监控报警目前比较主流的解决方案有云原生新秀 Prometheus 、老牌 Zabbix 等等, 下图是两种技术 Prometheus 与 Zabbix 的对比, 本文将介绍 Prometheus + Grafana 搭建服务器/虚拟机、SpringBoot 应用服务的监控报警及可视化.
扫码参与讨论, 分享您现在正在用的监控报警系统架构, 去帮助更多的人.
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" 都自带云原生的光环,天然能够友好协作。
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态, 任意组件只要提供对应的HTTP接口就可以接入监控. 不需要任何SDK或者其他的集成过程。输出被监控组件信息的HTTP接口被叫做exporter,目前开发常用的组件大部分都有exporter可以直接使用, 比如Nginx、MySQL、Linux系统信息、Mongo、ES等
prometheus可以理解为一个数据库+数据抓取工具, 工具从各处抓来统一的数据, 放入 prometheus 这一个时间序列数据库中. 那如何保证各处的数据格式是统一的呢? 就是通过这个exporter.
Exporter是一类数据采集组件的总称. Exporter负责从目标处搜集数据, 并将其转化为 Prometheus 支持的格式, 它开放了一个http接口(以便Prometheus来抓取数据). 与传统的数据采集组件不同的是, Exporter 并不向中央服务器发送数据, 而是等待中央服务器(如Prometheus等)主动前来抓取。
https://github.com/prometheus 有很多写好的 exporter, 可以直接下载使用。
Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端可以更加方便的水平扩展。
如果监控数据达到告警阈值 Prometheus Server 会通过 HTTP 将告警发送到告警模块alertmanger,通过告警的抑制后触发邮件或者webhook。Prometheus 支持 PromQL 提供多维度数据模型和灵活的查询,通过监控指标关联多个 tag 的方式,将监控数据进行任意维度的组合以及聚合。
Grafana是一个图形化工具, 它可以从很多种数据源(例如Prometheus)中读取数据信息, 使用很漂亮的图表来展示数据, 并且有很多开源的 dashborad 可以使用, 可以快速地搭建起一个非常精美的监控平台。它与Prometheus的关系就类似于Kibana与ElasticSearch。
所有的 Dashboard 都可以在 https://grafana.com/grafana/dashboards 检索到.
部署采用 Docker(Docker-Compose) 容器化部署. ------ 能不安装的绝不手动安装.
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
docker run -d --name prometheus \
-p 9090:9090 \
-v ${CONF_DIR}/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
通过访问 http://localhost:9090/targets 就可以看到打开 Prometheus 自带的可视化页面并查看监控 Job 的状态
通过访问 [http://localhost:9090/metrics] 也可以看到 Prometheus 拉取的数据详情
docker run -d \
-p 3000:3000 \
--name=grafana \
-v ${CONF_DIR}/grafana/:/var/lib/grafana \
grafana/grafana
通过访问 http://localhost:3000 就可以看到
grafana
的登录界面, 默认用户名密码是admin/admin
.
上面已经介绍过, Prometheus 监控是通过各种 Exportor 进行信息采集, 监控服务器/虚拟机常用的 Exportor 就是
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
等路径挂载, 不然采集到的数据就是容器的数据而不是服务器/物理机的数据.
编辑
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']
Grafana 要对 Prometheus 进行可视化的第一步先需要配置 Prometheus 为 Grafana 的数据源
Dashboard ID
再加载
Dashboard ID
可以在 https://grafana.com/grafana/dashboards 中检索.
随着微服务架构的迅猛发展, 服务水平化拆分越来越多, 系统服务数量也在不断剧增, 因此, 对后台服务的监控报警也越来越重要.
Prometheus 的 Exportor 已经有了对 SpringBoot 数据采集的实现 ----micrometer-registry-prometheus
, 因此便可以直接在 Prometheus 和 Grafana 的基础上快速搭建起来一个 SpringBoot 的监控报警系统.
micrometer-registry-prometheus
需要actuator
的支持.
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
application.yml
server:
port: 9411
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
- 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
)也是可以的.
Grafana 监控 SpringBoot, SpringCloud, k8s 等都有现成的 Dashboard, 帅帅这里找了一个 —
11378
, 大家按照上面的步骤添加就可以使用
还是那句老话, 既然大侠已经看到这里了, 那小弟也不藏着掖着了, 公众号后台回复 PGM 即可拿到帅帅整理好的 Prometheus 和 Grafana 的 docker compose 配置文件以及 Prometheus 配置文件, 一个 up 命令启动 ELK, 一个 down 命令停止 ELK, 它 不香吗?