当前位置: 首页 > 科技观察

使用NodeExporter监控其中一台Linux主机

时间:2023-03-13 12:58:15 科技观察

NodeExporter是一个用于暴露*NIX主机指标的Exporter,比如收集CPU、内存、磁盘等信息。Go编写,无第三方依赖,只需下载解压即可运行。安装配置由于NodeExporter是一个独立的二进制文件,可以直接从Prometheus下载页面(https://prometheus.io/download/#node_exporter)下载并解压:??wgethttps://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz#国内加速可以使用以下命令下载#wgethttps://download.fastgit.org/prometheus/node_exporter/releases/下载/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz??tar-xvfnode_exporter-1.2.2.linux-amd64.tar.gznode_exporter-1.2.2.linux-amd64/node_exporter-1.2.2.linux-amd64/LICENSEnode_exporter-1.2.2.linux-amd64/NOTICEnode_exporter-1.2.2.linux-amd64/node_exporter??cdnode_exporter-1.2.2.linux-amd64&&ls-latotal18084drwxr-xr-x234343434-5-5Aug621.5rootroot4096Oct1411:50..-rw-r--r--13434343411357Aug621:49LICENSE-rwxr-xr-x13434343418494215Aug621:45node_exporter-rw-r--r--node134343434463Aug621通过运行直接执行文件:4?export/node_exporterlevel=infots=2021-10-14T03:52:31.947Zcaller=node_exporter.go:182msg="Startingnode_exporter"version="(version=1.2.2,branch=HEAD,revision=26645363b486e12be40af7ce4fc91e731a33104e)"level=infots=2021-10-14T03:52:31.947Zcaller=node_exporter.go="1.947Zcaller=node_exporter.go:Buildcontext"build_context="(go=go1.16.7,user=root@b9cb4aa2eb17,date=20210806-13:44:18)"...level=infots=2021-10-14T03:52:31.948Zcaller=node_exporter.go:199msg="Listeningon"address=:9100level=infots=2021-10-14T03:52:31.948Zcaller=tls_config.go:191msg="TLSisdisabled."http2=false从日志中可以看出node_exporter监听在9100端口上,通过/metrics端点暴露默认的metrics接口,我们可以通过访问http://localhost:9100/metrics获取监控指标数据:??curlhttp://localhost:9100/指标......#HELPnode_load11mloadaverage.#TYPEnode_load1gaugenode_load10.01#HELPnode_load1515mloadaverage.#TYPEnode_load15gaugenode_load150.05#HELPnode_load55mloadaverage.#TYPEnode_load5gaugenode_load50.04#HELPnode_memory_Active_anon_bytesfieldAmory信息ive_anon_bytes.#TYPEnode_memory_Active_anon_bytesgaugenode_memory_Active_anon_bytes8.4393984e+07#HELPnode_memory_Active_bytesMemoryinformationfieldActive_bytes.#TYPEnode_memory_Active_bytesgaugenode_memory_Active_bytes1.8167808e+08#HELPnode_memory_Active_file_bytesMemoryinformationfieldActive_file_bytes.#TYPEnode_memory_Active_file_bytesgaugenode_memory_Active_file_bytes9.7284096e+07#HELPnode_memory_AnonHugePages_bytesMemoryinformationfieldAnonHugePages_bytes.#TYPEnode_memory_AnonHugePages_bytesgaugenode_memory_AnonHugePages_bytes3.5651584e+07#HELPnode_memory_AnonPages_bytesMemoryinformationfieldAnonPages_bytes.#TYPEnode_memory_AnonPages_bytesgaugenode_memory_AnonPages_bytes8.159232e+07#HELPnode_memory_Bounce_bytesMemoryinformationfieldBounce_bytes.#TYPEnode_memory_Bounce_bytesgaugenode_memory_Bounce_bytes0......metrics接口数据是标准的Prometheus监控指标格式,我们只需要将端点配置到Prometheus中即可抓取指标数据为了了解node_exporter的可配置参数,我们可以使用./node_exporter-h查看帮助信息:??./node_exporter-h--web.listen-address=":9100"#监听端口,默认为9100--web.telemetry-path="/metrics"#metrics的路径,默认为/metrics--web.disable-exporter-metrics#是否禁用go和prome的默认metrics--web.max-requests=40#最大并行请求个数,默认40个,设置为0时无限制--log.level="info"#日志级别:[debug,info,warn,error,fatal]--log.format=logfmt#设置日志打印目标和格式:[logfmt,json]--version#versionnumber--collector.{metric-name}#每个metric对应的参数...最重要的参数是--collector。通过这个参数,我们可以启用我们收集的node_exporter的功能模块,默认会收集一些模块。要禁用这些默认收集器,您可以传递--no-collector。标记以禁用它们。如果只启用某些特定的收集器,使用--collector.disable-defaults标志禁用所有默认值,然后通过指定特定的收集器--collector来启用它们。下图列出了默认启用的收集器:一般来说,为了方便管理,我们可以使用docker容器来运行node_exporter,但是需要注意的是,由于收集的是宿主机的指标信息,所以有必要访问主机系统。如果你使用docker容器部署的话,需要添加一些额外的参数来让node_exporter访问宿主机的命名空间。如果直接在宿主机上运行,??我们可以使用systemd对其进行管理,创建一个服务单元文件如下所示:??cat/etc/systemd/system/node_exporter.service[Unit]Description=nodeexporterserviceDocumentation=https://prometheus.ioAfter=network.target[Service]Type=simpleUser=rootGroup=rootExecStart=/usr/local/bin/node_exporter#有特殊需求可以后面指定参数配置Restart=on-failure[Install]WantedBy=multi-user.target然后你可以使用systemd来管理node_exporter:??cpnode_exporter/usr/local/bin/node_exporter??systemctldaemon-reload??systemctlstartnode_exporter??systemctlstatusnode_exporternode_exporter.service-nodeexporterservoceLoaded:loaded(/etc/systemd/system/node_exporter.service;disabled;vendorpreset:disabled)Active:active(running)sinceThu2021-10-1415:29:46CST;5sagoDocs:https://prometheus.ioMainPID:18679(node_exp顺序)任务:5内存:6.5MC组:/system.slice/node_exporter.service└─18679/usr/local/bin/node_exporterOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:..._zoneOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...=timeOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...timexOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...ueuesOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...unameOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...mstatOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...r=xfsOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...r=zfsOct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=node_exporter.go:...:9100Oct1415:29:46node1node_exporter[18679]:level=infots=2021-10-14T07:29:46.137Zcaller=tls_config.go:191...false提示:有些行是椭圆形的,使用-ltoshowinfull。这里我们使用systemd分别在两个节点(node1,node2)上启动node_exporter。启动完成后,我们使用static配置的方式在之前的Prometheus配置中增加一个node_exporter爬取任务,用于采集这两个节点的监控指标数据。配置文件如下:global:scrape_interval:5sscrape_configs:-job_name:"prometheus"static_configs:-targets:["localhost:9090"]-job_name:"demo"scrape_interval:15s#会覆盖全局配置scrape_timeout:10sstatic_configs:-targets:["localhost:10000","localhost:10001","localhost:10002"]-job_name:"node_exporter"#Newnode_exportertaskstatic_configs:-targets:["node1:9100","node2:9100"]#node1和node2映射在hosts上面的配置文件最后我们添加了一个name为node_exporter的抓包任务,将采集到的target配置在静态配置中,然后重新加载Prometheus,一般在Prometheus中在WebUI的目标页面,可以看到上面配置的node_exporter任务。接下来我们来了解一下节点监控的一些常用指标,比如CPU、内存、IO监控等,可以根据CPU的状态分析出当前系统的健康状态。监控一个节点的CPU,需要用到监控指标node_cpu_seconds_total。该指标在metrics界面的内容如下:#HELPnode_cpu_seconds_totalSecondstheCPUsspentineachmode.#TYPEnode_cpu_seconds_totalcounternode_cpu_seconds_total{cpu="0",mode="idle"}13172.76node_cpu_seconds_total0",mode="iowait"}0.25node_cpu_seconds_total{cpu="0",mode="irq"}0node_cpu_seconds_total{cpu="0",mode="nice"}0.01node_cpu_seconds_total{cpu="0",mode="softirq"}87.99node_cpu_seconds_total{cpu="0",mode="steal"}0node_cpu_seconds_total{cpu="0",mode="system"}309.38node_cpu_seconds_total{cpu="0",mode="user"}79.93node_cpu_seconds_total{cpu="1",mode="idle"}13168.98node_cpu_seconds_total{cpu="1",mode="iowait"}0.27node_cpu_seconds_total{cpu="1",mode="irq"}0node_cpu_seconds_total{cpu="1",mode="nice"}0node_cpu_seconds_total{cpu="1",mode="softirq"}74.1node_cpu_seconds_total{cpu="1",mode="steal"}0node_cpu_seconds_total{cpu="1",mode="system"}314.71node_cpu_seconds_total{cpu="1",mode="user"}78.83node_cpu_seconds_total{cpu="2",mode="idle"}13182.78node_cpu_seconds_total{cpu="2",mode="iowait"}0.69node_cpu_seconds_total{cpu="2",mode="irq"}0node_cpu_seconds_total{cpu="2",mode="nice"}0node_cpu_seconds_total{cpu="2",mode="softirq"}66.01node_cpu_seconds_total{cpu="2",mode="steal"}0node_cpu_seconds_total{cpu="2",mode="system"}309.09node_cpu_seconds_total{cpu="2",mode="user"}79.44node_cpu_seconds_total{cpu="3",mode="idle"}13185.13node_cpu_seconds_total{cpu="3",mode="爱荷华州t"}0.18node_cpu_seconds_total{cpu="3",mode="irq"}0node_cpu_seconds_total{cpu="3",mode="nice"}0node_cpu_seconds_total{cpu="3",mode="softirq"}64.49node_cpu_seconds_total{cpu="3",mode="steal"}0node_cpu_seconds_total{cpu="3",mode="system"}305.86node_cpu_seconds_total{cpu="3",mode="user"}78.17这个指标可以从接口说明中看到用来统计CPU在各个模式下所花费的时间,是一个计数器类型的指标,也就是会一直递增,这个值其实是CPU时间片的一个累加值,表示CPU启动操作系统启动时开始工作,开始记录自己使用的总时间,然后保存,这里累计的CPU使用时间会分为几种不同的模式,比如用户态使用时间,空闲时间,中断time,kernelmodeusagetime等,也是我们平时使用top命令查看的CPU相关信息,我们这里的indicator会分别记录这些modes非常好。接下来,我们将监控节点的CPU。我们也知道,一个不断增加的CPU时间对我们来说是没有意义的。一般我们要监控的是节点的CPU使用率,也就是我们使用top命令看到的百分比。要计算CPU使用率,我们需要弄清楚使用率的含义。CPU使用率是用CPU除空闲状态以外的所有其他CPU状态的时间总和除以CPU总时间得到的结果。理解了这个概念之后,就可以写出正确的promql查询语句了。计算除idle状态下的CPU时间总和,是不是直接计算idle状态下的CPU时间使用率,然后减1就是我们想要的结果,所以先过滤idle的指标mode,在Prometheus的WebUI中输入node_cpu_seconds_total{mode="idle"}进行过滤:要计算使用率,必须知道空闲模式下的CPU使用了多长时间,然后与total进行比较。由于这是一个Counter指标,我们可以使用increase函数获取变化,使用查询语句increase(node_cpu_seconds_total{mode="idle"}[1m]),因为increase函数需要输入一个区间向量,所以这里1分钟内取数据:可以看到查询结果中有大量不同cpu序号的数据。当然,我们需要计算所有CPU的时间,所以我们将它们聚合起来。我们要查询的是不同节点的CPU使用率,所以需要根据实例标签进行聚合。使用查询语句sum(increase(node_cpu_seconds_total{mode="idle"}[1m]))by(instance):这样我们就可以得到1分钟内不同节点的空闲CPU使用时间,然后进行比较与总CPU(此时不需要过滤状态模式)时间进行比较,使用querysum(increase(node_cpu_seconds_total{mode="idle"}[1m]))by(instance)/sum(increase(node_cpu_seconds_total[1m]))by(instance):那么计算CPU使用率就很简单了,减1乘以100即可:(1-sum(increase(node_cpu_seconds_total{mode="idle"}[1m]))by(instance)/总和(增加(node_cpu_seconds_total[1m]))(实例))*100。这是能想到的查询CPU使用率最直接的方式。当然前面我们学习的promql语法中提到,我们会使用rate函数而不是increase函数进行计算,所以最终CPU使用率的查询语句为:(1-sum(increase(node_cpu_seconds_total{mode="idle"}[1m]))by(instance)/sum(increase(node_cpu_seconds_total[1m]))by(instance))*100。可以和top命令的结果对比(下图是node2节点),基本一致。这是监控节点CPU使用率的方式。