写在前面

可以向Prometheus 提供监控样本数据的程序都可以被称为一个Exporter, 一个Exporter的实例被称为Targer。 Prometheues 会以轮询的方式从target 中获取数据,并保存在数据库中。

Prometheus 官方提供了多种Exporter, 如数据库(MySQL Redis MongoDB等), 硬件(cpu node iot等)等等, 除此之外,Promethues 提供了Client Liberary,官方支持语言 Go、Java/Scala、Python、Ruby, 使用者可以基于此构建自己的Exporter,. 在官方支持语言之外, 也有很多第三方的语言支持实现。

一个Exporter 不仅可以像node exporter 那样独立运行提供服务器信息, 也可以嵌入到程序内部, 如k8s 和 etcd 等都是官方直接在项目代码中使用了client library, 直接支持Prometheus, 把自己的内部运行状态暴露给监控系统。

Exporter 规范

Exporter 按照Prometheus的规范返回样本数据, 主要由三部分组成:

- HELP:  样本的一版注释信息
- TYPE:   样本的类型信息
- 样本

如:

1
2
3
4
5
6
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125
HELP

# HELP

TYPE

TYPE

TYPE注释行必须出现在指标的第一个样本之前。如果没有明确的指标类型需要返回为untyped

样本数据

除了# 开头的所有行都会被视为是监控样本数据。 每一行样本需要满足以下格式规范:

metric_name [ “{“ label_name “=” " label_value " { “,” label_name “=” " label_value " } [ “,” ] “}”] value [ timestamp ]

value是一个float格式的数据,timestamp的类型为int64(从1970-01-01 00:00:00以来的毫秒数),timestamp为可选默认为当前时间。具有相同metric_name的样本必须按照一个组的形式排列,并且每一行必须是唯一的指标名称和标签键值对组合

以 MySQLD Exporter 为例集成Prometheus

1. 启动MySQL 和 MySQLD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=database
mysqlexporter:
image: prom/mysqld-exporter
ports:
- "9104:9104"
environment:
- DATA_SOURCE_NAME=root:password@(mysql:3306)/database

启动之后就可以在 9104 端口获取监控数据

2. 集成到Prometheus

编辑 prometheus.yml, 添加:

1
2
3
4
- job_name: mysqld
static_configs:
- targets:
- localhost:9104

启动 prometheus 之后,就可以在ui页面的targets 中看到了。

3. MySQLD 的相关监控指标
  • mysql_global_variables_max_connections: 允许的最大连接数;

  • mysql_global_status_threads_connected: 当前开放的连接;

  • mysql_global_status_threads_running:当前开放的连接;

  • mysql_global_status_aborted_connects:当前开放的连接;

  • mysql_global_status_connection_errors_total{error=”max_connections”}:由于超出最大连接数导致的错误;

  • mysql_global_status_connection_errors_total{error=”internal”}:由于系统内部导致的错误;

写在最后