美文网首页
Prometheus集成Grafana可视化监控

Prometheus集成Grafana可视化监控

作者: 码农工号9527 | 来源:发表于2023-03-20 21:38 被阅读0次

    单机简单部署测试

    Prometheus部署

    1.下载安装

    wget https://github.com/prometheus/prometheus/releases/download/v2.35.0-rc0/prometheus-2.35.0-rc0.linux-amd64.tar.gz
    

    1.1 创建安装目录

    mkdir -p /usr/local/prometheus/
    

    1.2 解压到该目录

    tar xvf prometheus-2.35.0-rc0.linux-amd64.tar.gz -C /usr/local/prometheus
    mv /usr/local/prometheus/prometheus-2.35.0-rc0.linux-amd64 /usr/local/prometheus/2.35.0
    

    2.运行Prometheus

    #第一种方法,传统启动(更新配置需重启服务生效)
    ./prometheus --config.file=prometheus.yml
    #第二种方法,热加载配置(更新配置不需重启服务)
    ./prometheus --config.file=prometheus.yml --web.enable-lifecycle
    #更新配置后可使用此命令热加载
    curl -X POST http://localhost:9090/-/reload 
    

    添加系统服务,设置服务开机自启

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

    追加内容

    [Unit]
    Description=prometheus is service
     
    [Service]
    Type=simple
    ExecStart=/usr/local/prometheus/2.35.0/prometheus --config.file=/usr/local/prometheus/2.35.0/prometheus.yml --web.enable-lifecycle
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s
     
    [Install]
    WantedBy=multi-user.target
    

    systemctl 启动

    systemctl daemon-reload
    systemctl restart prometheus
    systemctl enable prometheus
    

    3.防火墙9090端口放开

    使用的是 firewall-cmd

    firewall-cmd --permanent --add-port=9090/tcp
    firewall-cmd --reload
    

    使用 iptable时,后续默认使用iptable的方式关闭端口。小提示:iptable使用参考文章

    iptables -I INPUT -p tcp --dport 9090 -j ACCEPT
    

    4.Prometheus登录

    4.1监控指标

    默认地址 http://10.10.50.211:9090/metrics

    image.png

    4.2监控界面

    默认地址 http://10.10.50.211:9090/graph

    image.png

    5.Prometheus参数配置

    # my global config
    global:
      scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 默认15s 全局每次数据收集的间隔
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 规则扫描时间间隔是15秒,默认不填写是 1分钟
      # scrape_timeout is set to the global default (10s). 超时时间
      # external_labels: # 用于外部系统标签的,不是用于metrics(度量)数据
    
    # 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 it's 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" # 任务目标名,可以理解成分组,每个分组包含具体的target组员
    
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
    
        static_configs:
          - targets: ["localhost:9090"]
    

    global: 全局配置(如果有内部单独设定,会覆盖这个参数)
    alerting: 告警插件定义。主要是指定prometheus将报警规则推送到指定的alertManager实例地址rule_files: 告警规则。 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现。
    scrape_configs:采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现。prometheus的数据采集通过此片段配置
    remote_writer:指定后端的存储的写入地址
    remote_reader:指定后端的存储的读取api地址。

    数据存储流程

    Prometheus运行后会生成“data”目录,Prometheus内存和硬盘都是以为KB为单位分块存储的。
    在Prometheus的世界中,无论是内存还是磁盘,它都是以1KB单位分成块来操作的。
    整体流程是 抓取数据 -> 写到head chunk,写满1KB,就再生成新的块,完成的块,是不可再变更的 -> 根据配置文件的设置,有一部份chunk会被保留在内存里,按照LRU算法,定期将块写进磁盘文件内。

    安装监控节点

    1.node_exporter 安装配置

    Node-exporter 可以采集机器(物理机、虚拟机、云主机)的监控指标数据,能够采集到的指标包括cpu、内存、磁盘、网络、文件数等信息。

    1.1下载node_exporter包

    wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
    

    1.2 创建安装目录

    mkdir /usr/local/node_exporter
    

    1.3 解压到该目录

    tar xvf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/node_exporter
    cd /usr/local/node_exporter/
    mv node_exporter-1.3.1.linux-amd64/ 1.3.1
    

    2.运行node_exporter

    编写service文件,vim /usr/lib/systemd/system/node_exporter.service

    [Unit]
    Description=prometheus node_exporter
     
    [Service]
    Type=simple
    ExecStart=/usr/local/node_exporter/1.3.1/node_exporter
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    MemoryLimit=300M //内存最大占用300M
    CPUQuota=100% //最多占用一个CPU线程
     
    [Install]
    WantedBy=multi-user.target
    

    重新加载启动文件目录,并设置开机自启

    systemctl daemon-reload
    systemctl start node_exporter
    systemctl enable node_exporter
    

    3.防火墙9100端口放开

     iptables -I INPUT -p tcp --dport 9100 -j ACCEPT
    

    4.Prometheus添加node_exporter节点

    vim /usr/local/prometheus/2.35.0/prometheus.yml

    ......
    scrape_configs:
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: "prometheus" # 任务目标名,可以理解成分组,每个分组包含具体的target组员
    
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
    
        static_configs:
          #- targets: ["localhost:9090"]
          - targets: ["10.10.50.211:9100"]
    

    5.查看已监听主机

    地址 http://10.10.50.211:9090/targets

    image.png

    Grafana部署

    1.下载安装

    Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。

    wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
    yum localinstall -y grafana-enterprise-9.4.3-1.x86_64.rpm
    

    2.添加系统服务

    systemctl daemon-reload
    systemctl start grafana-server
    systemctl enable grafana-server
    

    3.防火墙3000端口放开

    iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
    

    4.Grafana登录

    grafana默认登录的管理员账号密码都是:admin 默认端口3000


    image.png
    image.png

    5.Prometheus集成Grafana可视化监控

    5.1 创建数据源

    image.png

    添加配置Prometheus数据源,修改Prometheus的URL,保存提交


    image.png

    5.2 导入监控面板

    Grafana 官方和社区对已经做好了常用的 DashBoard,可以在官网通过下载json文件或copy id将其导入到自己grafana面板。(熟练后可以自己创建编辑模板)

    官网:https://grafana.com/grafana/dashboards/

    image.png

    选择Prometheus数据源,根据需求搜索相关模板。


    image.png

    通过Grafana + 图标导入(import)。输入复制的DashBoard模板id,选择数据源保存即可。


    image.png
    image.png
    image.png

    导入完成


    image.png

    alertmanager安装配置

    1.Alertmanager介绍

    Prometheus会根据配置的参数周期性的对警报规则进行计算, 如果满足警报条件,生产一条警报信息,将其推送到 Alertmanager 组件,Alertmanager 收到警报信息之后,会对警告信息进行处理,进行 分组 Group 并将它们通过定义好的路由 Routing 规则转到 正确的接收器 receiver, 比如 Email Slack 钉钉、企业微信 Robot(webhook) 企业微信 等,最终异常事件 Warning、Error通知给定义好的接收人,其中如钉钉是基于第三方通知来实现的,对于通知人定义是在钉钉的第三方组件中配置。

    prometheus触发一条告警的过程:

    prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|静默—>媒体类型—>邮件|钉钉|微信等。

    分组|抑制|静默 概念

    • 分组
      Grouping 是 Alertmanager 把同类型的警报进行分组,合并多条警报到一个通知中。在生产环境中,特别是云环境下的业务之间密集耦合时,若出现多台 Instance 故障,可能会导致成千上百条警报触发。在这种情况下使用分组机制, 可以把这些被触发的警报合并为一个警报进行通知,从而避免瞬间突发性的接受大量警报通知,使得管理员无法对问题进行快速定位。

    举例:就是一个集群部署中,有一半的服务实例不再可以访问数据库,Prometheus中的警报规则配置为在每个服务实例无法与数据库通信时为其发送警报。结果,数百个警报被发送到Alertmanager。作为运维组或者相关业务组的开发人员,可能更关心的是在一个通知中就可以快速查看到哪些服务实例被本次故障影响了。为此,我们对服务所在集群或者服务警报名称的维度进行分组配置,把警报汇总成一条通知时,就不会受到警报信息的频繁发送影响了。

    • 抑制
      Inhibition指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。

    举例:当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。抑制机制可以通过Alertmanager的配置文件来配置。

    • 静默
      Silences 提供了一个简单的机制,根据标签快速对警报进行静默处理;对传进来的警报进行匹配检查,如果接受到警报符合静默的配置,Alertmanager 则不会发送警报通知。

    以上除了分组、抑制是在 Alertmanager 配置文件中配置,静默是需要在 WEB UI 界面中设置临时屏蔽指定的警报通知。

    2.下载安装

    wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
    mkdir /usr/local/alertmanager
    tar xvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local/alertmanager/
    cd /usr/local/alertmanager
    mv alertmanager-0.24.0.linux-amd64/ 0.24.0
    

    TEST

    [root@localhost alertmanager]# ./0.24.0/alertmanager --version
    alertmanager, version 0.24.0 (branch: HEAD, revision: f484b17fa3c583ed1b2c8bbcec20ba1db2aa5f11)
      build user:       root@265f14f5c6fc
      build date:       20220325-09:31:33
      go version:       go1.17.8
      platform:         linux/amd64
    

    3.配置alertmanager告警方式(邮箱、钉钉、微信)

    当前测试使用企业微信方式
    复制一份源文件cd 0.24.0/ && cp alertmanager.yml alertmanager.yml.bak
    重写alertmanager.yml内容

    global:
      resolve_timeout: 5m
    
    templates:
      # 这里要加载template的文件 
      - ./templates/*.tmpl
    
    route:
      group_by: [alertname]
      group_wait: 10s
      group_interval: 1m
      repeat_interval: 30m
      # 这里的名称要上下一致
      receiver: prometheus
      routes:
      # 同上一致
      - receiver: prometheus
        group_wait: 60s
        match:
          level: 1
    
    
    receivers:
        # 同上一致
        - name: prometheus
          webhook_configs:
          # 这里的配置是调用adapter服务的接口
          - url: http://10.10.50.211:8089/adapter/wx
             # 匹配adapter的接口,匹配企业微信prometheus机器人
            send_resolved: true
    
    
    inhibit_rules:
      - source_match:
          severity: critical
        target_match:
          severity: warning
        equal: [alertname, dev, instance]
    

    http://10.10.50.211:8089/adapter/wxwebhook-adapter服务的地址,它是企业微信报警插件,后面会安装它,此处是提前写好的

    创建模板配置 mkdir templates && vim templates/wechat.tmpl

    define "wechat.default.message"
    - if gt (len .Alerts.Firing) 0 -
    - range $index, $alert := .Alerts -
    - if eq $index 0
    ==========异常告警==========
    告警类型:  $alert.Labels.alertname
    告警级别:  $alert.Labels.severity
    告警详情:  $alert.Annotations.message  $alert.Annotations.description;$alert.Annotations.summary
    故障时间:  ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
    - if gt (len $alert.Labels.instance) 0
    实例信息:  $alert.Labels.instance
    - end
    - if gt (len $alert.Labels.namespace) 0
    命名空间:  $alert.Labels.namespace
    - end
    - if gt (len $alert.Labels.node) 0
    节点信息:  $alert.Labels.node
    - end
    - if gt (len $alert.Labels.pod) 0
    实例名称:  $alert.Labels.pod
    - end
    ============END============
    - end
    - end
    - end
    - if gt (len .Alerts.Resolved) 0 -
    - range $index, $alert := .Alerts -
    - if eq $index 0
    ==========异常恢复==========
    告警类型:  $alert.Labels.alertname
    告警级别:  $alert.Labels.severity
    告警详情:  $alert.Annotations.message  $alert.Annotations.description;$alert.Annotations.summary
    故障时间:  ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
    恢复时间:  ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05"
    - if gt (len $alert.Labels.instance) 0
    实例信息:  $alert.Labels.instance
    - end
    - if gt (len $alert.Labels.namespace) 0
    命名空间:  $alert.Labels.namespace
    - end
    - if gt (len $alert.Labels.node) 0
    节点信息:  $alert.Labels.node
    - end
    - if gt (len $alert.Labels.pod) 0
    实例名称:  $alert.Labels.pod
    - end
    ============END============
    - end
    - end
    - end
    - end
    

    使用amtool检查配置

    [root@localhost 0.24.0]# ./amtool check-config ./alertmanager.yml
    Checking './alertmanager.yml'  SUCCESS
    Found:
     - global config
     - route
     - 1 inhibit rules
     - 1 receivers
     - 1 templates
      SUCCESS
    

    4.添加系统服务

    新建文件并写入内容vim /usr/lib/systemd/system/alertmanager.service

    [Unit]
    Description=alertmanager is service
     
    [Service]
    Type=simple
    ExecStart=/usr/local/alertmanager/0.24.0/alertmanager --config.file=/usr/local/alertmanager/0.24.0/alertmanager.yml
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s
     
    [Install]
    WantedBy=multi-user.target
    

    配置自启

    systemctl daemon-reload
    systemctl restart alertmanager
    systemctl enable alertmanager
    

    5.Alertmanager登录

    http://10.10.50.211:9093/#/alerts

    image.png

    6.webhook-adapter安装

    因为通过docker安装,所以先安装好docker

    curl -sSL https://get.daocloud.io/docker | sh
    systemctl start docker
    systemctl daemon-reload
    

    查看docker版本

    [root@localhost 0.24.0]# docker -v
    Docker version 23.0.1, build a5ee5b1
    

    安装docker-compose

    yum -y install docker-compose
    

    创建docker-composer的webhook-adapter.yml存放文件目录,并写入内容

    mkdir /usr/local/docker_component
    cd /usr/local/docker_component
    vim docker-compose.yml
    
    >>>docker-compose.yml内容>>>
    
    version: '3'
    services:
      webhook-adapter:
        image: guyongquan/webhook-adapter:latest
    version: '3'
    services:
      webhook-adapter:
        image: guyongquan/webhook-adapter:latest
        container_name: webhook-adapter
        hostname: webhook-adapter
        ports:
          - "8089:80"
        restart: always
        command:
          #/wx=后面是匹配企业微信机器人的webhook地址
          - "--adapter=/app/prometheusalert/wx.js=/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=cc7026b1-xxx-xxxx-xxxx-xxxxxxxxxx"
    

    启动webhook-adapter,在/usr/local/docker_component目录下执行

    docker-compose up -d
    

    查看容器服务

    [root@localhost docker_component]# docker ps
    CONTAINER ID   IMAGE                               COMMAND                   CREATED       STATUS       PORTS                                   NAMES
    713e93df0b95   guyongquan/webhook-adapter:latest   "node /app/index.js …"   2 hours ago   Up 2 hours   0.0.0.0:8089->80/tcp, :::8089->80/tcp   webhook-adapter
    

    如果容器需要销毁重建,可以执行docker-compose up -d --force-recreate --build

    查看webhook adapter是否启动成功

    [root@localhost docker_component]# curl http://10.10.50.211:8089
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>Error</title>
    </head>
    <body>
    <pre>Cannot GET /</pre>
    </body>
    </html>
    

    模拟测试

    1.Prometheus配置

    修改Prometheus配置文件 vim /usr/local/prometheus/2.35.0/prometheus.yml

    ......
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
              # - alertmanager:9093
              - 10.10.50.211:9093
    
    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
      - rules/*.yml
    ......
    

    2.创建报警规则

    mkdir /usr/local/prometheus/2.35.0/rules
    

    写入规则 vim /usr/local/prometheus/2.35.0/rules/service_status.yml

    groups:
    - name: 实例存活告警规则
      rules:
      - alert: 实例存活告警
        expr: up == 0
        for: 1m
        labels:
          user: prometheus
          severity: warning
        annotations:
          summary: "主机宕机 !!!"
          description: "该实例主机已经宕机超过一分钟了。"
    - name: 内存报警规则
      rules:
      - alert: 内存使用率告警
        expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "服务器可用内存不足。"
          description: "内存使用率已超过80%(当前值:{{ $value }}%)"
    - name: CPU报警规则
      rules:
      - alert: CPU使用率告警
        expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 80
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率正在飙升。"
          description: "CPU使用率超过80%(当前值:{{ $value }}%)"
    - name: 磁盘使用率报警规则
      rules:
      - alert: 磁盘使用率告警
        expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
        for: 20m
        labels:
          severity: warning
        annotations:
          summary: "硬盘分区使用率过高"
          description: "分区使用大于80%(当前值:{{ $value }}%)"
    

    3.重新加载Prometheus配置

    curl -X POST http://localhost:9090/-/reload

    4.检查告警配置

    登陆prometheus的UI界面,查看Alerts规则


    image.png

    5. shell方法测试企业微信的推送

    cd /usr/local/alertmanager/0.24.0/ && vim test_alert.sh
    

    写入如下内容

    #!/usr/bin/env bash
    alerts_message='[
      {
        "labels": {
           "alertname": "磁盘已满",
           "dev": "sda1",
           "instance": "实例1",
           "msgtype": "testing"
         },
         "annotations": {
            "info": "程序员小王提示您:这个磁盘sda1已经满了,快处理!",
            "summary": "请检查实例示例1"
          }
      },
      {
        "labels": {
           "alertname": "磁盘已满",
           "dev": "sda2",
           "instance": "实例1",
           "msgtype": "testing"
         },
         "annotations": {
            "info": "程序员小王提示您:这个磁盘sda2已经满了,快处理!",
            "summary": "请检查实例示例1",
            "runbook": "以下链接http://test-url应该是可点击的"
          }
      }
    ]'
    curl -XPOST -d"$alerts_message" http://127.0.0.1:9093/api/v1/alerts
    

    手动测试

    [root@localhost 0.24.0]# sh test_alert.sh 
    {"status":"success"}[root@localhost 0.24.0]# 
    

    企业微信收到警告,等一段时间再收到警告恢复


    image.png
    image.png

    也可以使用stress-ng做压测
    我当前机器是2核4G

    stress-ng --vm 2 --vm-bytes 2G --vm-hang 100 --timeout 100s
    

    开启2个进程分配内存,每次分配2GB内存,保持100秒后释放,100秒后退出。

    参考文章:
    Prometheus集成Grafana可视化监控安装详解
    prometheus通过企业微信机器人报警

    相关文章

      网友评论

          本文标题:Prometheus集成Grafana可视化监控

          本文链接:https://www.haomeiwen.com/subject/fdtprdtx.html