Prometheus集成Grafana可视化监控

单机简单部署测试

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通过企业微信机器人报警

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容