本指南介绍如何对在虚拟机上运行满足指定过滤条件的进程数量进行计数。您可以使用 Cloud Monitoring API 或使用 Google Cloud 控制台创建提醒政策和图表,用于计算流程。
如果您想了解正在运行的进程的相关信息,例如,要查看特定进程的 CPU 利用率,请参阅进程指标。
用于计算进程的 Monitoring 过滤器结构类似于使用这些过滤条件指定受监控的资源或指标类型的结构。如需了解一般信息,请参阅监控过滤条件。
准备工作
如果您不熟悉指标、时间序列和受监控的资源,请参阅指标、时间序列和资源。
要统计的进程
Monitoring 通过对调用进程的命令行应用正则表达式来计算进程。如果进程没有命令行字段可用,则不会计算该进程。
确定是否可以统计某个进程的方法之一是查看 Linux ps
命令的输出:
ps aux | grep nfs
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1598 0.0 0.0 0 0 ? S< Oct25 0:00 [nfsd4]
root 1639 0.0 0.0 0 0 ? S Oct25 2:33 [nfsd]
root 1640 0.0 0.0 0 0 ? S Oct25 2:36 [nfsd]
如果 COMMAND
列中的条目用方括号括起来(例如 [nfsd]
),则进程的命令行信息将不可用,因此系统不会统计该进程。
进程运行状况过滤器结构
进程运行状况过滤器用于标识要计数的进程以及要计算其进程的一个或多个资源。例如,以下 JSON 描述了在 Compute Engine 虚拟机实例上的进程数小于 30 时发送通知的提醒政策:
{ "displayName": "Count all processes", "conditionThreshold": { "aggregations": [], "comparison": "COMPARISON_LT", "duration": "0s", "filter": "select_process_count(\"*\") resource.type=\"gce_instance\"", "thresholdValue": 30, "trigger": { "count": 1 } } }
在此示例中,filter
语句的值是一个包含两个子句的字符串。第一个子句 select_process_count(\"*\")
指定计算所有进程。第二个子句 resource.type=\"gce_instance\"
标识要监控的 Compute Engine 虚拟机。
如果您使用 Google Cloud 控制台,请使用直接过滤模式输入 Monitoring 过滤条件的值。不过,请务必移除保护子字符串的所有转义字符。例如,如需计算 Compute Engine 虚拟机的所有进程,请输入以下内容:
select_process_count("*") resource.type="gce_instance"
如需了解如何在使用 Metrics Explorer 时或在信息中心中创建提醒政策或图表时访问直接过滤条件模式,请参阅以下文档
资源标识符
进程运行状况过滤条件必须设置 resource.type
字段以指定要计算其进程的虚拟机。此过滤条件的值必须是以下项之一:
gce_instance
aws_ec2_instance
如果仅指定 resource.type
字段,则计算所有虚拟机上的进程:
- 要选择单个虚拟机实例,请添加
metric.labels.instance_name
过滤条件对象。 - 要选择一组虚拟机,请添加
group.id
过滤条件对象。
如需详细了解 resource.type
字段,请参阅 Monitoring 过滤条件。
进程标识符
进程运行状况过滤器必须调用函数 select_process_count
。此函数的参数用于标识要计数的进程。
您可以在调用 select_process_count
中指定三个过滤条件对象:
command_line
(或metric.labels.command_line
):此过滤条件适用于用于启动该过程的命令行。命令行中 1024 个字符以后的内容会被截断,因此命令行中超出上述字符数限制的文本无法参与匹配。command
(或metric.labels.command
):此过滤条件适用于用于启动该过程的命令行。命令会在 1024 个字符后被截断,因此超出此限制的命令中的文本无法进行匹配。user
(或metric.labels.user
):此过滤条件适用于启动该进程的用户。
您可以在调用 select_process_count
中使用位置参数或命名参数。如果使用命名参数,则必须指定过滤条件对象、等于语句 =
和值。如果使用位置参数,那么您只需指定值。区分大小写的字符串测试确定进程是否与过滤条件匹配。
过滤对象的值可以是以下任一值:
- 字符串(完全匹配)
*
(通配符)has_substring(string)
starts_with(string)
ends_with(string)
monitoring.regex.full_match(string)
如果您指定了多个过滤条件,则需遵守以下规则:
command_line
通过逻辑 OR 加入command
。当进程与任一过滤条件匹配时,系统会计为进程。user
通过逻辑 AND 与command_line
(command
) 联接。进程仅在与user
过滤条件和command_line
(command
) 过滤条件匹配时才匹配。- 如果您应用所有过滤条件,那么当它与
user
过滤条件匹配且与command_line
或command
过滤条件匹配时,都会计为进程。
命名参数
如需使用命名参数,请指定过滤条件名称、等号语句、=
,然后指定过滤条件值。您可按任意顺序指定命名参数。
例如,以下命令与命令行包含字符串 nginx
时 root 进程启动的所有进程匹配:
select_process_count("command_line=has_substring(\"nginx\")","user=root")
此示例在命令行中使用正则表达式匹配:
select_process_count("command_line=monitoring.regex.full_match(\".*nginx.*\")","user=starts_with(\"root\")")
以下示例计算命令行为 /bin/bash
的所有进程:
select_process_count("command=/bin/bash")
此示例对命令行为以 /bin/bash
开头的用户 www
启动的所有进程进行计数:
select_process_count("user=www", "command_line=starts_with(\"/bin/bash \")")
位置参数
如需使用位置参数,您只需提供过滤条件值。以下规则适用于位置参数:
- 如果提供了单个参数,则该参数将被解释为命令行过滤条件对象:
select_process_count("*") select_process_count("/sbin/init") select_process_count("starts_with(\"/bin/bash -c\")") select_process_count("ends_with(\"--alsologtostderr\")") select_process_count("monitoring.regex.full_match(\".*nginx.*\")")
- 如果提供了两个参数,则第一个参数会被解释为命令行过滤条件,第二个参数是用户过滤条件。当进程与两个过滤条件对象都匹配时,系统会计数一个进程:
select_process_count("/sbin/init", "root")