第一次接触Prometheus,在调研过程中也遇到过一些困惑,觉得有必要把整个过程回顾一下,作为新人的参考。本篇只介绍Prometheus的基本工作原理和相关配置,不对其做深入探讨!
前言 工作原理
Prometheus本身是一个时间序列数据库和监控报警系统,主要以Pull的方式将数据按照时间序列拉取存储到本地,并根据制定好的报警规则对数据进行筛选,并将筛选的数据推送到alertmanager,alertmanager根据配置对报警进行分组和降噪处理,然后将报警事件发送到配置的receiver(报警网关,可以是邮箱、webhook等)将报警发出。
数据拉取的来源称之为exporter,exporter可以理解为一个http服务,默认情况下,Prometheus会从exporter的/metrics路径下拉取数据,比如exporter的监听地址为:127.0.0.1:9100,则为。此路径可以在配置文件中配置metrics_path: "/prometheus"以进行更改。
Prometheus除了以Pull方式拉取数据外,还提供了Pushgateway组件以允许客户端以Push的方式将数据按照规定的格式推送过来,然后Promtheus会定时从Pushgateway拉取数据。
Prometheus的监控数据图形化展示可以对接grafana来做。
结构图如下(官网):
第一节 安装部署
安装非常简单,把相应组件的二进制包下来运行即可,额外的操作无非就是找个统一的目录放置二进制包,再把各个组件加入systemd系统服务,主要组件包括:Prometheus、alertmanager、pushgateway。官网有提供自动化部署方式,比如ansible、puppet、saltstack等,不过可能没法拿来即用,都是需要根据实际情况去做相应修改的。安装这一块儿到此为止,不做过多赘述!
第二节 数据采集
数据采集这一块儿我们拿系统指标监控来做举例介绍。
在介绍工作原理的时候我们提到过exporter,也就是数据采集客户端。Prometheus监控系统指标是从一个叫做的客户端那里获取的数据,我们把node_exporter部署于所有需要采集的机器上,然后在Promtheus配置文件中配置相应的targets项即可。示例配置如下:
-
scrape_configs:
-
- job_name: 'prometheus'
-
static_configs:
-
- targets:
-
- 10.104.255.206:9090
-
- job_name: 'pushgateway'
-
honor_labels: true
-
static_configs:
-
- targets:
-
- 10.104.255.206:9091
-
- job_name: 'alertmanager'
-
honor_labels: true
-
static_configs:
-
- targets:
-
- 10.104.255.206:9093
-
- job_name: 'rabbitmq'
-
static_configs:
-
- targets:
-
- 10.104.255.133:9090
-
- 10.104.255.178:9090
-
labels:
-
env: prod
-
- job_name: "java"
-
metrics_path: "/prometheus"
-
scheme: "http"
-
static_configs:
-
- targets:
-
- 10.104.255.162:32100
-
labels:
-
env: prod
-
- job_name: 'node'
-
static_configs:
-
- targets:
-
- 10.104.255.162:9100
-
- 10.104.255.163:9100
-
- 10.104.255.164:9100
上边node那一项里targes配置的就是各机器上node_exporter的监听地址。
从上边的配置中还可以看到除了node的监控还有rabbitmq的,其实Prometheus官方提供很丰富的exporter,包括memcached、mysql、rabbitmq等等,将需要的exporter部署到需要监控的实例主机上运行起来,然后配置文件中配置相应的targets即可。
第三节 报警
-
global:
-
scrape_interval: 30s
-
evaluation_interval: 5s
-
-
# Alertmanager configuration
-
alerting:
-
alertmanagers:
-
- static_configs:
-
- targets:
-
- 127.0.0.1:9093
-
-
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
-
rule_files:
-
- "/etc/prometheus/rules_rabbitmq.yml"
-
- "/etc/prometheus/rules_system.yml"
-
- "/etc/prometheus/rules_java.yml"
上边配置中的rule_files即是配置报警规则的文件,Prometheus根据规则文件中的配置筛选数据,将筛选出的触发报警规则的数据推送到alertmanager。报警规则配置实例如下:
-
groups:
-
- name: rabbitmq
-
rules:
-
- alert: Rabbitmq状态
-
expr: rabbitmq_up{job="rabbitmq"} == 0
-
for: 1m
-
labels:
-
service: rabbitmq
-
severity: critical
-
annotations:
-
summary: "Rabbitmq状态异常"
-
description: "Rabbitmq状态异常! 当前实例:{{ $labels.instance }}"
-
-
- alert: Rabbitmq磁盘使用
-
expr: rabbitmq_node_disk_free / 1024 / 1024 / 1024 < 2
-
for: 1m
-
labels:
-
service: rabbitmq
-
severity: warning
-
annotations:
-
summary: "磁盘剩余空间不足"
-
description: "磁盘剩余空间不足(<2G)! 当前实例:{{ $labels.instance }}"
其中expr配置的即为查询条件语句,当通过改查询语句查询到数据即触发了改条报警。
对于alertmanager,主要是将收到的报警数据分类,并按照相应的时间机制发送到receiver,主要配置如下:
-
global:
-
-
templates:
-
- '/etc/alertmanager/template/*.tmpl'
-
-
route:
-
group_by: ['alertname']
-
group_wait: 30s
-
group_interval: 10m
-
repeat_interval: 10m
-
receiver: DingTalk
-
-
-
inhibit_rules:
-
- source_match:
-
severity: 'critical'
-
target_match:
-
severity: 'warning'
-
equal: ['alertname', 'cluster', 'service']
-
-
-
receivers:
-
- name: DingTalk
-
webhook_configs:
-
- send_resolved: true
-
url:
此处receiver配置的是自己写的一个,其实就是从alertmanager的报警数据提取出有用的项,然后按照钉钉群机器人支持的数据格式通过钉钉机器人给相应的群发消息,代码写的很烂,功能也很简单,不过可以给大家做个参考!
OK,以上几节基本把Prometheus的简单使用介绍了下,如果有疑惑或者有遇到什么使用上的问题的可以在下边评论,大家可以一块儿探讨下!
阅读(1029) | 评论(0) | 转发(0) |