一、Prometheus介绍

Prometheus是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。Prometheus是一个非常优秀的监控工具,准确的说,更是一套监控方案。Prometheus提供了监控数据收集,存储,处理可视化和告警的一套完整的监控解决方案。

二、特点

Prometheus由Go语言编写而成,采用Pull方式监控信息,并提供了多维度的数据模型和灵活的查询接口。Prometheus不仅可以通过静态文件配置监控对象,还支持自动发现机制,能够通过Kubernetes,Consul,DNS等多种方式动态获取监控对象。在数据采集方面,借助Go语言的高并发特性,单机Prometheus可以采集数百个节点的监控数据;在数据存储方面,单机Prometheus每秒可以采集一千万个指标,如果需要存储大量的历史监控数据,还支持远端存储。


  • 通过指标名称和标签(key/vaue对)区分的多维度,时间序列数据模型
  • 灵活的查询语法 PromQL


  • 不需要依赖额外的存储,一个服务节点就可以工作
  • 利用http协议,通过pull模式来收集时间序列数据


  • 需要push模式的应用可以通过pushgateway来实现
  • 监控模板支持服务发现和静态配置

  • 支持各种图表和监控面板组件

三、Prometheus生态系统组件架构

Prometheus+Grafana 搭建全方位的监控告警系统_云原生

Prometheus Server负责定时在目标上抓取Metric数据,每个抓取目标都需要暴露一个Http服务接口用于Prometheus定时抓取。这种调用被监控对象获取监控数据的方式被称为Pull。Pull方式体现了Prometheus独特设计与大多数采用了Push方式的监控系统不同。

但某些现有系统是通过Push方式实现的,为了接入这个系统,Prometheus提供对PushGateway的支持,这些系统主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。

AlertManager是独立于Prometheus的一个组件,在触发了预先设置在Prometheus中的高级规则后,Prometheus便会推送告警信息到AlertManager。


  • Prometheus Server:利用服务发现机制获取需要监控的target,通过Pull方式从target处拉取指标数据,根据定义的rule,可以提前对指标数据再次进行计算,触发报警的发送到alertmanager组件,用于收集和存储时间序列数据。
  • Grafana:数据可视化组件,监控仪表盘,通过PromQL从Prometheus Server查询数据,进行展示


  • PushGateway:各个目标主机可上报数据到PushGateway,然后Prometheus server统一从pushgateway拉取数据。
  • Exporters:采集已有的第三方服务监控指标并暴露metrics。Prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到Prometheus server 端。


  • Alertmanager:组件根据报警的告警方式发送相应的通知。从Prometheus server端接收到alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉,slack等。
  • Web UI:简单的Web控制台

metric是什么

metric(度量,指标)一个很重要的概念,在官方出现的非常高频,其本质是指存在于数据库的一条记录。

监控服务将监控数据存入数据库的某条记录时,这条记录能动态增加字段,得到通用的metric数据类型,另外还有name,label(与tag{}同义,将额外需要扩展增加的数据生成json存入 label{} ,能方便的扩展字段,不用每次修改数据库表结构),value以及timestamp。

Prometheus+Grafana 搭建全方位的监控告警系统_云原生_02


  • Counter:代表一种样本数据单调递增的指标,即只增不减,通常用来统计如服务的请求数,错误数等
  • Gauge:代表一种样本数据可以任意变化的指标,即可增可减,通常用来统计如服务的CPU使用值,内存占用值等。

  • Histogram和Summary:用于表示一段时间内的数据采样和点分位图统计结果,通常用来统计请求耗时或响应大小等。

时间序列是什么

Prometheus 是基于时间序列存储的,首先了解下什么的时间序列,时间序列的格式类似于(timestamp,value)这种格式,即一个时间点拥有一个对应值,例如生活中很常见的天气预报,如:[(14:00,27°C),(15:00,28°C),(16:00,26°C)],就是一个单维的时间序列,这种按照时间戳和值存放的序列也称为向量(vector)。

Prometheus+Grafana 搭建全方位的监控告警系统_数据_03

举个栗子:

如上图所示,假如有一个指标 http_requests,它的作用是统计每个时间段对应的总请求量是多少,这时候它即为上面提到的是一个单维矩阵,而当我们给这个指标加上一个维度:主机名,这时候这个指标的作用就变成了统计每个时间段各个主机名对应的请求量是多少,这时候这个矩阵区域就变成拥有多列向量(每一列对应一个主机名)的时间序列,当给这个时间序列再添加多个标签(key=value)时,这个矩阵就相应会变成一个多维矩阵。

四、安装及使用

环境准备


  • 安装Go 语言环境
  • 在监控服务器上安装Prometheus


  • 在被监控环境上安装export
  • 安装Grafana

Install Golang

1、下载

wget https://studygolang.com/dl/golang/go1.15.2.linux-amd64.tar.gz

2、解压

tar -xvf go1.15.2.linux-amd64.tar.gz

3、修改配置文件

vim  /etc/profile

4、刷新配置

source /etc/profile

5、check 版本号

go version

Install Prometheus

官网:​​Download | Prometheus​

1、下载

wget https://github.com/prometheus/prometheus/releases/download/v2.29.1/prometheus-2.29.1.linux-amd64.tar.gz

2、解压

tar -xvf prometheus-2.29.1.linux-amd64.tar.gz

修改命名

mv prometheus-2.29.1.linux-amd64 prometheus

3、配置文件

vim prometheus.yml

4、启动

/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml &

在浏览器打开普罗米修斯自带的监控页面:​​http://192.168.21.129:9090/ ​


安装常用监控exporter

已有的exporter:​​Exporters and integrations | Prometheus​

(1)监控Linux (node-exporter)

1、下载

https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz

2、解压

tar -zxvf node_exporter-0.17.0.linux-amd64.tar.gz -C /usr/local/

3、启动 node-exporter

/usr/local/node_exporter-0.17.0.linux-amd64/node_exporter &

4、普罗米修斯配置文件添加监控项

vim /usr/local/prometheus/prometheus.yml

默认node-exporter端口为9100,添加如下配置:

Prometheus+Grafana 搭建全方位的监控告警系统_运维_04

(2)监控mysql(mysql-exporter)

1、下载

https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz

2、解压

tar -zxvf mysqld_exporter-0.12.1.linux-amd64.tar.gz /usr/local/

3、配置mysql_exporter

cd /usr/local/mysqld_exporter-0.12.1.linux-amd64 #vim .my.cnf

.my.cnf配置内容如下:

配置授权的数据库用户名以及密码

[client] 
user=mysqld_exporter
password=mysqld_exporter_password

4、启动

nohup /usr/local/mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter --config.my-cnf="/usr/local/mysqld_exporter-0.12.1.linux-amd64/.my.cnf" &

5、普罗米修斯配置文件添加监控项

vim /usr/local/prometheus/prometheus.yml

默认mysql_exporter端口为 9104,添加如下配置

Prometheus+Grafana 搭建全方位的监控告警系统_运维_05

6、重启普罗米修斯

pkill prometheus
cd /usr/local/Prometheus/
./prometheus --config.file=/usr/local/Prometheus/prometheus.yml &

(3)监控spring-boot

1、配置pom依赖

<!--监控springboot项目-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

2、 项目开启监控

management.endpoint.metrics.enabled=true 
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true

3、添加job

vim /usr/local/prometheus/prometheus.yml

新增节点(应用地址:192.168.21.129:8081)

-job_name: spring-boot
metrics_path: /sass/actuator/prometheus
static_configs:
-targets: ['112.74.186.78:8081']

4、重启普罗米修斯

pkill prometheus
cd /usr/local/Prometheus/
./prometheus --config.file=/usr/local/Prometheus/prometheus.yml &

Install Grafana

(1)下载安装启动

1、下载安装

wget https://dl.grafana.com/oss/release/grafana-7.1.5-1.x86_64.rpm
sudo yum install grafana-7.1.5-1.x86_64.rpm

2、将grafana加入到系统服务,启动服务

sudo /sbin/chkconfig --add grafana-server
sudo service grafana-server start

3、启动后访问地址:ip:3000

初始用户名密码是admin/admin

(2)添加Prometheus数据源

Prometheus+Grafana 搭建全方位的监控告警系统_kubernetes_06

Prometheus+Grafana 搭建全方位的监控告警系统_运维_07

(3)新增Dashboard

Create->Import

Prometheus+Grafana 搭建全方位的监控告警系统_运维_08

从 Dashboards | Grafana Labs 搜索相应 dashboards 的 id 如8919,然后 load ,

选择Prometheus 数据源,最后import

(4)查看 Dashboard

Dashboards->Manage

http://192.168.21.129:3000/

Prometheus+Grafana 搭建全方位的监控告警系统_kubernetes_09

告警配置

Grafana的告警触发以panel为基础,即每个panel单独配置告警信息,包括告警规则,触发条件,告警通知通道及内容。

Prometheus+Grafana 搭建全方位的监控告警系统_kubernetes_10

告警通道

Grafana支持的告警通道:

Prometheus+Grafana 搭建全方位的监控告警系统_kubernetes_11

(1)告警通知发送到邮件

修改Grafana配置文件:

vim /etc/grafana/grafana.ini 

#################################### SMTP / Emailing ##########################
[smtp]
# 开启邮件通道
enabled = true
# 配置邮件服务器
host = smtp.exmail.qq.com:25
# 发件用户名和密码
user = xxx@tangdou.com
password = ********
from_address = xxx@tangdou.com
from_name = TangdouBigData

(2)WebUI配置邮件告警通道

Prometheus+Grafana 搭建全方位的监控告警系统_运维_12

Prometheus+Grafana 搭建全方位的监控告警系统_运维_13

(3)测试告警通知

Prometheus+Grafana 搭建全方位的监控告警系统_运维_14

测试邮件内容如下:

Prometheus+Grafana 搭建全方位的监控告警系统_kubernetes_15

Prometheus官网:Prometheus - Monitoring system & time series database

Grafana官网:Documentation | Grafana Labs