• 搭建 Prometheus 对服务进行监控


    前言:

            服务平时没啥问题,一到过节我放假,它也想放假,所以只能找个监工看着了。当前市面上主流的监工方案是 zabbix 和 prometheus,没有优劣之分,只是适用场景略有区别。我这边的需求就主要是监控服务的端口、接口响应、关键服务器的信息,使用prometheus比较合适。

    一、prometheus 简介

            这里不做介绍,可以自行查阅或者去官网查询材料 (https://prometheus.io)。介绍几个相关的模块:

    1. prometheus:监控的主服务模块

    2. alertmanager:告警模块

    3. blackbox_exporter:监控类型模块(支持 http、tcp等类型,并可自定义监控)

    4. node_exporter:服务器资源监控模块,需要安装在被监控的服务器上,服务端口 9100

    以上及其他模块可以在 https://prometheus.io/download 下载(我这边是普通的 redhat7.6系统,需要选择 amd 架构)。

    二、服务搭建

    规划把各服务放在 /apps/app 目录下

    1. prometheus 搭建

    1)服务前准备

    1. #直接解压到指定目录
    2. tar -xvf prometheus-2.45.0.linux-amd64.tar.gz -C /apps/app/
    3. #重命名解压目录(完全个人习惯哈)
    4. cd /apps/app
    5. mv prometheus-2.45.0.linux-amd64 prometheus-2.45.0
    6. #创建数据目录(服务启动会用到)
    7. cd /apps/app/prometheus-2.45.0
    8. mkdir data

    2)prometheus 服务添加到系统

    vim /usr/lib/systemd/system/prometheus.service

    配置如下:

    1. [Unit]
    2. Description=Prometheus Server
    3. Documentation=https://prometheus.io
    4. After=network.target
    5. [Service]
    6. Type=simple
    7. ExecStart=/apps/app/prometheus-2.45.0/prometheus \
    8. --config.file=/apps/app/prometheus-2.45.0/prometheus.yml \
    9. --storage.tsdb.path=/apps/app/prometheus-2.45.0/data/ \
    10. --storage.tsdb.retention=10d \
    11. --web.enable-lifecycle
    12. ExecReload=/bin/kill -HUP $MAINPID
    13. Restart=on-failure
    14. [Install]
    15. WantedBy=multi-user.target

    3)prometheus 服务添加自启动

    systemctl enable prometheus.service

    4)启动prometheus 服务

    systemctl start prometheus.service

    可以在 http://ip:9090 看到prometheus服务页面(比较简单)

    2. alertmanager 搭建

    搭建过程跟上述类似,服务端口是 9093。

    1. #解压到指定目录
    2. tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz -C /apps/app/
    3. cd /apps/app
    4. mv alertmanager-0.26.0.linux-amd64/ alertmanager-0.26.0/
    5. #服务添加到系统配置
    6. vim /usr/lib/systemd/system/alertmanager.service
    7. #配置如下
    8. [Unit]
    9. Description=alertmanager
    10. [Service]
    11. ExecStart=/apps/app/alertmanager-0.26.0/alertmanager --config.file=/apps/app/alertmanager-0.26.0/alertmanager.yml
    12. ExecReload=/bin/kill -HUP $MAINPID
    13. KillMode=process
    14. Restart=on-failure
    15. [Install]
    16. WantedBy=multi-user.target
    17. #服务自启动
    18. systemctl enable alertmanager.service
    19. #启动服务
    20. systemctl start alertmanager.service

    3. blackbox_exporter 搭建

    搭建过程跟上述类似,服务端口是 9115。

    1. #解压到指定目录
    2. tar -xvf blackbox_exporter-0.24.0.linux-amd64.tar.gz -C /apps/app/
    3. cd /apps/app
    4. mv blackbox_exporter-0.24.0.linux-amd64/ blackbox_exporter-0.24.0/
    5. #服务添加到系统配置
    6. vim /usr/lib/systemd/system/blackbox.service
    7. #配置如下
    8. [Unit]
    9. Description=blackbox_exporter
    10. After=network.target
    11. [Service]
    12. User=root
    13. Type=simple
    14. ExecStart=/apps/app/blackbox_exporter-0.24.0/blackbox_exporter --config.file=/apps/app/blackbox_exporter-0.24.0/blackbox.yml
    15. Restart=on-failure
    16. [Install]
    17. WantedBy=multi-user.target
    18. #服务自启动
    19. systemctl enable blackbox.service
    20. #启动服务
    21. systemctl start blackbox.service

    三、监控配置

    1. 监控服务器

    需要把 node_exporter 服务部署在被监控的服务器上

    1. #解压到指定目录
    2. tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz -C /apps/app/
    3. cd /apps/app
    4. mv node_exporter-1.6.1.linux-amd64/ node_exporter-1.6.1/
    5. #服务添加到系统配置
    6. vim /usr/lib/systemd/system/node_exporter.service
    7. #配置如下
    8. [Unit]
    9. Description=node_exporter
    10. Documentation=https://prometheus.io/
    11. After=network.target
    12. [Service]
    13. Type=simple
    14. ExecStart=/apps/app/node_exporter-1.6.1/node_exporter \
    15. --collector.ntp \
    16. --collector.mountstats \
    17. --collector.systemd \
    18. --collector.tcpstat
    19. ExecReload=/bin/kill -HUP $MAINPID
    20. Restart=on-failure
    21. [Install]
    22. WantedBy=multi-user.target
    23. #服务自启动
    24. systemctl enable node_exporter.service
    25. #启动服务
    26. systemctl start node_exporter.service

    回到 prometheus 的服务器修改配置文件(prometheus 安装目录下 prometheus.yml):

    1. #全局配置
    2. global:
    3. scrape_interval: 15s
    4. evaluation_interval: 15s
    5. #具体监控项
    6. scrape_configs:
    7. - job_name: "服务器监控"
    8. static_configs:
    9. - targets: ['被监控服务器ip:9100']

    重启 prometheus 服务:

    systemctl restart prometheus.service

    可以在 prometheus 界面的 Status -> Targets 看到这个服务器的监控项,点击超链接可以看到被监控服务器的详细信息(这种信息适合结合 grafana 用图表展示,这里不叙述)。

    2. 监控端口

    这个需要结合 blackbox_exporter 服务才能做到;打开 blackbox_exporter 的配置项查看一下默认支持的模块(安装目录下的 blackbox.yml 文件):

    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. grpc:
    21. prober: grpc
    22. grpc:
    23. tls: true
    24. preferred_ip_protocol: "ip4"
    25. grpc_plain:
    26. prober: grpc
    27. grpc:
    28. tls: false
    29. service: "service1"
    30. ssh_banner:
    31. prober: tcp
    32. tcp:
    33. query_response:
    34. - expect: "^SSH-2.0-"
    35. - send: "SSH-2.0-blackbox-ssh-check"
    36. irc_banner:
    37. prober: tcp
    38. tcp:
    39. query_response:
    40. - send: "NICK prober"
    41. - send: "USER prober prober prober :prober"
    42. - expect: "PING :([^ ]+)"
    43. send: "PONG ${1}"
    44. - expect: "^:[^ ]+ 001"
    45. icmp:
    46. prober: icmp
    47. icmp_ttl5:
    48. prober: icmp
    49. timeout: 5s
    50. icmp:
    51. ttl: 5

    添加监控项到 prometheus 的配置文件(相关模块的配置参见上述):

    1. scrape_configs:
    2. - job_name: '端口监控'
    3. metrics_path: /probe
    4. params:
    5. module: [tcp_connect] # blackbox_exporter 的模块
    6. static_configs:
    7. - targets: ['127.0.0.1:443']
    8. labels: # 自定义的一些字段,方便后续处理
    9. instance: 'local_service_tcp'
    10. group: 'web'
    11. relabel_configs:
    12. - source_labels: [__address__]
    13. target_label: __param_target
    14. - target_label: __address__
    15. replacement: 127.0.0.1:9115

    重启 prometheus 服务,可在  Status -> Targets 看到监控项,点击监控项可以看到监控详情

    3. 监控 http 响应的状态码

    其他跟上述操作一样,配置项略有区别,如下:

    1. - job_name: 'http响应状态码监控'
    2. metrics_path: /probe
    3. params:
    4. module: [http_2xx]
    5. static_configs:
    6. - targets: ['http://127.0.0.1:9201/alert/test']
    7. labels:
    8. instance: 'local_service_http'
    9. group: 'web'
    10. relabel_configs:
    11. - source_labels: [__address__]
    12. target_label: __param_target
    13. - target_label: __address__
    14. replacement: 127.0.0.1:9115

    4. 监控规则(告警规则)

    上述已经配置了监控项,这里需要配置一些监控的触发条件,点击监控项可以看到监控的返回,我这里主要监控 probe_success 字段(进程活着等于 1,进程挂了等于 0)。

    1. # 进入 prometheus 安装目录
    2. cd /apps/app/prometheus-2.45.0
    3. # 创建规则存放目录
    4. mkdir rules
    5. # 创建规则文件
    6. cd rules
    7. vim alert.rule

    alert.rule 内容:

    1. groups:
    2. - name: hostStatsAlert
    3. rules:
    4. - alert: instance_down
    5. expr: probe_success == 0 # 这个是核心
    6. for: 1m
    7. labels:
    8. severity: node
    9. annotations:
    10. summary: "Instance {{ $labels.instance }} down"
    11. description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

    上述规则加入到 prometheus 配置文件中:

    1. rule_files:
    2. - ./rules/*.rule

    重启 prometheus 服务,可以在 Status -> Rules 看到上述规则。

    四、告警配置

            prometheus 服务界面有个 Alerts 页签,里面就是 alertmanager 服务的集成,所有触发监控规则的告警都会在这里显示。

    1. 告警配置集成到prometheus

    prometheus 配置文件添加配置:

    1. alerting:
    2. alertmanagers:
    3. - static_configs:
    4. - targets: ['127.0.0.1:9093']

    2. 自定义定义告警接收器

    切换到 alertmanager 安装目录,修改 alertmanager.yml :

    1. route:
    2. group_by: [...] # 禁用分组。
    3. group_wait: 30s
    4. group_interval: 1m
    5. repeat_interval: 2m
    6. receiver: 'prometheus_clock' # 默认接收器
    7. routes: # 定义多个接收器,如果不需要可以删除
    8. - receiver: 'prometheus_special'
    9. match: # 这里跟告警项的label标签配置相匹配
    10. instance: local_service_http # instance=local_service_http 时告警走上述接收器
    11. inhibit_rules:
    12. - source_match:
    13. severity: 'critical'
    14. target_match:
    15. severity: 'warning'
    16. equal: ['alertname', 'dev', 'instance']
    17. receivers: # 告警接收器定义
    18. - name: 'prometheus_clock'
    19. webhook_configs:
    20. - url: 'http://127.0.0.1:9200/alert/msg/receive'
    21. - name: 'prometheus_special'
    22. webhook_configs:
    23. - url: 'http://127.0.0.1:9200/alert/msg/special'

    当触发告警时,会在上述定义的接收器(接口)以 POST 方式发送一个 json 告警字符串,可以依据这个策略做进一步的自定义集成。

    完成上述操作后记得重启 prometheus 和 alertmanager 服务。

    五、自定义监控配置(举例)

    这里我举个例子:我们这边有一套 eureka 注册中心,某些服务偶尔会掉线,所以我需要监控eureka 注册的实例数量。

    1. 自定义模块

    blackbox_exporter 配置项添加配置(末尾添加,跟其他模块平级关系):

    1. http_2xx_eureka:
    2. prober: http
    3. http:
    4. fail_if_body_not_matches_regexp:
    5. - "UP_6_"

    上述配置含义:如果接口返回不匹配(包含)UP_6_ 就触发告警,上述字符串是 eureka 实例接口数量的一段核心字段。

    2. 添加监控项

    1. - job_name: 'test-eureka'
    2. metrics_path: /probe
    3. params:
    4. module: [http_2xx_eureka]
    5. static_configs:
    6. - targets: ['http://user:password@eureka的ip:端口/eureka/apps']
    7. labels:
    8. instance: 'service_eureka'
    9. group: 'web'
    10. type: 'http响应监控'
    11. ownerEmail: '负责人邮件'
    12. relabel_configs:
    13. - source_labels: [__address__]
    14. target_label: __param_target
    15. - target_label: __address__
    16. replacement: 127.0.0.1:9115

    重启 blackbox_exporter 和 prometheus 服务即可。

  • 相关阅读:
    微信小程序项目如何用Hbuild启动,先让对方在微信开发平台将你的微信号添加成开发成员。
    MySQL中表的增删查改操作(CRUD)
    【无标题】
    html制作小猪佩奇卡通图案代码,使用HTML和CSS3绘制基本卡通图案的示例分享
    HAproxy负载均衡集群
    [激光原理与应用-39]:《光电检测技术-6》- 光干涉的原理与基础
    uniapp打包字节抖音小程序使用$refs报错解决办法
    企业有了BI,为什么还需要以指标为核心的ABI平台?
    查看TCP/UDP网络连接通信情况
    泛型(工作能用到的)
  • 原文地址:https://blog.csdn.net/qingquanyingyue/article/details/133357221