[关闭]
@zhangyy 2020-11-09T10:04:42.000000Z 字数 9405 阅读 145

Prometheus监控实战(一)

Prometheus系列



一:Prometheus是啥?

  1. Prometheus是一个开源的系统监控和告警工具包,最初由SoundCloud开发。自2012年开
  2. 始,许多公司和组织开始使用了Prometheus,该项目拥有非常活跃的开发者和用户社区。
  3. Prometheus现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄
  4. 清项目的治理结构,Prometheus2016年加入了云原生计算基金会(CNCF),成为继
  5. Kubernetes之后的第二个托管项目,也是从CNCF第二个毕业的项目。

二:Prometheus的主要特征:

  1. 1Prometheus使用的是 度量(metric)名称和键/值对标签(label)的时间序列数据,是一种多
  2. 维的数据模型。
  3. 2PromQL是一种灵活的查询语言,可以利用度量(metric)名称和标签进行查询、聚合。
  4. 3、不依赖于分布式存储,单个Prometheus服务也是自治理的。
  5. 4、使用基于HTTP的拉(pull)模型进行时间序列的数据收集。
  6. 5、同时也支持通过一个中间网关(pushgateway)来推送时间序列。
  7. 6、目标对象(主机)是通过静态配置或者服务发现来添加的。
  8. 7、支持多种图形模式和仪表盘。

三、Prometheus组件

  1. Prometheus目前已经是一个生态系统,具有众多的可选组件。
  2. 1Prometheus Server 本身用于抓取并存储时间序列数据。
  3. 2、客户端程序库用于检测各种编程语言编写的程序代码。
  4. 3pushgateway用于支持短生命周期(short-lived)的作业(job)。
  5. 4、可以针对不同的服务提供对应的导出器(exporters)用于采集度量数据,如HAProxy
  6. MySQL等服务。
  7. 5、用于告警的alertmanager组件
  8. 6、各种支持工具。
  9. 备注:大多数Prometheus组件都是用Go编写的,这使得它们很容易以静态二进制文件的形式
  10. 构建和部署。

四、Prometheus架构以及应用场景

  1. Prometheus架构和生态组件如下图所示:

image_1ei8g9b261lcr1dg6mu51h971g3e9.png-110.4kB


  1. 从上述架构图我们可以知道,Prometheus通过从Jobs/exporters中拉取度量数据;而短周期
  2. jobs在结束前可以先将度量数据推送到网关(pushgateway),然后Prometheus再从
  3. pushgateway中获取短周期jobs的度量数据;还可以通过自动发现目标的方式来监控
  4. kubernetes集群。所有收集的数据可以存储在本地的TSDB数据库中,并在这些数据上运行规
  5. 则、检索、聚合和记录新的时间序列,将产生的告警通知推送到Alertmanager组件。通过
  6. PromQL来计算指标,再结合Grafana或其他API客户端来可视化数据。
  7. Prometheus主要用于大规模的云端环境和容器化微服务(k8s)的监控,通过拉取(pull)应用程
  8. 序暴露出来的HTTP接口或exporter来获取时间序列数据。
  9. Prometheus不适用于对监控要求100%准确的度量数据,比如每个请求的账单,因为收集的
  10. 数据可能还不够详细和完整。
  11. Prometheus将其可以拉取指标的来源称为endpoint(端点),endpoint可以是各种
  12. exporter(导出器)或应用程序。然后,为了拉取endpoint里的数据,Prometheus定义了名为
  13. target(目标)的配置,告诉拉取时要如何进行连接等信息,多个具有相同功能角色的target
  14. 合在一起就构成了一个job(作业),例如,具有相同用途的一组主机的资源监控器
  15. (node_exporter),又或者是MySQL数据库监控器(mysqld_exporter)。
  16. Prometheus默认是将收集到的时间序列数据存储在本地tsdb数据库中,且默认只保留15天,
  17. 也可以配置发送到其他时间序列数据库中。

五、安装并配置Prometheus

  1. Prometheus本身也是一个导出器(exporter),提供了关于内存使用、垃圾收集以及自身性能
  2. 与健康状态等各种主机级指标。
  3. prometheus官网下载址:
  4. https://prometheus.io/download/
  5. wget https://github.com/prometheus/prometheus/releases/download/v2.21.0/prometheus-2.21.0.linux-amd64.tar.gz
  6. # tar xf prometheus-2.21.0.linux-amd64.tar.gz
  7. # mv prometheus-2.21.0.linux-amd64 /usr/local/prometheus
  8. # chmod +x /usr/local/prometheus/prom*
  9. # cp -rp /usr/local/prometheus/promtool /usr/bin/

image_1ei8gj7uku33mrh93ip06m5m.png-192.4kB

image_1ei8gjm511jmj1nuds7r1cep9m113.png-80.4kB

  1. Prometheus的配置文件是YAML格式,大致分为四大块,包括:globalalerting
  2. rule_filesscrape_configs。在下面的prometheus.yml配置文件中来描述其用途。

  1. # my global config
  2. global:
  3. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  4. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  5. # scrape_timeout is set to the global default (10s).
  6. # Alertmanager configuration
  7. alerting:
  8. alertmanagers:
  9. - static_configs:
  10. - targets:
  11. # - alertmanager:9093
  12. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  13. rule_files:
  14. # - "first_rules.yml"
  15. # - "second_rules.yml"
  16. # A scrape configuration containing exactly one endpoint to scrape:
  17. # Here it's Prometheus itself.
  18. scrape_configs:
  19. # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  20. - job_name: 'prometheus'
  21. # metrics_path defaults to '/metrics'
  22. # scheme defaults to 'http'.
  23. static_configs:
  24. - targets: ['localhost:9090']
  25. labels:
  26. app: prometheus
  27. nodename: prometheus-services
  28. - job_name: 'k8s'
  29. static_configs:
  30. - targets: ['192.168.100.11:9100']
  31. labels:
  32. app: master01
  33. nodename: node01.flyfish
  34. role: master
  35. - targets: ['192.168.100.12:9100']
  36. labels:
  37. app: node02
  38. nodename: node02.flyfish
  39. role: node
  40. - targets: ['192.168.100.13:9100']
  41. labels:
  42. app: node03
  43. nodename: node03.flyfish
  44. role: node

  1. promtool check config /usr/local/prometheus/prometheus.yml

image_1ei91eagm18ru1hsi8141nj01lgm1g.png-51.8kB


  1. 启动prometheus:
  2. cd /usr/local/prometheus/
  3. ./prometheus --config.file=prometheus.yml &

image_1ei91icd91fvt1fk91k0t13n08vf1t.png-195.5kB

image_1ei91jieoo2pftn1ishti3mmb2a.png-127.2kB

  1. ps -ef |grep prometheus
  2. netstat -nultp |grep 9090

image_1ei91mluf7b2u80j421ksjtl42n.png-94.8kB


  1. 守护进程启动
  2. cat > /usr/lib/systemd/system/prometheus.service <<EOF
  3. [Unit]
  4. Description=Prometheus
  5. [Service]
  6. ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --
  7. storage.tsdb.path=/usr/local/prometheus/data --web.enable-lifecycle --storage.tsdb.retention.time=180d
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target
  11. EOF

  1. chmod +x /usr/lib/systemd/system/prometheus.service
  2. service prometheus start
  3. chkconfig prometheus on

image_1ei94gmj21u671b75sq4159mhqo8q.png-107.9kB

image_1ei94h4nh1d2v13rmo611036aji97.png-134kB

  1. 打开web
  2. Prometheus内置的控制台访问入口:http://IP:9090/graph
  3. Prometheus本身暴露度量数据的HTTP接口为:http://IP:9090/metrics

image_1ei91roimb7t17244061ccif9434.png-124.2kB

image_1ei91si9d14fj19ds3atmce168v3h.png-434.4kB

image_1ei91vo0bdit337139n1eoa11sj3u.png-463.2kB


  1. promhttp_metric_handler_requests_total

image_1ei92ht0315d1nb81euprau1pgh4b.png-269.6kB

  1. promhttp_metric_handler_requests_total{code="200"}

image_1ei92kpne14a51e4dkd1mar13hr4o.png-145.3kB


  1. count(promhttp_metric_handler_requests_total)

image_1ei92mi4k10e27rb1pdc1nq16kr55.png-120.2kB

  1. rate(promhttp_metric_handler_requests_total{code="200"}[1m])

image_1ei92ovrj1ejk1qp0gbpu5d10675i.png-122.4kB

六:node_exporter使用

  1. 在客户端上面部署:
  2. tar -zxvf node_exporter-1.0.1.linux-amd64.tar.gz
  3. mv node_exporter-1.0.1.linux-amd64 /usr/local/node_exporter
  4. /usr/local/node_exporter/node_exporter &

image_1ei939cd1ir31stq1s8m97fuo65v.png-176.4kB

image_1ei93a5m51neg162btddjlaqbb6c.png-238.1kB

image_1ei93cov81dk01t7m1vimlm61coc6p.png-49.3kB

image_1ei93eijn1npq8vm1t8t1468aav76.png-271.2kB

  1. 同理其它主机也一样部署

image_1ei93gv5v12rajvp16aok1u166j7j.png-259.7kB

  1. 守护进程启动:
  2. cat > /usr/lib/systemd/system/node_exporter.service <<EOF
  3. [Unit]
  4. Description=node_exporter
  5. [Service]
  6. ExecStart=/usr/local/node_exporter/node_exporter \
  7. --web.listen-address=:9100 \
  8. --collector.systemd \
  9. --collector.systemd.unit-whitelist="(ssh|docker|rsyslog|redis-server).service" \
  10. --collector.textfile.directory=/usr/local/node_exporter/textfile.collected
  11. Restart=on-failure
  12. [Install]
  13. WantedBy=multi-user.target
  14. EOF

image_1ei9429go1t1m1omkl4n3b3lm80.png-108.7kB


  1. chmod +x /usr/lib/systemd/system/node_exporter.service
  2. service node_exporter start
  3. chkconfig node_exporter on
  4. netstat -nultp |grep 9100
  5. ps -ef |grep node_exporter

image_1ei944u7vnmlf3pb0l1ft8175u8d.png-124kB


七: 启动参数 说明

  1. 二、启动参数说明
  2. 1、启用systemd收集器
  3. systemd收集器记录systemd中的服务和系统状态。首先需要通过参数--collector.systemd
  4. 用该收集器,同时如果不希望收集所有的服务,只收集部分关键服务,node_exporter在启动
  5. 时可以使用--collector.systemd.unit-whitelist参数配置指定的服务。
  6. 2、指定textfile收集器目录
  7. 使用textfile收集器可以让用户添加自定义的度量指标,功能类似pushgateway,同zabbix
  8. 自定义的item一样,只要将度量指标和值按照prometheus规范的格式输出到指定位置且
  9. 以.prom后缀文件保存,textfile收集器会自动读取collector.textfile.directory目录下所有
  10. 以.prom结尾的文件,并提取所有格式为Prometheus的指标暴露给Prometheus来抓取。
  11. textfile收集器默认是开启的,我们只需要指定--collector.textfile.directory的路径即可。
  12. --collector.textfile.directory=/usr/local/node_exporter/textfile.collected

  1. 例如,需要监控系统登录用户数
  2. # echo "node_login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom
  3. # echo "node_processes $(ps -ef |wc -l)" > /usr/local/node_exporter/textfile.collected/node_processes.prom
  4. 以定时任务的方式采集
  5. */1 * * * * echo "login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom
  6. */1 * * * * echo "login_users $(who |wc -l)" >
  7. /usr/local/node_exporter/textfile.collected/node_processes.prom

  1. 3、启用或禁用收集器
  2. 通过 ./node_exporter -h 命令,可以看到默认启用了哪些收集器(default: enabled),若要禁
  3. 用某个收集器,如
  4. --collector.ntp,可以修改为 --no-collector.ntp,即禁用该收集器。

  1. 4、只添加指定收集器。
  2. node_exporter等各种收集器默认会收集非常多的指标数据,有很多并非我们所需要的,是可
  3. 以不收集的,我们可以在启动node_exporter时指定禁用某些收集器,也可以在Prometheus
  4. 的配置文件中(注意是Prometheus)的scrape_configs配置块下指定只收集哪些指标,配置
  5. 格式大致如下:
  6. scrape_configs:
  7. - job_name: 'node_exporter'
  8. static_configs:
  9. - targets: ['node01:9100']
  10. params:
  11. collect[]:
  12. - cpu
  13. - meminfo
  14. - netstat
  15. - xfs
  16. 详细配置可参照github文档(https://github.com/prometheus/node_exporter)。
  17. 使用场景:只有在我们非常清楚每一个收集器用途时才使用该方法,官方推荐按默认收集所有
  18. 数据,然后禁用某些不需要的收集器。

八: 监控系统资源的方法论

  1. google sre handbook中提出了评估系统是否存在问题,用户体验是否受影响,用四个黄
  2. 金信号来判断:Latency(延迟)、Traffic(流量)、Errors(错误数)、Saturation(饱和
  3. 度)。
  4. 但在系统资源监控用得较多的方法是"USE"方法,分别表示为:Utilization(使用率)、
  5. Saturation(饱和度)、Errors(错误数)

  1. 1CPU使用率监控
  2. (1- (avg(irate(node_cpu_seconds_total{nodename=~"node01.flyfish",mode="idle"}[5m]))))
  3. * 100
  4. 或者
  5. 100 - (avg(irate(node_cpu_seconds_total{nodename=~"node01.flyfish",mode="idle"}
  6. [5m])) * 100)

image_1ei964h1btdt1551ifv1t7319ii9k.png-259.4kB

image_1ei967u4s1iro1ekb1a121ffd1nk5a1.png-326.2kB


  1. 2、内存使用率监控
  2. (1-(node_memory_MemAvailable_bytes{nodename="node01.flyfish"})/node_memory_MemTotal_bytes{nodename="node01.flyfish"} ) * 100
  3. (node_memory_MemTotal_bytes{nodename="node01.flyfish"} -node_memory_MemAvailable_bytes{nodename="node01.flyfish"})/node_memory_MemTotal_bytes{nodename="node01.flyfish"} * 100
  4. 如果将BuffersCached也作为可用内存,则内存使用率计算公式如下:
  5. (node_memory_MemTotal_bytes{nodename="node01.flyfish"} -(node_memory_MemFree_bytes{nodename="node01.flyfish"} +node_memory_Buffers_bytes{nodename="node01.flyfish"} +node_memory_Cached_bytes{nodename="node01.flyfish"}))/node_memory_MemTotal_bytes{nodename="node01.flyfish"} * 100

image_1ei96k0lfm8iocfp311gk43m3ar.png-280.4kB

image_1ei96l6081g3fgum1nn4toevu4b8.png-299.7kB

image_1ei96itjn6cgr14lk0i5v1mibae.png-278.7kB

  1. 上述公式的标签名用nodename来替换了instance,因为在prometheus中配置时,instance
  2. job都按缺省取默认值。

  1. 3、磁盘分区使用率监控
  2. (1- (node_filesystem_avail_bytes{nodename="node01.flyfish",mountpoint="/"} /
  3. node_filesystem_size_bytes{nodename="node01.flyfish",mountpoint="/"})) * 100
  4. 磁盘使用预测
  5. predict_linear()函数,根据前一个时间段的值来预测未来某个时间点数据的走势。
  6. predict_linear(node_filesystem_free_bytes{device="rootfs",nodename=~"node01.flyfish",mountpoint="/"}[1d],24*3600) /(1024*1024*1024)
  7. 上面这个表达式含义是根据近1天的磁盘空闲情况,预测在明天的这个时间磁盘还空闲多少。
  8. 测试:dd if=/dev/zero of=/disktest bs=1024 count=2097152

image_1ei96og6q1nv6ru5q5dpomr1vbl.png-216.4kB


  1. 4CPU饱和度监控
  2. CPU饱和度通常是按系统的平均负载来衡量,如观察主机CPU数量(通常按逻辑CPU来算)在一
  3. 段时间内平均运行的队列长度,当平均负载小于vCPU数量则认为是正常的,若负载长时间超
  4. CPU的数量则认为CPU饱和。
  5. 我们先来看看如何查看主机的物理CPU个数、每个物理CPU的核数、每个物理CPU有多少个逻
  6. CPU(购买云主机时的vcpu数或叫线程数)。
  7. 通过过滤"physical id"查看物理CPU
  8. # cat /proc/cpuinfo |grep "physical id" | uniq | wc -l
  9. 通过过滤"cpu cores"查看每个物理CPU有多个核数
  10. # cat /proc/cpuinfo | grep "cpu cores" | uniq
  11. 通过过滤"siblings"查看每个物理CPU下有多少个逻辑CPU
  12. # cat /proc/cpuinfo | grep "siblings" |uniq
  13. 或者通过过滤"processor"查看所有物理cpu下的逻辑cpu个数
  14. # cat /proc/cpuinfo | grep "processor" | wc -l

image_1ei96vq9o1ft4q154kv15no1ugsc2.png-86.6kB


  1. CPU饱和度监控
  2. avg(node_load1{nodename="node01.flyfish"}) by
  3. (nodename)/count(node_cpu_seconds_total{nodename="node01.flyfish",mode="system"
  4. }) by (nodename)
  5. 或者以下这种写法
  6. avg(node_load1{nodename="node01.flyfish"})/count(node_cpu_seconds_total{nodename
  7. ="node01.flyfish",mode="system"})

image_1ei9735aq1l3s169a1j7e14mk13f7cf.png-257.4kB

image_1ei973sbl62o5g1si211b2199gcs.png-286.5kB

  1. 5、内存饱和度
  2. 可以用下面这两个指标来评估内存饱和度。
  3. node_vmstat_pswpin:系统每秒从swap读到内存的字节数,读取的是/proc/vmstat下的
  4. pswpin(si),单位是KB/s
  5. node_vmstat_pswpout:系统每秒从内存写到swap字节数,读取的是/proc/vmstat下的
  6. pswpout(so),单位是KB/s
  7. 内存饱和度计算,个人理解是上面2个指标之和大于0时表示已使用到交换分区,内存达到饱
  8. 和?但如果交换分区未启用该如何计算饱和度?

  1. 6、磁盘IO使用率
  2. avg(irate(node_disk_io_time_seconds_total{nodename="node01.flyfish"}[1m]))
  3. by(nodename) * 100

image_1ei9779as1mmrh57pfo1crj1abmd9.png-482.1kB

  1. 7、网卡接收/发送流量监控
  2. irate(node_network_receive_bytes_total{nodename=~'node01.flyfish',device=~"ens33"}[5m])*8
  3. irate(node_network_transmit_bytes_total{nodename=~'node01.flyfish',device=~"ens33"}
  4. [5m])*8
  5. increase()函数,获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以[区间]
  6. 时间(秒)就可以获取该时间内的平均增长率与rate函数用途相同(注意是rate()不是irate),如下
  7. 两个图所示。

image_1ei97bchgu6p12aj6qn1bp91hsgdm.png-465.6kB

image_1ei97c2a4178q1robaj01do31hqve3.png-399.6kB

  1. 总结:在使用Prometheus来监控各种系统指标时,要熟悉并记住对应的metric name以及该
  2. metric name对应是何种数据类型,然后就是熟悉PromQL的各种函数使用。系统资源饱和度
  3. 是对使用率的一个补充,能让管理者做出有关系统的最佳决策
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注