<?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>監控實務指南 on Tarragon</title><link>https://tarrragon.github.io/blog/monitoring/</link><description>Recent content in 監控實務指南 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/monitoring/index.xml" rel="self" type="application/rss+xml"/><item><title>監控資料的雙重用途：行為分析與訊號治理</title><link>https://tarrragon.github.io/blog/monitoring/telemetry-data-dual-use/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/telemetry-data-dual-use/</guid><description>&lt;p>SDK 埋的每一筆 event 有兩個下游消費者：產品團隊用它做行為分析（轉換率、留存、歸因），工程團隊用它做訊號治理（cardinality 控制、成本歸因、事故判讀）。兩邊各自有教學章節（&lt;a href="https://tarrragon.github.io/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">Monitoring 08 Business Analytics&lt;/a> 和 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">Backend 04 可觀測性&lt;/a>），但讀者常不知道這是同一份資料的兩種消費方式。本文是橋。&lt;/p>
&lt;h2 id="同一份資料兩種消費路徑">同一份資料、兩種消費路徑&lt;/h2>





&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">SDK 埋點（event / error / metric / lifecycle）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> ├── 行為分析路徑 → Monitoring 08
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> │ 消費者：PM / 行銷 / 產品
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> │ 方法：funnel / cohort / attribution / A-B test
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> │ 決策：改 UI、調定價、投廣告
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> └── 訊號治理路徑 → Backend 04
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> 消費者：SRE / platform team / on-call
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> 方法：cardinality budget / cost attribution / signal governance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> 決策：降 cardinality、調 sampling、改 alert、產出 evidence&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>這不是兩套埋點。同一個 &lt;code>button.click&lt;/code> event，產品團隊看的是「哪個步驟流失最多使用者」，工程團隊看的是「這個 event 的 cardinality 是否在預算內、ingestion cost 是否合理」。event 相同，切入角度不同。&lt;/p>
&lt;h2 id="資料格式的交叉點">資料格式的交叉點&lt;/h2>
&lt;p>Monitoring SDK 送出的事件格式（&lt;a href="https://tarrragon.github.io/blog/monitoring/02-log-schema/" data-link-title="模組二：Log Schema 設計" data-link-desc="跨平台統一事件格式、欄位設計、版本演進策略">02 Log Schema&lt;/a>）和 Backend 04 的 log schema / OTel event format 有共通欄位：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>欄位&lt;/th>
 &lt;th>Monitoring SDK 格式&lt;/th>
 &lt;th>Backend 04 / OTel 格式&lt;/th>
 &lt;th>交叉用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>timestamp&lt;/td>
 &lt;td>&lt;code>timestamp&lt;/code>（ISO 8601）&lt;/td>
 &lt;td>&lt;code>TimeUnixNano&lt;/code>&lt;/td>
 &lt;td>兩邊都需要精確時間做時序查詢&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>event type&lt;/td>
 &lt;td>&lt;code>type&lt;/code>（event/error/metric/lifecycle）&lt;/td>
 &lt;td>&lt;code>SeverityText&lt;/code> / &lt;code>SpanKind&lt;/code>&lt;/td>
 &lt;td>行為分析按 type 做 funnel；訊號治理按 type 做 cardinality budget&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>source&lt;/td>
 &lt;td>&lt;code>source.sdk&lt;/code> / &lt;code>source.platform&lt;/code> / &lt;code>source.app&lt;/code>&lt;/td>
 &lt;td>&lt;code>Resource&lt;/code> attributes&lt;/td>
 &lt;td>行為分析按 platform 切分；訊號治理按 service 做 cost attribution&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>trace context&lt;/td>
 &lt;td>手動注入（若有）&lt;/td>
 &lt;td>&lt;code>TraceId&lt;/code> / &lt;code>SpanId&lt;/code>&lt;/td>
 &lt;td>client-to-server 端到端追蹤的串接欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>payload&lt;/td>
 &lt;td>&lt;code>data&lt;/code>（自由 JSON）&lt;/td>
 &lt;td>&lt;code>Attributes&lt;/code> / &lt;code>Body&lt;/code>&lt;/td>
 &lt;td>行為分析讀 business fields；訊號治理讀 operational fields&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>格式一致性的價值是&lt;strong>一份 event 同時餵 BigQuery（行為分析）和 Grafana Loki（訊號查詢）不需要格式轉換&lt;/strong>。如果兩邊各自定義 schema，同一個 event 要寫兩次 adapter，schema drift 的風險倍增。&lt;/p></description><content:encoded><![CDATA[<p>SDK 埋的每一筆 event 有兩個下游消費者：產品團隊用它做行為分析（轉換率、留存、歸因），工程團隊用它做訊號治理（cardinality 控制、成本歸因、事故判讀）。兩邊各自有教學章節（<a href="/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">Monitoring 08 Business Analytics</a> 和 <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">Backend 04 可觀測性</a>），但讀者常不知道這是同一份資料的兩種消費方式。本文是橋。</p>
<h2 id="同一份資料兩種消費路徑">同一份資料、兩種消費路徑</h2>





<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">SDK 埋點（event / error / metric / lifecycle）
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  │
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  ├── 行為分析路徑 → Monitoring 08
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  │     消費者：PM / 行銷 / 產品
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  │     方法：funnel / cohort / attribution / A-B test
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  │     決策：改 UI、調定價、投廣告
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  │
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  └── 訊號治理路徑 → Backend 04
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        消費者：SRE / platform team / on-call
</span></span><span class="line"><span class="ln">10</span><span class="cl">        方法：cardinality budget / cost attribution / signal governance
</span></span><span class="line"><span class="ln">11</span><span class="cl">        決策：降 cardinality、調 sampling、改 alert、產出 evidence</span></span></code></pre></div><p>這不是兩套埋點。同一個 <code>button.click</code> event，產品團隊看的是「哪個步驟流失最多使用者」，工程團隊看的是「這個 event 的 cardinality 是否在預算內、ingestion cost 是否合理」。event 相同，切入角度不同。</p>
<h2 id="資料格式的交叉點">資料格式的交叉點</h2>
<p>Monitoring SDK 送出的事件格式（<a href="/blog/monitoring/02-log-schema/" data-link-title="模組二：Log Schema 設計" data-link-desc="跨平台統一事件格式、欄位設計、版本演進策略">02 Log Schema</a>）和 Backend 04 的 log schema / OTel event format 有共通欄位：</p>
<table>
  <thead>
      <tr>
          <th>欄位</th>
          <th>Monitoring SDK 格式</th>
          <th>Backend 04 / OTel 格式</th>
          <th>交叉用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>timestamp</td>
          <td><code>timestamp</code>（ISO 8601）</td>
          <td><code>TimeUnixNano</code></td>
          <td>兩邊都需要精確時間做時序查詢</td>
      </tr>
      <tr>
          <td>event type</td>
          <td><code>type</code>（event/error/metric/lifecycle）</td>
          <td><code>SeverityText</code> / <code>SpanKind</code></td>
          <td>行為分析按 type 做 funnel；訊號治理按 type 做 cardinality budget</td>
      </tr>
      <tr>
          <td>source</td>
          <td><code>source.sdk</code> / <code>source.platform</code> / <code>source.app</code></td>
          <td><code>Resource</code> attributes</td>
          <td>行為分析按 platform 切分；訊號治理按 service 做 cost attribution</td>
      </tr>
      <tr>
          <td>trace context</td>
          <td>手動注入（若有）</td>
          <td><code>TraceId</code> / <code>SpanId</code></td>
          <td>client-to-server 端到端追蹤的串接欄位</td>
      </tr>
      <tr>
          <td>payload</td>
          <td><code>data</code>（自由 JSON）</td>
          <td><code>Attributes</code> / <code>Body</code></td>
          <td>行為分析讀 business fields；訊號治理讀 operational fields</td>
      </tr>
  </tbody>
</table>
<p>格式一致性的價值是<strong>一份 event 同時餵 BigQuery（行為分析）和 Grafana Loki（訊號查詢）不需要格式轉換</strong>。如果兩邊各自定義 schema，同一個 event 要寫兩次 adapter，schema drift 的風險倍增。</p>
<h2 id="資料治理的衝突">資料治理的衝突</h2>
<p>同一份資料被兩邊消費時，治理需求會衝突：</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>行為分析需要</th>
          <th>訊號治理需要</th>
          <th>衝突點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>保留期</td>
          <td>長期保留（年級，趨勢與 cohort 需要歷史資料）</td>
          <td>短期保留（30-90 天，debug 用完即丟）</td>
          <td>成本 vs 分析完整度</td>
      </tr>
      <tr>
          <td>粒度</td>
          <td>高粒度（per-user、per-session、per-action）</td>
          <td>低粒度（聚合到 service / endpoint 維度）</td>
          <td>cardinality 爆炸 vs 分析精度</td>
      </tr>
      <tr>
          <td>PII 處理</td>
          <td>去識別但需保留 user segment（國家、裝置、方案）</td>
          <td>完全匿名或 redacted</td>
          <td>分析需求 vs 合規要求</td>
      </tr>
      <tr>
          <td>取樣</td>
          <td>低取樣或全量（行為趨勢需要完整分布）</td>
          <td>可以高取樣（error 全收，正常 request 取樣即可）</td>
          <td>成本 vs 覆蓋度</td>
      </tr>
      <tr>
          <td>查詢延遲</td>
          <td>可接受分鐘級（batch analytics）</td>
          <td>需要秒級（incident debug 不能等）</td>
          <td>儲存分層與查詢 backend 選擇</td>
      </tr>
  </tbody>
</table>
<p>這些衝突無法靠「選一邊」解決。行為分析少了歷史資料就看不到趨勢；訊號治理存太多高粒度資料就 cardinality 爆炸。解法是分流。</p>
<h2 id="解法在-transport-層分流">解法：在 transport 層分流</h2>
<p>把 SDK 送出的 event 在 collector 或 pipeline 層分流到不同 backend，各自按需求治理：</p>
<h3 id="hot-path即時訊號">Hot path：即時訊號</h3>
<p>error 和 metric 類事件即時進入 <a href="/blog/backend/04-observability/telemetry-pipeline/" data-link-title="4.11 Telemetry Pipeline 架構" data-link-desc="把 log / metric / trace 的 agent → collector → ingest → storage → query 分層治理">04 telemetry pipeline</a>（Loki / Prometheus / Tempo），短期 retention（30-90 天），服務 on-call debug 和 incident triage。這條路徑要求秒級延遲、低 cardinality（聚合維度）。</p>
<h3 id="warm-path行為分析">Warm path：行為分析</h3>
<p>全部四類事件進入 data warehouse（BigQuery / ClickHouse / Snowflake），長期 retention（年級），服務 funnel、cohort、attribution 和 A/B test。這條路徑接受分鐘級延遲、高粒度（per-user / per-session）。</p>
<h3 id="cold-path合規留存">Cold path：合規留存</h3>
<p>audit-level event 進入 archive storage（Cloud Storage / S3 / Glacier），法規要求的年級保留（GDPR 刪除請求、HIPAA 6 年、金融業更長）。這條路徑寫入後幾乎不查詢，查詢時接受小時級延遲。</p>
<h3 id="分流的關鍵設計">分流的關鍵設計</h3>
<p>分流在 transport 層做，不在 SDK 層做。SDK 統一送出全部 event 到同一個 endpoint，pipeline 按 event type / source / tag 路由到不同 backend。</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">SDK → Collector / OTel Collector / Cloud Logging
</span></span><span class="line"><span class="ln">2</span><span class="cl">         │
</span></span><span class="line"><span class="ln">3</span><span class="cl">         ├─ [type=error OR type=metric] → Hot path (Loki / Prometheus)
</span></span><span class="line"><span class="ln">4</span><span class="cl">         ├─ [all events]                → Warm path (BigQuery)
</span></span><span class="line"><span class="ln">5</span><span class="cl">         └─ [audit=true]               → Cold path (Cloud Storage)</span></span></code></pre></div><p>SDK 不需要知道下游有幾個消費者。新增一個消費者（例如新的分析平台）只要在 pipeline 加一條路由，不用改 SDK。</p>
<h2 id="實作考量">實作考量</h2>
<p>分流的實作方式取決於 pipeline 架構：</p>
<table>
  <thead>
      <tr>
          <th>架構</th>
          <th>分流機制</th>
          <th>適用場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>自架 collector（<a href="/blog/monitoring/04-collector/" data-link-title="模組四：Collector 設計" data-link-desc="收 → 驗 → 存 → 查 → 觸發的完整鏈路 — Go 單一 binary、可插拔 Storage Backend、rule engine">Monitoring 04</a>）</td>
          <td>Rule engine 按 event type 寫不同 output file / HTTP endpoint</td>
          <td>小規模、自用場景</td>
      </tr>
      <tr>
          <td>OTel Collector</td>
          <td>Processor + 多個 Exporter 組成 pipeline fan-out</td>
          <td>中規模、已採用 OTel</td>
      </tr>
      <tr>
          <td>Cloud Logging（GCP）</td>
          <td>Subscription filter + Sink（BigQuery / Cloud Storage / Pub/Sub）</td>
          <td>GCP 生態</td>
      </tr>
      <tr>
          <td>Kinesis / Firehose（AWS）</td>
          <td>Firehose delivery stream + Lambda transform</td>
          <td>AWS 生態</td>
      </tr>
  </tbody>
</table>
<p>不論哪種架構，分流後的每條 path 要各自設定 retention、sampling、PII handling 和 cost budget。Hot path 的 <a href="/blog/backend/04-observability/cardinality-cost-governance/" data-link-title="4.7 Cardinality 治理與成本邊界" data-link-desc="把 metric / log / trace 的 cardinality 與成本作為平台一級治理議題">cardinality 治理</a> 規則不該影響 warm path 的分析粒度；warm path 的長期保留成本不該擠壓 hot path 的 freshness。</p>
<h2 id="常見誤區">常見誤區</h2>
<h3 id="用兩套-sdk-替代分流">用兩套 SDK 替代分流</h3>
<p>在 client 端同時整合行為分析 SDK（Mixpanel）和 error tracking SDK（Sentry），看似分工清楚，實際是兩套 schema、兩份 ingestion cost、兩組 PII 風險面、兩套 consent 管理。同一個 user action 在兩個平台各記一次，但欄位名、timestamp 精度、user identifier 可能不同，跨平台 correlation 困難。</p>
<p>統一 SDK + pipeline 分流的成本通常低於雙 SDK 的整合與治理成本。</p>
<h3 id="hot-path-存全量高粒度">Hot path 存全量高粒度</h3>
<p>把 per-user / per-session 的完整事件直接灌進 Prometheus 或 Loki，會導致 cardinality 爆炸（<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>）。Hot path 的正確做法是在 pipeline 層做 aggregation 或 relabeling，只保留 service / endpoint / status 等低 cardinality 維度。高粒度資料走 warm path。</p>
<h3 id="warm-path-不做-pii-處理">Warm path 不做 PII 處理</h3>
<p>行為分析需要 user segment，但不需要 PII 原文。warm path 的 ingestion pipeline 應該在寫入 warehouse 前做 PII redaction（hash user_id、truncate IP、strip email）。<a href="/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">Monitoring 07 去識別化</a> 的策略同時適用於 hot 和 warm path。</p>
<h2 id="讀者路由">讀者路由</h2>
<table>
  <thead>
      <tr>
          <th>如果你想</th>
          <th>先讀</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>理解 event 格式設計</td>
          <td><a href="/blog/monitoring/02-log-schema/" data-link-title="模組二：Log Schema 設計" data-link-desc="跨平台統一事件格式、欄位設計、版本演進策略">Monitoring 02 Log Schema</a></td>
      </tr>
      <tr>
          <td>理解行為分析方法</td>
          <td><a href="/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">Monitoring 08 Business Analytics</a></td>
      </tr>
      <tr>
          <td>理解訊號治理和成本控制</td>
          <td><a href="/blog/backend/04-observability/cardinality-cost-governance/" data-link-title="4.7 Cardinality 治理與成本邊界" data-link-desc="把 metric / log / trace 的 cardinality 與成本作為平台一級治理議題">Backend 04 Cardinality 治理</a>、<a href="/blog/backend/04-observability/cost-attribution/" data-link-title="4.15 Cost Attribution / Chargeback" data-link-desc="把 observability 成本拆到團隊、產品、環境維度">4.15 Cost Attribution</a></td>
      </tr>
      <tr>
          <td>理解 pipeline 分流架構</td>
          <td><a href="/blog/backend/04-observability/telemetry-pipeline/" data-link-title="4.11 Telemetry Pipeline 架構" data-link-desc="把 log / metric / trace 的 agent → collector → ingest → storage → query 分層治理">Backend 04 Telemetry Pipeline</a></td>
      </tr>
      <tr>
          <td>理解 PII 去識別化</td>
          <td><a href="/blog/monitoring/07-security-privacy/" data-link-title="模組七：資安與隱私" data-link-desc="SDK redaction / transport 加密 / collector access control / 去識別化 — 蒐集的資料本身就是風險資產">Monitoring 07 Security Privacy</a></td>
      </tr>
      <tr>
          <td>理解 client-to-server 端到端觀測串接</td>
          <td><a href="/blog/backend/04-observability/client-server-trace-integration/" data-link-title="4.24 Client-to-Server 端到端觀測串接" data-link-desc="用一個結帳場景走完 browser click → trace context → server span → 統一 waterfall 的完整實作鏈路">Backend 04 Client-to-Server 觀測串接</a></td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item></channel></rss>