17.4.3 应用与中间件Exporter实践
本节聚焦常见应用与中间件的 Exporter 落地实践,强调“最小权限、可观测优先、标签一致性”。每类提供原理草图、安装/配置示例、排错要点与练习。
原理草图(通用)#
MySQL(mysqld_exporter)#
关键指标:连接数、慢查询、InnoDB 缓冲池命中率、复制延迟、锁等待。
权限最小化:只读、限制来源。
安装与配置
# 1) 创建监控账号(只读)
mysql -uroot -p -e "
CREATE USER 'exporter'@'10.0.%' IDENTIFIED BY 'Exp0rt3r!';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'10.0.%';
FLUSH PRIVILEGES;"
# 2) 配置 exporter
cat >/etc/mysqld_exporter.cnf <<'EOF'
[client]
user=exporter
password=Exp0rt3r!
host=127.0.0.1
port=3306
EOF
chmod 600 /etc/mysqld_exporter.cnf
# 3) 运行 exporter
/usr/local/bin/mysqld_exporter \
--config.my-cnf=/etc/mysqld_exporter.cnf \
--web.listen-address=":9104" \
--collect.info_schema.processlist \
--collect.engine_innodb_status
验证
curl -s http://127.0.0.1:9104/metrics | grep -E "mysql_global_status_threads_connected|innodb"
常见排错
- 401/Access denied:账号权限不足,检查 GRANT。
- 连接超时:确认 host/port 与防火墙。
- 指标缺失:确认 performance_schema 已启用。
练习
1. 为从库新增标签 role=slave,比较 mysql_slave_status_seconds_behind_master。
2. 提交一条慢查询并观测 mysql_global_status_slow_queries 增长。
Nginx(nginx-prometheus-exporter / stub_status)#
关键指标:活跃连接、请求速率、状态码分布、upstream 健康。
原理草图
安装与配置
# /etc/nginx/conf.d/status.conf
server {
listen 127.0.0.1:8080;
location /stub_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
nginx -t && systemctl reload nginx
/usr/local/bin/nginx-prometheus-exporter \
--nginx.scrape-uri="http://127.0.0.1:8080/stub_status" \
--web.listen-address=":9113"
验证
curl -s http://127.0.0.1:9113/metrics | grep -E "nginx_connections|nginx_http_requests"
排错
- 403:stub_status 访问控制未放行 exporter。
- 指标为 0:确认有请求进入 Nginx。
练习
- 用 ab -n 100 -c 10 http://your-nginx/ 触发请求,观察请求速率变化。
Redis(redis_exporter)#
关键指标:内存使用、键空间、命中率、复制与持久化状态。
安装与配置
# 若启用 AUTH
export REDIS_PASSWORD='R3d1s!'
/usr/local/bin/redis_exporter \
--redis.addr=127.0.0.1:6379 \
--redis.password="$REDIS_PASSWORD" \
--web.listen-address=":9121"
验证
curl -s http://127.0.0.1:9121/metrics | grep -E "redis_memory_used_bytes|redis_commands_processed_total"
排错
- NOAUTH:确认密码正确、Redis requirepass 一致。
- 指标缺失:确认 exporter 连接地址正确。
练习
- 执行 redis-cli -a R3d1s! INCR test,观察命令总数变化。
Nacos(内置 metrics / exporter)#
关键指标:注册实例数、服务数量、心跳超时、配置发布次数、RT。
安装与配置(Nacos 2.x 内置)
# 确认 metrics 开启
grep -E "metrics.enabled" /home/nacos/conf/application.properties
# metrics.enabled=true
curl -s http://127.0.0.1:8848/nacos/actuator/prometheus | head
Prometheus 采集示例
# prometheus.yml
- job_name: 'nacos'
metrics_path: /nacos/actuator/prometheus
static_configs:
- targets: ['10.0.0.21:8848']
labels:
cluster: nacos-a
env: prod
排错
- 404:Nacos 版本不支持或路径错误。
- 无指标:检查 metrics.enabled。
练习
- 发布一次配置,观察配置发布相关指标变化。
Kafka(kafka_exporter / JMX Exporter)#
关键指标:分区滞后、ISR 变化、broker 状态、请求延迟。
JMX Exporter 方式
# 1) 准备 jmx_exporter 配置
cat >/opt/jmx/kafka.yml <<'EOF'
rules:
- pattern: "kafka.server<type=(.+), name=(.+)><>Value"
name: "kafka_server_$1_$2"
EOF
# 2) 启动 Kafka 时加载 javaagent
export KAFKA_OPTS="-javaagent:/opt/jmx/jmx_prometheus_javaagent-0.20.0.jar=9404:/opt/jmx/kafka.yml"
验证
curl -s http://127.0.0.1:9404/metrics | grep -E "kafka_server"
排错
- 端口不可达:确认 JVM 参数生效、端口放行。
- 指标太多:规则过宽,优化 rules。
练习
- 创建一个消费滞后场景,观察 lag 指标变化。
ZooKeeper(zookeeper_exporter / 四字命令)#
关键指标:节点数、连接数、角色、延迟、watch 数。
配置四字命令白名单
# /opt/zookeeper/conf/zoo.cfg
4lw.commands.whitelist=srvr,ruok,stat,conf
运行 exporter
/usr/local/bin/zookeeper_exporter \
--zookeeper.servers=127.0.0.1:2181 \
--web.listen-address=":9141"
排错
- Commands are not executed:白名单未配置或未重启。
练习
- 通过 echo srvr | nc 127.0.0.1 2181 查看角色并对应指标。
Keepalived(keepalived_exporter / 脚本采集)#
关键指标:主备状态、VRRP 切换次数、优先级变化。
脚本采集示例
# /usr/local/bin/keepalived_state_exporter.sh
#!/bin/bash
state=$(grep -E "State =" /var/log/keepalived.log | tail -1 | awk '{print $NF}')
if [ "$state" = "MASTER" ]; then echo "keepalived_state 1"; else echo "keepalived_state 0"; fi
排错
- 无日志:确认 keepalived 日志配置与路径。
练习
- 触发主备切换,验证指标变化与告警规则。
HAProxy(haproxy_exporter)#
关键指标:前后端队列、会话数、错误率、后端健康。
配置
# /etc/haproxy/haproxy.cfg
listen stats
bind 127.0.0.1:8404
stats enable
stats uri /stats
stats auth admin:Str0ng!
/usr/local/bin/haproxy_exporter \
--haproxy.scrape-uri="http://admin:Str0ng!@127.0.0.1:8404/stats;csv" \
--web.listen-address=":9101"
排错
- 401:stats auth 配置错误。
- 指标缺失:stats 未启用或 URI 错误。
练习
- 暂停一个后端节点,观察健康指标变化。
ProxySQL(proxysql_exporter)#
关键指标:连接池、查询路由命中、后端健康、QPS、慢查询。
配置
# ProxySQL 监控账号
mysql -uadmin -p -h 127.0.0.1 -P6032 -e "
INSERT INTO mysql_users(username,password,active) VALUES ('exp','Exp0rt3r!',1);
LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK;"
# 运行 exporter
/usr/local/bin/proxysql_exporter \
--proxysql.user=exp \
--proxysql.password=Exp0rt3r! \
--proxysql.host=127.0.0.1 \
--proxysql.port=6032 \
--web.listen-address=":9102"
排错
- 访问拒绝:确认 users 已加载到 runtime。
- 无数据:检查 ProxySQL 是否运行在 6032。
练习
- 制造读写分离流量,观察不同标签下 QPS。
Docker(cAdvisor)#
关键指标:容器 CPU/内存/IO、重启次数、镜像与容器数量。
安装与运行
docker run -d --name=cadvisor \
-p 8080:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor:v0.47.2
排错
- 指标不全:确认挂载目录权限与只读参数。
- 容器不可访问:检查宿主机防火墙与端口映射。
练习
- 启动一个高 CPU 容器,观察 container_cpu_usage_seconds_total。
Kubernetes(kube-state-metrics / kubelet / apiserver)#
关键指标:资源请求/限制、Pod 状态、调度失败、节点压力。
原理草图
安装示例(Helm)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install ksm prometheus-community/kube-state-metrics -n monitoring --create-namespace
排错
- 无 pod 指标:检查 RBAC 与 serviceaccount。
- kubelet 403:确认 --authentication-token-webhook 与证书。
练习
- 创建一个 Pending Pod,观察 kube_pod_status_phase 变化。
Jenkins(Prometheus 插件 / exporter)#
关键指标:任务排队时间、构建成功率、节点负载、队列长度。
安装与配置
1) Jenkins 插件管理安装 Prometheus metrics。
2) 启用 /prometheus 端点。
验证
curl -s http://jenkins.example.com/prometheus | head
排错
- 403:检查 Jenkins 全局安全与匿名访问权限。
- 无指标:确认插件已启用并重启。
练习
- 触发 3 次构建,观察 jenkins_job_last_build_duration。
实践要点与统一规范#
1) 统一标签:建议至少包含 job、instance、env、region、cluster、service。
2) 权限最小化:监控账号只读、限制访问范围,必要时通过反向代理与 TLS。
3) 采集节奏:高频指标(QPS、延迟)15s 内;状态类指标 30–60s。
4) 资源隔离:Exporter 可同机部署,但需控制端口与资源占用。
5) 数据一致性:同类指标命名与单位统一,避免重复与歧义。
统一排错清单(快速定位)#
- 端口不可达:
ss -lntp | grep <port> - Exporter 进程异常:
journalctl -u <service> -f - 抓取失败:Prometheus
Targets页面查看错误信息 - 权限问题:检查应用侧账号与白名单
- 指标为空:对比
/metrics与应用健康状态
本节练习(综合)#
- 为 MySQL、Redis、Nginx 各设置
env=prod标签并验证 Prometheustargets。 - 设计一条告警:Redis 内存使用率 > 85% 持续 5 分钟。
- 将 Kafka JMX 暴露端口限制为内网访问,并验证外网不可达。