IT 监控有哪些监控数据采集方式
IT 监控系统是什么
IT 监控系统是用于监测和管理信息技术基础设施、应用程序和服务的软件系统。
IT 监控系统的功能包括指标监控(比如机器利用率、API延迟、请求成功率)、日志监控(收集分析日志用于故障排查和性能分析)链路监控(利用微服务埋点技术监控请求颗粒度的相关数据)。
IT 监控系统的架构
IT 监控系统架构上大体可分为数据采集层、数据过滤转换提取(即数据ETL)、数据存储层、展示分析层。
- 数据采集层:就是各类 agent,比如 categraf、telegraf、zabbix agent、fluentbit、filebeat 等,用于采集各类监控数据。链路追踪方面的 SDK 也可以看作是数据采集层的一部分。
- 数据 ETL:通常在日志领域用的较多,比如 Fluentd、Logstash、Vector 等,指标有时也有需求,比如指标的信息丰富(Enrichment)等。
- 数据存储层:指标的存储通常是使用时序数据库,比如 Prometheus、VictoriaMetrics 等,日志的存储通常是使用 Elasticsearch、ClickHouse 等。
- 展示分析层:典型的开源项目是 Grafana、Kibana、Jaeger、Skywalking 等。
IT 监控系统的数据采集方式
本文主要介绍 IT 监控系统中常见的监控数据采集方式,主要介绍指标的采集方式。什么是指标?比如某个机器的 CPU 利用率,某个数据库的连接数、某个 API 的请求 QPS、延迟等、某个业务指标比如订单量等。
机器类指标
机器类型指标的采集比较特殊,自成一系,通常是通过 agent 采集,比如 zabbix agent、telegraf、categraf 等。这些 agent 要部署到机器上,读取机器的一些特殊的文件或者调用系统 API 获取机器的一些信息。
比如内存相关的信息,在 Linux 系统里,就是读取 /proc/meminfo
文件,CPU 相关的信息,就是读取 /proc/stat
文件。比如网络相关的信息,就是读取 /proc/net/dev
文件。比如磁盘使用率,就是读取 /proc/diskstats
文件同时配合 syscall 获取文件系统的使用量信息。如下就是机器的 CPU 利用率的指标:
为了灵活性考虑,也可以让 agent 执行调用用户指定的脚本,只要这个脚本输出符合监控系统的格式即可。常用的格式有 JSON、Prometheus 格式、InfluxDB 力推的 Influx 格式等。
有人说,机器监控不是必须要安装 agent 的,比如把机器开启 SNMP 或者 SSH,通过 SNMP 或者 SSH 协议获取机器的信息,这种方式也是可行的。但是,本质上,SNMP 也有一个 agent 就是 snmpd,SSH 的方式也有一个 agent 就是 sshd,总得有个机制支持我们去机器上运行一些逻辑。
组件类指标
组件类指标的采集方式,通常是连到组件上,获取相关的信息。
比如 MySQL,就是把监控系统采集器看做一个 client,连到 MySQL 上执行一些特定的 SQL 语句,进而采集一些 Performance 数据,比如 show global status
、show global variables
等。
比如 Redis,就是把监控系统采集器看做一个 client,连到 Redis 上执行一些特定的 Redis 命令,进而采集一些 Performance 数据,比如 info
等。
比如 Elasticsearch,Elasticsearch 会暴露一些 HTTP API,比如 _cat
系列的 API,比如 _cluster
系列的 API,比如 _nodes
系列的 API,通过这些 API,我们可以获取到 Elasticsearch 的一些监控信息。
比如 ETCD,会暴露一些 HTTP API,比如 /metrics
端点,通过这个端点,我们可以获取到 ETCD 的一些监控信息。
再比如 Kafka,会暴露一些 JMX 端点,通过 JMX,我们可以获取到 Kafka 的一些监控信息。当然,除了 Kafka,所有 Java 类服务都可以暴露 JMX 信息,通过 JMX,我们可以获取到 Java 类服务的一些 GC、内存、线程、类加载等信息。
自研应用类指标
自研应用类指标的采集方式,通常是通过 SDK 或者 agent 的方式,把监控系统的采集器嵌入到自研应用里,进而采集一些自定义的指标,即所谓的埋点。
比如 Prometheus、StatsD、OpenTelemetry 等,都是提供了 SDK,我们可以在自研应用里引入这些 SDK,进而采集一些自定义的指标。
通常 Java 类应用比较简单,只要在启动的时候引入一个 jar 包,然后配置一下,就可以采集到一些 JVM 的信息,比如 GC、内存、线程、类加载等信息。Go、C++ 之类的其他很多语言,都需要显式埋点,即手工做一些埋点工作。当然,Java 类的应用,如果要做采集一些自定义的指标,也是需要显式埋点的。
业务类指标
业务类指标,主要来源有3个,一个是像应用类指标那样,采集一些自定义的指标,另一个是通过日志采集分析获取一些业务数据,还有一个是通过查询业务库的方式。
比如我们有一个业务指标叫做订单量,我们可以周期性查询订单库,就可以知道当前订单总量,把订单总量存入 Prometheus 之类的监控系统里,就可以很方便的做可视化、分析了。
总结
本文介绋了 IT 监控系统中常见的监控数据采集方式,主要介绍了指标的采集方式,包括机器类指标、组件类指标、自研应用类指标、业务类指标。不同的指标有不同的采集方式,需要根据具体的情况选择合适的采集方式。