ToB企服应用市场:ToB评测及商务社交产业平台

标题: Prometheus+Grafana 监控平台实践-搭建&常用服务监控&告警 [打印本页]

作者: 南七星之家    时间: 2024-2-7 10:09
标题: Prometheus+Grafana 监控平台实践-搭建&常用服务监控&告警
前言

Prometheus 是一个开放性的监控解决方案,通过各种 Exporter 采集当前主机/服务的数据,和 Grafana 相结合可以实现强大的监控和可视化功能
本篇将分享使用 docker compose 构建 Prometheus+Grafana,并监控之前文章所搭建的主机&服务,分享日常使用的一些使用经验
文章较长,已安装可略过,推荐先看第三节 常用服务的 Prometheus+Grafana 配置
特点

使用情况

使用 docker compose 安装 Prometheus

配置文件说明

  1. version: '3.1'
  2. services:
  3.   prometheus:
  4.     restart: always
  5.     container_name: prometheus
  6.     image: prom/prometheus:v2.47.2
  7.     command:
  8.       # 配置文件
  9.       - '--config.file=/etc/prometheus/prometheus.yml'
  10.       # 指定web面板账号密码访问
  11.       - '--web.config.file=/etc/prometheus/web-config.yml'
  12.       # 数据目录
  13.       - '--storage.tsdb.path=/prometheus'
  14.       # 数据保留时间
  15.       - '--storage.tsdb.retention.time=30d'
  16.       # 运行使用 curl -X POST http://localhost:9090/-/reload  重载其配置
  17.       - '--web.enable-lifecycle'
  18.     volumes:
  19.       # 需要权限 mkdir prometheus_data && chown 65534 ./prometheus_data
  20.       - ./prometheus.yml:/etc/prometheus/prometheus.yml
  21.       - ./prometheus_data:/prometheus
  22.       - ./web-config.yml:/etc/prometheus/web-config.yml
  23.     ports:
  24.       - 9090:9090
  25.     networks:
  26.       - devopsnetwork
  27.       
  28. networks:
  29.   devopsnetwork:
  30.     external: true
复制代码
  1. global:
  2.   scrape_interval:     15s # By default, scrape targets every 15 seconds.
  3.   # Attach these labels to any time series or alerts when communicating with
  4.   # external systems (federation, remote storage, Alertmanager).
  5.   external_labels:
  6.     monitor: 'codelab-monitor'
  7. # A scrape configuration containing exactly one endpoint to scrape:
  8. # Here it's Prometheus itself.
  9. scrape_configs:
  10.    - job_name: 'prometheus'
  11.     scrape_interval: 5s
  12.     static_configs:
  13.       - targets: ['localhost:9090']
  14.     # 启用了账号密码 web-config.yml basic_auth_users 需要配置
  15.     basic_auth:
  16.       username: root
  17.       password: devops666
复制代码
  1. basic_auth_users:
  2.   root: $2a$10$c6OOt9f6LuhiabPyW0nkNOprb1ndQ/HHSfqjB/exe7yh5FaYUqvBy
复制代码
Prometheus 指定账号密码访问

  1. basic_auth_users:
  2.   root: $2a$10$kmkC.lHR3Kwl19DE9l1KRerMDinEejEbNmJigrJZYAGkgzbVBUpa2
复制代码
  1. scrape_configs:
  2.    - job_name: 'prometheus'
  3.     scrape_interval: 5s
  4.     static_configs:
  5.       - targets: ['localhost:9090']
  6.     # 启用了账号密码 web-config.yml basic_auth_users 需要配置
  7.     basic_auth:
  8.       username: root
  9.       password: devops666
复制代码
重载配置

修改了配置文件后,可以使用 api 接口重载配置,如果启用了账号密码可以使用 -u 参数指定(basic_auth 修改重载配置无效),没有就不需要加 -u 参数
  1. curl -X POST http://localhost:9090/-/reload
  2. curl -X POST -u root:devops666 http://localhost:9090/-/reload
复制代码
添加 nginx 配置

还不会在局域网申请 ssl 及配置的可以参考之前的文章 前后端都用得上的 Nginx 日常使用经验
  1. server {
  2.     listen 80;
  3.     listen       443 ssl;
  4.     server_name prometheus.devops.test.com;  # 自行修改成你的域名
  5.     ssl_certificate      /certs/prometheus.devops.test.com/server.crt;
  6.     ssl_certificate_key  /certs/prometheus.devops.test.com/server.key;
  7.     ssl_session_cache    shared:SSL:1m;
  8.     ssl_session_timeout  5m;
  9.     ssl_ciphers  HIGH:!aNULL:!MD5;
  10.     ssl_prefer_server_ciphers  on;
  11.     location / {
  12.             proxy_pass http://prometheus:9090;
  13.             proxy_http_version 1.1;
  14.             proxy_buffering off;
  15.             proxy_request_buffering off;
  16.             proxy_set_header Upgrade $http_upgrade;
  17.             proxy_set_header Connection "upgrade";
  18.             proxy_set_header Host $host;
  19.             proxy_set_header X-Forwarded-For $remote_addr;
  20.     }
  21. }
复制代码
安装成功

根据上面的配置,完成了 Prometheus 的搭建,监听本身 Prometheus 的情况
通过https://prometheus.devops.test.com/ 使用账号密码 root devops666 登陆后即可

使用 docker compose 安装 Grafana

Grafana 是一个开源的数据可视化和监控平台,它提供了丰富的图表和面板,用于展示各种指标和数据。提到 Prometheus,Grafana 自然是不不能落下,基于官方和社区,可以很快的制作出监控可视化面板,助力日常运维检测
配置文件说明

  1. version: '3.1'
  2. services:
  3.     grafana:
  4.       restart: always
  5.       container_name: grafana
  6.       image: grafana/grafana:10.2.0
  7.       ports:
  8.         - "3000:3000"
  9.       volumes:
  10.         - ./grafana_data:/var/lib/grafana
  11.       environment:
  12.         - GF_SECURITY_ADMIN_USER=root
  13.         - GF_SECURITY_ADMIN_PASSWORD=devops666
  14.         - GF_USERS_ALLOW_SIGN_UP=false
  15.       networks:
  16.         - devopsnetwork
  17.       
  18. networks:
  19.   devopsnetwork:
  20.     external: true
复制代码
添加 nginx 配置
  1. server {
  2.     listen 80;
  3.     listen       443 ssl;
  4.     server_name grafana.devops.test.com;  # 自行修改成你的域名
  5.     ssl_certificate      /certs/grafana.devops.test.com/server.crt;
  6.     ssl_certificate_key  /certs/grafana.devops.test.com/server.key;
  7.     ssl_session_cache    shared:SSL:1m;
  8.     ssl_session_timeout  5m;
  9.     ssl_ciphers  HIGH:!aNULL:!MD5;
  10.     ssl_prefer_server_ciphers  on;
  11.     location / {
  12.             proxy_pass http://grafana:3000;
  13.             proxy_http_version 1.1;
  14.             proxy_buffering off;
  15.             proxy_request_buffering off;
  16.             proxy_set_header Upgrade $http_upgrade;
  17.             proxy_set_header Connection "upgrade";
  18.             proxy_set_header Host $host;
  19.             proxy_set_header X-Forwarded-For $remote_addr;
  20.     }
  21. }
复制代码
安装成功

通过https://grafana.devops.test.com/使用账号密码 root devops666 登陆后即可


制作监控面板步骤:
添加 Prometheus 数据源


! ! ! 数据源最好是用 IP+端口,避免容器内无法解析 test.com 域名

从 Grafana 导入仪表板




Grafana v10.2.0 常用操作

之前使用的 v6.7.2,当前已经是 v10.2.0 了,故还是选择将 grafana 升级到 v10,升级需要重新创建数据目录
设置中文

在写完文章发现原来已经支持中文了,补上~

导入面板


添加数据源



添加插件


常用服务的 Prometheus+Grafana 配置


常用的一些组件可以在官方下载页中去寻找,使用 Docker 可以去DockerHub去找对应的镜像即可


Linux 监控配置

  1. docker run -d \
  2.   -p 9100:9100 \
  3.   -v "/:/host:ro,rslave" \
  4.   --name node_exporter  \
  5.   --restart always \
  6.   quay.io/prometheus/node-exporter:v1.7.0 \
  7.   --path.rootfs=/host
复制代码

  1. #global:
  2. #  xxx
  3. #...
  4. scrape_configs:
  5.   - job_name: 'linux'
  6.     # 每隔5秒从该作业中抓取目标
  7.     scrape_interval: 5s
  8.     static_configs:
  9.       - targets: ['192.168.123.214:9100','192.168.123.216:9100','192.168.123.219:9100','192.168.123.222:9100']
复制代码





Windows 监控配置


  1. #global:
  2. #  xxx
  3. #...
  4. scrape_configs:
  5.   - job_name: 'win-node'
  6.     # 每隔5秒从该作业中抓取目标
  7.     scrape_interval: 5s
  8.     static_configs:
  9.       - targets: ['192.168.123.201:9182']
复制代码



可以修改时间范围查看监控情况


Nginx 监控配置

  1. server {
  2.     listen       80;
  3.     #...其他配置
  4.     location = /stub_status {
  5.         stub_status;
  6.     }
  7. }
复制代码

  1. docker run -d -p 9113:9113 \
  2. --name nginx_exporter  \
  3. --restart always \
  4. nginx/nginx-prometheus-exporter:0.11 --nginx.scrape-uri=http://192.168.123.214:80/stub_status
复制代码


  1.   - job_name: 'nginx'
  2.     # 每隔5秒从该作业中抓取目标
  3.     scrape_interval: 5s
  4.     static_configs:
  5.       - targets: ['192.168.123.214:9113']
复制代码
重载配置后生效: curl -X POST -u root:devops666  ``http://localhost:9090/-/reload


MySQL 监控配置

  1. CREATE USER 'exporter'@'%' IDENTIFIED BY 'devops666' WITH MAX_USER_CONNECTIONS 3;
  2. GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
复制代码
可以使用之前搭建的 JumpServer 进行执行

  1. docker run -d \
  2.   -p 9104:9104 \
  3.   -e MYSQLD_EXPORTER_PASSWORD=devops666 \
  4.   --name mysql_exporter  \
  5.   --restart always \
  6.   prom/mysqld-exporter:v0.15.0 \
  7.   --mysqld.address 192.168.123.214:3306  \
  8.   --mysqld.username exporter
复制代码

  1.   - job_name: mysql
  2.     static_configs:
  3.       - targets:
  4.         - 192.168.123.214:3306
  5.     relabel_configs:
  6.       - source_labels: [__address__]
  7.         target_label: __param_target
  8.       - source_labels: [__param_target]
  9.         target_label: instance
  10.       - target_label: __address__
  11.         # The mysqld_exporter host:port
  12.         replacement: 192.168.123.214:9104
复制代码
重载配置后生效 curl -X POST -u root:devops666  ``http://localhost:9090/-/reload


MongoDB 监控配置

  1. #docker stop mongodb_exporter && docker rm mongodb_exporter
  2. docker run -d -p 9216:9216 \
  3. --name mongodb_exporter  \
  4. --restart always \
  5. percona/mongodb_exporter:0.20 --compatible-mode --mongodb.uri=mongodb://root:devops666@192.168.123.214:27017
复制代码
  1.   - job_name: mongodb
  2.     static_configs:
  3.       - targets: ['192.168.123.214:9216']
  4.         labels:
  5.           instance: mongodb
复制代码

ClickHouse 监控配置

使用 Prometheus 数据源监控

  1.   - job_name: clickhouse
  2.     static_configs:
  3.       - targets: ['192.168.123.214:9363']
  4.         labels:
  5.           instance: clickhouse
复制代码
  1. version: '3'
  2. services:
  3.   clickhouse-server:
  4.     container_name: db_clickhouse_20_6
  5.     image: yandex/clickhouse-server:20.6.8.5
  6.     restart: always
  7.     ulimits:
  8.       nofile:
  9.         soft: 262144
  10.         hard: 262144
  11.     environment:
  12.       - TZ=Asia/Shanghai
  13.       - ports=8123,9363,9000
  14.     ports:
  15.       - 8123:8123
  16.       - 9363:9363
  17.       - 9000:9000
  18.     volumes:
  19.       - ./data:/var/lib/clickhouse
  20.       - ./logs:/var/log/clickhouse-server
  21.       # 指定配置文件
  22.       - ./config:/etc/clickhouse-server
复制代码
使用数据源插件监控





Redis 监控配置

redis_exporter 单机监控

  1. #docker stop redis_exporter && docker rm redis_exporter &&
  2. docker run -d -p 9121:9121 \
  3. --name redis_exporter \
  4. --restart always \
  5. oliver006/redis_exporter:v1.55.0 \
  6. --redis.addr redis://192.168.123.214:6379 \
  7. --redis.password devops666
复制代码
  1.   - job_name: redis_exporter
  2.     static_configs:
  3.       - targets: ['192.168.123.214:9121']
  4.         labels:
  5.           instance: redis-node
复制代码


redis_exporter 集群监控

  1. docker run -d -p 9122:9121 \
  2. --name redis_exporter_targets \
  3. --restart always \
  4. oliver006/redis_exporter:v1.55.0
复制代码
  1.   - job_name: redis_exporter_targets
  2.     static_configs:
  3.       - targets:
  4.         - redis://192.168.123.216:6380
  5.         - redis://192.168.123.219:6380
  6.         - redis://192.168.123.222:6380
  7.         - redis://192.168.123.216:6381
  8.         - redis://192.168.123.219:6381
  9.         - redis://192.168.123.222:6381
  10.     metrics_path: /scrape
  11.     relabel_configs:
  12.       - source_labels: [__address__]
  13.         target_label: __param_target
  14.       - source_labels: [__param_target]
  15.         target_label: instance
  16.       - target_label: __address__
  17.         replacement: 192.168.123.214:9122
复制代码


使用数据源插件监控 Redis 单机/集群






RabbitMQ 监控配置


  1.   - job_name: rabbitmq
  2.     static_configs:
  3.       - targets: ['192.168.123.214:15692']
  4.         labels:
  5.           instance: rabbitmq
复制代码


站点监控配置

  1. version: '3.1'
  2. services:
  3.   blackbox_exporter:
  4.     restart: always
  5.     container_name: blackbox_exporter
  6.     image: prom/blackbox-exporter:v0.24.0
  7.     command:
  8.       # 配置文件
  9.       - '--config.file=/config/blackbox.yml'
  10.     volumes:
  11.       # blackbox.yml myCA.pem
  12.       - ./config:/config
  13.     ports:
  14.       - 9115:9115
  15.     networks:
  16.       - devopsnetwork
  17.       
  18. networks:
  19.   devopsnetwork:
  20.     external: true
复制代码
  1. modules:
  2.   http_2xx:
  3.     prober: http
  4.     http:
  5.       preferred_ip_protocol: "ip4"
  6.   http_post_2xx:
  7.     prober: http
  8.     http:
  9.       method: POST
  10.   tcp_connect:
  11.     prober: tcp
  12.   pop3s_banner:
  13.     prober: tcp
  14.     tcp:
  15.       query_response:
  16.       - expect: "^+OK"
  17.       tls: true
  18.       tls_config:
  19.         insecure_skip_verify: false
  20.         ca_file:
  21.   grpc:
  22.     prober: grpc
  23.     grpc:
  24.       tls: true
  25.       preferred_ip_protocol: "ip4"
  26.   grpc_plain:
  27.     prober: grpc
  28.     grpc:
  29.       tls: false
  30.       service: "service1"
  31.   ssh_banner:
  32.     prober: tcp
  33.     tcp:
  34.       query_response:
  35.       - expect: "^SSH-2.0-"
  36.       - send: "SSH-2.0-blackbox-ssh-check"
  37.   irc_banner:
  38.     prober: tcp
  39.     tcp:
  40.       query_response:
  41.       - send: "NICK prober"
  42.       - send: "USER prober prober prober :prober"
  43.       - expect: "PING :([^ ]+)"
  44.         send: "PONG ${1}"
  45.       - expect: "^:[^ ]+ 001"
  46.   icmp:
  47.     prober: icmp
  48.   icmp_ttl5:
  49.     prober: icmp
  50.     timeout: 5s
  51.     icmp:
  52.       ttl: 5
  53.   http_custom_ca_devops:
  54.     prober: http
  55.     http:
  56.       method: GET
  57.       tls_config:
  58.         ca_file: /config/myCA.pem
复制代码
  1.   - job_name: blackbox_devops
  2.     metrics_path: /probe
  3.     params:
  4.       module: [ http_custom_ca_devops ]  # Look for a HTTP 200 response.
  5.     dns_sd_configs:
  6.       - names:
  7.           - nginx.devops.test.com
  8.           - apollo.devops.test.com
  9.           - rabbitmq.devops.test.com
  10.           - dns.devops.test.com
  11.           - nexus.devops.test.com
  12.           - jumpserver.devops.test.com
  13.           - grafana.devops.test.com
  14.           - prometheus.devops.test.com
  15.         type: A
  16.         port: 443
  17.     relabel_configs:
  18.       - source_labels: [__address__]
  19.         target_label: __param_target
  20.         replacement: https://192.168.123.214:443/  # Make probe URL be like https://1.2.3.4:443/
  21.       - source_labels: [__meta_dns_name]
  22.         target_label: instance
  23.       - target_label: __address__
  24.         replacement: 192.168.123.214:9115  # The blackbox exporter's real hostname:port.
  25.       - source_labels: [__meta_dns_name]
  26.         target_label: __param_hostname  # Make domain name become 'Host' header for probe requests
  27.       - source_labels: [__meta_dns_name]
  28.         target_label: vhost  # and store it in 'vhost' label
  29.         #匹配apollo,需要访问/health检查状态
  30.       - source_labels: [__param_hostname]
  31.         regex: 'apollo.*'
  32.         target_label: __param_target
  33.         replacement: https://192.168.123.214:443/health
  34.         #匹配prometheus 开启了basic_auth 所以可以使用下面这种方式进行验证,问的gpt,还真行
  35.       - source_labels: [__param_hostname]
  36.         regex: 'prometheus.*'
  37.         target_label: __param_target
  38.         replacement: https://root:devops666@192.168.123.214:443
复制代码




Grafana 监控告警设置

通过设置 Alert rules(预警规则) ,匹配到有指标符合规则时,就会根据 Notification policies(通知策略) 进行消息发送,发送的内容和模板在 Contact points(通知方式) 设置
下面完成一个实际的使用场景:检测 RabbitMQ 面板状态,服务不可用时进行预警,通过企业微信机器人进行群通知
设置预警规则







设置通知策略

可以通过修改重复间隔,重新发送通知


设置告警模板

Grafana 使用 Go 模板语言来创建通知消息,可根据文档自行编写,另外一个aws 的中文文档可以参考
  1. {{ define "DevOpsTemplate" -}}
  2. {{- range .Alerts -}}
  3. {{- range .Annotations.SortedPairs -}}
  4. {{if eq .Name "summary" }}
  5. **{{ "预警消息" }}**:{{ .Value }}
  6. {{- end -}}
  7. {{ end }}
  8. {{- range .Annotations.SortedPairs -}}
  9. {{if eq .Name "runbook_url" }}
  10. **{{ "服务地址" }}**:{{ .Value }}
  11. {{- end -}}
  12. {{ end }}
  13. **{{"预警分组"}}**:{{ .Labels.grafana_folder }}
  14. **{{"开始时间"}}**:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"}}
  15. **{{"预警参数"}}**:
  16.     {{ range .Labels.SortedPairs -}}
  17.       {{ .Name }}:{{ .Value }}
  18.     {{ end }}
  19.     {{- range .Annotations.SortedPairs -}}
  20.     {{- if and (ne .Name "summary") (ne .Name "runbook_url") -}}
  21.       {{ .Name }}:{{ .Value }}
  22.     {{ end }}
  23. {{ end }}
  24. {{- end -}}
  25. {{- end -}}
复制代码
设置通知方式


支持多种通知,根据需要配置,这里以企业微信机器人为例

需要通过告警快速定位问题,实际应用中肯定是需要将告警实例及其信息一并通知,所以还需要结合告警模板和规则进行消息的发送。使用模板语法指定前面设置的模板

设置完成后,当预警规则设置页面出现异常提示时,就会进行提示了

踩坑记录

  1. # 1.定义模板
  2. {{ define "模板名称" -}}
  3. /**/
  4. {{ end }}
  5. # 2.循环预警消息
  6. {{ range .Alerts }}
  7. /**/
  8. {{ end }}
  9. # 3.打印加粗文字
  10. **{{ "预警消息" }}**
  11. # 4.删除空格和换行符
  12. {{ range .Alerts -}}
  13.   {{ range .Labels.SortedPairs -}}
  14.     {{ .Name }} = {{ .Value }}
  15.   {{ end }}
  16. {{ end }}
  17. # 5. 循环附加信息
  18. {{- range .Annotations.SortedPairs -}}
  19. {{ end}}
  20. # 5. if判断
  21. {{if eq .Name "runbook_url" }}
  22. # 6. 时区问题,+8设置
  23. **{{"开始时间"}}**:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"}}
复制代码
相关文档

后语

研究了差不多大半个月,从常用中间件的监控到设置预警,花费了很大的功夫,也掉了不少的头发。
这篇文章写完,个人感觉 Prometheus+Grafana 这套方案算是入门了,满足日常使用肯定是没问题的。
走过不要错过,欢迎留言交流。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4