Prometheus监控运维实战十: 主机监控指标

Posted 唐僧骑白马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prometheus监控运维实战十: 主机监控指标相关的知识,希望对你有一定的参考价值。

1、CPU指标

CPU负载

node_load1
node_load5
node_load15

以上三个指标为主机的CPU平均负载,分别对应一分钟、五分钟和十五分钟的时间间隔。CPU负载是指某段时间内占用CPU时间的进程和等待CPU时间的进程数之和。一般来说,cpu负载数/cpu核数如果超过0.7,应该开始关注机器性能情况 ,如果超过1的话,运维人员应该介入处理。

CPU使用率

node_cpu_seconds_total

该指标包括了多个标签,分别标记每种处理模式使用的CPU时间,该指标为counter类型。这个指标不适合直接拿来使用,可通过前面学习的PromQL,将其转化成CPU使用率的指标 。

mode="idle"代表CPU 的空闲时间,所以我们只需要算出空闲的时间占比,再以总数减去该值 ,便可知道CPU的使用率,此处使用irate方法。由于现有的服务器一般为多核,所以加上avg求出所有cpu的平均值,便是CPU的使用率情况 ,如下 :

100 -avg(irate(node_cpu_seconds_totalmode="idle"[5m])) by (instance)* 100

2、内存监控

物理内存使用率

对于内存,我们一般会关注内存使用率,但node-exporter并不直接进行计算,我们需要根据node-exporet返回的内存指标自己写计算公式 。

需要用到的内存指标有下列几个:

node_memory_MemTotal_bytes    #总内存大小
node_memory_MemFree_bytes     #空闲内存大小
node_memory_Buffers_bytes     #缓冲缓存大小
node_memory_Cached_bytes      #页面缓存大小

计算的公式为:(总内存 -(空闲内存 + 缓冲缓存 + 页面缓存))/ 总内存 * 100

(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes+node_memory_Cached_bytes ))/node_memory_MemTotal_bytes * 100

swap内存使用率

Swap为交换内存分区,它使用磁盘上的部分空间来充当服务器内存,当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务。而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

swap内存用到的指标如下:

node_memory_SwapTotal_bytes  #swap内存总大小
node_memory_SwapFree_bytes   #swap空闲内存大小

计算的公式如下:

(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes)/node_memory_SwapTotal_bytes * 100

3、磁盘使用率

分区使用率

分区使用率的指标可以通过分区空间总容器和分区空闲容量计算出来

node_filesystem_size_bytes  #分区空间总容量
node_filesystem_free_bytes  # 分区空闲容量

磁盘吞吐量

node_disk_read_bytes_total  #分区读总字节数
node_disk_written_bytes_total #分区写总字节数

上面两个指标分别对应了分区读写的总字节数,指标为counter类型。前面文章讲过,counter类型会不断的累加,该指标直接使用对于监控没有意义,但可通过下面公式转化为磁盘的每秒读写速率。device代表对应的磁盘分区。

irate(node_disk_read_bytes_totaldevice="sda"[5m]) 
irate(node_disk_written_bytes_totaldevice="sda"[5m])

磁盘IOPS

IOPS表示每秒对磁盘的读写次数,它与吞吐量都是衡量磁盘的重要指标。对于IOPS的监控,可通过下面两个指标算得出

node_disk_reads_completed_total  #分区读总次数
node_disk_writes_completed_total  #分区写总次数

计算公式与上面相似,使用我们熟悉的irate或rate函数来处理

irate(node_disk_reads_completed_totaldevice="sda"[5m]) 
irate(node_disk_writes_completed_totaldevice="sda"[5m])

4、网络监控

网卡流量

网卡流量一般分为上传和下载流量,下面两个指标分别为总的字节数,可通过这两个指标计算出来网卡每秒流量

node_network_receive_bytes_total  #下载流量总字节数
node_network_transmit_bytes_total  #上传流量总字节数

计算公式如下,此处排除Loopback 网卡

irate(node_network_receive_bytes_totaldevice != "lo"[1m])

请求百度页面查看网卡流量

for i in 1..20; do curl http://www.baidu.com; done

5、可用性监控

除了监控主机的性能参数外,我们还需要关注实例的可用性情况,比如是否关机、exporter是否正常运行等。在exporter返回的指标,有一个up指标,可用来实现这类监控需求。

upjob="agent1"

上一篇:Prometheus监控实战系列九:主机监控
下一篇:Prometheus监控实战系列十一:可视化

Prometheus监控运维实战十一:Pushgateway

一. Pushgateway简介

Pushgateway为Prometheus整体监控方案的功能组件之一,并做于一个独立的工具存在。它主要用于Prometheus无法直接拿到监控指标的场景,如监控源位于防火墙之后,Prometheus无法穿透防火墙;目标服务没有可抓取监控数据的端点等多种情况。

在类似场景中,可通过部署Pushgateway的方式解决问题。当部署该组件后,监控源通过主动发送监控数据到Pushgateway,再由Prometheus定时获取信息,实现资源的状态监控。


工作流程:

    a. 监控源通过Post方式,发送数据到Pushgateway,路径为/metrics。

    b. Prometheus服务端设置任务,定时获取Pushgateway上面的监控指标。

    c. Prometheus拿到监控指标后,根据配置的告警规则,如果匹配将触发告警到Alertmanager;同时,Grafana可配置数据源调用Prometheus数据,做为数据展示。

    d. Alertmanager收到告警后,根据规则转发到对应接收人及接收介质;Grafana方面,用户可登录并根据数据源的监控指标,配置相关的图表展示 。


二. 安装部署

1、二进制安装 

下载安装包


$ wget https://github.com/prometheus/pushgateway/releases/download/v1.4.1/pushgateway-1.4.1.linux-amd64.tar.gz


解压并安装 

$ tar -xvf pushgateway-1.4.1.linux-amd64.tar.gz 
$ cd pushgateway-1.4.1.linux-amd64
$ sudo cp pushgateway /usr/local/bin/


查看版本号验证是否正常

$ pushgateway --version
pushgateway, version 1.4.1 (branch: HEAD, revision: 6fa509bbf4f082ab8455057aafbb5403bd6e37a5)
build user: root@da864be5f3f0
build date: 20210528-14:30:10
go version: go1.16.4
platform: linux/amd64


启动服务,默认端口为9091,可通过--web.listen-address更改监听端口

pushgateway &


2、docker安装

$ docker pull prom/pushgateway
$ docker run -d --name=pushgateway -p 9091:9091 prom/pushgateway


部署完成后,在浏览器输入 http://$IP:9091 即可看到程序界面 


三. 数据推送Pushgateway

pushgateway的数据推送支持两种方式,Prometheus Client SDK推送和API推送。

1、Client SDK推送

Prometheus本身提供了支持多种语言的SDK,可通过SDK的方式,生成相关的数据,并推送到pushgateway,这也是官方推荐的方案。目前的SDK覆盖语言有官方的​

  • Go
  • Java or Scala
  • Python
  • Ruby

也有许多第三方的,详情可参见此链接:https://prometheus.io/docs/instrumenting/clientlibs/

示例:

本示例以python为例,讲解SDK的使用

from prometheus_client import Counter,Gauge,push_to_gateway
from prometheus_client.core import CollectorRegistry

registry = CollectorRegistry()
data1 = Gauge(\'gauge_test_metric\',\'This is a gauge-test-metric\',[\'method\',\'path\',\'instance\'],registry=registry)
data1.labels(method=\'get\',path=\'/aaa\',instance=\'instance1\').inc(3)

push_to_gateway(\'10.12.61.3:9091\', job=\'alex-job\',registry=registry)


注解:

第一、二行代码:引入相关的Prometheus SDK;

第五行代码:创建相关的指标,类型为Gauge。其中“gauge_test_metric”为指标名称,\'This is a gauge-test-metric\'为指标注释,[\'method\',\'path\',\'instance\'] 为指标相关的label。

第六行代码:添加相关的label信息和指标value 值。

第六行代码:push数据到pushgateway,\'10.12.61.3:9091\'为发送地址,job指定该任务名称。


以上代码产生的指标数据等同如下 :

# HELP gauge_test_metric This is a gauge-test-metric
# TYPE gauge_test_metric gauge
gauge_test_metric{instance="instance1",method="get",path="/aaa"} 3.0


2、 API推送

通过调用pushgateway  API的方式实现数据的推送。

请求格式:


/metrics/job/<jobname>{/instance/instance_name}


<jobname>将用作Job标签的值,然后是其他指定的标签。

示例:

本例中定义了两个标签 job=alex-job和instance=instance1,并推送了指标 http_request_total 及其value值,10.12.61.1 为pushgateway地址。


echo \'http_request_total 12\' | http://10.12.61.3:9091/metrics/job/alex-job/instance/instance1


复杂数据发送:

$ cat <<EOF | curl --data-binary @- http://10.12.61.3:9091/metrics/job/alex-job/instance/10.2.10.1
# TYPE http_request_total counter
http_request_total{code="200",path="/aaa"} 46
http_request_total{code="200",path="/bbb"} 15
EOF


数据推送完成后,可登录pushgateay地址查看指标情况


假如需要删除pushgateway上面存储的指标信息,可通过如下方式操作:

删除某个组下某个实例的所有数据

curl -X DELETE http://10.12.61.3:9091/metrics/job/alex-job/instance/10.2.10.1


删除某个job下所有的数据

 

curl -X DELETE http://10.12.61.3:9091/metrics/job/alex-job



四. prometheus抓取数据

Pushgateway只是指标的临时存放点,最终我们需要通过Prometheus将其存放到时间序列数据库里。对此,我们需要在Prometheus上面创建一个job


- job_name: \'pushgateway\'
honor_labels: true
static_configs:
- targets:
- \'10.12.61.3:9091\'



目标任务正常启动后,可在prometheus查看到相关的指标数据

五. 注意事项

  1. 通过Pushgateway方式,Prometheus无法直接检测到监控源服务的状态,故此种方式不适用于监控服务的存活状态等场景。
  2. Pushgateway属于静态代理,它接收的指标不存在过期时间,故会一直保留直到该指标被更新或删除。此种情况下,不再使用的指标可能存在于网关中。
  3. 如上所言,Pushgateway并不算是完美的解决方案,在监控中更多做为辅助方案存在,用于解决Prometheus无法直接获取数据的场景。
















以上是关于Prometheus监控运维实战十: 主机监控指标的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus监控运维实战十一:Pushgateway

Prometheus监控运维实战十二:Exporter详解

Prometheus监控运维实战六: Node_exporter监控主机

Prometheus监控运维实战八:可视化

Prometheus监控运维实战十三:Docker容器监控

Prometheus监控运维实战十七: 高可用与扩展性