如何通过Elastic Heartbeat的add_process_metadata监控Windows服务运行状态
为什么现有配置无法获取进程数据
add_process_metadata处理器的核心逻辑是从已生成的监控事件中读取PID字段,再匹配系统进程信息补充到事件内。你当前搭配的是ICMP类型的monitor,该类monitor仅执行网络层ping探测,生成的事件本身不包含任何进程ID、端口关联进程信息,因此无论如何配置match_pids参数都无法匹配到进程数据。
Heartbeat实现Windows服务/进程监控的方案
Heartbeat本身没有内置专门的Windows服务扫描monitor,但可以通过exec类型的monitor调用PowerShell脚本实现按固定服务名/二进制名的监控需求,无需引入其他Beats组件。
1. 按Windows服务名监控配置示例
heartbeat.monitors: - type: exec id: custom-windows-service-monitor name: 目标业务服务监控 schedule: '*/10 * * * * *' # 每10秒执行一次探测,可自行调整频率 command: 'powershell.exe' args: - '-ExecutionPolicy' - 'Bypass' - '-Command' # 替换下方<实际服务名>为你要监控的Windows服务的正式名称(可在服务属性页查询,非显示名称) - '$svc = Get-Service -Name "<实际服务名>" -ErrorAction SilentlyContinue; if ($svc -and $svc.Status -eq "Running") { exit 0 } else { exit 1 }' timeout: 5s
- 脚本退出码为0时Heartbeat判定服务正常,非0时判定服务异常,符合标准监控上报逻辑。
- 若需要补充进程PID、二进制路径等元数据到事件中,可以调整PowerShell脚本输出JSON格式的字段,Heartbeat会自动将输出内容合并到监控事件里:
$svcName = "<实际服务名>" $svc = Get-Service -Name $svcName -ErrorAction SilentlyContinue if ($svc -and $svc.Status -eq "Running") { $svcInfo = Get-CimInstance -ClassName Win32_Service -Filter "Name='$svcName'" Write-Output "{`"service.name`":`"$svcName`",`"service.status`":`"Running`",`"process.pid`":$($svcInfo.ProcessId),`"process.executable`":`"$($svcInfo.PathName.Replace('\','\\'))`"}" exit 0 } else { Write-Output "{`"service.name`":`"$svcName`",`"service.status`":`"Stopped`"}" exit 1 }
2. 按二进制文件名监控配置示例
如果需要按进程二进制名称监控,只需调整PowerShell命令即可:
args: - '-ExecutionPolicy' - 'Bypass' - '-Command' # 替换<二进制文件名(不含.exe后缀)>为实际的进程名,例:要监控notepad.exe就填notepad - '$proc = Get-Process -Name "<二进制文件名(不含.exe后缀)>" -ErrorAction SilentlyContinue; if ($proc) { exit 0 } else { exit 1 }'
可选:搭配add_process_metadata补充字段
如果你的脚本已经输出了process.pid字段,也可以配置add_process_metadata处理器自动补全进程的其余元数据:
processors: - add_process_metadata: match_pids: ["process.pid"] target: process.metadata
内容的提问来源于stack exchange,提问作者Christian Langis
相关产品推荐
相关产品推荐

