本指南說明如何計算虛擬機器 (VM) 上符合指定篩選條件的程序數量。您可以使用 Cloud Monitoring API 或 Google Cloud 控制台,建立快訊政策和圖表來計算程序。
如要瞭解執行中的程序資訊 (例如特定程序的 CPU 使用率),請參閱程序指標。
用於計算程序的監控篩選器結構,與用於指定受監控資源或指標類型的篩選器結構類似。如需一般資訊,請參閱「監控篩選器」。
事前準備
如果您不熟悉指標、時間序列和受監控資源,請參閱「指標、時間序列和資源」。
計入的程序
監控功能會對叫用程序的指令列套用規則運算式,藉此計算程序數量。如果程序沒有可用的指令列欄位,就不會計入。
如要判斷程序是否可計數,請查看 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會以邏輯 OR 運算子加入command。程序只要符合任一篩選條件,就會列入計算。user會透過邏輯 AND 運算子與command_line(command) 聯結。 只有在程序同時符合user篩選器和command_line(command) 篩選器時,才會視為相符。- 如果您套用所有篩選器,程序符合
user篩選器,且符合command_line或command篩選器時,就會列入計算。
具名引數
如要使用具名引數,請指定篩選器名稱、等號陳述式、=,然後指定篩選器值。具名引數的指定順序不限。
舉例來說,如果指令列包含字串 nginx,下列指令會比對由根目錄啟動的所有程序:
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")