Docker搭建Prometheus&Grafana

Prometheus

Prometheus集成了数据的采集处理存储展示告警一系列流程,存储数据是使用多维数据模型由度量名称和键值对标识的时间序列数据,通过灵活的查询语言PromSQL利用多维数据完成复杂查询不依赖分布式存储,单个服务器节点可直接工作,基于HTTPpull方式釆集时间序列数据,通过PushGateway组件支持推送时间序列数据,通过服务发现静态配罝发现目标,通过Grafana支持多种图形模式及仪表盘

Prometheus Server主要功能是收集指标存储时间序列数据TSDB,并提供查询接口,通过PushGateway短期存储指标数据用于临时性任务Exporters采集已有的三方服务监控指标并暴露metrics,Alertmanager提供告警支持,Web UI提供简单的WEB控制台。

数据模型

Prometheus将所有数据存储为时间序列,具有相同度量名称标签属于同一指标,即Prometheus从数据源拿到数据后会存到内置的TSDB中,TSDB中存储的就是时间序列数据,它存储的数据会有一个度量名称,如监控一个nginx首先得起个名字,该名称即度量名,还会有N个标签,可理解名称为表名标签为字段,每个时间序列都由度量标准名称和一组键值对即标签唯一标识。

时间序列的格式<metricename> {<labelname>=<labelvalue>, ...}metricename为度量标准名称,labelname为标签名,该标签可有多个,如jvm_memory_max_bytes{area="heap",id="Eden Space",},还可以继续指定标签,指定的标签越多查询的维度就越多

指标类型

类型名称 说明
Counter 递增计数器,适合收集接口请求次数
Guage 可任意变化的数值,适用CPU使用率
Histogram 对一段时间内数据进行采集,并对有所数值求和用于统计数量
Summary 与Histogram类型类似

任务&实例

实例即可抓取的目标target,会在Prometheus配置文件中体现,任务是具有相同目标的实例集合,可理解为一个组,如订单服务多台实例机器,可放入一个任务中,分多个实例target抓取。

Prometheus部署

对于SpringBoot项目需要开启SpringBoot监控和增加Prometheus整合,添加如下依赖:

1
2
3
4
5
6
7
8
9
10
<!-- 开启springboot的应用监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 增加prometheus整合 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

还需要在具体的服务配置文件中增加开启SpringBoot Admin监控的配置:

1
2
3
4
5
6
7
8
9
10
management: # 开启SpringBoot Admin的监控
endpoints:
promethus:
enable: true
web:
exposure:
include: '*'
endpoint:
health:
show-details: always

通过Docker来安装,新建目录/data/docker/docker-prometheus,在里面创建文件docker-compose-app.yml

1
2
3
4
5
6
7
8
9
10
11
12
version: "3"
services:
prometheus:
image: prom/prometheus:v2.4.3
container_name: 'prometheus'
volumes:
# 映射prometheus的配置文件
- /data/docker/docker-prometheus/prometheus/:/etc/prometheus/
# 同步容器与宿主机的时间,非常重要,若时间不一致,会导致prometheus抓不到数据
- /etc/localtime:/etc/localtime:ro
ports:
- '9090:9090'

创建Prometheus配置文件/data/docker/docker-prometheus/prometheus/prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
global:  # 全局配置
scrape_interval: 15s # 全局定时任务抓取性能数据间隔

scrape_configs: # 抓取性能数据任务配置
# 抓取订单服务性能指标数据任务,一个job下可以配置多个抓取的targets,如订单服务多个实例机器
- job_name: 'mall-order'
scrape_interval: 10s #每10s抓取一次
metrics_path: '/actuator/prometheus' # 抓取的数据url
static_configs:
- targets: ['192.168.0.180:8011'] # 抓取的服务器地址
labels:
application: 'mall-order-label1' # 抓取任务标签
- targets: ['192.168.0.180:8012'] # 抓取的服务器地址
labels:
application: 'mall-order-label2' # 抓取任务标签

# 抓取prometheus自身性能指标数据任务
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
1
2
# 启动prometheus
docker-compose -f docker-compose-app.yml up -d

Grafana部署

在上面的docker-compose-app.yml配置文件中加入Grafana的安装配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3"
services:
prometheus:
image: prom/prometheus:v2.4.3
container_name: 'prometheus'
volumes:
# 映射prometheus的配置文件
- /data/docker/docker-prometheus/prometheus/:/etc/prometheus/
# 同步容器与宿主机的时间,非常重要,若时间不一致,会导致prometheus抓不到数据
- /etc/localtime:/etc/localtime:ro
ports:
- '9090:9090'

grafana:
image: grafana/grafana:5.2.4
container_name: 'grafana'
ports:
- '3000:3000'
volumes:
# grafana报警邮件配置
- ./grafana/config/grafana.ini:/etc/grafana/grafana.ini
# 配置grafana的prometheus数据源
- ./grafana/provisioning/:/etc/grafana/provisioning/
- /etc/localtime:/etc/localtime:ro
env_file:
- ./grafana/config.monitoring # grafana登录配置
depends_on:
- prometheus # grafana需要在prometheus之后启动

docker-prometheus目录下新增grafana目录,在grafana目录中创建config.monitoring配置文件

1
2
3
4
# grafana管理界面的登录用户密码,用户名是admin
GF_SECURITY_ADMIN_PASSWORD=password
# grafana管理界面是否允许注册,默认不允许
GF_USERS_ALLOW_SIGN_UP=false

grafana目录下创建provisioning目录,在provisioning目录中创建datasources目录,在datasources目录中新建datasource.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# config file version
apiVersion: 1

deleteDatasources: # 若之前存在name为Prometheus,orgId为1的数据源先删除
- name: Prometheus
orgId: 1

datasources: # 配置Prometheus的数据源
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090 # 在相同的docker compose下,可直接用prometheus服务名直接访问
basicAuth: false
isDefault: true
version: 1
editable: true

grafana目录下创建config目录,在config目录中创建grafana.ini配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#################################### SMTP / Emailing ##########################
# 配置邮件服务器
[smtp]
enabled = true
# 发件服务器
host = smtp.qq.com:465
# smtp账号
user = 906271196@qq.com
# smtp 授权码
password = test123
# 发信邮箱
from_address = 906271196@qq.com
# 发信人
from_name = eleven

监控MySQL性能指标

prometheus.yml文件末尾追加如下配置:

1
2
3
4
5
6
- job_name: 'mysql'
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.180:9104']
labels:
instance: mysql
1
2
3
4
5
6
# 下载mysql客户端的exporter镜像
docker pull prom/mysqld-exporter
# 启动监控的数据库连接,容器创建时需指定
docker run -d -p 9104:9104 -e DATA_SOURCE_NAME="root:password@(mysql服务器ip:3306)/databaseName" prom/mysqld-exporter
# 重新启动Prometheus镜像
docker-compose up --force-recreate -d

导入Prometheus模板,添加mysql-dashboard.json格式模板,模板文件可到Grafana官网github上下载

监控Redis性能指标

prometheus.yml文件末尾追加如下配置:

1
2
3
4
5
6
- job_name: 'redis'
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.180:9121']
labels:
instance: redis
1
2
3
4
5
6
# 下载redis客户端的exporter镜像
docker pull oliver006/redis_exporter
# 启动监控的数据库连接,容器创建时需指定
docker run -d -p 9121:9121 oliver006/redis_exporter --redis.addr redis://redis连接IP:6379
# 重新启动Prometheus镜像
docker-compose up --force-recreate -d

导入Prometheus模板,添加redis-dashboard.json格式模板,模板文件可到Grafana官网github上下载

监控Linux服务器性能指标

prometheus.yml文件末尾追加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- job_name: linux
scrape_interval: 10s
static_configs:
- targets: ['192.168.0.180:9100']
labels:
instance: linux-180
- targets: ['192.168.0.181:9100']
labels:
instance: linux-181
- targets: ['192.168.0.182:9100']
labels:
instance: linux-182
- targets: ['192.168.0.183:9100']
labels:
instance: linux-183
1
2
3
4
5
6
# 下载linux监控的exporter镜像
docker pull prom/node-exporter
# 启动监控的数据库连接,容器创建时需指定
docker run -d -p 9100:9100 prom/node-exporter
# 重新启动Prometheus镜像
docker-compose up --force-recreate -d

导入Prometheus模板,添加linux-dashboard.json格式模板,模板文件可到Grafana官网github上下载