Prometheus+Alertmanager+Grafana安装部署简介

[TOC]

一.Prometheus简介

(一).简介

Prometheus(普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。

(二).架构图

1.Prometheus架构图

Prometheus+Alertmanager+Grafana安装部署简介_linux

2.altermanager架构图

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_02

(三).相关组件

Prometheus 由多个组件组成,但是其中许多组件是可选的;

1.Prometheus Server:用于收集指标和存储时间序列数据,并提供查询接口

2.Client Library:客户端库为需要监控的服务产生相应的metrics 并暴露给 Prometheus Server。

3.Push Gateway:主要用于临时性的 jobs。

4.Exporter:用于暴露已有的第三方服务的 metrics 给 Prometheus。

5.Alertmanager:从Prometheus server端接收到alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。

6.Web UI:Prometheus 内置一个简单的Web控制台,可以查询指标,查看配置信息或者Service Discovery等。

(四).基本原理

Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控。不需要任何 SDK 或者其他的集成过程。

这样做非常适合做虚拟化环境监控系统,比如 VM、Docker、Kubernetes 等。

输出被监控组件信息的HTTP接口被叫做 exporter 。

目前互联网公司常用的组件大部分都有 exporter 可以直接使用。
比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息(包括磁盘、内存、CPU、网络等等)。

(五).Prometheus数据格式

1.1 收集数据
监控概念:白盒监控、黑盒监控

白盒监控:自省方式,被监控端内部,可以自己生成指标,只要等待监控系统来采集时提供出去即可。

黑盒监控:对于被监控系统没有侵入性,对其没有直接"影响",这种类似于基于探针机制进行监控(snmp协议)。

Prometheus支持通过三种类型的途径从目标上"抓取(Scrape)"指标数据(基于白盒监控)。

Exporters:工作在被监控端,周期性的抓取数据并转换为pro兼容格式等待prometheus来收集,自己并不推送

Instrumentation:指被监控对象内部自身有数据收集、监控的功能,只需要prometheus直接去获取
Pushgateway:短周期5s-10s的数据收集
1.2 Prometheus存储
Prometheus 存储的是时序数据:即按相同时序(相同名称和标签),以时间维度存储连续的数据的集合。

1.时序:是由名称(Metric)以及一组key/value标签定义的,具有相同的名字以及标签属于相同时序。

2.metric名字:表示需要记录的数据的名称以及数据类型,如http_request_total。

3.标签:用来表示一类资源,例如:同一个集群可以使用同一个标签,就可以通过标签获取到整个集群的同一个指标。

4.指标值:按照某个时序以时间维度采集的数据,称之为样本。实际的时间序列,每个序列包括一个float64的值和一个毫秒级的unix时间戳。
1.3 四种指标类型
1.Counter (计算器):单调递增的指标,即只增不减,除非监控系统发生了重置。

2.Gauge(仪表盘):可以任意变化的指标,即可增可减。

3.Histogram(直方图):在一段时间范围内对数据进行采样,并将其计入可配置的存储桶中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。

4.Summary(摘要):Histogram 类似类型,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间计算。

5.Histogram 与 Summary 的异同:它们都包含了_sum和_count 指标 Histogram 需要通过_bucket来计算分位数,而 Summary 则直接存储了分位数的值。

二.安装环境

环境

版本

备注

os

Centos7.9

系统环境

go

v1.18

依赖软件版本

prometheus

v2.37.0

主软件版本

alertmanager

v0.24

主软件版本

grafana

v9.0.5

主软件版本

三.安装部署

(一).Prometheus 安装部署

1.下载 prometheus
  cd /usr/local
  wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz

2.解压
  tar -zxvf prometheus-2.37.0.linux-amd64.tar.gz
  mv prometheus-2.35.0.linux-amd64 prometheus

3.配置文件
  cat /usr/local/prometheus/prometheus.yml
  # my global config
  global:
    // 默认情况下,每15s拉取一次目标采样点数据。
    scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
    // 每15秒评估一次规则。默认值为每1分钟。
    evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    # scrape_timeout is set to the global default (10s).

  # Alertmanager configuration
  alerting:
    alertmanagers:
    - static_configs:
      - targets:
        # - alertmanager:9093

  # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  rule_files:
    # - "first_rules.yml"
    # - "second_rules.yml"

  # A scrape configuration containing exactly one endpoint to scrape:
  # Here its Prometheus itself.
  scrape_configs:
    // job名称会增加到拉取到的所有采样点上,同时还有一个instance目标服务的host:port标签也会增加到采样点上
    - job_name: 'prometheus'

      # 覆盖global的采样点,拉取时间间隔5s
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.0.184:9090']

  //两种写法,第一种在配置文件中添加node,需要重启服务;
    - job_name: 'linux'
      static_configs:
      - targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"] //多个用,分开

      - job_name: 'linux'
      //第二种写法只需要指定加载配置文件
      file_sd_configs: 
      // 配置去指定⽬录下找配置job的配置⽂件,这样就可以是添加新的job之后,不需要重启或者重新加载
    - files: ['/usr/local/prometheus/job_etc/*.yml'] 
    //到这个⽬录下找
    //每隔5s去上⾯的路径下扫描新的配置⽂件
    refresh_interval: 5s 
      - job_name: 'kafka'
      static_configs:
      - targets:
        - 10.100.2.4:9308  //kafka_export的地址
      - job_name: 'Windows'
        static_configs:
        - targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"]
          labels:
            server_type: 'windows'
        relabel_configs:
          - source_labels: [__address__]
          target_label: instance

  cat /usr/local/prometheus/job_etc/node.yml
  - labels:
   motring: node
  - targets:
   - "192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"

4.启动prometheus
  cd /usr/lib/systemd/system
  vim prometheus.service
  [Unit]
  Description=https://prometheus.io

  [Service]
  Restart=on-failure
  ExecStart=/usr/local/prometheus/prometheus \
   --config.file=/usr/local/prometheus/prometheus.yml \
   --storage.tsdb.path=/data/prometheus/data \
   --storage.tsdb.retention.time=100y \
   --rules.alert.for-grace-period=10s \
   --rules.alert.resend-delay=5s \
   --log.level=error \
   --web.listen-address=192.168.0.184:9090

  [Install]
  WantedBy=multi-user.target

  systemctl daemon-reload
  systemctl start prometheus.service

  //或者
  nohup /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml 2>&1 1>/data/logs/prometheus.log &

访问界面如下图:

Prometheus+Alertmanager+Grafana安装部署简介_linux_03

在Status-Targets里查看本机的监控状态及node节点

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_04

(二).Grafana安装部署

1.下载grafana
  vim /etc/yum.repos.d/grafana.repo
  [grafana]
  name=grafana
  baseurl=https://packages.grafana.com/enterprise/rpm
  repo_gpgcheck=1
  enabled=1
  gpgcheck=1
  gpgkey=https://packages.grafana.com/gpg.key
  sslverify=1
  sslcacert=/etc/pki/tls/certs/ca-bundle.crt

2.安装grafana
  yum install grafana-enterprise -y

3.启动服务
  systemctl start grafana-server.service
  systemctl enable grafana-server.service

(三).Alertmanager安装部署

1.下载安装包
  wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

2.解压
  tar xvf -C /usr/local/ alertmanager-0.24.0.linux-amd64.tar.gz
  mv alertmanager-0.24.0.linux-amd64 alertmanager

3.创建配置文件
  cat /usr/local/alertmanager/alertmanager.yml
  lobal:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: 'monitor@test.com'
  smtp_auth_username: 'xxx@xxx.com'
  smtp_auth_password: 'dawfaswdawdawf+L4'
  smtp_require_tls: false

  templates:
    - 'tmpl/*.tmpl'
  route:
    group_by: ['alertname']
    group_wait: 10s
    group_interval: 10s
    repeat_interval: 1m
    receiver: 'email'
  receivers:
  - name: 'email'
    email_configs:
    - to: 'xx@xxx.com'

4.编辑系统启动脚本
  vi /usr/lib/systemd/system/alertmanager.service
  Description=alertmanager

  [Service]
  ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/usr/local/alertmanager/data --web.listen-address=192.168.0.184:9093 --data.retention=120h
  Restart=on-failure

  [Install]
  WantedBy=multi-user.target

(四).Linux安装node_exporter

prometheus⽀持的客户端exporter列表:
https://prometheus.io/download

1.下载node
  cd /usr/local
  wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz

2.解压node
  tar -zxvf node_exporter-1.1.2.linux-amd64.tar.gz
  mv node_exporter-1.1.2.linux-amd64/ node_exporter

3.启动
  vim /usr/lib/systemd/system/node_exporter.service
  [Unit]
  Description=node_exporter
  After=network.target

  [Service]
  ExecStart=/usr/local/node_exporter/node_exporter
  Restart=on-failure

  [Install]
  WantedBy=multi-user.target

  systemctl daemon-reload
  systemctl start node_exporter

(五).Kafka集群安装kafka_exporter

* 监控kafka集群时只需要在其中一台上安装Kafka_Exporter
1.下载
  wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.4.2/kafka_exporter-1.4.2.linux-amd64.tar.gz
2.解压
  tar xf kafka_exporter-1.4.2.linux-amd64.tar.gz -C /usr/local
  mv kafka_exporter-1.4.2.linux-amd64 kafka_exporter
3.启动
   vim /usr/lib/systemd/system/kafka_exporter.service
   [Unit]
   Description=kafka_exporter
   After=network.target

   [Service]
   Type=simple
   ExecStart=/usr/local/kafka_exporter/kafka_exporter --kafka.server=10.100.2.4:9092 --web.listen-address=10.100.2.4:9308 --zookeeper.server=10.100.2.4:2181
   [Install]
   WantedBy=multi-user.target

4.systemctl start kafka_exporter
  systemctl enable kafka_exporter

(六).Win客户端安装windows_exporter

* 下载后双击运行,端口为9182
https://github.com/prometheus-community/windows_exporter/releases/download/v0.20.0/windows_exporter-0.20.0-amd64.msi

四.页面配置

访问页面如图所示:

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_05

默认用户名密码:admin\admin

点击Configuration -> Data Sources ->add data source -> Prometheus

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_06

Prometheus+Alertmanager+Grafana安装部署简介_linux_07

配置添加 Prometheus 的 ip

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_08

导入监控Dashboard

Prometheus+Alertmanager+Grafana安装部署简介_linux_09

输入模版id,通过 https://grafana.com/grafana/dashboards 中获取

Prometheus+Alertmanager+Grafana安装部署简介_linux_10

展示界面如图所示

Prometheus+Alertmanager+Grafana安装部署简介_linux_11

至此,Prometheus+Grafana 安装部署部分完毕。

五.告警配置

- prometheus配合alertmanager这个组件报警,报警规则需要手动编写,这需要对prometheus+alertmanager有一定的了解
- grafana配合SaaS模式的云告警平台onealert报警,onealert也是需要时间熟悉的
- grafana+email配置报警

这里介绍两种告警方式:grafana+email配置报警方式以及prometheus+alertmanager组件报警方式

(一).Grafana+Email配置报警

1.1 Grafana配置
vim /etc/grafana/grafana.ini 
[smtp]
enabled = true  # 改成true
//发送服务器地址和端口
host = smtp.exmail.qq.com:465 
// 这里填写发件邮箱
user =  
// 这里填写发件邮箱密码或授权密码
password =  
// 改成true
skip_verify = true 
// 这里填写发件邮箱 
from_address =  

//重启grafana
systemctl restart grafana-server.service
1.2 页面配置

告警页面配置选项解释如图所示:

Prometheus+Alertmanager+Grafana安装部署简介_linux_12

选中通知渠道-创建通知方式,填写告警名称,收件人邮箱,测试告警


收到测试邮件

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_13

创建告警规则使用告警通道

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_14

创建告警通道匹配规则,点击添加

Prometheus+Alertmanager+Grafana安装部署简介_linux_15

Prometheus+Alertmanager+Grafana安装部署简介_linux_16

配置告警策略,这里找到主机的cpu监控项:

Prometheus+Alertmanager+Grafana安装部署简介_linux_17

点击edit,进入编辑页面,创建 alert rule

Prometheus+Alertmanager+Grafana安装部署简介_linux_18

设置报警规则:
设置所有IP地址是10.101开头的服务器,cpu使用率最新的参数超过80%阈值,30s检查一次,
持续一分钟都超过告警阈值,则触发告警。

Prometheus+Alertmanager+Grafana安装部署简介_linux_19

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_20

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_21

Prometheus+Alertmanager+Grafana安装部署简介_prometheus_22

(二).Prometheus+Alertmanager配置告警

1.1 创建配置文件
//创建rules⽬录⽤于存放,⼿动创建规则的配置⽂件
  mkdir -p /usr/local/prometheus/rules
  cat prometheus.yml
  # my global config
  global:
   scrape_interval: 15s # Set the scrape interval to every 15
  seconds. Default is every 1 minute.每个多久去拉取⼀次监控指标
   evaluation_interval: 15s # Evaluate rules every 15 seconds. The
  default is every 1 minute.每个多久检查⼀次报警规则。如果发⽣更改并出发,使⽤
  //新规则⽣成报警
   # scrape_timeout is set to the global default (10s).
  # Alertmanager configuration
  alerting:
   alertmanagers:
   - static_configs:
   - targets:
   - 192.168.0.184:9093 // 指定alertmanagers的服务地址个端⼝
  # Load rules once and periodically evaluate them according to the
  global 'evaluation_interval'.
  rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
   - "rules/*.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here its Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    scrape_interval: 5s
    static_configs:
      - targets: ["localhost:9100"]

  - job_name: 'linux'
    static_configs:
    - targets: ["192.168.2.110:9100","192.168.2.129:9100","192.168.0.59:9100","192.168.2.116:9100","192.168.2.254:9100","192.168.2.120:9100","192.168.2.208:9100","192.168.2.216:9100","192.168.2.25:9100","10.100.2.4:9100","10.100.2.162:9100","10.100.2.38:9100"]

  - job_name: 'kafka'
    static_configs:
    - targets:
      - 10.100.2.4:9308
  - job_name: 'Windows'
    static_configs:
    - targets: ["192.168.1.165:9182","192.168.1.94:9182","192.168.1.97:9182","192.168.1.183:9182","192.168.1.131:9182","192.168.1.57:9182","192.168.1.31:9182","192.168.1.127:9182"]
      labels:
        server_type: 'windows'
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
1.2 服务器告警配置文件
cat /usr/local/prometheus/rules/node_alerts.yml
groups:
//设置告警名,自定义
- name: node_instance
  rules:
//设置只检测ip开头为10、192网段的地址
  - alert: InstanceDown
//设置只检测ip开头为10、192网段的地址
    expr: up{instance=~"10|192.*"} == 0
//设置告警时间为1分钟。
    for: 1m
    labels:
//设置告警等级
      severity: critical
    annotations:
//设置描述信息,{{ $labels.instance }}表示数据来源及端口。如 192.168.111.1主机down掉了,此>处就会显示192.168.111.1:9100
      description: Host {{ $labels.instance }} Down
//详细的告警信息,自定义。
      summary: Host {{ $labels.instance }} of {{ $labels.job }} is  Down !!!
//设置cpu使用告警参数选项,该处名字自定义。
- name: cpu_used
  rules:
//自定义告警类型名
  - alert: Cpu_used_Hight
//定义CPU使用率高于90%时告警,CPU使用>率和uptime中看到的CPU负载有一定的差距。
    expr: 100 - ((avg by (instance,job,env)(irate(node_cpu_seconds_total{mode="idle"}[30s]))) *100) > 90
    for: 1m
    labels:
      severity: critical
    annotations:
      description: Host {{ $labels.instance }} Excessive Cpu utilization
      summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Cpu utilization !!!
- name: mem_used
  rules:
  - alert: Men_used_Hight
//设置内存使用率高于90时发送告警,计算方式为 总内存-空闲内存 - buffers - cached
    expr: ((node_memory_MemTotal_bytes -(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes) )/node_memory_MemTotal_bytes ) * 100 > 90
    for: 1m
    labels:
      severity: critical
    annotations:
      description: Host {{ $labels.instance }} Excessive Memory utilization
      summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Memory utilization !!!
- name: disk_used
  rules:
  - alert: Disk_used_Hight
//设置挂载分区使用率为90以上时告警
    expr: 100 - (node_filesystem_free_bytes{fstype=~"ext3|ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext3|ext4|xfs"} * 100) > 90
    for: 1m
    labels:
      severity: critical
    annotations:
      description: Host {{ $labels.instance }} Excessive Disk utilization
      summary: Host {{ $labels.instance }} of {{ $labels.job }} Excessive Disk utilization !!!
1.3 kafka集群告警配置文件
cat /usr/local/prometheus/rules/kafka.yml
groups:
- name: kafka服务监控
  rules:
  - alert: kafka消费滞后
    expr: sum(kafka_consumergroup_lag{topic!="sop_free_study_fix-student_wechat_detail"}) by (consumergroup, topic, job) > 50000
    for: 3m
    labels:
      severity: 严重告警
    annotations:
      summary: "{{$labels.instance}} kafka消费滞后({{$.Labels.consumergroup}})"
      description: "{{$.Labels.topic}}消费滞后超过5万持续3分钟(当前{{$value}})"

  - alert: kafka集群节点减少
    expr: kafka_brokers < 3   #kafka集群节点数3
    for: 3m
    labels:
      severity: 严重告警
    annotations:
      summary: "kafka集群部分节点已停止,请尽快处理!"
      description: "{{$labels.instance}} kafka集群节点减少"

  - alert: emqx_rule_to_kafka最近五分钟内的每秒平均变化率为0
    expr: sum(rate(kafka_topic_partition_current_offset{topic="emqx_rule_to_kafka"}[5m])) by ( instance,topic,job) ==0
    for: 5m
    labels:
      severity: 严重告警
    annotations:
      summary: "{{$labels.instance}} emqx_rule_to_kafka未接收到消息"
      description: "{{$.Labels.topic}}emqx_rule_to_kafka持续5分钟未接收到消息(当前{{$value}})"
1.4 配置 Alertmanager
vim alertmanager.yml
global:
 //解析超时时间
 resolve_timeout: 5m
 #email的服务器地址
 smtp_smarthost: 'smtp.exmail.qq.com:465'
 smtp_from: 'email——username'
 smtp_auth_username: 'email——username'
 smtp_auth_password: 'password'
 smtp_require_tls: false
route:
 //采⽤哪个标签作为分组的依据
 group_by: ['alertname']
 //分组等待的时间
 group_wait: 30s
 //发送告警的间隔时间
 group_interval: 10s
 //重复发送告警时间
 repeat_interval: 30s
 //定义谁来通知报警
 receiver: 'mail'
receivers:
//使⽤上⾯指定的mail⽅式来给指定的⽤户发信息。
- name: 'mail' 
 email_configs: 
//邮件接收者
 - to: 'senf_to_email_username'