写点什么

手把手教你基于 Prometheus 搭建监控告警系统

发布于: 2021 年 04 月 11 日
手把手教你基于Prometheus搭建监控告警系统

IT 界有句话很有道理:“不稳定时系统的常态,稳定只是其中的一种表现形式”。作为一个程序员,如何可以在晚上可以安然入眠?如何在假期无虑的玩耍?如何实时掌控自己负责的系统运行状况?搭建一个监控告警系统可以让你睡的更安稳、玩的更开心一些!

坦白说没有监控告警的线上运行的系统就像是一个定时炸弹,不知道什么时候就会出一些意想不到的问题,让人头秃。那么本文会手把手教你基于 Prometheus 搭建监控告警系统,我们先从一些基本概念开始吧。

一、基础知识

1、什么是监控告警?

显然监控告警系统分为两个部分:监控和告警。

监控:

监控可以分为三个步骤:采集指标数据、存储指标数据、可视化展示。最终我们可以在一个可视化界面去观察系统的各个方面的状态,实时了解系统运行情况。

例如:

对于运维人员来说,他们需要监控机器的 CPU、内存、硬盘的使用情况。

对于研发人员来说,他们关注 JVM 的使用情况。

对于产品或运营来说,他们更关心产品层面的事情,例如:某个某个活动参与人数情况。

告警:

虽然有了可视化的监控系统,我们可以方便的观察系统当前运行状态,但是我们不可能 24 小时盯着监控看,所以就需要告警这个功能。当系统的某些指标出了问题,系统会自动按照我们事先配置的告警规则通知我们,通知的方式可以通过邮件、钉钉、短信、电话等。

例如:运维希望在 CPU 达到 80% 的时候给值班的运维人员发送邮件,产品希望活动积分发放数量超过 10 万的时候发送短信告警。

2、监控哪些方面?

目前一个比较完整的监控系统主要需要监控一下几个方面:

1、系统层监控:

系统:CPU、内存、硬盘...

网络:网络设备、网络延迟、丢包率...

2、中间件监控:

消息中间件:RocketMQ、Kafka...

web 容器:tomcat、jetty...

数据库:mysql、MogoDB、Redis...

3、应用监控:

JVM 监控:GC、堆使用情况...

4、业务指标监控:

订单量、注册数、DAU、转化率...

可以看到想真正监控一个系统是需要监控非常多的内容的,好在 Promethues 已经帮我们完成了监控中的绝大部分内容,我们只需要学习会用 Prometheus 就可以很快的搭建一个套完整的监控体系!

 

二、什么是 Prometheus

Prometheus(普罗米修斯)是古希腊的一个神明,名字的意思是「先见之明」。从它的名字可以看出,Prometheus 是做「先见之明」的监控告警用途。

Prometheus 是由 SoundCloud 开源监控告警解决方案,从 2012 年开始编写代码,再到 2015 年 github 上开源以来,已经吸引了 9k+ 关注,以及很多大公司的使用;2016 年 Prometheus 成为继 k8s 后,第二名 CNCF(Cloud Native Computing Foundation) 成员。 

官方网站:https://prometheus.io/。官网的的介绍翻译过来就是:用指标洞察系统、借助领先的开源监视解决方案来增强指标并发出警报。

下面我们看下 Prometheus 的架构图:


简单地说,Prometheus 的实现架构也并不复杂。其实就是收集数据、处理数据、可视化展示,再进行数据分析进行报警处理

三、安装

1、安装包安装

Prometheus 安装

https://prometheus.io/download/


./prometheus --config.file=prometheus.yml
复制代码


访问:http://localhost:9090/graph

NodeExporter 安装

https://prometheus.io/download/


./node_exporter --web.listen-address 127.0.0.1:8080
复制代码


访问:http://localhost:8080/metrics

Prometheus 抓取 NodeExporter 数据

修改 prometheus.yml 文件然后重启:


scrape_configs:  - job_name: 'prometheus'    static_configs:      - targets: ['localhost:9090']  # 采集node exporter监控数据  - job_name: 'node'    static_configs:      - targets: ['localhost:8080']
复制代码

Grafana 安装

https://grafana.com/grafana/download


./grafana-server web
复制代码


访问:http://localhost:3000/默认用户名密码admin/admin


模板中心:https://grafana.com/grafana/dashboards

四、Prometheus 数据模型及 PromQL

PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询语言,它能实现对事件序列数据的查询、聚合、逻辑运算等。它并且被广泛应用在 Prometheus 的日常应用当中,包括对数据查询、可视化、告警处理当中。

1、时序数据数据模型

<metric name>{<label name>=<label value>, ...}

2、时序类型

Prometheus 时序数据分为 Counter, Gauge, Histogram, Summary 四种类型。


counter 计数器 表示收集的数据是按照某个趋势(增加/减少)一直变化的,我们往往用它记录服务请求总量、错误总数等。


gauges 量器 表示搜集的数据是一个瞬时的值,与时间没有关系,可以任意变高变低,往往可以用来记录内存使用率、磁盘使用率等。


histogram 柱状图<basename>_bucket{le="<upper inclusive bound>"}<basename>_bucket{le="+Inf"}, <basename>_sum<basename>_count 组成,主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。


summary 汇总 和 Histogram 类似,由 <basename>{quantile="<φ>"}<basename>_sum<basename>_count 组成,主要用于表示一段时间内数据采样结果(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。

3、查询结果类型

PromQL 查询结果主要有 3 种类型:


  • 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total

  • 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]

  • 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)


五、Spring Boot Actuator 实现应用监控

1、引入 pom 依赖

<!--actuator监控--><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency>  <groupId>io.micrometer</groupId>  <artifactId>micrometer-registry-prometheus</artifactId>  <scope>runtime</scope></dependency>
复制代码

2、配置打开

#暴露端口management:  endpoints:    web:      exposure:        include: "*"    metrics:      enabled: true    prometheus:      enabled: true  metrics:    export:      prometheus:        enabled: true
复制代码

3、prometheus 配置

localhost:8080/actuator/health


- job_name: 'jvm'    metrics_path: '/actuator/prometheus'    static_configs:    - targets: ['localhost:8080']
复制代码

4、Granfna 配置

dashboard 的 ID 为:4701

六、Springboot 实现自定义指标监控

1、添加监控指标类

@Componentpublic class PrometheusCustomMonitor {    private Counter orderInstanceCount;
private final MeterRegistry registry;
@Autowired public PrometheusCustomMonitor(MeterRegistry registry) { this.registry = registry; }
@PostConstruct private void init() { orderInstanceCount = registry.counter("order_instance_count"); }
public Counter getOrderInstanceCount() { return orderInstanceCount; }}
复制代码

2、在业务中增加指标投递

monitor.getOrderInstanceCount().increment();
复制代码


访问localhost:8080/actuator/prometheus可以看到指标

3、配置 Granfna 图表


至此,你已经学会了基于 Promethues 搭建监控告警系统的全部内容,还不赶紧把线上的系统加上监控来~


发布于: 2021 年 04 月 11 日阅读数: 153
用户头像

还未添加个人签名 2018.04.25 加入

还未添加个人简介

评论

发布
暂无评论
手把手教你基于Prometheus搭建监控告警系统