Exporter
Exporter
Blackbox exporter
The blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, ICMP and gRPC.
blackbox-exporter的配置文件使用默认的即可(/usr/local/blackbox_exporter/blackbox.yml),文件里定义了进行目标检测时要使用的模块和模块参数。至于要检测哪些目标是定义在Prometheus 的Job配置中。
# Blackbox Exporter modules 配置文件
# 保存为 blackbox.yml,重启 blackbox_exporter 后生效
modules:
# TCP 连接探测,适合检测任意 TCP 服务端口是否可达(无 HTTP 握手)
tcp_connect_8000:
prober: tcp
timeout: 5s
# tcp 探测可以配置发送/期望回复,但对常规端口检测通常不需要
tcp:
# 可选:如果服务会在连接后立即返回特定数据,可以配置 query/response
# query: ""
# response: ""
# HTTP 探测(检查 2xx 响应 / 基本 HTTP 可用性),用于 web 服务的详细检查
http_8000:
prober: http
timeout: 5s
http:
# 请求方法
method: GET
# 期望的有效状态码范围,若服务返回 200 则认为成功
valid_status_codes: [200]
# 如果希望接受 2xx/3xx/4xx 可根据需要调整,例如 [200,301]
# valid_status_codes: [200,301]
# 不跟随重定向(根据需要可改为 true)
no_follow_redirects: false
# 优先使用 IPv4(内部网络通常使用 IPv4)
preferred_ip_protocol: "ip4"
# 若服务使用 TLS 且内部证书不受信任,可以内网使用跳过校验
tls_config:
insecure_skip_verify: true
# 可选自定义请求头
headers:
# Example:
# Host: example.local
# User-Agent: blackbox-probe
scrape_configs:
- job_name: 'blackbox-192.168.3.51-8000-tcp'
metrics_path: /probe
params:
module: [tcp_connect_8000] # 使用 blackbox.yml 中的模块名
static_configs:
- targets: ['192.168.3.51:8000'] # 被探测目标 (target)
relabel_configs:
# 将 __address__(目标)传给 /probe 的参数 target
- source_labels: [__address__]
target_label: __param_target
# 使用 target 值作为 instance 标签(可在 grafana/告警中显示)
- source_labels: [__param_target]
target_label: instance
# 把实际的 scrape 地址改为 blackbox exporter 的地址
- target_label: __address__
replacement: 127.0.0.1:9115 # <-- 把这改为 blackbox_exporter 的地址:端口
postgres_exporter
export DATA_SOURCE_NAME=postgresql://postgres:Pgsql%402024@localhost:5432/postgres?sslmode=disable
scrape_configs:
- job_name: postgres_exporter
static_configs:
- targets: ["localhost:9187"]
--extend.query-path=queries.yaml
table_size:
query: |
SELECT
schemaname,
relname AS table_name,
pg_total_relation_size(relid) AS bytes
FROM pg_stat_user_tables;
metrics:
- schemaname:
usage: "LABEL"
- table_name:
usage: "LABEL"
- bytes:
usage: "GAUGE"
${__field.labels.table_name}
热加载配置 curl -X POST http://localhost:9090/-/reload 默认没有启用,需要在启动时指定 prometheus --config.file=/path/to/prometheus.yml --web.enable-lifecycle prometheus --web.enable-lifecycle
Status → Targets
Node Exporter
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:v1.10.2
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
node-exporter:
image: 192.168.3.12:5005/prometheus/node-exporter:v1.10.2
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
# 👇 新增:textfile 目录
- /var/lib/node_exporter/textfile:/textfile:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
# 👇 新增:开启 textfile collector
- '--collector.textfile.directory=/textfile'
textfile collector
/var/lib/node_exporter/textfile/dm_license.prom
dm_license_expiry_timestamp 1777488000
启动 Node Exporter 时,如果开启了这个参数:
--collector.textfile.directory=/var/lib/node_exporter/textfile
它会做一件事:
👉 每次 Prometheus 来抓 /metrics 时:
扫描这个目录
读取所有 .prom 文件
把内容拼进 /metrics 输出
告警
groups:
- name: dm-license-alert
rules:
- alert: DMLicenseExpireSoon
expr: (dm_license_expiry_timestamp - time()) / 86400 <= 90
for: 0m
labels:
severity: warning
annotations:
summary: "达梦数据库授权即将到期"
description: "剩余 {{ printf \"%.0f\" $value }} 天"
Note
在 Prometheus 里,它返回的是: 满足条件 → 返回 原始数值(剩余天数) 不满足 → 这个时间序列直接消失
route:
receiver: feishu
group_by: ['alertname']
group_wait: 30s
group_interval: 24h
repeat_interval: 24h
receivers:
- name: feishu
webhook_configs:
- url: "https://open.feishu.cn/open-apis/bot/v2/hook/你的token"
mysqld_exporter
# 配置mysqld_exporter
[client] user=root password=Mysql@2023 port=3306
# 启动mysqld_exporter
监控数据量大小
./mysqld_exporter --web.telemetry-path=/metrics --collect.info_schema.innodb_tablespaces
mysql_info_schema_innodb_tablespace_file_size_bytes
https://github.com/prometheus/mysqld_exporter
模糊查询使用 ~
mysql_info_schema_innodb_tablespace_file_size_bytes{instance="192.168.3.204:9104", job="mysql-105", tablespace_name=~"cs.*"}
# prometheus 配置
- job_name: 'mysql-105' # 给被监控主机取个名字
static_configs:
- targets: ['192.168.3.204:9104'] # 这里填写被监控主机的IP和端口
process-exporter
docker
docker run -d --rm -p 9256:9256 --privileged -v /proc:/host/proc -v `pwd`:/config ncabatoff/process-exporter --procfs /host/proc -config.path /config/filename.yml
version: '3.8'
services:
process-exporter:
image: ncabatoff/process-exporter:latest
container_name: process-exporter
restart: unless-stopped
privileged: true
ports:
- "9256:9256"
volumes:
# 映射宿主机的 /proc 到容器内的 /host/proc
- /proc:/host/proc:ro
# 映射当前目录到容器内的 /config (对应原命令中的 `pwd`)
# 请确保当前目录下有一个名为 filename.yml 的配置文件
- ./:/config
command:
- "--procfs=/host/proc"
- "--config.path=/config/filename.yml"
./process-exporter --config.path process.yml
process_names:
- name: dolphinscheduler-master
cmdline:
- MasterServer
- name: dolphinscheduler-worker
cmdline:
- WorkerServer
name:
给这一组进程起个逻辑名字
这个名字 不会影响匹配
只会体现在 Prometheus 指标的 name label 里
cmdline:
匹配规则(最关键)
含义是:
只要某个进程的 启动命令行(cmdline)里包含 MasterServer 这个字符串
就认为它是 dolphinscheduler-master
等价于 Linux 上
ps -ef | grep MasterServer
- job_name: process_exporter
static_configs:
- targets: ["localhost:9256"]
namedprocess_namegroup_num_procs{groupname="dolphinscheduler-master"}
namedprocess_namegroup_num_procs{groupname="dolphinscheduler-worker"}
告警规则
groups:
- name: dolphinscheduler服务监控
rules:
- alert: DolphinSchedulerMasterProcessDown
expr: namedprocess_namegroup_num_procs{groupname="dolphinscheduler-master"} < 1
for: 10s
labels:
severity: warning
- alert: DolphinSchedulerWorkerProcessDown
expr: namedprocess_namegroup_num_procs{groupname="dolphinscheduler-worker"} < 1
for: 10s
labels:
severity: warning