一、下载process-exporter安装包

1、本地下载后上传到linux服务器

下载地址:https://github.com/ncabatoff/process-exporter/releases/

2、直接在linux服务器上wget方式下载

# 新建目录
mkdir -p /data/prometheus/process-exporter
# 进入目标目录
cd /data/prometheus/process-exporter
# 下载
wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.10/process-exporter-0.7.10.linux-amd64.tar.gz
# 解压
tar -vxzf process-exporter-0.7.10.linux-amd64.tar.gz
# 移动到安装目录
mv /data/prometheus/process-exporter/process-exporter-0.7.10.linux-amd64 /usr/local/process-exporter
# 进入目录
cd /usr/local/process-exporter
# 新建配置文件
touch process.yml

3、process.yml

# 添加如下内容
process_names:
# 监控所有进程
#  - name: "{{.Matches}}"
#    cmdline:
#    - '.+'
  - name: "{{.Matches}}"
    cmdline:
    - 'mysqld'

process_names是个数组,每个成员表示一个分组。

name是分组的名称,这里使用模版。cmdline用于对分组中的进程进行过滤,这里的正则表达式就表示过滤所有进程。

因此,上述配置文件的含义是:采集所有进程的指标数据,当遍历到某个进程时,获取该进程的进程名,然后放到进程名对应的分组。

name字段可以使用固定的字符串,也可以使用以下模版:

{{.Comm}}:进程名
{{.ExeBase}}:可执行文件的文件名,与进程的区别是,进程名有长度15的限制
{{.ExeFull}}:可执行文件的全路径
{{.Username}}:进程的有效用户名
{{.Matches}}:用正则匹配cmdline等字段时得到的匹配项的map,例如下面的Cfgfile
{{.PID}}:pid,使用pid表示这个组只会有这一个进程
{{.StartTime}}:进程的起始时间
{{.Cgroups}}:进程的cgoup,可以用于区分不同的容器
进行分组进程过滤除了使用cmdline字段,还可以使用comm和exe,分别表示进程名和二进制路径,并且遵循以下规则:
如果使用了多个字段,则必须都匹配,例如,如果既使用了comm,又使用了exe,两个过滤必须都满足
对于comm和exe,它们是字符串数组,并且是OR的关系
对于cmdline,则是正则表达式数组,并且是AND的关系
process_names:
  # 进程名过滤,超过15个字符会被截断
  - comm:
    - bash

  # argv[0],如果开头不是/,说明匹配进程名
  # 如果开头是/,则需要使用二进制路径全匹配
  - exe:
    - postgres
    - /usr/local/bin/prometheus

  # 如果使用多个字段进行匹配,则需要都匹配
  - name: "{{.ExeFull}}:{{.Matches.Cfgfile}}"
    exe:
    - /usr/local/bin/process-exporter
    cmdline:
    - -config.path\s+(?P<Cfgfile>\S+)

二、将process-exporter配置为系统服务

1、进入systemd目录

cd /usr/lib/systemd/system

2、创建文件

vim process-exporter.service

# 添加如下内容
[[Unit]
Description=https://github.com/ncabatoff/process-exporter
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/usr/local/process-exporter/process-exporter --config.path=/usr/local/process-exporter/process.yml

[Install]
WantedBy=multi-user.target

3、服务命令

# 生效系统systemd文件
systemctl daemon-reload
# 设置开机自启
systemctl enable process-exporter.service
# 查看状态
systemctl status process-exporter.service
# 启动
systemctl start process-exporter.service
# 停止
systemctl stop process-exporter.service

三、启动process-exporter

# 进入目标目录
/usr/local/process-exporter
# 启动命令如下
nohup ./process-exporter -config.path=process.yml -web.listen-address=:9067 >> ./process-exporter.out 2>&1 &

process-exporter用来安装到被监控的主机上,服务器端通过调用默认端口9256来获取服务器信息。访问process-exporter

http://172.30.18.244:9256/metrics,默认端口为9256

四、Docker部署(推荐)

五、添加 Prometheus 监控配置

- job_name: "process"
    file_sd_configs:
    - refresh_interval: 1m
      files:
      - /data/docker/prometheus/sd_config/process.json

六、process.json

[{
    "targets": [
       "192.168.0.62:9256"
    ],
    "labels": {
       "service": "进程监控",
       "idc": "ctyun"
    }
}]

七、process-exporter的主要指标

1、process-exporter常用指标。

process-exporter中进程的指标以namedprocess_namegroup开头:

namedprocess_namegroup_num_procs:运行的进程数

namedprocess_namegroup_states:Running/Sleeping/Other/Zombie状态的进程数

namedprocess_namegroup_cpu_seconds_total:获取/proc/[pid]/stat 进程CPU utime、stime状态时间

namedprocess_namegroup_read_bytes_total:获取/proc/[pid]/io 进程读取字节数

namedprocess_namegroup_write_bytes_total:获取/proc/[pid]/io 进程写入字节数

namedprocess_namegroup_memory_bytes:获取进程使用的内存字节数,通过memtype区分不同的占用类型

namedprocess_namegroup_open_filedesc:获取进程使用的文件描述符数量

namedprocess_namegroup_thread_count:运行的线程数

namedprocess_namegroup_thread_cpu_seconds_total:获取线程CPU状态时间

namedprocess_namegroup_thread_io_bytes_total:获取线程IO字节数

namedprocess_namegroup_num_threads:线程数

namedprocess_namegroup_thread_context_switches_total:线程上下文切换统计

因此,进程的单核CPU占比的promsql语句为increase(namedprocess_namegroup_cpu_seconds_total{mode="user",groupname="procname"}[30s])*100/30,单核内核态CPU占比的promsql语句为increase(namedprocess_namegroup_cpu_seconds_total{mode="system",groupname="procname"}[30s])*100/30。

注意:实测发现,process-exporter获取的数据与/proc/pid/stat中的有一定差异,需要进一步看下。

process-exporter采集内存的指标时将内存分成5种类型:

resident:进程实际占用的内存大小,包括共享库的内存空间,可以从/proc/pid/status中的VmRSS获取

proportionalResident:与resident相比,共享库的内存空间会根据进程数量平均分配

swapped:交换空间,系统物理内存不足时,会将不常用的内存页放到硬盘的交换空间,可以从/proc/pid/status中的VmSwap获取

proportionalSwapped:将可能被交换的内存页按照可能性进行加权平均

virtual:虚拟内存,描述了进程运行时所需要的总内存大小,包括哪些还没有实际加载到内存中的代码和数据,可以从/proc/pid/status中的VmSize获取

对于一般的程序来说,重点关注的肯定是实际内存,也就是resident和virtual,分别表示实际在内存中占用的空间和应该占用的总空间。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐