您可以使用 Cloud Monitoring 的程序健康狀態篩選器,計算虛擬機器 (VM) 上符合特定條件的執行中程序數量。您可以透過 Cloud Monitoring API 或 Google Cloud 控制台的直接篩選模式,在警告政策和圖表中使用這些篩選器。
如要監控特定程序的資源消耗量 (例如 CPU 使用率),請參閱「監控 VM 上的程序」。程序健康狀態篩選器與標準資源和指標篩選器共用語法;如需一般語法規則,請參閱「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 VM 執行個體上的程序數量少於 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 VM。
如果您使用 Google Cloud 控制台,請使用直接篩選器模式輸入 Monitoring 篩選器的值。不過,請務必移除保護子字串的所有逸出字元。舉例來說,如要計算 Compute Engine VM 的所有程序,請輸入下列內容:
select_process_count("*") resource.type="gce_instance"
如要瞭解如何在使用 Metrics Explorer 時,或在資訊主頁上建立警告政策或圖表時,存取直接篩選模式,請參閱下列文件:
資源 ID
程序健康狀態篩選器必須設定 resource.type 欄位,指定要計算程序的 VM。這個篩選器的值必須是下列其中一個:
gce_instanceaws_ec2_instance
如果只指定 resource.type 欄位,系統會計算所有 VM 上的程序:
- 如要選取單一 VM 執行個體,請新增
metric.labels.instance_name篩選器物件。 - 如要選取一組 VM,請新增
group.id篩選器物件。
如要進一步瞭解 resource.type 欄位,請參閱「監控篩選器」。
程序 ID
程序健康狀態篩選器必須呼叫 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和command之間以邏輯 OR 連結。只要符合任一篩選條件,就會計入程序。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")
以下範例會計算使用者 www 啟動的所有程序,其指令列開頭為 /bin/bash:
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")