透过 node-exporter 彻底弄懂机器监控:01. node-exporter 框架讲解
前言
Prometheus 生态里有很多采集器负责各类监控数据的采集,其中使用最广泛的,显然是 node-exporter,负责 Linux、BSD 等系统的常规监控指标的采集,比如 CPU、内存、硬盘、网络、IO 等。其 github 地址是:https://github.com/prometheus/node_exporter 。很多人都用过,但对其细节未必清楚。
我想写一个小专栏,通过 node-exporter 这个采集器,讲解各类指标的含义、采集方法、使用场景、注意事项。顺带讲解 Linux 的很多观测手段。想必对于初中级研发、运维人员都会有帮助,专栏依旧会放到星球里,争取让星球的资源慢慢更为丰富起来。这块写完之后,后面可以继续 mysql、redis 等相关的专栏,一点点磕。
安装 node-exporter
要想方便调试,理解整个知识,建议还是要把 node-exporter 的代码下载下来,能够本地编译运行。这里我做一个简单演示,我的电脑是 Mac,M1 芯片,首先下载 go 安装包(https://go.dev/dl/):https://go.dev/dl/go1.22.2.darwin-arm64.tar.gz。一般使用 tar.gz 的文件就好,不用 pkg。
cd /Users/ulric/works/tgz
wget https://go.dev/dl/go1.22.2.darwin-arm64.tar.gz
tar -zxf go1.22.2.darwin-arm64.tar.gz
操作如上,/Users/ulric/works/tgz/go 这个目录就是 go 的安装目录,然后配置环境变量:
export GOROOT=/Users/ulric/works/tgz/go
export GOPATH=/Users/ulric/works/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
GOROOT 是 go 的安装目录,GOPATH 是 go 的工作目录,PATH 是环境变量,这样配置之后,就可以使用 go 命令了。上面的几行命令可以保存在 ~/.bash_profile 或者 ~/.zshrc 里,这样每次打开终端都会自动加载。
验证 go 环境是否正常安装:
% go version
go version go1.22.2 darwin/arm64
然后下载 node-exporter 的代码:
cd /Users/ulric/works
git clone https://github.com/prometheus/node_exporter.git
然后就可以编译了,如果你的网络环境不好,编译之前可以设置代理:
export GOPROXY=https://goproxy.cn,direct
cd /Users/ulric/works/node_exporter
go build
如果一切正常,就可以运行 node_exporter 做测试了,我先看看其版本:
ulric@ulric-flashcat node_exporter % ./node_exporter --version
node_exporter, version (branch: , revision: 0d3400ebc976e14d5b87db276bb2ec32f55b4052)
build user:
build date:
go version: go1.22.2
platform: darwin/arm64
tags: unknown
如上,就完成了 node-exporter 的源码安装。
启动 node-exporter
生产环境启动 node-exporter,通常是通过 systemd 等方式启动,咱们这里为了学习方便,就直接把进程启动在前台即可:
ulric@ulric-flashcat node_exporter % ./node_exporter --log.level=debug
ts=2024-05-23T04:08:01.560Z caller=node_exporter.go:193 level=info msg="Starting node_exporter" version="(version=, branch=, revision=0d3400ebc976e14d5b87db276bb2ec32f55b4052)"
ts=2024-05-23T04:08:01.560Z caller=node_exporter.go:194 level=info msg="Build context" build_context="(go=go1.22.2, platform=darwin/arm64, user=, date=, tags=unknown)"
ts=2024-05-23T04:08:01.561Z caller=node_exporter.go:199 level=debug msg="Go MAXPROCS" procs=1
ts=2024-05-23T04:08:01.561Z caller=filesystem_common.go:111 level=info collector=filesystem msg="Parsed flag --collector.filesystem.mount-points-exclude" flag=^/(dev)($|/)
ts=2024-05-23T04:08:01.562Z caller=filesystem_common.go:113 level=info collector=filesystem msg="Parsed flag --collector.filesystem.fs-types-exclude" flag=^devfs$
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:111 level=info msg="Enabled collectors"
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=boottime
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=cpu
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=diskstats
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=filesystem
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=loadavg
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=meminfo
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=netdev
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=os
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=powersupplyclass
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=textfile
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=thermal
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=time
ts=2024-05-23T04:08:01.562Z caller=node_exporter.go:118 level=info collector=uname
ts=2024-05-23T04:08:01.565Z caller=tls_config.go:313 level=info msg="Listening on" address=[::]:9100
ts=2024-05-23T04:08:01.565Z caller=tls_config.go:316 level=info msg="TLS is disabled." http2=false address=[::]:9100
可以看到,node-exporter 启动成功,监听在 9100 端口,可以通过浏览器访问:http://localhost:9100/metrics 查看采集到的指标。或者通过 curl 命令:
curl -s http://localhost:9100/metrics
在我的本地 Mac 上,大概会采集 610 个指标,包括:
- go 前缀的指标:这是 node-exporter 进程本身的一些指标,比如 gc 耗时、内存使用等
- node 前缀的指标:机器的一些常规指标,比如 CPU、内存、硬盘、网络、IO 等,咱们后面重点研究这类指标
- promhttp 前缀的指标:node-exporter 的 http 服务的一些指标,比如请求次数
node-exporter 启动参数
./node_exporter --help 可以查看 node-exporter 的启动参数,主要参数:
- collector 前缀的指标:控制是否启用某个采集器,node-exporter 内置了多个采集器,比如 cpu、meminfo、ntp 等都是不同的采集器;collector 前缀的还有一些参数是控制各个采集器具体行为的,比如
--collector.ntp.server控制 ntp 采集器的 ntp 服务器地址 - web 前缀的指标:控制 node-exporter 的 http 服务,比如
--web.listen-address控制监听地址,--web.telemetry-path控制暴露指标数据的 API 路径 - log 前缀的指标:控制日志打印,比如
--log.level控制日志级别
大量参数都是围绕 collector 的,因为 node-exporter 的核心就是采集器,不同的采集器负责不同的指标采集。有部分 collector 是默认开启的,有部分是默认关闭的,README 中有详细说明。对于那些默认关闭的 collector,如果你想启用,就要小心测试了,看看采集耗时、对机器的资源占用的影响等。
node-exporter 源码结构
代码仓库根目录下,有个 node_exporter.go,main 函数入口就在这里。collector 目录下是各个插件的实现,比如 meminfo 相关的:
ulric@ulric-flashcat collector % ll meminfo*
-rw-r--r-- 1 ulric staff 1998 12 18 17:20 meminfo.go
-rw-r--r-- 1 ulric staff 2515 12 18 17:20 meminfo_darwin.go
-rw-r--r-- 1 ulric staff 1853 12 18 17:20 meminfo_linux.go
-rw-r--r-- 1 ulric staff 1163 12 18 17:20 meminfo_linux_test.go
-rw-r--r-- 1 ulric staff 1520 12 18 17:20 meminfo_netbsd.go
-rw-r--r-- 1 ulric staff 4655 12 18 17:20 meminfo_numa_linux.go
-rw-r--r-- 1 ulric staff 2950 12 18 17:20 meminfo_numa_linux_test.go
-rw-r--r-- 1 ulric staff 2483 12 18 17:20 meminfo_openbsd.go
-rw-r--r-- 1 ulric staff 2336 12 18 17:20 meminfo_openbsd_amd64.go
这些源码文件分成了很多不同的后缀,这是因为不同的系统,meminfo 的实现是不同的,go 语言通过后缀来区分不同的系统,比如 meminfo_darwin.go 是 Mac 系统的实现,meminfo_linux.go 是 Linux 系统的实现。
不同的插件,都会有个 init() 函数,这个函数会在 node-exporter 启动的时候被调用,用来注册插件。比如 meminfo 插件:
func init() {
registerCollector("meminfo", defaultEnabled, NewMeminfoCollector)
}
所谓的插件注册,核心就是把各个插件的信息(名称、是否启用、工厂函数)保存在全局变量中,这样一来,node-exporter 启动的时候,就可以根据这些信息,动态创建插件实例,然后调用采集函数,采集指标。典型的插件化设计思路。
插件在 node-exporter 中抽象为一个 interface,只有一个 Update 函数:
type Collector interface {
// Get new metrics and expose them via prometheus registry.
Update(ch chan<- prometheus.Metric) error
}
比如内存采集插件 meminfo,就实现了这个接口:
func (c *meminfoCollector) Update(ch chan<- prometheus.Metric) error {
var metricType prometheus.ValueType
memInfo, err := c.getMemInfo()
if err != nil {
return fmt.Errorf("couldn't get meminfo: %w", err)
}
level.Debug(c.logger).Log("msg", "Set node_mem", "memInfo", memInfo)
for k, v := range memInfo {
if strings.HasSuffix(k, "_total") {
metricType = prometheus.CounterValue
} else {
metricType = prometheus.GaugeValue
}
ch <- prometheus.MustNewConstMetric(
prometheus.NewDesc(
prometheus.BuildFQName(namespace, memInfoSubsystem, k),
fmt.Sprintf("Memory information field %s.", k),
nil, nil,
),
metricType, v,
)
}
return nil
}
node-exporter 框架层面,会创建 prometheus.Metric 类型的 channel,作为一个监控数据接收器,传给 Update,各个插件实现 Update 函数,把采集到的指标数据写入 channel,node-exporter 框架层面,会把这些数据通过 /metrics 接口暴露出来。
小结
作为专栏第一篇,对 node-exporter 整体做了一些介绍,包括其定位、安装方式、启动参数、源码结构等。后续会逐个插件详细讲解,一起揭开 Linux 监控数据的神秘面纱,看看这些数据是如何采集的,用来干啥的,有啥坑,以及一些重要指标的含义。
透过 node-exporter 彻底弄懂机器监控:01. node-exporter 框架讲解的更多相关文章
- 必须弄懂的495个C语言问题
1.1 我如何决定使用那种整数类型? 如果需要大数 值(大于32, 767 或小于¡32, 767), 使用long 型.否则, 如果空间很重要(如有大数组或很多结构), 使用short 型.除此之外 ...
- 彻底弄懂 Unicode 编码
彻底弄懂 Unicode 编码 今天,在学习 Node.js 中的 Buffer 对象时,注意到它的 alloc 和 from 方法会默认用 UTF-8 编码,在数组中每位对应 1 字节的十六进制数. ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
- 这一次,彻底弄懂 JavaScript 执行机制
本文转自https://juejin.im/post/59e85eebf265da430d571f89#heading-4 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还 ...
- Prometheus 监控K8S Node监控
Prometheus 监控K8S Node监控 Prometheus社区提供的NodeExporter项目可以对主机的关键度量指标进行监控,通过Kubernetes的DeamonSet可以在各个主机节 ...
- 彻底弄懂LSH之simHash算法
马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说.这种说法同样适用于“经典”的计算机书籍. 最近一直在看LSH,不过由于matlab基础比较差,一直没搞懂.最近看的 ...
- 打工心态废掉了很多人,包括你吗?(你把现在这家公司的业务都弄清楚、弄懂了吗?君子报仇十年不晚!不离不弃!)good
我只拿这点钱,凭什么去做那么多工作,我傻呀. 我为公司干活,公司付我一份报酬,等价交换而已,我不欠谁的. 我只要对得起这份薪水就行了,多一点我都不干,做了也白做. 工作嘛,又不是为自己干,说得过去就行 ...
- SQL Server-聚焦NOLOCK、UPDLOCK、HOLDLOCK、READPAST你弄懂多少?(三十四)
前言 时间流逝比较快,博主也在快马加鞭学习SQL Server,下班回来再晚也不忘记更新下博客,时间挤挤总会有的,现在的努力求的是未来所谓的安稳,每学一门为的是深度而不是广度,求的是知识自成体系而不是 ...
- 彻底弄懂AngularJS中的transclusion
点击查看AngularJS系列目录 彻底弄懂AngularJS中的transclusion AngularJS中指令的重要性是不言而喻的,指令让我们可以创建自己的HTML标记,它将自定义元素变成了一个 ...
- 彻底弄懂 JavaScript 执行机制
本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...
随机推荐
- HarmonyOS NEXT应用开发案例—自定义日历选择器
介绍 本示例介绍通过CustomDialogController类显示自定义日历选择器. 效果图预览 使用说明 加载完成后显示主界面,点当前日期后会弹出日历选择器,选择日期后会关闭弹窗,主页面日期会变 ...
- HarmonyOS NEXT应用开发之MpChart图表实现案例
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI.本示例主要介绍如何使用三方库MpChart实现柱状图U ...
- 阿里云云原生加速器企业硬之城携手阿里云 Serverless 应用引擎(SAE)打造低代码平台
简介: 作为入选阿里云首期云原生加速器的企业,硬之城此前也获得了阿里云首批产品生态集成认证,通过云原生加速器项目携手阿里云共建更加丰富的云原生产业生态圈,加速云原生落地. 作者 | 陈泽涛(硬之城产品 ...
- 实时 OLAP, 从 0 到 1
简介: BTC.com 团队在实时 OLAP 方面的技术演进过程及生产优化实践. 作者|高正炎 本文主要介绍 BTC.com 团队在实时 OLAP 方面的技术演进过程及生产优化实践,内容如下: 业务背 ...
- 【视频特辑】提效神器!如何用Quick BI高效配置员工的用数权限
简介:随着企业数字化进程逐步加速,企业所产生和积累的数据资源日益增多.每当员工的用数权限发生变动,管理员都需要进行复杂繁琐的重复性配置流程,不仅耗时耗力还容易出错. 如何能便捷地对员工用数权限进行高 ...
- Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径
本文记录一个 Win32 的有趣行为,调用 CreateProcess 方法传入特别的参数,可以让任务管理器里的命令行不显示应用文件路径 开始之前,先看看下面这张有趣的图片 可以看到我编写的 Svca ...
- Postergresql常见操作
Postergresql常见操作 1. 安装部署 略 2. 登录数据库 查看版本 ## 以管理员身份 postgres 登陆,然后通过#psql -U postgres#sudo -i -u post ...
- toLua中Lua调用C#中的类
toLua中Lua调用C#: [7]Lua脚本调用C#中的class 准备工作:打算在Lua脚本中使用Debug,使用lua调用C#脚本,需要绑定LuaState和自定义添加Debug --- --- ...
- linux下使用fdisk进行磁盘分区详解
目录 一.前言 二.关于磁盘分区的结构 三.fdisk命令详解 四.使用fdisk进行磁盘分区 4.1 磁盘分区规划 4.2 fdisk进行磁盘分区 4.3 格式化分区 4.4 创建挂载点/挂载目录 ...
- PStorm 安装与破解
官方下载地址: https://www.jetbrains.com/zh-cn/phpstorm/promo/?utm_source=baidu&utm_medium=cpc&utm_ ...