docker部署prometheus+grafana+alertmanager+各种exporter全方位监控系统,对比ELK
一/prometheus+grafana+alertmanager监控系统与ELK(Beat)对比a.前者搭建比较简单,后者组件更多稍微复杂,但功能稍更强大;b.前者性能自带时序数据库,性能好成本低,后者数据存ES比较吃内存,不适合客户端过多场景;c.前者是拉模式,prometheus根据配置的target周期性去目标节点通过暴露的http端点拉取监控数据到Prometheus时序数据...
一/prometheus+grafana+alertmanager监控系统与ELK(Beat)对比
a.前者搭建比较简单,后者组件更多稍微复杂,但功能稍更强大;
b.前者性能自带时序数据库,性能好成本低,后者数据存ES比较吃内存,都不太适合大规模监控场景;
c.前者是拉模式,prometheus根据配置的target周期性去目标节点通过暴露的http端点拉取监控数据到Prometheus时序数据库,后者推模式,通过各种Beat采集log,metric,hearbeat推送到ES
d.前者Prometheus提供了简易的web UI,可通过promQL查询一些监控信息,但比较low,一般通过grafana数据展示;后者ES本身没有UI,一般通过kibana ,granfna进行数据展示,两者都可以自己定制dashboard并导出,也可导入别人的做好的dashboard模板
e.报警方面前者依赖alertmanager等或grafana添加报警,后者kibana依赖elasticAlert/sentinl,都支持微信/丁丁/邮件/短信等
f.系统指标:前者主要nodeExporter,cadvisor,后者主要是metricbeat
g.应用指标:前者通过json格式NG日志或aop日志需要监控接口性能,请求错误信息等还得依赖ELK部分组件,展示可用grafana;后者专业采集机构化的日志文件无入侵入;两者都可以通过JMX较简单监控JVM等信息
h.业务监控方面:前者通过埋点采集订单数/令牌桶等业务数据到pushgateway(exporter),后者不便埋点采集;
i.两者都没调用链路监控功能,需要单独skywalking/CAT/zipkin等进行监控,或使用arthas进行临时链路分析
二/普罗米修斯原理图
原理图https://prometheus.io/docs/introduction/overview/
三/安装Prometheus
#先把镜像拉下来启动起来,进去把配置文件copy到宿主机
docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
docker cp prometheus:/etc/prometheus/prometheus.yml ./
docker rm -f prometheus
#这里先不改配置文件启动,挂载的报警触发规则文件alert.yml可以先不要
docker run -d -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/alertmanager/alert.yml:/etc/prometheus/alert.yml --name prometheus --net=host --restart=always(随docker自动重启) prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle --web.listen-address=:9090 --web.enable-admin-api
关于参数--web.enable-lifecycle,配置在最后,必须同时指定--config.file,发送post请求进行触发热加载: curl -XPOST localhost:9090/-/reload ,
--web.enable-admin-api是开启admin api权限,可以通过api删除prometheus的指标数据:curl -X POST -g 'http://localhost:8101/prometheus/api/v1/admin/tsdb/delete_series?match[]={application="payment"}' ,参考https://www.qikqiak.com/post/prometheus-delete-metrics/
#在浏览器打开http://IP:9090打开Prometheus的UI,点击status--targets这里能够查看到我们各个监控项,默认暂时只监控自己,也在graph选项通过promQL查询监控数据。
Prometheus.yml
#全局配置可被覆盖
global:
scrape_interval: 1m # 每次数据收集的间隔,默认1m,
evaluation_interval: 30s #评估周期,默认1m
scrape_timeout: 10s #抓取超时时间,默认10s
# 报警配置,主要配置Alertmanager,见后面
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
timeout: 10s
# 报警配置
#报警原理:周期性拉取到指标后评估如果满足规则文件里的触发条件并且保持到指定的“for时间”,报警状态由inactive=>pending=>firing,
#通过配置的alertmanager URL发送http请求给alertmanager,alertmanager收到一个alert并根据alertmanager.yml配置的邮件或webhook丁丁微信等及rules报警
rule_files:
- '/etc/prometheus/alert.yml' #挂载到容器内的路径
#抓取配置
scrape_configs:
- job_name: 'prometheus'
metrics_path: '/metrics' #默认
scheme: 'http' #默认
scrape_interval: 30s #覆盖全局
static_configs:
- targets: ['localhost:9090']
# labels:
# instance: xxx
#安装参考后面的node-exporter
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
# labels:
# instance: yyy
alert.yml
groups:
- name: prometheus
rules:
- alert: prometheus节点UP状态
expr: sum(up{job="prometheus"})==1
for: 1m
labels:
severity: 严重
team: node-prometheus
annotations:
summary: "{{ $labels.job }} 已停止运行超过 1分钟!"
description: "{{ $labels.instance }} 异常停止,请尽快处理!"
value: '{{ $value }}'
四/安装XXexporter拉取其它监控指标
如服务器运行指标。需要在被监控的服务器安装一个nodeexporter,官网https://prometheus.io/download/有多种XXexporter用以暴露一个Prometheus拉去该服务器运行指标的端点。这里有多种exporter,类似ELK是通过XXbeat推送各种被监控端的信息。除了通过exporter间接拉取外,如springboot是通过@EnablePrometheusEndpoint来暴露端点的。官网有二进制压缩包可以减压安装,为方便还是用的docker
docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host --name=node-exporter prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
#mysql监控:docker run -p 9104:9104 -e DATA_SOURCE_NAME="root:password@(127.0.0.1:3306)/databaseName" --net=host --name=mysqld-exporter prom/mysqld-exporter
#容器监控cadvisor(高版本可能有BUG,启动报错缺少XX文件或文件夹,默认使用8080端口,最好不用host网络模式,另外映射一个端口): docker run -d -p 9111:8080 -v /:/rootfs:ro -v /var/run:/var/run:ro -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -v /dev/disk/:/dev/disk:ro --name=cadvisor google/cadvisor:v0.24.1
启动该nodeexporter容器后在Prometheus配置文件的target选项追加一个localhost:9100,然后docker restart prometheus然后监控页面即可看到新增的target,graph也会增加node_XX的一些指标如下可用内存node_memory_MemAvailable_bytes。(指标命名特征:被监控主体名_指标名_其它描述,指标名很多只需要记得关键字即可,如node_memory_MemAvailable_bytes,只需要输出nodemem即可很快找到,也可以从"Excute"按钮后下拉选。)
四/安装gragana,展示prometheus监控数据
1.mkdir /root/grafana-storage
2.chmod 777 -R /root/grafana-storage
3.因prometheus使用了host网络,grafana需要连接promehteus数据源,使用--link会网络冲突,故这里grafana也使用host网络,defaults.ini就改了端口
docker run -d --net=host --name grafana -v /etc/monitor/defaults.ini:/usr/share/grafana/conf/defaults.ini -v /home/monitor/grafana-data:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123456" grafana/grafana
#tar安装:wget https://dl.grafana.com/oss/release/grafana-6.6.1.linux-amd64.tar.gz 直接解压启动,访问http:IP:3000,账号密码默认admin/admin
1.从启动grafana及其配置文件,可以看到并没有指定prometheus或其它datasourse(grafana支持的数据源:如mysql/es/PG/influxdb等,但是不是很友好),故登录进去后首先要链接数据源,如Prometheus/mysql/es等.
2.从grafana官网https://grafana.com/grafana/dashboards下载别人做的json格式的模板,可以把json文件内容贴过来或通过模板ID或通过本地json等方式导入模板,这点比ELK kibana导入模板做得好,如图是8919面板,如果没数据,可能有两个原因:创建数据源填写的Name要与json模板里的datasourse对应;创建datasourse的那个URL默认的placeholder显示灰色不能使用,即使是默认的localhost:9090也得手动敲一下。
也可以自定义dashboard面板:dashboad是多个panel组合到一起显示的一个面板。可以对每个pannel编辑保持:Queris选择数据源编写promQ=> Visualization选择可视化方式,XY轴等=> General通用设置如pannel标题等属性 =>Alert添加报警
插件安装(插件库:https://grafana.com/grafana/plugins?orderBy=weight&direction=asc)
如果比较常用的饼图/世界地图安装:grafana的bin目录执行安装命令(插件默认安装到/var/lib/grafana),安装重启后如果添加panel时页面Visualization还是没有两个插件,修改一下配置文件的defualts.ini的plugins扫描目录(全局搜,约25行,改为plugins = /var/lib/grafana/plugins)
./grafana-cli plugins install grafana-piechart-panel
./grafana-cli plugins install raintank-worldping-app (需要官网申请一个api key)
五/ grafana直接支持了报警,alertManager报警(了解)
安装alertManger,也提供了web ui,访问IP:9093可查看报警配置及报警信息,配置信息,可以在web ui配置静默silence拦截指定时间段满足指定条件的alert等
先拉下来启动
docker run -d -p 9093:9093 --net=host --name alertmanager docker.io/prom/alertmanager:latest
#进入容器查看配置文件
docker exec -it alertmanager /bin/bash 发现报错找不到/bin/bash目录,Prometheus镜像也有这个问题,尝试 docker exec -it alertmanager /bin/sh 或 docker exec -it alertmanager bash
#到宿主机/root/alertmanager/config.yml配置,重启挂载启动
docker run -d -p 9093:9093 -v /root/alertmanager/config.yml:/etc/alertmanager/alertmanager.yml -v /root/alertmanager/email.tmpl/:/etc/alertmanager/email.tmpl --net=host --name alertmanager docker.io/prom/alertmanager:latest
alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '523083921@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '523083921@qq.com'
smtp_auth_password: 'dyfXXXXXX' #非Q密
smtp_require_tls: false
smtp_hello: 'qq.com'
templates:
- '/etc/alertmanager/email.tmpl' #邮件模板文件,容器内的路径
route:
receiver: 'email'
group_by: ['alertname'] #按alertname等进行分组
group_wait: 1m #周期内有同一组的报警到来则一起发送
group_interval: 10m #报警发送周期
repeat_interval: 30m #与上次相同的报警延迟30m才发送,这里应该是(10+30)m左右
routes:
- match: #可以使用match_re正则匹配
severity: 严重
receiver: email #匹配上则发给下面的name=email的receivers
receivers:
# - name: 'email'
# email_configs:
# - to: '523083921@qq.com'
# send_resolved: true
- name: 'email'
email_configs:
- to: '523083921@qq.com'
html: '{{ template "email.jwolf.html" . }}'
send_resolved: true
- name: 'dingding'
slack_configs:
- send_resolved: true
api_url: 丁丁机器人钩子
text: "{{ .CommonAnnotations.description }}"
#抑制规则
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
email.tmpl (go语言)
{{ define "email.jwolf.html" }}
{{ range $i ,$alert := .Alerts }}
=========start==========<br>
告警级别: {{ $alert.Labels.severity }} 级 <br>
告警类型: {{ $alert.Labels.alertname }} <br>
故障主机: {{ $alert.Labels.instance }} <br>
告警主题: {{ $alert.Annotations.summary }} <br>
告警详情: {{ $alert.Annotations.description }} <br>
告警阈值: {{ $alert.Annotations.value }} <br>
触发时间: {{ $alert.StartsAt }} <br>
=========end==========<br>
{{ end }}
grafana直接设置报警
如邮件需要修改安装目录config/defaults.ini搜索SMTP修改相应配置,yum安装的应该在 /etc/grafana/grafana.ini
丁丁等报警则更加简单(省略钉钉机器人webhook相关操作)
需要注意勾选发送提醒:如果不勾选send reminders,alert一直处于alerting状态只会告警一次,否则周期性发追发提醒邮件。只有报警条件解除后才能恢复OK。如果勾选include image可能报警会失败,从日志可看到需要安装插件,但2020/11/19测试最新版本该插件安装不成功./grafana-cli plugins install grafana-image-renderer ,另外可勾选default(send on all alerts)即使用新建报警都默认适用该alert rules
选择panel->edit->小铃铛进行报警设置,评估周期1m和保持时间5m(同Prometheus),及condition(注意A代表"queries选项"设置的promQL,如果queries设置了多个,代号依次是ABCD...,第二个为多少时间内开始,第三个为从何时结束)。如图:每1分钟评估一次 【从5分钟前~现在,A查询的avg()如果is above阈值】,如果保持该状态5分钟则发出报警 。然后选择上步的channel,填写报警内容(如果钉钉机器人设置了机器人keyword等过滤规则,则这里的内容需要还有响应的关键词如“告警”),保存panel即可。参考https://blog.csdn.net/Fickle_actor/article/details/89310878?utm_source=app
报警内容中的两个链接:默认跳转localhost,无法访问,需要修改grafana的配置文件defualts.ini中的配置项 domain:自己的ip
清理战场:docker ps -a |grep Exited |awk '{print $1}'|xargs docker rm -f
推荐阅读:https://github.com/yunlzheng/prometheus-book;http://dockone.io/article/5716
更多推荐
所有评论(0)