<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cloud-Monitoring on Tarragon</title><link>https://tarrragon.github.io/blog/tags/cloud-monitoring/</link><description>Recent content in Cloud-Monitoring on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 22 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/cloud-monitoring/index.xml" rel="self" type="application/rss+xml"/><item><title>Cloud Monitoring Metrics Model 與 MQL</title><link>https://tarrragon.github.io/blog/backend/04-observability/vendors/gcp-cloud-operations/cloud-monitoring-mql/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/04-observability/vendors/gcp-cloud-operations/cloud-monitoring-mql/</guid><description>&lt;blockquote>
&lt;p>本文是 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/vendors/gcp-cloud-operations/" data-link-title="GCP Cloud Operations" data-link-desc="GCP 原生觀測性套件（前 Stackdriver）：Logging / Monitoring / Trace / Profiler">GCP Cloud Operations&lt;/a> 的 vendor deep article，深化 overview「Cloud Monitoring uptime checks / SLO」跟「OTLP integration」段。初次接觸 GCP 觀測的讀者建議先讀 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/vendors/gcp-cloud-operations/" data-link-title="GCP Cloud Operations" data-link-desc="GCP 原生觀測性套件（前 Stackdriver）：Logging / Monitoring / Trace / Profiler">GCP Cloud Operations 服務頁&lt;/a>。&lt;/p>&lt;/blockquote>
&lt;h2 id="問題情境">問題情境&lt;/h2>
&lt;p>GCP 服務預設把 metrics 寫到 Cloud Monitoring，工程師打開 Metrics Explorer 就能看到 CPU、記憶體、request count。問題通常出在三個地方：GCP 內建 metrics 的 resource model 跟應用層的 business metrics 用不同語言描述同一件事，PromQL 使用者要重新學 MQL 語法，alerting policy 的 condition type 跟 notification channel 配置比預期複雜。理解 Cloud Monitoring 的 metrics model 才能避免 custom metrics 爆量、alert noise、跟 Prometheus 生態的銜接摩擦。&lt;/p>
&lt;h2 id="核心概念">核心概念&lt;/h2>
&lt;h3 id="monitored-resource-與-metric-descriptor">Monitored resource 與 metric descriptor&lt;/h3>
&lt;p>Cloud Monitoring 的資料模型有兩個軸：&lt;strong>monitored resource&lt;/strong> 描述「誰產生了這個 metric」，&lt;strong>metric descriptor&lt;/strong> 描述「這個 metric 量什麼」。&lt;/p>
&lt;p>Monitored resource 是 GCP 自動帶入的標籤集合。GKE pod 的 monitored resource type 是 &lt;code>k8s_pod&lt;/code>，帶 &lt;code>project_id&lt;/code>、&lt;code>location&lt;/code>、&lt;code>cluster_name&lt;/code>、&lt;code>namespace_name&lt;/code>、&lt;code>pod_name&lt;/code>。Cloud Run revision 是 &lt;code>cloud_run_revision&lt;/code>，帶 &lt;code>service_name&lt;/code>、&lt;code>revision_name&lt;/code>、&lt;code>location&lt;/code>。這層標籤不需要工程師手動設定，GCP agent 或 SDK 自動填入。&lt;/p>
&lt;p>Metric descriptor 定義 metric 的名稱、型別（GAUGE / DELTA / CUMULATIVE）、value type（INT64 / DOUBLE / DISTRIBUTION）與自訂 label。GCP 內建 metrics 用 &lt;code>compute.googleapis.com/instance/cpu/utilization&lt;/code> 這樣的命名空間格式；custom metrics 用 &lt;code>custom.googleapis.com/&amp;lt;your-name&amp;gt;&lt;/code> 或 &lt;code>workload.googleapis.com/&amp;lt;your-name&amp;gt;&lt;/code>（後者透過 OTel Collector 或 Managed Prometheus 寫入時使用）。&lt;/p>
&lt;p>兩個軸相乘就是 time series 的數量。Cardinality 管理在 GCP 上等同於控制 monitored resource × metric label 的組合數。GCP 對 custom metrics 有每個 project 的 time series 配額（預設 500 per metric descriptor、可申請提高），超過時寫入會被拒。&lt;/p>
&lt;h3 id="mql-vs-promql">MQL vs PromQL&lt;/h3>
&lt;p>Cloud Monitoring 有兩種查詢語言。MQL（Monitoring Query Language）是 GCP 自家設計的 pipeline 語法：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">fetch k8s_container
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">| metric &amp;#39;kubernetes.io/container/cpu/core_usage_time&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">| align rate(1m)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">| every 1m
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">| group_by [resource.cluster_name, resource.namespace_name],
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> [value_cpu_usage: aggregate(value.core_usage_time)]&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>PromQL 在 Cloud Monitoring 上也可用（透過 Managed Service for Prometheus）。兩者的核心差異：&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是 <a href="/blog/backend/04-observability/vendors/gcp-cloud-operations/" data-link-title="GCP Cloud Operations" data-link-desc="GCP 原生觀測性套件（前 Stackdriver）：Logging / Monitoring / Trace / Profiler">GCP Cloud Operations</a> 的 vendor deep article，深化 overview「Cloud Monitoring uptime checks / SLO」跟「OTLP integration」段。初次接觸 GCP 觀測的讀者建議先讀 <a href="/blog/backend/04-observability/vendors/gcp-cloud-operations/" data-link-title="GCP Cloud Operations" data-link-desc="GCP 原生觀測性套件（前 Stackdriver）：Logging / Monitoring / Trace / Profiler">GCP Cloud Operations 服務頁</a>。</p></blockquote>
<h2 id="問題情境">問題情境</h2>
<p>GCP 服務預設把 metrics 寫到 Cloud Monitoring，工程師打開 Metrics Explorer 就能看到 CPU、記憶體、request count。問題通常出在三個地方：GCP 內建 metrics 的 resource model 跟應用層的 business metrics 用不同語言描述同一件事，PromQL 使用者要重新學 MQL 語法，alerting policy 的 condition type 跟 notification channel 配置比預期複雜。理解 Cloud Monitoring 的 metrics model 才能避免 custom metrics 爆量、alert noise、跟 Prometheus 生態的銜接摩擦。</p>
<h2 id="核心概念">核心概念</h2>
<h3 id="monitored-resource-與-metric-descriptor">Monitored resource 與 metric descriptor</h3>
<p>Cloud Monitoring 的資料模型有兩個軸：<strong>monitored resource</strong> 描述「誰產生了這個 metric」，<strong>metric descriptor</strong> 描述「這個 metric 量什麼」。</p>
<p>Monitored resource 是 GCP 自動帶入的標籤集合。GKE pod 的 monitored resource type 是 <code>k8s_pod</code>，帶 <code>project_id</code>、<code>location</code>、<code>cluster_name</code>、<code>namespace_name</code>、<code>pod_name</code>。Cloud Run revision 是 <code>cloud_run_revision</code>，帶 <code>service_name</code>、<code>revision_name</code>、<code>location</code>。這層標籤不需要工程師手動設定，GCP agent 或 SDK 自動填入。</p>
<p>Metric descriptor 定義 metric 的名稱、型別（GAUGE / DELTA / CUMULATIVE）、value type（INT64 / DOUBLE / DISTRIBUTION）與自訂 label。GCP 內建 metrics 用 <code>compute.googleapis.com/instance/cpu/utilization</code> 這樣的命名空間格式；custom metrics 用 <code>custom.googleapis.com/&lt;your-name&gt;</code> 或 <code>workload.googleapis.com/&lt;your-name&gt;</code>（後者透過 OTel Collector 或 Managed Prometheus 寫入時使用）。</p>
<p>兩個軸相乘就是 time series 的數量。Cardinality 管理在 GCP 上等同於控制 monitored resource × metric label 的組合數。GCP 對 custom metrics 有每個 project 的 time series 配額（預設 500 per metric descriptor、可申請提高），超過時寫入會被拒。</p>
<h3 id="mql-vs-promql">MQL vs PromQL</h3>
<p>Cloud Monitoring 有兩種查詢語言。MQL（Monitoring Query Language）是 GCP 自家設計的 pipeline 語法：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">fetch k8s_container
</span></span><span class="line"><span class="ln">2</span><span class="cl">| metric &#39;kubernetes.io/container/cpu/core_usage_time&#39;
</span></span><span class="line"><span class="ln">3</span><span class="cl">| align rate(1m)
</span></span><span class="line"><span class="ln">4</span><span class="cl">| every 1m
</span></span><span class="line"><span class="ln">5</span><span class="cl">| group_by [resource.cluster_name, resource.namespace_name],
</span></span><span class="line"><span class="ln">6</span><span class="cl">    [value_cpu_usage: aggregate(value.core_usage_time)]</span></span></code></pre></div><p>PromQL 在 Cloud Monitoring 上也可用（透過 Managed Service for Prometheus）。兩者的核心差異：</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>MQL</th>
          <th>PromQL（via Managed Prometheus）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>資料來源</td>
          <td>所有 Cloud Monitoring metrics</td>
          <td>透過 Managed Prometheus 寫入的 metrics</td>
      </tr>
      <tr>
          <td>查詢介面</td>
          <td>Metrics Explorer / alerting condition</td>
          <td>Grafana / Prometheus UI / API</td>
      </tr>
      <tr>
          <td>Aggregation 語法</td>
          <td>pipe-style <code>group_by</code></td>
          <td>函式風格 <code>sum by (label)</code></td>
      </tr>
      <tr>
          <td>跨 GCP 與 custom</td>
          <td>原生支援 GCP 內建 metrics</td>
          <td>需要轉成 Prometheus 格式</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>GCP-specific、不可搬到其他平台</td>
          <td>跨平台標準、可搬到 Mimir / Thanos</td>
      </tr>
  </tbody>
</table>
<p>選擇判讀：純 GCP 環境且團隊沒有 Prometheus 經驗 → MQL 起步快。已有 Prometheus / Grafana 生態 → 用 Managed Prometheus + PromQL、把 GCP 內建 metrics 透過 Prometheus-compatible exporter 導入。混合環境 → 兩者並存、GCP 原生 metrics 用 MQL 做 alerting、application metrics 用 PromQL 查詢。</p>
<h2 id="配置-step-by-step">配置 step-by-step</h2>
<h3 id="custom-metrics-設計與寫入">Custom metrics 設計與寫入</h3>
<p>Custom metrics 的常見路徑有三條：</p>
<p><strong>路徑一：Cloud Monitoring API 直接寫入</strong>。應用程式用 Cloud Monitoring client library 建立 metric descriptor 並寫入 time series。適合 GCP-native 應用，不需要額外 agent。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">metric type: custom.googleapis.com/checkout/latency_ms
</span></span><span class="line"><span class="ln">2</span><span class="cl">kind: GAUGE
</span></span><span class="line"><span class="ln">3</span><span class="cl">value type: DISTRIBUTION
</span></span><span class="line"><span class="ln">4</span><span class="cl">labels: [service, region, status_code]</span></span></code></pre></div><p><strong>路徑二：OTel Collector + GCP exporter</strong>。應用程式用 OTel SDK 產生 metrics，OTel Collector 透過 <code>googlecloud</code> exporter 寫到 Cloud Monitoring。Metrics 命名空間是 <code>workload.googleapis.com/</code>。適合已有 OTel instrumentation 的服務。</p>
<p><strong>路徑三：Managed Service for Prometheus</strong>。部署 GCP 的 Managed Prometheus collector（或自管 Prometheus + remote write），metrics 存在 GCP 託管的 Monarch backend。查詢用 PromQL。適合 Kubernetes 環境且團隊熟悉 Prometheus 生態。</p>
<p>三條路徑可以共存。選擇判讀：先看團隊的 metrics 生態是 GCP-native 還是 Prometheus-native，再看 multi-cloud 需求。Managed Prometheus 的優勢是 PromQL 可搬、劣勢是 GCP 內建 metrics 需要額外整合。</p>
<h3 id="alerting-policy-配置">Alerting policy 配置</h3>
<p>Cloud Monitoring alerting policy 由三部分組成：condition、notification channel、documentation。</p>
<p>Condition types：</p>
<ul>
<li><strong>Metric threshold</strong>：metric 超過閾值 N 分鐘。適合「error rate &gt; 1% 持續 5 分鐘」。</li>
<li><strong>Metric absence</strong>：metric 消失。適合偵測 scrape 斷裂或服務停擺。</li>
<li><strong>Forecasting</strong>：預測 metric 在 N 小時後超過閾值。適合 disk 滿、quota 耗盡。</li>
<li><strong>Process health</strong>：GCE instance 的 process 是否存活。</li>
<li><strong>Log-based</strong>：Cloud Logging 出現特定 pattern 時觸發。適合把 error log 轉成 alert。</li>
<li><strong>SLO burn rate</strong>：SLO 設定後、burn rate 超過閾值。對應 <a href="/blog/backend/knowledge-cards/burn-rate/" data-link-title="Burn Rate" data-link-desc="說明 error budget 消耗速度如何支援告警與事故分級">burn-rate</a> 概念。</li>
</ul>
<p>Notification channels：Email / PagerDuty / Slack / Pub/Sub / Webhook / SMS。Pub/Sub channel 適合接自定義 automation（收到 alert → trigger Cloud Function）。</p>
<p>Snooze 與 maintenance window：暫時抑制特定 alerting policy。部署期間或已知維護時使用。</p>
<h3 id="managed-prometheus-整合">Managed Prometheus 整合</h3>
<p>GCP Managed Service for Prometheus 的部署模式：</p>
<ul>
<li><strong>GKE 模式</strong>：啟用 GKE monitoring、Managed Prometheus collector 自動部署。不需要自管 Prometheus server。</li>
<li><strong>Remote write 模式</strong>：自管 Prometheus server + <code>remote_write</code> 到 GCP Monarch endpoint。保留本地查詢能力，同時長期儲存在 GCP。</li>
<li><strong>OTel Collector 模式</strong>：OTel Collector 用 <code>googlemanagedprometheus</code> exporter 寫到 Monarch。</li>
</ul>
<p>查詢端：用 GCP Console 的 PromQL UI、或部署 Grafana + GMP datasource。PromQL 功能子集支援良好（rate / histogram_quantile / aggregation），少數進階功能（subquery）有限制。</p>
<h2 id="故障演練與邊界">故障演練與邊界</h2>
<h3 id="custom-metric-配額用盡">Custom metric 配額用盡</h3>
<p><strong>觸發條件</strong>：custom metric descriptor 數量超過 project 配額（預設 500），或單一 metric descriptor 的 time series 數量超過配額。</p>
<p><strong>表現</strong>：API 回傳 429 或 quota exceeded error。新 time series 寫不進去，既有的不受影響。</p>
<p><strong>修復</strong>：清理不再使用的 metric descriptor（describe → delete）、合併語意重疊的 metrics、減少 label cardinality。GCP Console → IAM → Quotas 可以申請提高配額，但先確認是設計問題而非真的需要那麼多 series。</p>
<h3 id="alerting-policy-觸發延遲">Alerting policy 觸發延遲</h3>
<p><strong>觸發條件</strong>：alerting policy 使用的 metrics 的 alignment period 或 duration 設定過長。</p>
<p><strong>表現</strong>：異常已經發生 10 分鐘，alert 才觸發。原因是 Cloud Monitoring 的 evaluation cycle 跟 metrics ingestion delay 相加。GCP 內建 metrics 的 ingestion delay 約 1-3 分鐘；custom metrics 透過 API 寫入的 delay 約 10-30 秒。</p>
<p><strong>修復</strong>：把 condition 的 alignment period 設短（1 分鐘）、duration 設短（但太短會造成 flapping）。Log-based alerting condition 的 delay 通常比 metric-based 短（秒級 vs 分鐘級），緊急異常考慮用 log-based condition。</p>
<h3 id="managed-prometheus-查詢與自管-prometheus-結果不一致">Managed Prometheus 查詢與自管 Prometheus 結果不一致</h3>
<p><strong>觸發條件</strong>：同一個 PromQL query 在本地 Prometheus 跟 GMP 的結果不同。</p>
<p><strong>表現</strong>：dashboard 數字對不上、alert 觸發行為不一致。</p>
<p><strong>修復</strong>：先確認 remote write 是否有 sample drop（看 <code>prometheus_remote_storage_samples_failed_total</code>）。再確認 GMP 的 PromQL 子集限制（部分 subquery 語法不支援）。最後確認 metric naming：local Prometheus 的 metric name 跟 GMP 儲存後的 naming convention 可能有差異（加了 <code>__name__</code> prefix 或 resource label）。</p>
<h2 id="容量與成本">容量與成本</h2>
<p>Cloud Monitoring 的計費模型基於 <strong>ingested metrics volume</strong>（per million data points）。GCP 內建 metrics（agent metrics 除外）免費。Custom metrics 的前 150 MB per billing account 免費，超過後按 volume 計費。</p>
<p>成本治理的判讀：</p>
<ul>
<li>最大成本來源通常是高頻率的 custom metrics 或高 cardinality label</li>
<li>用 <code>monitoring.googleapis.com/billing/bytes_ingested</code> metric 追蹤 ingestion 量</li>
<li>減少 scrape interval（15s → 30s 或 60s）可以直接降低 ingestion 量</li>
<li>Managed Prometheus 的計費跟 custom metrics 分開計算（per samples ingested）</li>
</ul>
<h2 id="整合與下一步">整合與下一步</h2>
<ul>
<li><a href="/blog/backend/04-observability/vendors/gcp-cloud-operations/" data-link-title="GCP Cloud Operations" data-link-desc="GCP 原生觀測性套件（前 Stackdriver）：Logging / Monitoring / Trace / Profiler">GCP Cloud Operations 服務頁</a>：overview 與日常操作</li>
<li><a href="/blog/backend/04-observability/cardinality-cost-governance/" data-link-title="4.7 Cardinality 治理與成本邊界" data-link-desc="把 metric / log / trace 的 cardinality 與成本作為平台一級治理議題">4.7 cardinality 治理</a>：cardinality 治理的完整策略</li>
<li><a href="/blog/backend/04-observability/sli-slo-signal/" data-link-title="4.6 SLI 量測與 SLO 訊號設計" data-link-desc="把可靠性目標的訊號從 metric 端設計好、餵給 6.6 SLO 政策">4.6 SLI/SLO signal</a>：SLO burn rate alert 的訊號設計</li>
<li><a href="/blog/backend/04-observability/vendors/prometheus/" data-link-title="Prometheus" data-link-desc="Pull-based metrics 主流 OSS、PromQL 與 alerting">Prometheus</a>：Managed Prometheus 的上游概念</li>
<li><a href="/blog/backend/04-observability/vendors/opentelemetry/" data-link-title="OpenTelemetry" data-link-desc="可觀測性開放標準、SDK 與 Collector">OpenTelemetry</a>：OTel Collector + GCP exporter 整合</li>
<li><a href="../cloud-logging-export-compliance/">Cloud Logging 查詢、匯出與合規</a>：同 vendor 的 logs 面</li>
</ul>
]]></content:encoded></item></channel></rss>