主题
深入理解Prometheus
介绍
Prometheus是CNCF 的项目之一(ps.CNCF的项目代码都值得研究), 而且还是Graduated Projects. 同时因为其主要是方便灵活的pull方式, 暴露出个http接口出来给prometheusd拉取就行了, 而push方式客户端要做更多的事情, 如果要改push的地址的话就很麻烦, 所以很多著名的项目都在用它, 比如k8s, tidb, etcd, 甚至是时序数据库influxdb都在用它.
我体会到, 很多场景很适合使用Prometheus sdk去加一些指标, 比如logger包, Error级别的消息数是一个很有用的指标; 对于消息队列的SDK, 可以用Prometheus收集客户端侧的发送时延、消费时延、消费处理耗时、消费处理出错等指标; 封装DB操作的SDK, 连接池打开的DB连接数与最大连接数是个很重要的指标; 写个HTTP Middleware, http handler的调用次数、处理时间和responseCode是感兴趣的指标.
安装
服务发现
Prometheus的配置文件主要就是定义要抓取的job配置, 显然新加服务要改配置文件是比较麻烦的, Prometheus的一大重要的功能点就是原生支持多种服务发现方式, 支持consul etcd等服务发现组件, 还支持非常通用的基于文件的服务发现, 即你可以定义一个写好target的IP端口号等配置的配置文件路径, 由外部程序定期去更新这个文件, prometheus会定期加载它, 更新抓取的目标, 非常灵活.
数据描述
Prometheus的时序指标数据由timestamp、metric name、label、value组成:
- timestamp 是毫秒级的时间戳.
- metric name 是符合正则[a-zA-Z_:][a-zA-Z0-9_:]*的字符串, 即只包含英文字母和数字及两个特殊符号_:, 不能包含横杆-这样的特殊符号.
- label 是一个kv都是string类型的map.
- value 是float64.
指标类型
Prometheus的指标类型包括基本指标类型Counter和Guage及进阶指标类型Historygram和Summary.
所有指标都是在client SDK端内存存储的, 由prometheus抓取器抓取.
基本使用
编辑配置文件prometheus.yml
在/data/prometheus目录下创建prometheus.yml文件, 内容如下:
yaml
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
- job_name: redis
static_configs:
- targets: ['127.0.0.1:9121']
labels:
instance: redis_exporter
- job_name: mysqld
static_configs:
- targets: ['127.0.0.1:9104']
labels:
instance: mysql-exporter
docker启动
sh
docker run -d --name prometheus --restart=always -p 9090:9090 -v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
安装 MySQL Exporter
MySQL Exporter 是一个用于收集 MySQL 指标的工具,Prometheus 通过它来获取 MySQL 的监控数据。
sh
docker run -d -p 9104:9104 --name=mysql_exporter -e DATA_SOURCE_NAME="user:password@(mysql-host:3306)/" prom/mysqld-exporter
替换 user、password 和 mysql-host 为你的 MySQL 数据库的实际用户名、密码和主机地址。
安装 Redis Exporter
Redis Exporter 是一个用于收集 Redis 指标的工具,Prometheus 通过它来获取 Redis 的监控数据。
sh
docker run -d -p 9121:9121 --name=redis_exporter -e REDIS_ADDR="redis://<redis-host>:6379" oliver006/redis_exporter
替换 <redis-host> 和 6379 为你的 Redis 实例的实际地址和端口。
Grafana面板
sh
docker run -d -p 3000:3000 --name=grafana grafana/grafana
编辑Grafana面板时, 有几个技巧:
- Query界面可以设置下方说明条Legend的格式, 支持双花括号形式的模板语法, 此处的值在发报警时会作为报警消息内容的一部分.
- Visualization界面可以设置坐标轴的单位, 比如百分比, 数据大小单位, 时长单位等等, 让Y轴的值更具有可读性.
- Visualization界面可以设置Legend的更多选项, 是否显示为一个表格, 表格是放在下方还是右方, 支持显示额外的聚合值如最大值最小值平均值当前值总值, 支持设置这些聚合值的小数位数.