多类型 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 规范: 统一使用 instanceenvcluster 标签
  • 抓取间隔: 高流量服务用 15s,低流量服务用 60s
  • 高可用: 多实例 Exporter 前置负载均衡