process-exporter 是一个用于 Prometheus 生态的监控工具,专门用来收集和暴露 Linux 系统中特定进程的资源使用情况(如 CPU、内存、磁盘 I/O、线程数等)。
说明
通常我们使用 node_exporter 监控操作系统的整体资源(如整个服务器的 CPU 使用率),而 process-exporter 则可以让你知道具体是哪个进程(比如 java、mysql 或你的应用进程)吃掉了这些资源。
核心功能与工作原理
- 数据源:它通过读取 Linux 的
/proc 文件系统(如 /proc/<pid>/stat)来获取进程信息。
- 分组机制:它不会盲目监控系统上成千上万个进程,而是根据你提供的匹配规则(正则表达式),将符合条件的进程归类为一个“组”(Group)进行聚合监控。
- 指标:提供 CPU 时间、内存占用(RSS/Virtual)、磁盘读写字节、打开的文件描述符数量、线程状态等。
安装与部署
二进制包安装(Linux 主机)
最直接的安装方式,适合传统物理机或虚拟机。
-
下载:
前往 GitHub Releases 下载最新版(例如 v0.8.5)。
wget https://github.com/ncabatoff/process-exporter/releases/download/v0.8.5/process-exporter-0.8.5.linux-amd64.tar.gz
tar -xvf process-exporter-0.8.5.linux-amd64.tar.gz
cd process-exporter-0.8.5.linux-amd64
sudo cp process-exporter /usr/local/bin/
-
创建配置文件 (config.yaml):
Process-exporter 需要知道你想监控哪些进程。创建一个 YAML 文件来定义规则。
sudo mkdir -p /etc/process-exporter
sudo vim /etc/process-exporter/config.yaml
配置示例(监控名字包含 java 或 nginx 的进程):
process_names:
# 匹配所有名字中包含 nginx 的进程,并以 "nginx" 作为组名
- name: '{{.Comm}}'
cmdline:
- 'nginx'
# 匹配 java 进程,利用正则提取 JAR 包名字作为组名 (例如 my-app.jar -> Group: my-app)
- name: '{{.Matches.JarName}}'
cmdline:
- 'java -jar (?P<JarName>[^ ]+).jar'
-
创建 Systemd 服务并启动:
sudo vim /etc/systemd/system/process-exporter.service
内容如下:
[Unit]
Description=Prometheus Process Exporter
Documentation=https://github.com/ncabatoff/process-exporter
[Service]
User=root
# 注意:-config.path 指定刚才创建的配置文件
ExecStart=/usr/local/bin/process-exporter -config.path /etc/process-exporter/config.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务:
sudo systemctl daemon-reload
sudo systemctl enable process-exporter
sudo systemctl start process-exporter
Docker 安装
适合容器化环境。关键点是必须把宿主机的 /proc 挂载进去。
docker run -d --rm -p 9256:9256 --privileged \
-v /proc:/host/proc \
-v $(pwd)/config.yaml:/config/config.yaml \
ncabatoff/process-exporter \
--procfs /host/proc \
-config.path /config/config.yaml
Kubernetes (K8s) 部署
通常以 DaemonSet 方式运行,以便监控每个节点上的进程。
- Helm 安装(推荐):
可以使用社区提供的 Chart,例如 stable 或 prometheus-community。
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install process-exporter prometheus-community/prometheus-process-exporter \
--set config.process_names[0].name="{{.Comm}}" \
--set config.process_names[0].cmdline[0]=".+"
(上述命令配置了一个通用规则:监控所有进程并将进程名作为组名,生产环境建议缩小范围)
配置详解 (config.yaml)
Process-exporter 的核心在于如何通过正则匹配进程。
process_names: 定义匹配规则列表。
name: 定义在 Prometheus 中显示的指标标签值(groupname)。支持 Go 模板语法。
{{.Comm}}: 进程的可执行文件名(通常被截断为 15 字符)。
{{.ExeBase}}: 完整可执行文件的基名。
{{.Matches.MyVar}}: 引用正则中捕获的变量。
cmdline: 正则表达式列表,用于匹配进程的完整命令行。
实战配置示例:
-
简单粗暴:监控所有进程(不推荐,指标量巨大)
process_names:
- name: '{{.Comm}}'
cmdline:
- '.+'
-
监控特定的 Python 脚本
假设你运行了 python worker.py 和 python server.py。
process_names:
- name: 'python-{{.Matches.Script}}'
cmdline:
- 'python (.*\/)?(?P<Script>\w+\.py)'
效果:会生成组名为 python-worker.py 和 python-server.py 的指标。
Prometheus 集成
在 prometheus.yml 中添加一个 Job:
scrape_configs:
- job_name: 'process'
static_configs:
- targets: ['<安装了exporter的主机IP>:9256']
Grafana 看板
数据采集后,需要可视化展示。
推荐使用 Grafana 官方社区看板 ID:249 或 14728。
- 导入方法:在 Grafana 中点击
+ -> Import -> 输入 ID 249 -> 选择数据源 -> 完成。
总结
process-exporter 填补了 node_exporter 只能看“宏观”数据的空白。部署时最重要的是写好正则匹配规则,只监控关键进程,避免因监控所有进程导致 Prometheus 产生大量高基数(High Cardinality)数据而卡顿。