文章目录

  • 一、Prometheus基本概况
  • 二、本文要实现的架构图
  • 三、部署Prometheus
  • 1.部署客户端—SpringBoot应用
  • 2.部署客户端—node-exporter
  • 3.部署服务端—Prometheus Server
  • 三、部署Grafana
  • 1.拉取镜像
  • 2.添加数据源
  • 3.选择展示模板
  • 四、部署AlertManager
  • 1.部署配置AlertManager
  • 2.配置服务器告警操作
  • 3.配置prometheus.yml文件
  • 4.开始告警
  • 5.SpringBoot应用接收告警信息
  • 参考文章


一、Prometheus基本概况

首先Prometheus是一个监控系统,尤其在云原生的时代,Prometheus作为新一代的云原生监控,表现的非常亮眼,目前已经超过120+项的第三方集成。

Prometheus架构图

grafana 架构介绍 grafana 集群_spring boot


采集层

采集层分为两类,一类是生命周期比较短的作业,一类是生命周期较长的作业。所谓生命周期长短就是你的应用是长时间运行还是短时间运行

  • 短作业:直接通过Api,将指标推送给Pushgateway
  • 长作业:Retrieval组件直接从job或者Exporter拉取数据(比如SpringBoot应用程序)

存储计算层

  • Prometheus Server,里面包含了存储引擎和计算引擎
  • Retrieval组件为取数组件,它会主动从Pushgateway或者Exporter拉取指标数据
  • Service dicovery可以动态发现要监控的目标

应用层
分为两类,AlertManager和数据可视化(Grafana)

  • AlertManager:告警组件,在Prometheus配置告警规则,一旦满足告警规则,将告警信息发送给AlertManager,AlertManager发送出告警信息
  • Grafana:将Prometheus采集的指标数据可视化

二、本文要实现的架构图

grafana 架构介绍 grafana 集群_docker_02

三、部署Prometheus

1.部署客户端—SpringBoot应用

Prometheus分为客户端与服务端,客户端就是SpringBoot应用需要引入相关的依赖

<!--springboot的监控端点 2.3.6-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--prometheus的客户端依赖 1.5.7-->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置文件配置打开Actuator服务

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等

#打开所有Actuator服务
management.endpoints.web.exposure.include=*

访问http://localhost:8090/actuator/prometheus,就可以看到监控的数据了

grafana 架构介绍 grafana 集群_grafana 架构介绍_03

2.部署客户端—node-exporter

node-exproter 它是最基本的节点监控客户端,负责监控机器的各个指标,包括节点存活、CPU、Mem、Network、IO 等等,方便后边演示 Alertmanager 报警时的触发条件,例如配置节点存活检测,当机器 Down 时,触发报警控制,那么就可以通过停止 node-exporter 来模拟实现了。

docker pull  prom/node-exporter:latest

docker run --name node-exporter -d -p 9100:9100 prom/node-exporter:latest

访问地址:http://192.168.184.128:9100/metrics,即可看到监控的指标

grafana 架构介绍 grafana 集群_docker_04

3.部署服务端—Prometheus Server

这里使用docker部署,因为国内有docker的镜像所有部署起来更容易一些

拉取镜像

# 拉取docker镜像
docker pull prom/prometheus

准备prometheus.yml文件
里面含有两个job,一个是收集springboot应用的actuator信息,一个是收集node-exporter的信息

scrape_configs:
# 可随意指定
- job_name: 'spring'
  # 多久采集一次数据
  scrape_interval: 15s
  # 采集时的超时时间
  scrape_timeout: 10s
  # 采集的路径
  metrics_path: '/actuator/prometheus'
  # 采集服务的地址,设置成Springboot应用所在服务器的具体地址
  static_configs:
  - targets: ['192.168.43.119:8090','192.168.184.128:8090']

- job_name: 'node-exporter'
  # 多久采集一次数据
  scrape_interval: 15s
  # 采集时的超时时间
  scrape_timeout: 10s
  static_configs:
    - targets: ['192.168.184.128:9100']
      labels:
        instance: redpack
        service: node-service

创建docker容器,挂载并指定yml文件启动

docker run -d -p 9090:9090 -v /usr/local/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml

访问服务http://{ip}:9090/即可

grafana 架构介绍 grafana 集群_grafana 架构介绍_05

grafana 架构介绍 grafana 集群_spring_06

三、部署Grafana

Grafana是一款go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分时序数据库

1.拉取镜像

//拉取镜像
docker pull grafana/grafana
//启动容器
docker run -d -p 3000:3000 grafana/grafana

访问:http://192.168.184.127:3000/login,用户名及密码都是admin

grafana 架构介绍 grafana 集群_spring boot_07

2.添加数据源

grafana 架构介绍 grafana 集群_spring_08


grafana 架构介绍 grafana 集群_docker_09


grafana 架构介绍 grafana 集群_grafana 架构介绍_10


需要注意的是Access要选Browser模式,否则无法正常获取数据。配置完成后,点击Save & Test即可。

3.选择展示模板

Grafana提供了各式各样的监控模板供开发者使用,官方地址 ,在本实例中使用了Spring Boot Statistics

点击左侧加号+选import

grafana 架构介绍 grafana 集群_java_11


显示的页面

grafana 架构介绍 grafana 集群_java_12


里面也有涉及到其他的监控页面,大家可以自己探究一下

四、部署AlertManager

Prometheus发出告警时分为两部分。首先,Prometheus按告警规则(rule_files配置块)向Alertmanager发送告警(即告警规则是在Prometheus上定义的)。然后Alertmanager开管理这些告警,包括去重(Deduplicating)、分组(Grouping)、静音(silencing)、抑制(inhibition)、聚合(aggregation),最终通过电子邮件、webhook等方式将告警通知路由(route)给对应联系人

1.部署配置AlertManager

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 10s #组报警等待时间
  group_interval: 10s #组报警间隔时间
  repeat_interval: 1m #重复报警间隔时间
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://192.168.43.119:8090/alert/test'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
  • global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
  • route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
  • receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
  • inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

这里配置成了web.hook的方式,当server通知alertmanager会自动调用webhook http://192.168.43.119:8090/alert/test

docker run -d -p 9093:9093 \
--name alertmanager \
-v /usr/local/docker/altermanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager

访问服务 http://192.168.184.127:9093/#/alerts

grafana 架构介绍 grafana 集群_spring_13


目前还没有配置告警操作

2.配置服务器告警操作

需要配置告警规则的yml文件,如下

[root@k8s-node2 rules]# pwd
/usr/local/docker/prometheus/rules
[root@k8s-node2 rules]# ls
memory_over.yml  node-up.yml

node-up.yml

groups:
- name: node-up
  rules:
  - alert: node-up
    expr: up{job="node-exporter"} == 0
    for: 2s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{ $labels.instance }} 已停止运行超过 2s!"

memory_over.yml
配置当服务器内存占用80%时告警

groups:
- name: HighMemoryUsage
  rules:
  - alert: NodeMemoryUsage
    expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{$labels.instance}}: High Memory usage detected"
      description: "{{$labels.instance}}: Memory usage is above 80% (current value is:{{ $value }})"

其中(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100是内存的利用率,可以在prometheus界面上执行一下。

grafana 架构介绍 grafana 集群_spring_14

3.配置prometheus.yml文件

将配置的规则添加到prometheus中

scrape_configs:
# 可随意指定
- job_name: 'spring'
  # 多久采集一次数据
  scrape_interval: 15s
  # 采集时的超时时间
  scrape_timeout: 10s
  # 采集的路径
  metrics_path: '/actuator/prometheus'
  # 采集服务的地址,设置成Springboot应用所在服务器的具体地址
  static_configs:
  - targets: ['192.168.43.119:8090','192.168.184.128:8090']

- job_name: 'node-exporter'
  # 多久采集一次数据
  scrape_interval: 15s
  # 采集时的超时时间
  scrape_timeout: 10s
  static_configs:
    - targets: ['192.168.184.128:9100']
      labels:
        instance: redpack
        service: node-service
#在后面加上该内容
rule_files:
- /etc/prometheus/rules/*.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["192.168.184.127:9093"]

altering:指定了Alertmanager的告警地址
rule_files:指定了告警规则

重新启动prometheus的容器

docker run -d -p 9090:9090 \
-v /usr/local/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /usr/local/docker/prometheus/rules/:/etc/prometheus/rules/ prom/prometheus  \
--config.file=/etc/prometheus/prometheus.yml \
--web.enable-lifecycle

添加上–web.enable-lifecycle就可以开启热加载配置,下次再改prometheus配置时就可以采用如下命令

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

当然AlertManager也可以,换成它的ip和端口号就行

从prometheus的控制台查看配置的规则

grafana 架构介绍 grafana 集群_spring_15

4.开始告警

访问prometheus的Alerts界面

grafana 架构介绍 grafana 集群_java_16

可以看到Prometheus Alert告警有三种状态

  • Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
  • Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
  • Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

从图中可以看出监控的128的服务器内存使用率已经超过80%,node-exporter还在正常运行

触发报警后,prometheus会将报警信息发送给AlertManager,ip:9093访问AlterManager界面可以看到正在发送一个报警信息

grafana 架构介绍 grafana 集群_grafana 架构介绍_17

5.SpringBoot应用接收告警信息

前面说到AlertManager可以通过邮件、钉钉收到告警信息,这里采用的是通过springboot应用接收AlertManager发过来的json信息

grafana 架构介绍 grafana 集群_spring_18


参考文章

Actuator的介绍:https://www.jianshu.com/p/14d10481845e Prometheus官网:https://prometheus.io/ 详细教程: prometheus相关exporter: prometheus常用告警规则: Alertmanager配置介绍:https://www.bilibili.com/read/cv7055904?spm_id_from=333.999.0.0 prometheus的gitbook系列书:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/quickstart