程序健康狀態篩選器

本指南說明如何計算符合指定篩選條件的虛擬機器 (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 時存取直接篩選器模式,或在資訊主頁上建立快訊政策或圖表,請參閱下列文件

資源識別碼

程序健康狀態篩選器必須設定 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 會透過邏輯 OR 連接至 command。如果程序符合任一篩選條件,就會計入。
  • user 會透過邏輯 AND 與 command_line (command) 結合。只有符合 user 篩選器和 command_line (command) 篩選器的程序才會相符。
  • 如果您套用所有篩選器,系統會在程序符合 user 篩選器和 command_linecommand 篩選器時,將其計入計算。

具名引數

如要使用具名引數,請指定篩選器名稱、等於陳述式 =,然後指定篩選器值。您可以以任何順序指定具名引數。

舉例來說,當指令列包含 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")