监控数据的几种采集方式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 【1月更文挑战第14天】

1、读取 /proc 目录

/proc 是一个位于内存中的伪文件系统,该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,Linux 操作系统层面的很多监控数据,比如内存数据、网卡流量、机器负载等,都是从 /proc 中获取的信息。


/proc/meminfo内存总量、剩余量、可用量、Buffer、Cached 等数据都可以轻易拿到。没有使用率、可用率这样的百分比指标,这类指标需要二次计算,可以在客户端采集器中完成,也可以在服务端查询时现算。


2、执行命令行工具

这种方式非常简单,就是调用一下系统命令,解析输出就可以了。比如我们想获取 9090 端口的监听状态,可以使用 ss 命令 ss -tln|grep 9090,想要拿到各个分区的使用率可以通过 df 命令 df -k。但是这个方式不太通用,性能也不好。


3、远程黑盒探测

典型的探测手段有三类,ICMP、TCP 和 HTTP。有一个软件叫 Blackbox Exporter,就是专门用来探测的,Categraf、Datadog-Agent 等采集器也都可以做这种探测。


监控采集器和手工 Ping 测试的原理是一样的,也是发几个包做统计。不过有些机器是禁 Ping 的,这时候我们就可以通过 TCP 或 HTTP 来探测。对于 Linux 机器,一般是会开放 sshd 的 22 端口,那我们就可以用类似 telnet 的方式探测机器的 22 端口,如果成功就认为机器存活。


对于 HTTP 协议的探测,除了基本的连通性测试,还可以检查协议内容,比如要求返回的 status code 必须是 200,返回的 response body 必须包含 success 字符串,如果任何一个条件没有满足,从监控的角度就认为是异常的。


4、拉取特定协议的数据

有很多组件都通过 HTTP 接口的方式,暴露了自身的监控指标。如 RabbitMQ,访问 /api/overview 可以拿到 Message 数量、Connection 数量等概要信息。再比如 Kubelet,访问 /stats/summary 可以拿到 Node 和 Pod 等很多概要信息。


不同的接口返回的内容虽然都是指标数据,但是要推给监控服务端,还是要做一次格式转换,比如统一转换为 Prometheus 的文本格式。要是这些组件都直接暴露 Prometheus 的协议数据就好了,使用统一的解析器,就能大大简化监控采集逻辑。


这种拉取监控数据的方式虽然需要做一些数据格式的转换,但并不复杂。因为目标对象会把需要监控的数据直接通过接口暴露出来,监控采集器把数据拉到本地做格式转换即可。


5、连接到目标对象执行命令

目前最常用的数据库就是 MySQL 和 Redis 了。MySQL,我们经常需要获取一些连接相关的指标数据,比如当前有多少连接,总共拒绝了多少连接,总共接收过多少连接,登录 MySQL 命令行,使用下面的命令可以获取。

mysql> show global status like '%onn%';
+-----------------------------------------------+---------------------+
| Variable_name                                 | Value               |
+-----------------------------------------------+---------------------+
| Aborted_connects                              | 3212                |
| Connection_errors_accept                      | 0                   |
| Connection_errors_internal                    | 0                   |
| Connection_errors_max_connections             | 0                   |
| Connection_errors_peer_address                | 0                   |
| Connection_errors_select                      | 0                   |
| Connection_errors_tcpwrap                     | 0                   |
| Connections                                   | 3281                |
| Locked_connects                               | 0                   |
| Max_used_connections                          | 13                  |
| Max_used_connections_time                     | 2022-10-30 16:41:35 |
| Performance_schema_session_connect_attrs_lost | 0                   |
| Ssl_client_connects                           | 0                   |
| Ssl_connect_renegotiates                      | 0                   |
| Ssl_finished_connects                         | 0                   |
| Threads_connected                             | 1                   |
+-----------------------------------------------+---------------------+
16 rows in set (0.01 sec)

Threads_connected 表示当前有多少连接,Max_used_connections 表示曾经最多有多少连接,Connections 表示总计接收过多少连接。当然,除了连接数相关的指标,通过 show global status 还可以获取很多其他的指标,这些指标用于表示 MySQL 的运行状态,随着实例运行,这些数据会动态变化。


还有另一个命令 show global variables 可以获取一些全局变量信息,比如使用下面的命令可以获取 MySQL 最大连接数。

mysql> show global variables like '%onn%';
+-----------------------------------------------+-----------------+
| Variable_name                                 | Value           |
+-----------------------------------------------+-----------------+
| character_set_connection                      | utf8            |
| collation_connection                          | utf8_general_ci |
| connect_timeout                               | 10              |
| disconnect_on_expired_password                | ON              |
| init_connect                                  |                 |
| max_connect_errors                            | 100             |
| max_connections                               | 5000            |
| max_user_connections                          | 0               |
| performance_schema_session_connect_attrs_size | 512             |
+-----------------------------------------------+-----------------+
9 rows in set (0.01 sec)

其中 max_connections 就是最大连接数,这个数值默认是 151。在很多生产环境下,都应该调大,所以我们要把这个指标作为一个告警规则监控起来,如果发现这个数值太小要及时告警。


比如 show slave status 可以获取 Slave 节点的信息。总的来看,MySQL 监控的原理就是,连上 MySQL 后执行各种 SQL 语句,解析结果,转换为监控时序数据。


6、代码埋点

所谓的代码埋点方式,是指应用程序内嵌一些监控相关的 SDK,在请求的关键链路上调用 SDK 的方法,告诉 SDK 当前是个什么请求、耗时多少、是否成功之类的,SDK 汇总这些数据并二次计算,最终推给监控服务端。


比如一个用 Go 写的 Web 程序,提供了 10 个 HTTP 接口,我们想获取这 10 个接口的成功率和延迟数据,那就要写程序实现这些逻辑,包括数据采集、统计、转发给服务端等。这些监控相关的逻辑是典型的横向需求,这个 Web 程序有需求,其他的程序也有这个需求,所以就把这部分代码抽象成一个统一的 Lib,即上面提到的这个 SDK,每个需要监控逻辑的程序都可以复用这个 SDK,提升效率。


7、日志解析

一般程序都会打印日志,可以写日志解析程序,从日志中提取一些关键信息,比如从业务日志中很容易拿到 Exception 关键字出现的次数,从接入层日志中很容易就能拿到某个接口的访问次数。

相关文章
|
Go Python
安装程序报2503/2502问题的解决
安装程序报2503/2502问题的解决
514 0
安装程序报2503/2502问题的解决
|
存储 编译器 测试技术
交叉编译spdlpg 参数详解
交叉编译spdlpg 参数详解
373 0
|
NoSQL MongoDB
11 MongoDB - 数据查询(统计个数)
11 MongoDB - 数据查询(统计个数)
1540 0
|
小程序 安全
Fiddler抓取小程序后端请求导入AppScan扫描快捷方法
【8月更文挑战第26天】这是一种利用 Fiddler 捕获小程序后端请求并导入 AppScan 进行安全扫描的方法。首先安装配置 Fiddler 并设置手机代理,通过 Fiddler 捕获请求;接着导出这些请求为 .saz 文件,并在 AppScan 中导入此文件,配置扫描参数后启动扫描以检测安全漏洞。操作时需确保有合法授权并遵循相关法规。尽管不同版本软件操作细节可能有所不同,但整体流程类似。
533 1
|
并行计算 算法 大数据
Dask 与图形处理:大规模图数据的并行分析
【8月更文第29天】在大数据时代,图数据结构因其能够高效表达实体之间的复杂关系而变得越来越重要。然而,处理大规模图数据集往往需要高效的并行计算框架。Dask 是一个灵活的并行计算库,它能够与 Python 的现有科学计算生态系统无缝集成。本文将介绍如何利用 Dask 来处理和分析大规模的图数据结构。
505 4
|
缓存 负载均衡 数据库
构建高性能后端系统的策略与实践
在数字化时代的浪潮中,后端系统作为支撑现代应用程序的核心,其性能的优劣直接影响用户体验和业务发展。本文将深入探讨如何构建一个既高效又可靠的后端系统,通过具体的策略和技术手段,指导读者理解并实施后端优化的最佳实践。我们将一起探索代码优化、数据库设计、缓存应用、异步处理以及负载均衡等关键领域,旨在帮助开发者打造能够应对高并发挑战的后端架构。 【7月更文挑战第27天】
236 5
|
存储 算法 数据处理
数据结构与云计算:实现高效的数据存储与处理
本文探讨了数据结构和云计算在现代信息技术中的核心作用。数据结构,包括线性与非线性结构,影响着程序的效率,而在云计算环境中,这些结构需要适应分布式、并行和高可用性的需求。云计算提供弹性、可扩展的计算资源,分为IaaS、PaaS和SaaS三层服务模式。数据存储与处理在云计算中面临优化,如分布式数据存储利用哈希表实现数据分布,分布式数据处理采用映射减少算法提高效率,同时数据压缩和加密确保存储节省与安全性。未来,云计算将继续发展,面临扩展性、可靠性和安全性的挑战,而数据结构的优化将是提升系统性能的关键。
566 5
|
存储 NoSQL 关系型数据库
【MongoDB 专栏】MongoDB 的 ACID 事务支持
【5月更文挑战第11天】MongoDB,作为流行的非关系型数据库,逐步强化ACID事务支持,确保数据操作可靠性。事务包括原子性、一致性、隔离性和持久性四个特性。MongoDB通过多文档事务和锁机制实现ACID,适用于复杂操作、分布式协调和高一致性业务。然而,使用时注意性能影响、事务范围、错误处理及版本兼容性。随着技术进步,MongoDB将持续优化事务处理,应对更多复杂业务场景,为数据库领域带来创新与机遇。理解并恰当运用事务特性对构建高效应用至关重要。
392 0
【MongoDB 专栏】MongoDB 的 ACID 事务支持
|
Java 应用服务中间件 对象存储
富文本编辑器Ueditor实战(二)-图片上传
本文重点阐述了如何扩展Ueditor的图片上传功能,以及在实际中,如何根据项目实际情况,设置图片信息的动态展示思路。
1160 0
富文本编辑器Ueditor实战(二)-图片上传
|
运维 Devops 开发工具
PPT & 回放|打破代码评审难落地魔咒,轻松构建基于代码评审的研发流程和文化
代码评审的好处不言而喻,为何实际落地却困难重重? Git 和 Gerrit社区贡献者、云效Codeup开发者 滕龙认为问题主要出在流程工具问题、时间资源限制、自动化程度不足这3方面。 在昨天的直播中,滕龙给出了详细的解法,包含好的代码评审应该怎么做和如何选对工具高效落地2方面。
1132 1