搭建 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)服务前准备

#直接解压到指定目录
tar -xvf prometheus-2.45.0.linux-amd64.tar.gz -C /apps/app/

#重命名解压目录(完全个人习惯哈)
cd /apps/app
mv prometheus-2.45.0.linux-amd64 prometheus-2.45.0

#创建数据目录(服务启动会用到)
cd /apps/app/prometheus-2.45.0
mkdir data

2)prometheus 服务添加到系统

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

配置如下:

[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target

[Service]
Type=simple
ExecStart=/apps/app/prometheus-2.45.0/prometheus \
--config.file=/apps/app/prometheus-2.45.0/prometheus.yml \
--storage.tsdb.path=/apps/app/prometheus-2.45.0/data/ \
--storage.tsdb.retention=10d \
--web.enable-lifecycle

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target

3)prometheus 服务添加自启动

systemctl enable prometheus.service

4)启动prometheus 服务

systemctl start prometheus.service

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

搭建 Prometheus 对服务进行监控_第1张图片

2. alertmanager 搭建

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

#解压到指定目录
tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz -C /apps/app/

cd /apps/app
mv alertmanager-0.26.0.linux-amd64/ alertmanager-0.26.0/

#服务添加到系统配置
vim /usr/lib/systemd/system/alertmanager.service

#配置如下
[Unit]
Description=alertmanager

[Service]
ExecStart=/apps/app/alertmanager-0.26.0/alertmanager --config.file=/apps/app/alertmanager-0.26.0/alertmanager.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

#服务自启动
systemctl enable alertmanager.service

#启动服务
systemctl start alertmanager.service

3. blackbox_exporter 搭建

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

#解压到指定目录
tar -xvf blackbox_exporter-0.24.0.linux-amd64.tar.gz -C /apps/app/

cd /apps/app
mv blackbox_exporter-0.24.0.linux-amd64/ blackbox_exporter-0.24.0/

#服务添加到系统配置
vim /usr/lib/systemd/system/blackbox.service

#配置如下
[Unit]
Description=blackbox_exporter
After=network.target

[Service]
User=root
Type=simple
ExecStart=/apps/app/blackbox_exporter-0.24.0/blackbox_exporter --config.file=/apps/app/blackbox_exporter-0.24.0/blackbox.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target

#服务自启动
systemctl enable blackbox.service

#启动服务
systemctl start blackbox.service

三、监控配置

1. 监控服务器

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

#解压到指定目录
 tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz -C /apps/app/

cd /apps/app
mv node_exporter-1.6.1.linux-amd64/ node_exporter-1.6.1/

#服务添加到系统配置
vim /usr/lib/systemd/system/node_exporter.service

#配置如下
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/apps/app/node_exporter-1.6.1/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target


#服务自启动
systemctl enable node_exporter.service

#启动服务
systemctl start node_exporter.service

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

#全局配置
global:
  scrape_interval: 15s
  evaluation_interval: 15s


#具体监控项
scrape_configs:
  - job_name: "服务器监控"
    static_configs:
      - targets: ['被监控服务器ip:9100']

重启 prometheus 服务:

systemctl restart prometheus.service

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

2. 监控端口

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

modules:
  http_2xx:
    prober: http
    http:
      preferred_ip_protocol: "ip4"
  http_post_2xx:
    prober: http
    http:
      method: POST
  tcp_connect:
    prober: tcp
  pop3s_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^+OK"
      tls: true
      tls_config:
        insecure_skip_verify: false
  grpc:
    prober: grpc
    grpc:
      tls: true
      preferred_ip_protocol: "ip4"
  grpc_plain:
    prober: grpc
    grpc:
      tls: false
      service: "service1"
  ssh_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^SSH-2.0-"
      - send: "SSH-2.0-blackbox-ssh-check"
  irc_banner:
    prober: tcp
    tcp:
      query_response:
      - send: "NICK prober"
      - send: "USER prober prober prober :prober"
      - expect: "PING :([^ ]+)"
        send: "PONG ${1}"
      - expect: "^:[^ ]+ 001"
  icmp:
    prober: icmp
  icmp_ttl5:
    prober: icmp
    timeout: 5s
    icmp:
      ttl: 5

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

scrape_configs:
  - job_name: '端口监控'
    metrics_path: /probe
    params:
      module: [tcp_connect] # blackbox_exporter 的模块
    static_configs:
      - targets: ['127.0.0.1:443']
        labels: # 自定义的一些字段,方便后续处理
          instance: 'local_service_tcp'
          group: 'web'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: 127.0.0.1:9115

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

3. 监控 http 响应的状态码

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


  - job_name: 'http响应状态码监控'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets: ['http://127.0.0.1:9201/alert/test']
        labels:
          instance: 'local_service_http'
          group: 'web'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: 127.0.0.1:9115

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

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

# 进入 prometheus 安装目录
cd /apps/app/prometheus-2.45.0

# 创建规则存放目录
mkdir rules

# 创建规则文件
cd rules
vim alert.rule

alert.rule 内容:

groups:
- name: hostStatsAlert

  rules:
  - alert: instance_down
    expr: probe_success == 0    # 这个是核心
    for: 1m
    labels:
      severity: node
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

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

rule_files:
  - ./rules/*.rule

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

四、告警配置

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

1. 告警配置集成到prometheus

prometheus 配置文件添加配置:

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['127.0.0.1:9093']

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

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

route:
  group_by: [...] # 禁用分组。
  group_wait: 30s
  group_interval: 1m
  repeat_interval: 2m
  receiver: 'prometheus_clock'       # 默认接收器
  routes:                            # 定义多个接收器,如果不需要可以删除
  - receiver: 'prometheus_special'
    match:                           # 这里跟告警项的label标签配置相匹配
      instance: local_service_http   # instance=local_service_http 时告警走上述接收器
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

receivers:                            # 告警接收器定义
  - name: 'prometheus_clock'
    webhook_configs:
      - url: 'http://127.0.0.1:9200/alert/msg/receive'
  - name: 'prometheus_special'
    webhook_configs:
      - url: 'http://127.0.0.1:9200/alert/msg/special'

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

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

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

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

1. 自定义模块

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

  http_2xx_eureka:
    prober: http
    http:
      fail_if_body_not_matches_regexp:
      - "UP_6_"

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

2. 添加监控项

  - job_name: 'test-eureka'
    metrics_path: /probe
    params:
      module: [http_2xx_eureka]
    static_configs:
      - targets: ['http://user:password@eureka的ip:端口/eureka/apps']
        labels:
          instance: 'service_eureka'
          group: 'web'
          type: 'http响应监控'
          ownerEmail: '负责人邮件'
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: 127.0.0.1:9115

重启 blackbox_exporter 和 prometheus 服务即可。

你可能感兴趣的:(工具,prometheus,监控http状态码,监控TCP端口,监控服务器)