程序健康狀態篩選器

您可以使用 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_instance
  • aws_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")