最近自己个人尝试在使用prometheus+grafana监控工作业务上的指标, 但是报警功能还没有实际用上,但是感觉是很好用,写下一些啃prometheus官网文档并且自己用到的一些配置的总结,后续还用到其他东西再更新。如果想深入理解还是请看官方文档(https://prometheus.io/docs/introduction/overview/)

安装

直接在操作系统上安装

docker compose

version: "3"

networks:
monitor:
driver: bridge services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
volumes:
- ./prometheusConfig:/etc/prometheus
- ./data/prometheus:/prometheus
ports:
- "9090:9090"
hostname: prometheus
networks:
- monitor
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
- "--web.console.templates=/usr/share/prometheus/consoles"
- "--storage.tsdb.retention.time=3d"
- "--web.enable-lifecycle" alertmanager:
image: prom/alertmanager
container_name: alertmanager
hostname: alertmanager
restart: always
ports:
- '9093:9093'
volumes:
- ./data/alertmanager:/alertmanager/data
- ./alertmanager.yml:/alertmanager.yml
command:
- "--config.file=/alertmanager.yml"
networks:
- monitor grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- ./data/grafana:/var/lib/grafana
networks:
- monitor

prometheus

理解

prometheus是一个时序性数据库,能够比较高效, 方便的采集时序列数据并以时间建立索引,以及维护数据的存储时间以免磁盘被打满。毕竟时序性数据库主要就是用来监控,监控指标存储过早之前的数据并没什么意义。

此外prometheus还提供规则功能,报警规则用于报警,但是prometheus只是做发现以及生成需要报警的消息, 发送报警的工作由alertmanager来完成。

prometheus.yml

# prometheus_config/prometheus.yml
global: # 全局变量
scrape_interval: 1m # 访问目标间隔 可以在job单独配置
evaluation_interval: 30s # 访问规则的间隔 rule_files: # 规则文件
- 'rules/*' alerting:
alertmanagers:
- scheme: http # 使用http协议发起请求
static-configs:
- targets: [alertmanager:9093] scrape_configs:
- job_name: 'nginx_demo'
scrape_interval: 10s
#static_configs: # 静态配置
#- targets: ['192.168.56.100:9100']
file_sd_configs: # 动态配置
- files:
- /etc/prometheus/nginx.yml
refresh_interval: 1m # 刷新时间 即修改后最大生效时间
metrics_path: "/metrics" # 默认数据采集路径 不配置的话就是 metrics
# prometheus_config/nginx.yml
- targets:
- "192.168.56.100:9100"

metrics接口返回格式

key0 value0
key1 value1
key2{label0=value0} value2

nginx_2xx 10234
nginx_3xx 1023
nginx_4xx 12
nginx_5xx{level="error"} 239

报警规则文件 rules/alert.yml

# rules/alert.yml
groups:
- name: nginx_example
rules:
- alert: test
expr: nginx_5xx > 100
for: 1m
labels:
serverity: warning
process: nginx
annotations:
summary: "nginx 5xx is too much"
description: "instance: {{ $labels.instance }} number:{{ $value }}"

alertmanger

理解

​ alertmanager进程作用是接收来自prometheus进程的报警规则消息后, 进行下一步动作(通知到人), 而alertmanager并不真正关心指标(规则)的具体细节, 而只关心告警规则的labels用于进行路由分类 将告警以合适的方式发送到应当通知到的人而不骚扰其他人。

​ 同时altermanager提供的高级功能则是 将短时间内的报警邮件进行统一发送以及重复持续的报警有间隔的发送, 有过被重复报警刷满收件箱前几页的同学 经常能体会到这个功能的人性化。

​ 但最重要的还是制定好报警规则, 少即是多, 多即是无, 大量无意义的报警不仅只是骚扰到收件人, 更会让真正需要被注意到的报警被掩盖,失去报警这件事情原本的意义。

alertmanager.yml

# alertmanager.yml
global:
# 邮件报警设置 都可以在 receiver单独配置
smtp_from: example@demo.com
smtp_smarthost: smtp.example.org:587
smtp_auth_username: example@demo.com
smtp_auth_password: password
smtp_require_tls: false # 协议是否使用tls 需要注意默认是 true # 报警时调用api 暂略 route: # 路由 这将会是一个树形数据结构, 如果不满足任何子节点 才会使用本节点配置 核心数据是规则的label
receiver: default # 接收者 下面会定义
group_by: ['serverity'] # 分组使用的labels 属性 如果是 ... 则使用所有labels分组 group_interval: 1m # 针对该组发送报警邮件的间隔 间隔内多封报警会集合后发送一封
repeat_interval: 20m # 相同报警邮件发送频率间隔 如报警a b两个规则邮件发送后, c也触发了则算是新的报警 abc 1m 后一起发送 match: # 全等匹配
serverity: notice match_re: # 正则匹配
serverity: warning | error continue: true # 是否尝试匹配子节点路由 注意 默认是false routes: # 子节点路由
- [route] # 也是route结构 receivers: # 接收者
- name: default
email_config: # 接受者的邮件设置
to: all@demo.com

grafana

登录

默认账号密码都是admin

增加prometheus作为数据源

  • 右边侧边栏 Configuration --> Data Sources 进入配置页
  • 右上角 Add data source 按钮 进入增加数据源页
  • 选择prometheus 并进行host等配置即可

增加第一个简单折线图标

  • 在Home页面 选择Add dashboard

  • 选择右上角按钮 Add panel

  • 选择Add Query 进入pannel配置页面

  • Query 选择prometheus

  • 可以在一个panel显示多个指标 这里只弄一个 Metrics框输入nginx_2xx Min time interval框和采集时间时间间隔保持一致 如 10s

  • 点击页面左下角设置图标 给panel title改为 nginx

  • 保存即可

其他

  • panel可以分多个ROW 创建一个新ROW的方法是新建一个panel 点击conver to row
  • row的排序拖动按钮在row标题最右边 黑色皮肤下可能会忽略

最新文章

  1. 最近用到js筛选一个url的域名部分(草创)
  2. WINDOW.PARENT.CKEDITOR.TOOLS.CALLFUNCTION 图片上传
  3. 不插网线,看不到IP的解决办法
  4. 配置SharePoint使用ADFS
  5. 【Todo】Zookeeper学习
  6. 【转】Redis主从复制简介
  7. 使用POI读取excel文件内容
  8. noNamespaceSchemaLocation前添加xsi
  9. 比较C++中的4种类型转换方式(转自http://blog.csdn.net/hrbeuwhw/article/details/7884797)
  10. 深入理解泛型之JAVA泛型的继承和实现、泛型擦除
  11. Assembly Experiment3
  12. 【WebAPI No.1】创建简单的 .NETCore WebApi
  13. Random.nextInt()替换Math.random()
  14. idea android 开发
  15. mysql 查看当前使用的配置文件my.cnf的方法(推荐)
  16. Build OpenJdk
  17. AI Summit(2018.07.19)
  18. 设置java.library.path的值(Mac/Linux/Windows)
  19. C#数组之 []、List、Array、ArrayList应用
  20. grails3.1.5 com.mysql.jdbc.Driver

热门文章

  1. 洛谷 P2004 领地选择 题解
  2. tensorflow手写数字识别(有注释)
  3. Spark-Streaming kafka count 案例
  4. ES6 数组方法 forEach map filter find every some reduce
  5. mysql max()函数,min()函数,获取最大值以及最小值
  6. 【0521模拟赛】小Z爱划水
  7. ckplayer去掉/修改右上角logo(位置)
  8. (四)Cisco dhcp snooping实例2-多交换机环境(DHCP服务器和DHCP客户端位于不同VLAN)
  9. iwms后台编辑器无法粘贴word格式的解决方法
  10. 第06组 Alpha事后诸葛亮