Prometheus + Grafana 搭建监控报警系统
“ Prometheus 作为云原生下继 kubernetes 之后的第二个宠儿, 未来很可能是监控报警领域的翘楚, 而任何系统都离不开监控和报警, 因此学习 Prometheus 一定会对开发人员现在及以后产生巨大的帮助!”
1. 简介
监控报警目前比较主流的解决方案有云原生新秀 Prometheus 、老牌 Zabbix 等等, 下图是两种技术 Prometheus 与 Zabbix 的对比, 本文将介绍 Prometheus + Grafana 搭建服务器/虚拟机、SpringBoot 应用服务的监控报警及可视化.
扫码参与讨论, 分享您现在正在用的监控报警系统架构, 去帮助更多的人.
1.1 Prometheus
Kubernetes 自从2012年开源以来便以不可阻挡之势成为容器领域调度和编排的领头羊,Kubernetes 是 Google Borg 系统的开源实现,于此对应 Prometheus 则是 Google BorgMon 的开源实现。Prometheus(中文名:普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB). Prometheus使用Go语言开发, 2016年,由Google发起的 Linux 基金会旗下的云原生基金会(Cloud Native Computing Foundation)将Prometheus 纳入继 Kubernetes 之后的其第二大开源项目。Prometheus 在开源社区也十分活跃,在GitHub上拥有两万多Star,并且系统每隔一两周就会有一个小版本的更新,而Prometheus与它的“师兄”Kubernetes" 都自带云原生的光环,天然能够友好协作。
1.1.1 Prometheus
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态, 任意组件只要提供对应的HTTP接口就可以接入监控. 不需要任何SDK或者其他的集成过程。输出被监控组件信息的HTTP接口被叫做exporter,目前开发常用的组件大部分都有exporter可以直接使用, 比如Nginx、MySQL、Linux系统信息、Mongo、ES等
1.1.2 Exporter
Prometheus可以理解为一个数据库+数据抓取工具, 工具从各处抓来统一的数据, 放入 prometheus 这一个时间序列数据库中. 那如何保证各处的数据格式是统一的呢? 就是通过这个exporter. Exporter是一类数据采集组件的总称. Exporter负责从目标处搜集数据, 并将其转化为 Prometheus 支持的格式, 它开放了一个http接口(以便Prometheus来抓取数据). 与传统的数据采集组件不同的是, Exporter 并不向中央服务器发送数据, 而是等待中央服务器(如Prometheus等)主动前来抓取。https://github.com/prometheus 有很多写好的 exporter, 可以直接下载使用。
1.1.3 架构
Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端可以更加方便的水平扩展。如果监控数据达到告警阈值 Prometheus Server 会通过 HTTP 将告警发送到告警模块alertmanger,通过告警的抑制后触发邮件或者webhook。Prometheus 支持 PromQL 提供多维度数据模型和灵活的查询,通过监控指标关联多个 tag 的方式,将监控数据进行任意维度的组合以及聚合。
1.2 Grafana
Grafana是一个图形化工具, 它可以从很多种数据源(例如Prometheus)中读取数据信息, 使用很漂亮的图表来展示数据, 并且有很多开源的 dashborad 可以使用, 可以快速地搭建起一个非常精美的监控平台。它与Prometheus的关系就类似于Kibana与ElasticSearch。所有的 Dashboard 都可以在 https://grafana.com/grafana/dashboards 检索到.
2. 通过 Docker 部署
部署采用 Docker(Docker-Compose) 容器化部署. ------ 能不安装的绝不手动安装.
2.1 部署 Prometheus
2.1.1 创建配置文件 prometheus.yml
所有配置文件可以先通过
2.1.2
启动过程中不挂载配置文件路径启动, 然后通过docker cp
命令从容器里面 copy 到本地磁盘, 再通过挂载路径启动.
# 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).
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
# 配置监控的 Job
- job_name: "prometheus"
# 拉取监控数据的地址 --> 完整路径即为 targets[i]/metrics_path, 本 Job 即为http://localhost:9090/metrics
metrics_path: '/metrics'
static_configs:
# 监控的目标 -- 这里配置的是监控 prometheus 自身
- targets: ['localhost:9090']
# 添加一个标示
labels:
instance: prometheus
2.1.2 启动 Prometheus
docker run -d --name prometheus \
-p 9090:9090 \
-v ${CONF_DIR}/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
2.1.3 测试
通过访问 http://localhost:9090/targets 就可以看到打开 Prometheus 自带的可视化页面并查看监控 Job 的状态
通过访问 [http://localhost:9090/metrics] 也可以看到 Prometheus 拉取的数据详情
2.2 部署 Grafana
2.2.1 部署
docker run -d \
-p 3000:3000 \
--name=grafana \
-v ${CONF_DIR}/grafana/:/var/lib/grafana \
grafana/grafana
2.2.2 测试
通过访问 http://localhost:3000 就可以看到
grafana
的登录界面, 默认用户名密码是admin/admin
.
3. 监控服务器/虚拟机
上面已经介绍过, Prometheus 监控是通过各种 Exportor 进行信息采集, 监控服务器/虚拟机常用的 Exportor 就是
Node_Exportor
;
3.1 部署 Node_Exportor 采集服务器/虚拟机信息
docker run -d --name node-exporter -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter
需要注意的是需要将物理机的
proc
、/sys
等路径挂载, 不然采集到的数据就是容器的数据而不是服务器/物理机的数据.
3.2 添加 Prometheus 监控 Job
编辑
prometheus.yml
配置文件
scrape_configs:
# 配置监控的 Job
- job_name: "prometheus"
static_configs:
# 监控的目标 -- 这里配置的是监控 prometheus 自身
- targets: ['localhost:9090']
# 添加一个标示
labels:
instance: prometheus
- job_name: "self-node-exportor"
static_configs:
- targets: ['192.168.1.88:9100', '192.168.1.89:9100']
3.3 配置 Grafana 数据源
Grafana 要对 Prometheus 进行可视化的第一步先需要配置 Prometheus 为 Grafana 的数据源
选择数据源
添加数据源
填入 Prometheus 信息
测试保存
3.4 配置 Grafana 可视化仪表盘
选择 Import
输入
Dashboard ID
再加载
Dashboard ID
可以在 https://grafana.com/grafana/dashboards 中检索.
编辑 Name 和数据源, 点击 Import
3.4 效果展示
Dashboard 9276
Dashboard 8919
4. 监控 SpringBoot
随着微服务架构的迅猛发展, 服务水平化拆分越来越多, 系统服务数量也在不断剧增, 因此, 对后台服务的监控报警也越来越重要. Prometheus 的 Exportor 已经有了对 SpringBoot 数据采集的实现 ----
micrometer-registry-prometheus
, 因此便可以直接在 Prometheus 和 Grafana 的基础上快速搭建起来一个 SpringBoot 的监控报警系统.
4.1 环境
Spring Boot: 2.3.2.RELEASE
4.2 引入依赖
micrometer-registry-prometheus
需要actuator
的支持.
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.3 配置 application.yml
server:
port: 9411
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
4.5 添加 Prometheus 监控 Job
- job_name: "prometheus-sb"
# 多久采集一次数据
scrape_interval: 15s
# 采集时的超时时间
scrape_timeout: 10s
# 采集的路径
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ["host.docker.internal:9411"]
其中
host.docker.internal
指向 SpringBoot 的应用地址, 由于这里 Prometheus 是在 docker 中安装, 因此localhost
和127.0.0,1
都是容器内的地址, 通过host.docker.internal
可以将其映射到宿主机上. 当然, 你也可以直接配置成你真实的 IP 地址(192.168.1.128
)也是可以的.
4.6 配置 Grafana 仪表板
Grafana 监控 SpringBoot, SpringCloud, k8s 等都有现成的 Dashboard, 帅帅这里找了一个 ---
11378
, 大家按照上面的步骤添加就可以使用
4.7 效果展示
5. Docker-Compose 一键部署 Prometheus 和 Grafana
还是那句老话, 既然大侠已经看到这里了, 那小弟也不藏着掖着了, 公众号后台回复 PGM 即可拿到帅帅整理好的 Prometheus 和 Grafana 的 docker compose 配置文件以及 Prometheus 配置文件, 一个 up 命令启动 Prometheus 和 Grafana, 一个 down 命令停止 , 它 不香吗?
如果有任何相关的问题都可以加入 QQ/微信群一起讨论, 学习, 进步. 此外如果有任何对于本公众号的意见和建议也欢迎大家留言积极批评指正, 最后, 愿你我都能成为更好的自己.
我是帅帅, 一个集帅气, 幽默与内涵, 并且热爱编程, 拥抱开源, 喜欢烹饪与旅游的暖男, 我们下期再见. 拜了个拜!
老规矩别忘了哦, 点击原文链接跳转到我们官方的博客平台哦.
悄悄话
————
每文一句
————
纽约时间比加州时间早三个小时,
New York is 3 hours ahead of California,
但加州时间并没有变慢。
but it does not make California slow.
有人22岁就毕业了,
Someone graduated at the age of 22,
但等了五年才找到稳定的工作!
but waited 5 years before securing a good job!
有人25岁就当上CEO,
Someone became a CEO at 25,
却在50岁去世。
and died at 50.
也有人直到50岁才当上CEO,
While another became a CEO at 50,
然后活到90岁。
and lived to 90 years.
有人单身,
Someone is still single,
同时也有人已婚。
while someone else got married.
奥巴马55岁就退休,
Obama retires at 55,
川普70岁才开始当总统。
but Trump starts at 70.
世上每个人本来就有自己的发展时区。
Absolutely everyone in this world works based on their Time Zone.
身边有些人看似走在你前面,
People around you might seem to go ahead of you,
也有人看似走在你后面。
some might seem to be behind you.
但其实每个人在自己的时区, 有自己的步程。
But everyone is running their own RACE, in their own TIME.
不用嫉妒或嘲笑他们。
Don’t envy them or mock them.
他们都在自己的时区里,你也是!
They are in their TIME ZONE, and you are in yours!
生命就是等待正确的行动时机。
Life is about waiting for the right moment to act.
所以,放轻松。
So, RELAX.
你没有落后。
You’re not LATE.
你也没有领先。
You’re not EARLY.
在上帝为你安排的属于自己的时区里,一切都准时。
You are very much ON TIME, and in your TIME ZONE GOD set up for you.
日常求赞
————
你们白漂的力量就是我拖更的史诗级动力, 点赞, 评论, 再看, 赞赏, 看都看到这了, 随便点一个咯.
关注加好友
拉你进大佬交流群
————————————————