Prometheus介绍
官网:Prometheus - Monitoring system & time series database
Github:Prometheus · GitHub
中文名普罗米修斯,Prometheus 是一个开源系统监控和警报工具包最初在 SoundCloud 构建。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,该项目有一个非常活跃的开发人员和用户社区。它现在是一个独立的开源项目 并独立于任何公司进行维护。强调这一点,并澄清 该项目的治理架构,Prometheus 于 2016 年加入云原生计算基金会 作为继 Kubernetes 之后的第二个托管项目。
Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录它的时间戳一起存储,以及称为标签的可选键值对。
特点
- 多维数据模型:由度量名称和键值对标识的时间序列数据
- PromSQL: — 种灵活的查询语言,可以利用多维数据完成复杂的查询
- 不依赖分布式存储,单个服务器节点可直接工作
- 基于 HTTP 的 pull 方式釆集时间序列数据
- 推送时间序列数据通过 PushGateway 组件支持
- 通过服务发现或静态配罝发现目标
- 多种图形模式和仪表盘支持 (比如:grafana)
架构
名称 | 说明 |
Prometheus Server | 收集指标和存储时间序列数据,并提供查询接口 |
Push Gateway | 短期存储指标数据,主要用于临时性任务 |
Exporters | 采集已有的三方服务监控指标并暴露 metrics |
Alertmanager | 告警 |
Web UI | 简单的 WEB 控制台 |
数据模型
Prometheus 将所有数据存储为时间序列,具有相同度量名称以及标签属于同个指标,也就是说 Prometheus 从数据源拿到数据之后都会存到内置的 TSDB 中,这里存储的就是时间序列数据,它存储的数据会有一个度量名称,譬如你现在监控一个 nginx,首先你要给他起个名字,这个名称也就是度量名,还会有 N 个标签,你可以理解名称为表名,标签为字段,所以,每个时间序列都由度量标准名称和一组键值对 (也称为标签) 唯一标识。
时间序列的格式是这样的:
metric_name [
"{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"
] value [ timestamp ]
metrice name 指的就是度量标准名称,label name 也就是标签名,这个标签可以有多个。
示例:
jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 2797352.0
这个度量名称为 jvm_memory_used_bytes,后面是两个标签,和他们各对应的值,还可以继续指定标签,指定的标签越多查询的维度就越多。
指标类型
类型名称 | 说明 |
Counter | 递增计数器,适合收集接口请求次数 |
Guage | 可以任意变化的数值,适用 CPU 使用率 |
Histogram | 对一段时间内数据进行采集,并对有所数值求和于统计数量 |
Summary | 与 Histogram 类型类似 |
任务和实例
实例指的就是可以抓取的目标target,这个会在 Prometheus 配置文件中体现,任务是具有相同目标的实例集合,可以理解为是一个组(比如,一个服务有多台实例机器,可以放入一个任务里,分多个实例target抓取)。
prometheus部署
官网采用的docker部署:安装 |普罗 米修斯 (prometheus.io)
这采用docker-compose进行部署
新建目录monitor,创建文件docker-compose.yml,内容如下:
version: "3"
services:
prometheus:
image: prom/prometheus:v2.4.3
container_name: 'prometheus'
volumes:
#映射prometheus的配置文件
- ./prometheus/:/etc/prometheus/
#同步容器与宿主机的时间,这个非常重要,如果时间不一致,会导致prometheus抓不到数据
- /etc/localtime:/etc/localtime:ro
ports:
- '9090:9090'
monitor目录下新增prometheus文件夹,里面创建prometheus的配置文件prometheus.yml,内容如下:
global: #全局配置
scrape_interval: 15s #全局定时任务抓取性能数据间隔
scrape_configs: #抓取性能数据任务配置
- job_name: 'lp-server-test'#抓取性能指标数据任务,一个job下可以配置多个抓取的的targets,比如服务的多个实例机器
scrape_interval: 10s #每10s抓取一次
metrics_path: '/actuator/prometheus' #抓取的数据url
static_configs:
- targets: ['192.168.10.111:8080'] #抓取的服务器地址
labels:
application: 'lp-server-test-label' #抓取任务标签
- job_name: 'prometheus-local' #抓取prometheus自身性能指标数据任务
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
返回monitor目录执行docker compose命令:
docker-compose up -d
在浏览器访问prometheus:http://192.168.92.128:9090/graph,如下图所示:
点击Status下拉,选中Targets,界面如下:
这里显示了在prometheus里配置的两个抓取任务,不过lp-servers-test任务是失败的,state是down,接下来我们需要配置下lp-servers-test服务才能让prometheus抓取数据。
首先需要在我们的服务下增加pom依赖,如下:
所有的导出器和集成地址:出口商和集成 |普罗 米修斯 (prometheus.io)
第三方应用:
spring boot 健康监控:
Production-ready Features (spring.io)
<!-- 开启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>
还需要在服务的配置文件开启Spring Boot 监控的配置:
#开启SpringBoot 应用健康监控
management:
endpoints:
promethus:
enable: true
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
重启服务刷新刷新prometheus页面,如下所示:
点击lp-servers-test下面的prometheus链接:
http://192.168.10.111:8080/actuator/prometheus
,会打开服务对外暴露的性能指标数据,如下图:
返回prometheus页面首页,点击Graph页面,进入指标查询页面进行查询相关的指标数据
选中指标,然后点击Execute按钮
以上是prometheus自带的指标查询界面,一般我们都是使用grafana图形展示工具配合prometheus一起使用。
Grafana 部署
Run Grafana Docker image | Grafana documentation
使用docker来安装下grafana,在上面的docker-compose.yml文件里加入grafana的安装配置,如下所示:
version: "3"
services:
prometheus:
image: prom/prometheus:v2.4.3
container_name: 'prometheus'
volumes:
#映射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/config/grafana.ini:/etc/grafana/grafana.ini #grafana报警邮件配置
- ./grafana/provisioning/:/etc/grafana/provisioning/ #配置grafana的prometheus数据源
- /etc/localtime:/etc/localtime:ro
env_file:
- ./grafana/config.monitoring #grafana登录配置
depends_on:
- prometheus #grafana需要在prometheus之后启动
在monitor目录下新增grafana目录,在里面创建文件config.monitoring,内容如下:
GF_SECURITY_ADMIN_PASSWORD=password #grafana管理界面的登录用户密码,用户名是admin
GF_USERS_ALLOW_SIGN_UP=false #grafana管理界面是否允许注册,默认不允许
在grafana目录下创建目录provisioning,在里面创建datasources目录,在datasources目录里新建文件datasource.yml,内容如下:
# 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,在里面创建文件grafana.ini,内容如下:
#################################### SMTP / Emailing ##########################
# 配置邮件服务器
[smtp]
enabled = true
# 发件服务器
host = smtp.qq.com:465
# smtp账号
user = xxxxx@qq.com
# smtp 授权码
password = xxx
# 发信邮箱
from_address = xxxxx@qq.com
# 发信人
from_name = xxxxx
用docker compose启动grafana,访问grafana页面http://192.168.92.128:3000/login,用户名为admin,密码为password,如下:
首页:
点击左边的加号并import事先准备好的可视化指标文件4701_rev10.json
可视化指标文件下载地址:Dashboards | Grafana Labs
上传官网下载的模板json,然后选择Prometheus
创建报警方式点击下图所示:
可以选择多种报警通知方式,常用Email,也可以选择webhook方式配置报警通知的http接口配置警报的 Webhook 通知程序 |Grafana 文档
配置告警规则:
示例1:监控Linux服务器性能指标
GitHub - prometheus/node_exporter: Exporter for machine metrics
下载linux监控的exporter镜像
docker pull prom/node-exporter
启动监控的数据库连接,容器创建的时候需要指定
#docker 启动
docker run -d -p 9100:9100 prom/node-exporter
#docker-compose 启动
---
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
在prometheus.yml文件末尾追加如下配置:
模板:
- job_name: linux
scrape_interval: 10s
static_configs:
- targets: ['IP地址1:9100']
labels:
instance: linux-1
- targets: ['IP地址2:9100']
labels:
instance: linux-2
示例:
- job_name: linux
scrape_interval: 10s
static_configs:
- targets: ['192.168.92.128:9100']
labels:
instance: linux-128
重启Prometheus
导入Prometheus模板Node Exporter Full | Grafana Labs
示例2:监控Mysql性能指标
GitHub - prometheus/mysqld_exporter: Exporter for MySQL server metrics
下载mysql客户端的exporter镜像
docker pull prom/mysqld-exporter
启动监控的数据库连接,容器创建时指定:
docker run -d \
-p 9104:9104 \
--network my-mysql-network \
prom/mysqld-exporter
--config.my-cnf=<path_to_cnf>
在prometheus.yml文件末尾追加如下配置:
- job_name: 'mysql'
scrape_interval: 5s
static_configs:
- targets: ['192.168.92.128:9101']
labels:
instance: mysql
重启Prometheus
导入Prometheus模板MySQL Overview | Grafana Labs