最近自己个人尝试在使用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标题最右边 黑色皮肤下可能会忽略