# 简介
- 一个监控服务器,也是一个时序数据库TSDB
- 有专门的PQL,即Prometheus查询语言
- 基于go语言开发
- 可以监控主机,也可以监控容器
- 官网:https://prometheus.io/
- exporter的地址:https://prometheus.io/docs/instrumenting/exporters/
- node_exporter的下载地址:https://prometheus.io/download/
- 告警配置,规则配置等的参考文档:https://samber.github.io/awesome-prometheus-alerts/
# 启动
./prometheus --config.file=prometheus.yml --web.enable-lifecycle
# 如果配置了--web.enable-lifecycle,那么改变了prometheus.yml,可以执行下面的命令加载配置
curl -X POST http://localhost:9090/-/reload
# nginx监控
两种方案对nginx进行监控,第一种是nginx自带的stub_status模块进行监控,第二种是用vts监控工具进行监控。这两种方案都是基于prometheus于grafana结合三方模块或者监控工具搭建的。
## tub_status模块监控
# 1.如果有输出with-http_stub_status_module,说明启用了stub_status模块,如果没有就需要对nginx源码重新编译安装
nginx -V 2>&1 | grep -o with-http_stub_status_module
# 2.确认开启了之后,修改nginx的配置:
server {
location = /status {
stub_status on;# nginx_status;两个待确认
access_log off;
}
}
# 3.启动nginx-prometheus-exporter 下载的地址:https://github.com/nginxinc/nginx-prometheus-exporter/releases
nohup ./nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:80/nginx_status &
# 4.prometheus.yml中添加被监控的节点
# 采集nginx的指标
- job_name: 'nginx_status_module'
# 拉取指标的接口路径
metrics_path: '/metrics'
# 采集指标的间隔周期
scrape_interval: 10s
static_configs:
# nginx-prometheus-exporter服务的ip和端口
- targets: ['127.0.0.1:9113']
# 5.在grafana中导入模板,模板链接:https://grafana.com/grafana/dashboards/12708
## vts工具监控
# 1.vts模块下载,链接:https://github.com/vozlt/nginx-module-vts
# 2.解压放到nginx目录下,nginx源码重新编译安装
# 3.修改nginx的配置文件
#nginx配置server中添加:
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
#http中添加:
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
# 4.启动nginx后访问:http://localhost/status,确认是否有数据
# 5.启动nginx-vts-exporter
nginx-vts-exporter -nginx.scrape_uri=http://172.17.9.70/status/format/json
# 6.修改prometheus.yml
- job_name: 'nginx'
static_configs:
- targets: ['172.17.9.70:9913'] #9913为工具启动的端口
labels:
instance: nginx
# 7.导入grafana模板:https://grafana.com/grafana/dashboards/2949
# java应用监控
JMX-Exporter 提供了两种用法:
- 启动独立进程。JVM 启动时指定参数,暴露 JMX 的 RMI 接口,JMX-Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
- JVM 进程内启动(in-process)。JVM 启动时指定参数,通过 javaagent 的形式运行 JMX-Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程,所以普遍使用第二种方式
jmx_exporter的地址:https://github.com/prometheus/jmx_exporter
java -javaagent:./jmx_prometheus_javaagent-0.19.0.jar=12345:config.yaml -jar yourJar.jar
config.yaml的简版配置:
rules:
- pattern: ".*"
grafana的模板:8563,7727
# alertmanager告警
下载alertmanager:https://prometheus.io/download/
修改配置文件alertmanager.yml
global:
# 恢复的超时时间,这个跟告警恢复通知有关,此参数并不是说在这个时间没有收到告警就会恢复
resolve_timeout: 5m
# 邮件服务器:端口
smtp_smarthost: 'smtp.qq.com:465'
# 发送人
smtp_from: '841677557@qq.com'
# 发生的邮箱账号
smtp_auth_username: '841677557@qq.com'
# 授权码或密码
smtp_auth_password: '123456'
# 请求TLS,false即可
smtp_require_tls: falseroute:
# 默认以告警名进行分组,就是rule文件的alert值进行分组
group_by: ['alertname']
# 发送警报前,至少等待多少秒才会发送(为了收集同组更多的警报信息一起发送)
group_wait: 10s
# 如果警报1已经发送,这时又出现同组的警报2,由于组状态发生变化,警报会在group_interval这个时间内发送,不会被repeat_interval这个时间收敛
group_interval: 10s
# 报警信息已发送,但事件并没有恢复,则等待多久时间再重新发送(生产环境一般设成20min或者30min)
repeat_interval: 20m
# 发送警报的接收器名称,即对应下面的<receivers>配置段中的<name>值
# 如果一个报警没有被下面的<routes>配置段中的<receiver>字段匹配,则发送给这个默认的接收器
receiver: 'devops.webhook'# 为node_exporter、docker、mysqld_exporter等的Job定义匹配路由,每个路由有自己的分组在告警时信息就会单独发送到对应的组
routes:
# 每个服务可以定义自己的接收者,这样在发送时就可以发送给不同的人,不同的服务对应不同的处理人员,需要对应下面<receivers>配置段中的<name>值
- receiver: 'devops.mail'
# 组等待时间,同上面的全局配置一个意思
group_wait: 10s
group_by: ['node_exporter']
match_re:
# 匹配分组,即使用prometheus中的labels标签信息进行匹配分组发送告警,ps: 分组发送的关键点
job: node2- receiver: 'devops.webhook'
group_wait: 10s
group_by: ['geth']
match_re:
job: geth2- receiver: 'devops.mailwechat'
group_wait: 10s
group_by: ['mysqld_exporter']
match_re:
job: mysqld_exporter# 发送告警信息给哪个接收者
receivers:
# 这个需要和上面全局默认<receiver>或者<routes>中的<receiver>值定义的接收者名称一致
- name: 'devops.webhook'
webhook_configs:
- url: 'http://192.168.4.88:5001/webhook'- name: 'devops.mail'
email_configs:
- to: 'luzhining@guangzhoudaze.com'
# 邮件主题
headers: { Subject: "[WARN] Prometheus 报警邮件" }
# 发送告警恢复通知
send_resolved: true# 将这个告警同时发送到邮件和企业微信
- name: 'devops.mailwechat'
email_configs:
- to: '841677557@qq.com'
headers: { Subject: "[WARN] Prometheus 报警邮件" }
send_resolved: true# 企业微信配置
wechat_configs:
# 第三方企业应用的密钥,可以在自己创建的第三方企业应用详情页面查看。
- api_secret: 'ERDiPpoFB3IezMgj8yDksP5anY27__gM_TVkZGk28VY'
# 第三方企业应用的 ID,可以在自己创建的第三方企业应用详情页面查看。
agent_id: '1000082'
# 企业微信账号唯一 ID, 可以在我的企业中查看。
corp_id: 'wx2b1e95bda2a7b974'
# 需要发送的组/部门。
to_party: '1366'
send_resolved: true# 抑制规则,防止告警风暴
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'env', 'instance']# 配置推送通知的模板
templates:
- '/app/alertmanager/wechat.tmpl'
启动命令参考:
./alertmanager --config.file=./alertmanager.yml --storage.path="./alertmanager/data/" --data.retention=120h
# 启动后更新配置文件,可以直接加载,也可以访问9093端口确认
curl -X POST http://localhost:9093/-/reload
完善下prometheus的配置文件prometheus.yml
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093rule_files:
- "rules/*.yml"
企业微信的告警模板(wechat.tmpl):
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========故障告警==========
告警类型:{{ $alert.Labels.alertname }}
故障主机:{{ $alert.Labels.instance }}
告警详情:{{ $alert.Annotations.summary }}
触发时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========故障恢复==========
告警类型:{{ $alert.Labels.alertname }}
故障主机:{{ $alert.Labels.instance }}
告警详情:{{ $alert.Annotations.summary }}
触发时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
# node_exporter
node_exporter的下载地址:https://prometheus.io/download/
[Unit]
Description=node_exporter
After=network.target[Service]
Type=forking
User=jssuz.dev
ExecStart=/app/node_exporter-1.7.0.linux-amd64/node_exporter --collector.systemd --collector.systemd.unit-include=(node_exporter|nginx).service[Install]
WantedBy=multi-user.target