多类型 Exporter 接入
概述
Exporter 是 Prometheus 生态中的指标暴露器,通过 HTTP 的 /metrics 端点以文本格式提供指标。每一个被监控的组件通常都有对应的 Exporter。
接入流程(通用):
1. 部署 Exporter(独立进程或 Sidecar)
2. 在 Prometheus scrape_configs 中添加抓取目标
3. 验证 /metrics 端点输出
4. 在 Grafana 导入对应 Dashboard
Node Exporter(系统指标)
最常用的系统级指标采集器,监控 CPU、内存、磁盘、网络等。
# Docker 部署
docker run -d \
--name node-exporter \
--restart unless-stopped \
-p 9100:9100 \
prom/node-exporter:v1.6.1
Kubernetes DaemonSet 部署
kubectl apply -f https://raw.githubusercontent.com/prometheus/node_exporter/master/examples/kubernetes/node-exporter-daemonset.yaml
关键指标:
| 指标名 | 说明 |
|---|---|
node_cpu_seconds_total |
CPU 时间累计 |
node_memory_MemTotal_bytes |
内存总量 |
node_memory_MemAvailable_bytes |
可用内存 |
node_filesystem_size_bytes |
文件系统总大小 |
node_filesystem_avail_bytes |
文件系统可用空间 |
node_network_receive_bytes_total |
接收字节数 |
node_network_transmit_bytes_total |
发送字节数 |
node_disk_read_bytes_total |
磁盘读取字节 |
node_disk_written_bytes_total |
磁盘写入字节 |
Prometheus 抓取配置:
- job_name: 'node-exporter'
static_configs:
- targets:
- 'node-exporter:9100'
relabel_configs:
- source_labels: [__address__]
target_label: instance
MySQL Exporter
docker run -d \
--name mysql-exporter \
--restart unless-stopped \
-p 9104:9104 \
-e DATA_SOURCE_NAME="exporter:password@tcp(mysql-master:3306)/" \
prom/mysqld-exporter:v0.15.0
关键指标:
| 指标名 | 说明 |
|---|---|
mysql_global_status_threads_connected |
当前连接数 |
mysql_global_status_queries |
查询总数 |
mysql_global_status_slow_query_log |
慢查询数 |
mysql_global_variables_max_connections |
最大连接数 |
mysql_global_status_innodb_buffer_pool_pages_free |
InnoDB 缓冲池空闲页 |
mysql_slave_status_seconds_behind_master |
主从延迟(秒) |
QGD(Query Analytics)指标:
# 连接数使用率
100 * mysql_global_status_threads_connected / mysql_global_variables_max_connections
QPS
rate(mysql_global_status_queries[5m])
主从复制延迟
mysql_slave_status_seconds_behind_master
Redis Exporter
docker run -d \
--name redis-exporter \
--restart unless-stopped \
-p 9121:9121 \
-e REDIS_ADDR="redis://redis-master:6379" \
-e REDIS_PASSWORD="your-password" \
oliver006/redis_exporter:v1.55.0
关键指标:
| 指标名 | 说明 |
|---|---|
redis_connected_clients |
客户端连接数 |
redis_commands_total |
命令执行总数 |
redis_memory_used_bytes |
内存使用量 |
redis_keyspace_hits_total |
Key 命中次数 |
redis_keyspace_misses_total |
Key 未命中次数 |
redis_replication_offset |
复制偏移量 |
内存碎片率:
redis_mem_fragmentation_ratio > 1.5
PostgreSQL Exporter
docker run -d \
--name postgres-exporter \
--restart unless-stopped \
-p 9187:9187 \
-e DATA_SOURCE_NAME="postgresql://postgres:password@postgres-master:5432/postgres?sslmode=disable" \
prom/postgres_exporter:v0.12.1
关键指标:
| 指标名 | 说明 |
|---|---|
pg_stat_database_tup_inserted |
插入行数 |
pg_stat_database_tup_updated |
更新行数 |
pg_stat_database_tup_deleted |
删除行数 |
pg_stat_database_blocks_read |
磁盘块读取数 |
pg_locks_count |
锁等待数量 |
pg_replication_lag |
复制延迟 |
Blackbox Exporter(黑盒探测)
用于 HTTP/TCP/ICMP/DNS 探测,适合 SLI/SLO 监控。
docker run -d \
--name blackbox-exporter \
--restart unless-stopped \
-p 9115:9115 \
-v $(pwd)/blackbox.yml:/etc/blackbox/blackbox.yml \
prom/blackbox-exporter:v0.24.0 \
--config.file=/etc/blackbox/blackbox.yml
配置:
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2"]
follow_redirects: true
tcp_connect:
prober: tcp
timeout: 5s
dns:
prober: dns
timeout: 5s
dns:
transport_protocol: udp
query_name: google.com
Prometheus 抓取配置:
- job_name: 'blackbox-http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://api.example.com/health
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
- job_name: 'blackbox-tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- mysql-master:3306
- redis-master:6379
- postgres-master:5432
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox-exporter:9115
常用告警 PromQL:
# HTTP 探测失败率 > 1%
sum(rate(probe_success{job="blackbox-http"}[5m]) == 0) by (instance) > 0.01
DNS 解析时间 > 1s
probe_duration_seconds{job="blackbox-dns"} > 1
Kafka Exporter
docker run -d \
--name kafka-exporter \
--restart unless-stopped \
-p 9308:9308 \
danielqsj/kafka-exporter:v1.6.0 \
--kafka.server=kafka-broker-1:9092 \
--kafka.server=kafka-broker-2:9092 \
--consumer.group.enabled \
--topic.disable |
关键指标:
| 指标名 | 说明 |
|---|---|
kafka_broker_messages_in_total |
Broker 接收消息总数 |
kafka_consumer_group_offset |
消费组位移 |
kafka_topic_partitions |
分区数 |
kafka_consumer_lag |
消费 lag(关键) |
消费延迟告警:
# Consumer Lag > 10000
kafka_consumer_lag > 10000
Producer 请求失败
rate(kafka_producer_request_failures_total[5m]) > 0
统一 Exporter 部署规范
目录结构:
/opt/exporters/
├── node-exporter/
│ └── start.sh
├── mysql-exporter/
│ └── start.sh
├── redis-exporter/
│ └── start.sh
└── blackbox-exporter/
└── start.sh
supervisord 统一管理:
[program:node-exporter]
command=/opt/exporters/node-exporter/node_exporter
directory=/opt/exporters/node-exporter
autostart=true
autorestart=true
stdout_logfile=/var/log/exporter/node-exporter.log
stderr_logfile=/var/log/exporter/node-exporter.err
user=root
[program:mysql-exporter]
command=/opt/exporters/mysql-exporter/mysqld_exporter
directory=/opt/exporters/mysql-exporter
environment=DATA_SOURCE_NAME="exporter:password@tcp(mysql-master:3306)/"
autostart=true
autorestart=true
stdout_logfile=/var/log/exporter/mysql-exporter.log
stderr_logfile=/var/log/exporter/mysql-exporter.err
user=root
Exporter 开发规范
自定义 Exporter 需要遵循 Prometheus 文本格式:
# HELP <metric_name> <description>
TYPE <metric_name> <type> (gauge/counter/histogram/summary/untyped)
<metric_name>{label1="value1",label2="value2"} <value>
示例
HELP http_requests_total Total HTTP requests
TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 1024
http_requests_total{method="POST",status="201"} 512
Go 语言示例:
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
httpRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests",
},
[]string{"method", "status"},
)
)
func init() {
prometheus.MustRegister(httpRequests)
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
}
最佳实践
- 端口规范: 9xxx 端口段,避免与业务端口冲突
- 鉴权: 生产环境 Exporter 添加 Basic Auth 或 TLS
- Label 规范: 统一使用
instance、env、cluster标签
- 抓取间隔: 高流量服务用 15s,低流量服务用 60s
- 高可用: 多实例 Exporter 前置负载均衡