排解監控代理程式相關問題

這個頁面可協助您診斷安裝或執行 Monitoring 代理程式過程中的問題。

檢查清單

如果您在安裝或使用 Monitoring 代理程式時遇到問題,請檢查以下項目:

  • 如果 Linux 安裝指令導致錯誤,請確認安裝指令是否以 sudo 為前置字元。

  • 確認代理程式服務正在您的 VM 執行個體上執行:

    • 針對 Windows VM,請使用下列 PowerShell 指令:

      Get-Service -Name StackdriverMonitoring
      

      搜尋名稱為 Stackdriver Monitoring 的服務。如果代理程式未執行,可能需要重新啟動。

    • 針對 Linux VM,請使用下列指令:

      sudo service stackdriver-agent status
      

      如果代理程式未執行,您可能需要使用下列指令重新啟動:

      sudo service stackdriver-agent restart
      

      如果重新啟動失敗,且記錄輸出內容顯示「Disabled via metadata」(透過中繼資料停用),您可能正在執行 Google Cloud Marketplace 中的映像檔,而 Monitoring Agent 預設為停用。這項功能是由 google-monitoring-enable 執行個體中繼資料鍵 (值為 0) 控制。如要重新啟用代理程式,請移除該鍵或將值設為 1 (請參閱「設定執行個體中繼資料」)。

      如果無法透過中繼資料停用代理程式,請重新安裝代理程式。如要瞭解這個程序,請參閱「重新安裝 Monitoring 代理程式」。

  • 查看代理程式是否已將錯誤訊息寫入記錄。

    • 在 Windows 中,Monitoring 代理程式會將訊息寫入 Windows 事件記錄檔。

    • 在 Linux 上,Monitoring Agent 是 collectd 套件,會將訊息記錄到 /var/log/syslog 或 /var/log/messages。記錄訊息會以 collectd 或 stackdriver-agent 做為前置字元:

      • 如果看到 HTTP 429 錯誤,表示您可能已超出Monitoring API 配額。如要查看可用配額,請在Google Cloud 控制台中選取「API 和服務」>「資訊主頁」。請選擇 [Monitoring API]。

      • 如果看到 Proxy 問題,請檢查 HTTP Proxy 設定是否正確。這些操作說明是「在 Linux 和 Windows 上安裝」一文的一部分。

      • 如果遇到 API 存取或授權問題,或是看到「無法判斷 collectd 端點」等錯誤訊息,請參閱下一個章節「驗證專案和憑證」。

      • 如果記錄中顯示「Unsupported collectd plugin/type combination」(不支援的 collectd 外掛程式/類型組合) 或「Unsupported collectd id」(不支援的 collectd ID) 錯誤,可能是因為您傳送了不支援的代理程式指標。可能原因如下:

        • 您修改了其中一個代理程式第三方應用程式設定。如要還原變更,請按照相關說明文件頁面的指示,重新安裝特定外掛程式的設定。如要使用代理程式將該指標傳送至 Monitoring,請考慮將指標轉換為使用者定義指標。

        • 其中一個第三方應用程式外掛程式正在傳送 Monitoring 無法辨識的新指標。如要瞭解如何提出要求,請參閱支援頁面,我們會審查這些指標並分類。

  • 如果代理程式似乎正常運作,但您沒有收到資料,或警報政策未如預期運作,請檢查代理程式是否將資料傳送至正確的專案。請參閱下方的驗證專案與憑證一節。

驗證專案與憑證

如果監控代理程式回報存取或授權錯誤,或代理程式似乎正常運作,但沒有資料或警報政策未如預期運作,請檢查 VM 執行個體的憑證是否正確,包括是否指定正確的專案:

  • 如果您使用的 Compute Engine VM 執行個體具有標準 (而非私密金鑰) 憑證,資料不太可能傳送到錯誤的專案,但您的憑證可能仍有不足。如要瞭解憑證,請參閱「授權 Monitoring 代理程式」。如要驗證憑證,請參閱「驗證 Compute Engine 憑證」。

  • 如果您在 Compute Engine 執行個體上使用私密金鑰憑證,則憑證可能無效或來自錯誤的專案。如要瞭解憑證,請參閱「授權 Monitoring 代理程式」。如要驗證憑證,請參閱「驗證私密金鑰憑證」。

如果問題仍未解決,請參閱「重新安裝監控代理程式」。

驗證 Compute Engine 憑證

使用 Google Cloud 控制台的 Compute Engine「VM instances」(VM 執行個體) 頁面,確認 Compute Engine VM 執行個體是否具備 Monitoring Agent 的適當憑證。憑證通常會新增至所有新的 Compute Engine VM 執行個體的預設服務帳戶,但您可以在建立執行個體時覆寫這些預設值。

前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面:

前往「VM instances」(VM 執行個體) 頁面

如果您是使用搜尋列尋找這個頁面,請選取子標題為「Compute Engine」的結果。

  1. 如有需要,請將目前的 Google Cloud 專案變更為與 Compute Engine VM 執行個體相關聯的專案。舉例來說,如果系統提示您啟用計費功能,表示目前專案中沒有任何 Compute Engine VM 執行個體。
  2. 在「VM Instances」(VM 執行個體) 頁面中,按一下 VM 執行個體的名稱。畫面會隨即顯示 VM 執行個體的詳細資料頁面。
  3. 在「VM 執行個體詳細資料」頁面中,查看「Cloud API 存取範圍」標題下方:
    • 如果您看到「Allow full access to all Cloud APIs」(允許所有 Cloud API 的完整存取權),表示您擁有充分憑證。
    • 如果「Stackdriver Monitoring API」旁邊顯示 Cloud Monitoring API 的舊名稱,且您擁有「僅寫入」或「完整」權限,表示您有足夠的憑證。
    • 否則,執行個體的預設服務帳戶就沒有代理程式所需的憑證。如要在執行個體中使用代理程式,您必須新增私密金鑰服務帳戶憑證。如需操作說明,請參閱新增憑證。

如果您有正確的預設憑證,請直接跳至「在 Linux 和 Windows 上安裝」一節。

驗證私密金鑰憑證

如要驗證是否已在您的 VM 執行個體上安裝有效的私密金鑰憑證,請先驗證憑證檔案是否存在於其預期位置,然後驗證憑證檔案中的資訊是否有效。您可以使用 Google Cloud 控制台的「IAM & Admin」>「Service accounts」部分,撤銷先前有效的憑證。如果沒有有效憑證,請參閱「新增憑證」一文,瞭解如何更換現有憑證或新增憑證。

是否存在憑證?

如要查看私密金鑰服務帳戶憑證是否位於您的執行個體上,請在您的執行個體上執行下列 Linux 指令:

sudo cat $GOOGLE_APPLICATION_CREDENTIALS
sudo cat /etc/google/auth/application_default_credentials.json

如果任何指令顯示如下所示的檔案,表示您的執行個體可能擁有有效的私密金鑰憑證。如果兩個指令都顯示一個檔案,則系統會使用由 GOOGLE_APPLICATION_CREDENTIALS 表示的檔案。

{
  "type": "service_account",
  "project_id": "{your-project-id}",
  "private_key_id": "{your-private-key-id}",
  "private_key": "{your-private-key}",
  "client_email": "{your-project-number}-{your-key}@developer.gserviceaccount.com",
  "client_id": "{your-client-id}",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "{x509-cert-url}",
  "client_x509_cert_url": "{client-x509-cert-url}"
}

如果不存在任何憑證檔案,請參閱新增憑證一文。

憑證是否有效?

在憑證檔案中,「project_id」欄位是您的 Google Cloud 專案,「client_email」會識別專案中的服務帳戶,而「private_key_id」則會識別服務帳戶中的私密金鑰。將這項資訊與Google Cloud 控制台的「IAM & Admin」>「Service accounts」部分顯示的資訊進行比對。

如果發生下列任一情況,憑證檔案就會無效:

  • 您正在檢查 Compute Engine VM 執行個體,但憑證檔案中的Google Cloud 專案並非含有執行個體的專案。
  • 所列服務帳戶不存在。可能已遭刪除。
  • 所列服務帳戶未啟用正確角色,至少應具備 roles/monitoring.metricWriter (監控指標寫入器),用於收集指標,以及 roles/logging.logWriter (記錄寫入器),用於寫入記錄。
  • 私密金鑰不存在。可能已遭到撤銷。

如果服務帳戶正確,但私密金鑰已撤銷,則您可以建立新的私密金鑰,並將其複製到執行個體。否則,您必須如下面的新增憑證一節所述,建立新的服務帳戶。

產生新憑證

如果憑證無效,請採取下列步驟:

  1. 針對每個含有需要使用私密金鑰授權的連線專案,以及每個含有未納入存取權範圍 https://www.googleapis.com/auth/monitoring.write 而建立的 Compute Engine 執行個體專案,建立服務帳戶並產生私密金鑰 (如果尚未建立)。請按照下列步驟操作:
    1. 前往 Google Cloud 控制台的「Settings」(設定) 頁面:

      前往「設定」

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果。

    2. 選取「指標範圍」分頁標籤。
    3. 找出包含有問題 Compute Engine 資源的專案,然後前往 Google Cloud 控制台。
    4. 前往 Google Cloud 控制台的「IAM Service Accounts」(IAM 服務帳戶) 頁面,選取您的 Google Cloud 專案,建立新的服務帳戶,然後為該服務帳戶產生新的私密金鑰。

      如要執行這些步驟,請採取下列任一做法:

      • 前往「IAM Service Accounts」(IAM 服務帳戶) 頁面,選取您的 Google Cloud 專案,然後按照「 建立服務帳戶」一文中的步驟操作:

        前往 IAM 服務帳戶

      • 按一下下列按鈕,然後選取專案: Google Cloud

        建立服務帳戶並下載金鑰

        上一個按鈕會自動建立金鑰,並下載至本機系統,供代理程式專屬服務帳戶使用。如有必要,這個程序也會建立必要的服務帳戶,並確保服務帳戶具備正確的權限。代理商專屬服務帳戶的名稱與 stackdriver-1234@PROJECT_ID.iam.gserviceaccount.com 類似。完成這些動作後,您會收到類似下列的對話方塊通知:

        通知使用者已建立服務帳戶和金鑰的橫幅。

  2. 在與有問題的服務帳戶對應的執行個體上,替換私密金鑰。

    • 在 Linux 上,請取代 /etc/google/auth/application_default_credentials.json 中的私密金鑰。
    • 在 Windows 中,取代 C:\ProgramData\Google\Auth\application_default_credentials.json 中的私密金鑰。 詳情請參閱「 將私密金鑰複製到執行個體」。
  3. 重新啟動代理程式

    • 在 Linux 上執行 sudo service stackdriver-agent restart
    • 在 Windows 上,前往服務管理控制台,然後重新啟動 Cloud Monitoring 服務。

如果您有多個專案需要新的私密金鑰,請針對每個專案重複這個程序。

如要確認私密金鑰是否正確,請參閱「憑證是否存在?」一節。 具體情況如下:

  • 在執行個體上讀取私密金鑰 JSON 檔案,例如 (在 Linux 上): sudo cat /etc/google/auth/application_default_credentials.json
  • 請確認 project_id 欄位的值與您剛產生憑證的受監控專案相符。

驗證代理程式資料

如要確認代理程式是否正確傳送指標,請使用 Monitoring API 的 timeSeries.list 方法,從 VM 執行個體尋找最近的時間序列資料。您可以使用方法說明文件頁面上的 APIs Explorer 呼叫方法。如果沒有看到任何資料,可能是因為代理程式將資料傳送至錯誤的專案。如要檢查,請參閱「驗證專案和憑證」。

以下是使用 timeSeries.list 方法的詳細操作說明:

  1. 確定安裝代理程式的 VM 執行個體的執行個體 ID:

    • Compute Engine 執行個體:前往執行個體的 Compute Engine 詳細資料頁面。按一下頁面底部的「Equivalent REST」(對等 REST)。ID 為 19 位數。
  2. 前往 timeSeries.list 方法的說明文件頁面。

  3. 填寫 APIs Explorer 表單:

    1. 將 name 設為含有 VM 執行個體的專案,並加上 projects/ 前置字元。例如:projects/[YOUR_PROJECT_ID]。

    2. 將「filter」(篩選器) 設定為下面此行指令碼,以從 VM 執行個體中選擇代理程式指標。複製並貼到 APIs Explorer,然後變更 VM 執行個體 ID:

      metric.type = "agent.googleapis.com/memory/bytes_used" AND resource.label.instance_id = "[YOUR-VM-INSTANCE-ID]"
      
    3. 設定搜尋時間間隔。您需要大約五分鐘的間隔時間:

      • 將 interval.endTime 設為目前的 GMT 時間,您可以在 time.is/GMT 找到這項資訊。時間格式必須如下列範例所示。請勿在時間前後加上半形引號:

        2016-10-31T14:10:00Z
        
      • 將「interval.startTime」設定為結束時間前大約五分鐘的時間,且使用相同格式。

    4. 將其他所有欄位保留空白。

  4. 按一下 [Execute] (執行)。

您會看到如下所示的輸出:

{
 "timeSeries": [
  {
   "metric": {
    "labels": {
     "state": "buffered"
    },
    "type": "agent.googleapis.com/memory/bytes_used"
   },
   "resource": {
    "type": "[INSTANCE-TYPE]",
    "labels": {
     "instance_id": "[YOUR-VM-INSTANCE-ID]",
     "zone": "[YOUR-INSTANCE-ZONE]",
     "project_id": "[YOUR-PROJECT-ID]"
    }
   },
   "metricKind": "GAUGE",
   "valueType": "DOUBLE",
   "points": [
    {
     "interval": {
      "startTime": "[START_TIME]",
      "endTime": "[END_TIME]"
     },
     "value": {
      "doubleValue": 27451392
     }
    },
    ...

如果 API 呼叫從 VM 執行個體傳回任何時間序列資料 (如上所示),表示代理程式運作正常,且所有作業都完成了。

如果沒有看到任何時間序列資料,請檢查下列事項:

  • 如果 API 呼叫導致錯誤訊息,這並不表示代理程式有問題。確認已正確填寫 APIs Explorer 欄位:

    • 「無效引數」錯誤可能表示專案 ID、篩選器或兩個時間戳記的拼字和格式有問題。

      時間戳記引數的規定取決於您指定的指標類型。指標類型會記錄 GAUGE、DELTA 或 CUMULATIVE 資料。詳情請參閱 MetricKind。

      如要使用 DELTA 和 CUMULATIVE 指標,必須提供開始和結束時間,且結束時間必須晚於開始時間。這類指標類型會記錄一段時間內測得的變化,因此開始和結束時間必須定義非零間隔。

    • 「未獲授權」錯誤可能表示您拼錯專案 ID。

    • 如果出現「找不到」錯誤,表示您在「名稱」欄位中省略了必要的 projects/ 前置字元。

    修正問題,然後再次呼叫 API。

  • 如果 API 呼叫成功,但只看到空白回應 { },請檢查篩選條件和時間間隔是否正確。時間戳記的格式錯誤可能會導致無法傳回資料。如果一切正常,但您沒有收到任何資料,表示代理程式未傳送指標資料,或至少未傳送至您預期的專案。這可能表示憑證有問題,請參閱「驗證私密金鑰憑證」。

重新安裝 Monitoring 代理程式

安裝最新版代理程式可解決許多問題:

判斷哪些 Linux VM 已安裝代理程式

  • 執行下列任一查詢,查看哪些 Linux VM 正在執行代理程式:

    請注意,您必須為每項查詢輸入專案名稱,並調整時間範圍。

自動重新啟動代理程式

您可以設定指令碼,檢查代理是否正在執行,並在代理當機時重新啟動。

舉例來說,在 Linux 上,您可以建立下列 crontab 項目,每 5 分鐘檢查一次代理程式狀態:

  */5 * * * * /bin/pidof stackdriver-collectd >/dev/null 2>&1 || /usr/sbin/service stackdriver-agent restart >/dev/null 2>&1

已知問題

以下各節說明 Monitoring 代理程式的已知問題。

處理資料存取權問題 (Windows)

您可能會在 Windows 事件記錄中看到類似下列內容的代理程式錯誤訊息:

Read access denied for processes: Registry (84), smss.exe (264), csrss.exe (376), wininit.exe (448), csrss.exe (456), services.exe (580), NisSrv.exe (3008), MsMpEng.exe (3624), csrss.exe (7044)

這則訊息表示服務專員無法存取你系統上的這項資料。如要停止顯示這則訊息,請為 SYSTEM 使用者提供足夠的權限,以便讀取錯誤訊息中列出的程序和服務的程序資料。如果不需要這項資料,可以放心忽略這些資訊訊息。

中繼資料快取問題 (Linux)

您可能會在 Linux 系統記錄檔 (Debian / Ubuntu 上的 /var/log/syslog 或 Red Hat / CentOS / SLES 上的 /var/log/messages) 中看到類似下列的錯誤訊息:

collectd[25571]: uc_update: Value too old: name = myhost/processes-all/ps_vm;
value time = 1511345468.180; last cache update = 1511345468.180;
write_gcm: wg_update_stats failed.
write_gcm: uc_update returned an error.

這些訊息是無害的警告,不會造成資料遺失。 如果時間戳記不符,目前的程序外掛程式實作項目就會產生這些訊息。

捨棄無限值資料點的問題 (Linux)

您可能會在 Linux 系統記錄檔 (Debian / Ubuntu 上的 /var/log/syslog 或 Red Hat / CentOS / SLES 上的 /var/log/messages) 中看到類似下列的錯誤訊息:

write_gcm: can not take infinite value

這則訊息表示系統已捨棄單一格式錯誤的資料點。這通常無害,可以忽略。

中繼資料鍵節流問題 (Linux)

您可能會在 Linux 系統記錄檔 (Debian / Ubuntu 上的 /var/log/syslog 或 Red Hat / CentOS / SLES 上的 /var/log/messages) 中看到類似下列的錯誤訊息:

collectd[7440]:match_throttle_metadata_keys: uc_meta_data_add returned an error
collectd[7440]:match_throttle_metadata_keys: mtg_update_stats failed

這則訊息表示記憶體節流的狀態更新失敗一次。 這通常無害,但如果經常發生,可能表示代理程式的記憶體不足。

Cloud Monitoring API 配額用完 (Linux)

您可能會在 Linux 系統記錄檔 (Debian / Ubuntu 上的 /var/log/syslog 或 Red Hat / CentOS / SLES 上的 /var/log/messages) 中看到類似下列的錯誤訊息:

collectd[25198]: write_gcm: Unsuccessful HTTP request 429

這則訊息表示已達到 Cloud Monitoring API 配額限制。 如要瞭解如何管理配額限制,請參閱「Quota」指南。

COLLECTD_INTERVAL 偏低導致記憶體用量偏高 (Linux)

如果 COLLECTD_INTERVAL 設定的時間比預設的 60 seconds 短 (例如 10 seconds),代理程式的記憶體用量可能會偏高。這是代理程式的已知限制,因為代理程式會從單一執行緒依序傳送要求。為減輕這類情況,建議您只針對部分必要指標縮減 COLLECTD_INTERVAL,其餘指標則維持預設間隔。

權杖緩衝區溢位問題 (Linux)

您可能會在 Linux 系統記錄檔中看到類似下列的錯誤訊息 (Debian/Ubuntu 上的/var/log / syslog 或 Red Hat /CentOS/SLES 上的/var / log / messages):

write_gcm: Error or buffer overflow when building auth_header
write_gcm: wg_oauth2_get_auth_header failed.
write_gcm: wg_transmit_unique_segment failed.
write_gcm: wg_transmit_unique_segments failed. Flushing.

這些訊息表示監控代理程式需要升級至 6.1.2 以上版本。

存放區變更了「來源」值 (Linux)

升級或安裝代理程式,或在 Debian/Ubuntu Linux 上執行 apt-get update 時,可能會看到類似以下的錯誤訊息:

E: Repository 'https://packages.cloud.google.com/apt google-cloud-monitoring-buster-all InRelease' changed its 'Origin' value from 'google-cloud-monitoring-buster' to 'namespaces/cloud-ops-agents-artifacts/repositories/google-cloud-monitoring-buster-all'
E: Repository 'https://packages.cloud.google.com/apt google-cloud-monitoring-buster-all InRelease' changed its 'Label' value from 'google-cloud-monitoring-buster' to 'namespaces/cloud-ops-agents-artifacts/repositories/google-cloud-monitoring-buster-all'

這則訊息表示套件存放區快取可能與來源不同。如要解決這個問題,請執行下列指令:

apt-get --allow-releaseinfo-change update

然後再次執行升級或安裝作業。

已移除 Google Cloud 控制台回報為已安裝的代理程式

解除安裝代理程式後, Google Cloud 控制台最多可能需要一小時才能回報這項變更。

Windows 的「解除安裝程式」清單中未顯示 Monitoring 代理程式

如果 Windows 控制台的「解除安裝程式」清單未列出監控代理程式,請從安裝目錄執行 uninstall.exe,解除安裝該代理程式。