<?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>Motivation on Tarragon</title><link>https://tarrragon.github.io/blog/tags/motivation/</link><description>Recent content in Motivation on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/motivation/index.xml" rel="self" type="application/rss+xml"/><item><title>動機驅動的事件設計</title><link>https://tarrragon.github.io/blog/monitoring/01-mental-model/motivation-to-event-mapping/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/01-mental-model/motivation-to-event-mapping/</guid><description>&lt;p>事件設計是三維結構：動機（為什麼收）決定需要什麼事件、感測器（怎麼收）決定在前端哪裡埋點、生命週期（什麼時候收）決定各事件在哪個產品階段啟用。本章展開&lt;a href="https://tarrragon.github.io/blog/monitoring/01-mental-model/derive-collection-from-requirements/" data-link-title="從需求推導「該收集哪些事件」" data-link-desc="從 debug 需求、行為分析需求、效能需求、合規需求四個方向推導事件收集策略 — 避免「什麼都收」和「什麼都不收」">從需求推導收集策略&lt;/a>的四個方向到具體事件名稱級。從動機出發反推事件清單，比從技術能力出發（「SDK 能收什麼就收什麼」）更精準 — 每個事件都能回指一個具體的消費場景。&lt;/p>
&lt;h2 id="debug-動機">Debug 動機&lt;/h2>
&lt;p>Debug 動機驅動的事件收集目標是「問題發生時、開發者能從事件記錄中重建 context 並定位根因」。&lt;/p>
&lt;h3 id="要偵測的行為">要偵測的行為&lt;/h3>
&lt;ul>
&lt;li>多步驟流程的每一步完成或失敗（連線 → 認證 → 資料交換）&lt;/li>
&lt;li>系統狀態轉換（前景/背景、連線/斷線、登入/登出）&lt;/li>
&lt;li>非預期例外（uncaught exception、network error、timeout）&lt;/li>
&lt;li>使用者最近的操作序列（問題發生前做了什麼）&lt;/li>
&lt;/ul>
&lt;h3 id="事件表">事件表&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>事件名稱&lt;/th>
 &lt;th>類型&lt;/th>
 &lt;th>觸發時機&lt;/th>
 &lt;th>data schema 重點&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>{feature}.step.done&lt;/td>
 &lt;td>lifecycle&lt;/td>
 &lt;td>流程步驟完成&lt;/td>
 &lt;td>step_name, duration_ms&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>{feature}.step.failed&lt;/td>
 &lt;td>error&lt;/td>
 &lt;td>流程步驟失敗&lt;/td>
 &lt;td>step_name, error, context&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>app.exception&lt;/td>
 &lt;td>error&lt;/td>
 &lt;td>uncaught exception&lt;/td>
 &lt;td>message, stack_trace, component&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>ws.connected / ws.disconnected&lt;/td>
 &lt;td>lifecycle&lt;/td>
 &lt;td>連線狀態變化&lt;/td>
 &lt;td>url, reason, code&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>app.foreground / app.background&lt;/td>
 &lt;td>lifecycle&lt;/td>
 &lt;td>app 前後景切換&lt;/td>
 &lt;td>duration_in_background&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>{action}.completed&lt;/td>
 &lt;td>event&lt;/td>
 &lt;td>使用者完成操作&lt;/td>
 &lt;td>action_detail&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="查詢場景">查詢場景&lt;/h3>
&lt;p>&lt;strong>Session 回放&lt;/strong>：按 session_id 過濾、按時間排序，還原「使用者做了什麼 → 系統發生了什麼 → 問題在哪裡出現」。&lt;/p>
&lt;p>&lt;strong>Error 根因定位&lt;/strong>：按 error name GROUP BY，找出最常出現的錯誤。單筆 error 的 stack_trace + 同 session 的 lifecycle 事件組合，判斷失敗發生在流程的哪一步。&lt;/p>
&lt;p>&lt;strong>最近 N 個操作&lt;/strong>：error 發生前的 10-20 個 event/lifecycle 事件，等同 Sentry 的 breadcrumb trail。&lt;/p>
&lt;h3 id="生命週期階段">生命週期階段&lt;/h3>
&lt;p>開發期起全開。Debug 事件是最早需要的 — 實機測試階段就依賴這些事件定位問題。error 類和 lifecycle 類不做取樣（量低且每筆都可能是線索）。&lt;/p>
&lt;h2 id="商業動機">商業動機&lt;/h2>
&lt;p>商業動機驅動的事件收集目標是「回答產品決策的問題 — 使用者在哪裡流失、不同群組行為有什麼差異、哪些功能被使用」。&lt;/p>
&lt;h3 id="要偵測的行為-1">要偵測的行為&lt;/h3>
&lt;ul>
&lt;li>漏斗步驟完成（註冊 → 啟用 → 付費 → 續約的每一步）&lt;/li>
&lt;li>功能使用頻率（哪些功能被頻繁使用、哪些從未被觸發）&lt;/li>
&lt;li>Session 長度和頻率（使用者多常用、每次用多久）&lt;/li>
&lt;li>關鍵轉換事件（首次付費、邀請好友、升級方案）&lt;/li>
&lt;/ul>
&lt;h3 id="事件表-1">事件表&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>事件名稱&lt;/th>
 &lt;th>類型&lt;/th>
 &lt;th>觸發時機&lt;/th>
 &lt;th>data schema 重點&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>funnel.{name}.step_N&lt;/td>
 &lt;td>event&lt;/td>
 &lt;td>漏斗步驟完成&lt;/td>
 &lt;td>step_name, funnel_name&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>feature.{name}.used&lt;/td>
 &lt;td>event&lt;/td>
 &lt;td>使用者使用特定功能&lt;/td>
 &lt;td>feature_name, context&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>session.start / session.end&lt;/td>
 &lt;td>lifecycle&lt;/td>
 &lt;td>session 邊界&lt;/td>
 &lt;td>session_duration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>conversion.{type}&lt;/td>
 &lt;td>event&lt;/td>
 &lt;td>關鍵轉換&lt;/td>
 &lt;td>conversion_type, value&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="查詢場景-1">查詢場景&lt;/h3>
&lt;p>&lt;strong>Funnel 轉換率&lt;/strong>：每步的完成數 / 上一步的完成數。SQLite 層做每步計數，PostgreSQL 層做 session 級 JOIN 的精確轉換率（見 &lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/feature-tier-boundary/" data-link-title="功能分層與 Backend 選擇" data-link-desc="SQLite 層和 PostgreSQL 層各自承載哪些功能 — 分界線是查詢模式而非資料量、觸發升級的是功能需求而非規模成長">功能分層與 Backend 選擇&lt;/a>）。&lt;/p>
&lt;p>&lt;strong>Cohort 留存&lt;/strong>：按「首次使用週」分群，計算每週的回訪率。需要 session.start 事件 + 使用者首次出現的時間戳。&lt;/p>
&lt;p>&lt;strong>功能使用率&lt;/strong>：feature.*.used 事件按 name GROUP BY COUNT，排序找出最常/最少使用的功能。&lt;/p>
&lt;h3 id="生命週期階段-1">生命週期階段&lt;/h3>
&lt;p>上線後啟用。開發期不需要商業事件（沒有真實使用者）。測試期可以用模擬流量驗證 funnel 事件的觸發正確性，但不做分析。&lt;/p>
&lt;h2 id="資安動機">資安動機&lt;/h2>
&lt;p>資安動機驅動的事件收集目標是「偵測非預期的存取模式、追蹤敏感操作、提供事後稽核的 audit trail」。&lt;/p></description><content:encoded><![CDATA[<p>事件設計是三維結構：動機（為什麼收）決定需要什麼事件、感測器（怎麼收）決定在前端哪裡埋點、生命週期（什麼時候收）決定各事件在哪個產品階段啟用。本章展開<a href="/blog/monitoring/01-mental-model/derive-collection-from-requirements/" data-link-title="從需求推導「該收集哪些事件」" data-link-desc="從 debug 需求、行為分析需求、效能需求、合規需求四個方向推導事件收集策略 — 避免「什麼都收」和「什麼都不收」">從需求推導收集策略</a>的四個方向到具體事件名稱級。從動機出發反推事件清單，比從技術能力出發（「SDK 能收什麼就收什麼」）更精準 — 每個事件都能回指一個具體的消費場景。</p>
<h2 id="debug-動機">Debug 動機</h2>
<p>Debug 動機驅動的事件收集目標是「問題發生時、開發者能從事件記錄中重建 context 並定位根因」。</p>
<h3 id="要偵測的行為">要偵測的行為</h3>
<ul>
<li>多步驟流程的每一步完成或失敗（連線 → 認證 → 資料交換）</li>
<li>系統狀態轉換（前景/背景、連線/斷線、登入/登出）</li>
<li>非預期例外（uncaught exception、network error、timeout）</li>
<li>使用者最近的操作序列（問題發生前做了什麼）</li>
</ul>
<h3 id="事件表">事件表</h3>
<table>
  <thead>
      <tr>
          <th>事件名稱</th>
          <th>類型</th>
          <th>觸發時機</th>
          <th>data schema 重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>{feature}.step.done</td>
          <td>lifecycle</td>
          <td>流程步驟完成</td>
          <td>step_name, duration_ms</td>
      </tr>
      <tr>
          <td>{feature}.step.failed</td>
          <td>error</td>
          <td>流程步驟失敗</td>
          <td>step_name, error, context</td>
      </tr>
      <tr>
          <td>app.exception</td>
          <td>error</td>
          <td>uncaught exception</td>
          <td>message, stack_trace, component</td>
      </tr>
      <tr>
          <td>ws.connected / ws.disconnected</td>
          <td>lifecycle</td>
          <td>連線狀態變化</td>
          <td>url, reason, code</td>
      </tr>
      <tr>
          <td>app.foreground / app.background</td>
          <td>lifecycle</td>
          <td>app 前後景切換</td>
          <td>duration_in_background</td>
      </tr>
      <tr>
          <td>{action}.completed</td>
          <td>event</td>
          <td>使用者完成操作</td>
          <td>action_detail</td>
      </tr>
  </tbody>
</table>
<h3 id="查詢場景">查詢場景</h3>
<p><strong>Session 回放</strong>：按 session_id 過濾、按時間排序，還原「使用者做了什麼 → 系統發生了什麼 → 問題在哪裡出現」。</p>
<p><strong>Error 根因定位</strong>：按 error name GROUP BY，找出最常出現的錯誤。單筆 error 的 stack_trace + 同 session 的 lifecycle 事件組合，判斷失敗發生在流程的哪一步。</p>
<p><strong>最近 N 個操作</strong>：error 發生前的 10-20 個 event/lifecycle 事件，等同 Sentry 的 breadcrumb trail。</p>
<h3 id="生命週期階段">生命週期階段</h3>
<p>開發期起全開。Debug 事件是最早需要的 — 實機測試階段就依賴這些事件定位問題。error 類和 lifecycle 類不做取樣（量低且每筆都可能是線索）。</p>
<h2 id="商業動機">商業動機</h2>
<p>商業動機驅動的事件收集目標是「回答產品決策的問題 — 使用者在哪裡流失、不同群組行為有什麼差異、哪些功能被使用」。</p>
<h3 id="要偵測的行為-1">要偵測的行為</h3>
<ul>
<li>漏斗步驟完成（註冊 → 啟用 → 付費 → 續約的每一步）</li>
<li>功能使用頻率（哪些功能被頻繁使用、哪些從未被觸發）</li>
<li>Session 長度和頻率（使用者多常用、每次用多久）</li>
<li>關鍵轉換事件（首次付費、邀請好友、升級方案）</li>
</ul>
<h3 id="事件表-1">事件表</h3>
<table>
  <thead>
      <tr>
          <th>事件名稱</th>
          <th>類型</th>
          <th>觸發時機</th>
          <th>data schema 重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>funnel.{name}.step_N</td>
          <td>event</td>
          <td>漏斗步驟完成</td>
          <td>step_name, funnel_name</td>
      </tr>
      <tr>
          <td>feature.{name}.used</td>
          <td>event</td>
          <td>使用者使用特定功能</td>
          <td>feature_name, context</td>
      </tr>
      <tr>
          <td>session.start / session.end</td>
          <td>lifecycle</td>
          <td>session 邊界</td>
          <td>session_duration</td>
      </tr>
      <tr>
          <td>conversion.{type}</td>
          <td>event</td>
          <td>關鍵轉換</td>
          <td>conversion_type, value</td>
      </tr>
  </tbody>
</table>
<h3 id="查詢場景-1">查詢場景</h3>
<p><strong>Funnel 轉換率</strong>：每步的完成數 / 上一步的完成數。SQLite 層做每步計數，PostgreSQL 層做 session 級 JOIN 的精確轉換率（見 <a href="/blog/monitoring/04-collector/feature-tier-boundary/" data-link-title="功能分層與 Backend 選擇" data-link-desc="SQLite 層和 PostgreSQL 層各自承載哪些功能 — 分界線是查詢模式而非資料量、觸發升級的是功能需求而非規模成長">功能分層與 Backend 選擇</a>）。</p>
<p><strong>Cohort 留存</strong>：按「首次使用週」分群，計算每週的回訪率。需要 session.start 事件 + 使用者首次出現的時間戳。</p>
<p><strong>功能使用率</strong>：feature.*.used 事件按 name GROUP BY COUNT，排序找出最常/最少使用的功能。</p>
<h3 id="生命週期階段-1">生命週期階段</h3>
<p>上線後啟用。開發期不需要商業事件（沒有真實使用者）。測試期可以用模擬流量驗證 funnel 事件的觸發正確性，但不做分析。</p>
<h2 id="資安動機">資安動機</h2>
<p>資安動機驅動的事件收集目標是「偵測非預期的存取模式、追蹤敏感操作、提供事後稽核的 audit trail」。</p>
<h3 id="要偵測的行為-2">要偵測的行為</h3>
<ul>
<li>認證失敗（密碼錯誤、biometric 失敗、token 過期）</li>
<li>權限越界嘗試（嘗試存取非自己的資源、呼叫無權限的 API）</li>
<li>敏感資料存取（查看個資、匯出資料、修改權限設定）</li>
<li>異常存取模式（短時間大量請求、非常規時段存取、來源 IP 變化）</li>
</ul>
<h3 id="事件表-2">事件表</h3>
<table>
  <thead>
      <tr>
          <th>事件名稱</th>
          <th>類型</th>
          <th>觸發時機</th>
          <th>data schema 重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>auth.{method}.failed</td>
          <td>error</td>
          <td>認證失敗</td>
          <td>method, failure_reason, attempt_count</td>
      </tr>
      <tr>
          <td>auth.{method}.success</td>
          <td>event</td>
          <td>認證成功（語意上是系統回呼、歸為 event 是業界慣例）</td>
          <td>method, duration_ms</td>
      </tr>
      <tr>
          <td>authz.denied</td>
          <td>error</td>
          <td>權限檢查拒絕</td>
          <td>resource, action, role</td>
      </tr>
      <tr>
          <td>sensitive.accessed</td>
          <td>event</td>
          <td>敏感資料被存取</td>
          <td>resource_type, accessor_role</td>
      </tr>
      <tr>
          <td>sensitive.exported</td>
          <td>event</td>
          <td>資料被匯出</td>
          <td>export_format, record_count</td>
      </tr>
      <tr>
          <td>admin.setting.changed</td>
          <td>event</td>
          <td>管理設定變更</td>
          <td>setting_key, old_value_hash, new_value_hash</td>
      </tr>
  </tbody>
</table>
<h3 id="查詢場景-2">查詢場景</h3>
<p><strong>認證失敗監控</strong>：auth.*.failed 事件的 count by session_id，短時間內同一 session 多次失敗 → 暴力破解嫌疑。Rule engine 設閾值告警。</p>
<p><strong>Audit trail</strong>：sensitive.* 和 admin.* 事件按時間排列，回答「誰在什麼時候存取/修改了什麼」。合規審計的必要紀錄。</p>
<p><strong>異常 pattern 偵測</strong>：auth 成功後的操作事件頻率和模式分析。正常使用者每 session 操作 10-50 次；自動化腳本可能操作數千次。</p>
<h3 id="生命週期階段-2">生命週期階段</h3>
<p>開發期起全開。安全事件不能延後 — 「先不收安全事件、上線後再加」等於安全審計的空白期。認證相關事件是 auto-intercept 的一部分（見 <a href="/blog/monitoring/03-sdk-design/auto-intercept/" data-link-title="自動攔截機制" data-link-desc="JS window.onerror / Flutter FlutterError.onError / Python sys.excepthook — 各平台攔截未捕獲例外的機制和限制">自動攔截機制</a>），不需要手動埋點。</p>
<h3 id="和-redaction-的關係">和 redaction 的關係</h3>
<p>資安事件本身可能包含敏感資訊（失敗的密碼、被存取的個資欄位名稱）。事件的 data schema 設計時標記需要 <a href="/blog/monitoring/knowledge-cards/redaction/" data-link-title="Redaction" data-link-desc="說明在事件資料離開 client 之前把敏感欄位的值替換成遮罩或移除的機制">redaction</a> 的欄位 — auth.failed 記錄失敗原因但不記錄輸入的密碼、sensitive.accessed 記錄資源類型但不記錄資源內容。</p>
<h2 id="效能動機">效能動機</h2>
<p>效能動機驅動的事件收集目標是「發現效能退化趨勢、定位效能瓶頸、為容量規劃提供數據」。</p>
<h3 id="要偵測的行為-3">要偵測的行為</h3>
<ul>
<li>操作回應時間（API 呼叫、頁面載入、動畫轉場）</li>
<li>渲染效能（frame rate、長任務、佈局重排）</li>
<li>資源使用（記憶體、CPU、網路流量）</li>
<li>外部依賴延遲（第三方 API、CDN、資料庫查詢）</li>
</ul>
<h3 id="事件表-3">事件表</h3>
<table>
  <thead>
      <tr>
          <th>事件名稱</th>
          <th>類型</th>
          <th>觸發時機</th>
          <th>data schema 重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>{operation}.duration</td>
          <td>metric</td>
          <td>操作完成</td>
          <td>duration_ms, operation_name</td>
      </tr>
      <tr>
          <td>render.frame_drop</td>
          <td>metric</td>
          <td>掉幀偵測</td>
          <td>dropped_frames, total_frames</td>
      </tr>
      <tr>
          <td>resource.memory</td>
          <td>metric</td>
          <td>定期取樣（30s）</td>
          <td>heap_used, heap_total</td>
      </tr>
      <tr>
          <td>dependency.{name}.latency</td>
          <td>metric</td>
          <td>外部呼叫完成</td>
          <td>dependency_name, latency_ms, status</td>
      </tr>
      <tr>
          <td>web.vitals</td>
          <td>metric</td>
          <td>Web 頁面載入</td>
          <td>lcp_ms, fid_ms, cls_score</td>
      </tr>
  </tbody>
</table>
<h3 id="查詢場景-3">查詢場景</h3>
<p><strong>P95 趨勢</strong>：{operation}.duration 事件按天聚合、計算 percentile_cont(0.95)，觀察回應時間是否隨版本增加。</p>
<p><strong>容量規劃</strong>：resource.memory 事件的趨勢圖，判斷記憶體是否隨使用時間穩定增長（memory leak 訊號）。</p>
<p><strong>依賴健康度</strong>：dependency.*.latency 事件按 dependency_name GROUP BY，比較各依賴的平均延遲和失敗率。</p>
<h3 id="生命週期階段-3">生命週期階段</h3>
<p>測試期起啟用。開發期不需要效能事件（本地環境的效能數據不代表 production）。測試期啟用用於建立效能 baseline。上線後持續收集用於趨勢監控。</p>
<p>效能事件量通常最大（每 30 秒一筆 resource.memory × 活躍使用者數），取樣率需要控制 — 自用場景全收、商業產品取樣 10-50%（見 <a href="/blog/monitoring/03-sdk-design/frontend-sensor-design/" data-link-title="前端感測器設計" data-link-desc="什麼行為值得埋感測器、每類感測器的實作方式、取樣策略和效能影響 — 和 auto-intercept 的被動攔截互補">前端感測器設計</a> 的取樣策略段）。</p>
<h2 id="ab-測試動機">A/B 測試動機</h2>
<p>A/B 測試動機驅動的事件是商業動機的延伸 — 實驗期間收集實驗分組和轉換事件，實驗結束後關閉。</p>
<h3 id="事件表-4">事件表</h3>
<table>
  <thead>
      <tr>
          <th>事件名稱</th>
          <th>類型</th>
          <th>觸發時機</th>
          <th>data schema 重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>experiment.{name}.assigned</td>
          <td>event</td>
          <td>使用者被分配到實驗組</td>
          <td>experiment_name, variant</td>
      </tr>
      <tr>
          <td>experiment.{name}.converted</td>
          <td>event</td>
          <td>使用者完成轉換目標</td>
          <td>experiment_name, variant, conversion_type</td>
      </tr>
  </tbody>
</table>
<h3 id="生命週期階段-4">生命週期階段</h3>
<p>實驗期間啟用，實驗結束後關閉（從 SDK config 或 feature flag 移除）。實驗事件的保留期限跟著實驗週期走 — 實驗結束 + 分析完成後可清除。A/B test 的統計分析見 <a href="/blog/monitoring/08-business-analytics/ab-test-statistics/" data-link-title="A/B Test 的統計基礎" data-link-desc="假設檢定、樣本量計算、多重比較校正 — A/B test 不只是「比較兩個數字」，統計方法決定結論是否可靠">A/B test 的統計基礎</a>。</p>
<h2 id="完整對照總表">完整對照總表</h2>
<table>
  <thead>
      <tr>
          <th>動機</th>
          <th>要偵測的行為</th>
          <th>事件名稱模式</th>
          <th>感測器類型</th>
          <th>生命週期啟用</th>
          <th>查詢模式</th>
          <th>保留層級</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Debug</td>
          <td>流程步驟完成/失敗</td>
          <td>{feature}.step.*</td>
          <td>auto-intercept</td>
          <td>開發期起</td>
          <td>session 回放</td>
          <td>原始 7d</td>
      </tr>
      <tr>
          <td>Debug</td>
          <td>例外拋出</td>
          <td>app.exception</td>
          <td>auto-intercept</td>
          <td>開發期起</td>
          <td>error GROUP BY</td>
          <td>原始 30d</td>
      </tr>
      <tr>
          <td>Debug</td>
          <td>連線狀態</td>
          <td>ws.connected/disconnected</td>
          <td>auto-intercept</td>
          <td>開發期起</td>
          <td>session 回放</td>
          <td>原始 7d</td>
      </tr>
      <tr>
          <td>Debug</td>
          <td>最近操作</td>
          <td>{action}.completed</td>
          <td>手動埋點</td>
          <td>開發期起</td>
          <td>breadcrumb trail</td>
          <td>原始 7d</td>
      </tr>
      <tr>
          <td>商業</td>
          <td>漏斗步驟</td>
          <td>funnel.{name}.step_N</td>
          <td>手動埋點</td>
          <td>上線後</td>
          <td>funnel JOIN</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>商業</td>
          <td>功能使用</td>
          <td>feature.{name}.used</td>
          <td>手動埋點</td>
          <td>上線後</td>
          <td>COUNT GROUP BY</td>
          <td>天聚合 365d</td>
      </tr>
      <tr>
          <td>商業</td>
          <td>Session</td>
          <td>session.start/end</td>
          <td>auto-intercept</td>
          <td>上線後</td>
          <td>cohort 留存</td>
          <td>天聚合 365d</td>
      </tr>
      <tr>
          <td>商業</td>
          <td>轉換</td>
          <td>conversion.{type}</td>
          <td>手動埋點</td>
          <td>上線後</td>
          <td>funnel 最後一步</td>
          <td>原始 90d</td>
      </tr>
      <tr>
          <td>資安</td>
          <td>認證失敗</td>
          <td>auth.{method}.failed</td>
          <td>auto-intercept</td>
          <td>開發期起</td>
          <td>閾值告警</td>
          <td>原始 30d</td>
      </tr>
      <tr>
          <td>資安</td>
          <td>權限拒絕</td>
          <td>authz.denied</td>
          <td>auto-intercept</td>
          <td>開發期起</td>
          <td>pattern 偵測</td>
          <td>原始 30d</td>
      </tr>
      <tr>
          <td>資安</td>
          <td>敏感存取</td>
          <td>sensitive.*</td>
          <td>手動埋點</td>
          <td>開發期起</td>
          <td>audit trail</td>
          <td>原始 365d</td>
      </tr>
      <tr>
          <td>資安</td>
          <td>設定變更</td>
          <td>admin.setting.changed</td>
          <td>手動埋點</td>
          <td>開發期起</td>
          <td>audit trail</td>
          <td>原始 365d</td>
      </tr>
      <tr>
          <td>效能</td>
          <td>操作延遲</td>
          <td>{operation}.duration</td>
          <td>手動埋點</td>
          <td>測試期起</td>
          <td>P95 趨勢</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>效能</td>
          <td>渲染效能</td>
          <td>render.frame_drop</td>
          <td>auto-intercept</td>
          <td>測試期起</td>
          <td>趨勢圖</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>效能</td>
          <td>資源用量</td>
          <td>resource.memory</td>
          <td>定期取樣</td>
          <td>測試期起</td>
          <td>趨勢圖</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>效能</td>
          <td>外部依賴</td>
          <td>dependency.{name}.latency</td>
          <td>手動埋點</td>
          <td>測試期起</td>
          <td>GROUP BY 依賴</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>效能</td>
          <td>Web Vitals</td>
          <td>web.vitals</td>
          <td>auto-intercept</td>
          <td>測試期起</td>
          <td>趨勢圖</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>A/B</td>
          <td>實驗分組</td>
          <td>experiment.{name}.assigned</td>
          <td>手動埋點</td>
          <td>實驗期間</td>
          <td>variant GROUP BY</td>
          <td>實驗結束後清</td>
      </tr>
      <tr>
          <td>A/B</td>
          <td>實驗轉換</td>
          <td>experiment.{name}.converted</td>
          <td>手動埋點</td>
          <td>實驗期間</td>
          <td>轉換率計算</td>
          <td>實驗結束後清</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>Collector 存活</td>
          <td>collector.health.check</td>
          <td>Collector 內部</td>
          <td>開發期起</td>
          <td>狀態卡</td>
          <td>原始 7d</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>事件吞吐量</td>
          <td>collector.ingestion.count</td>
          <td>Collector 內部</td>
          <td>開發期起</td>
          <td>吞吐曲線</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>儲存用量</td>
          <td>collector.storage.disk_usage</td>
          <td>Collector 內部</td>
          <td>開發期起</td>
          <td>儲存圖</td>
          <td>小時聚合 90d</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>SDK 心跳</td>
          <td>sdk.heartbeat</td>
          <td>SDK 端</td>
          <td>開發期起</td>
          <td>連線列表</td>
          <td>原始 7d</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>部署事件</td>
          <td>deployment.completed</td>
          <td>CI/CD hook</td>
          <td>開發期起</td>
          <td>部署狀態</td>
          <td>原始 30d</td>
      </tr>
      <tr>
          <td>DevOps</td>
          <td>規則命中</td>
          <td>rule.matched</td>
          <td>Collector 內部</td>
          <td>開發期起</td>
          <td>alert 歷史</td>
          <td>原始 30d</td>
      </tr>
      <tr>
          <td>中台</td>
          <td>使用者首次出現</td>
          <td>user.first_seen</td>
          <td>Collector 計算</td>
          <td>上線後</td>
          <td>cohort 分群</td>
          <td>天聚合 365d</td>
      </tr>
      <tr>
          <td>中台</td>
          <td>通路歸因</td>
          <td>attribution.install_source</td>
          <td>SDK 首次啟動</td>
          <td>上線後</td>
          <td>歸因報表</td>
          <td>原始 90d</td>
      </tr>
      <tr>
          <td>中台</td>
          <td>即時在線</td>
          <td>session.active.count</td>
          <td>Collector 計算</td>
          <td>上線後</td>
          <td>即時大屏</td>
          <td>小時聚合 90d</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>四類事件的基礎定義 → <a href="/blog/monitoring/01-mental-model/four-event-types/" data-link-title="四類事件的完整定義" data-link-desc="Event / Error / Metric / Lifecycle 四類事件各自的語意、觸發時機和典型用途 — 分類是監控體系的統一語言">四類事件的完整定義</a></li>
<li>事件枚舉的方法論 → <a href="/blog/monitoring/01-mental-model/event-enumeration-method/" data-link-title="事件枚舉與補齊檢查" data-link-desc="從操作盤點系統性地推導出完整的事件清單 — 四類補齊檢查確保沒有遺漏、粒度判準確保每個事件只記一個事實">事件枚舉與補齊檢查</a></li>
<li>前端感測器的具體設計 → <a href="/blog/monitoring/03-sdk-design/frontend-sensor-design/" data-link-title="前端感測器設計" data-link-desc="什麼行為值得埋感測器、每類感測器的實作方式、取樣策略和效能影響 — 和 auto-intercept 的被動攔截互補">前端感測器設計</a></li>
<li>感測器的生命週期控制 → <a href="/blog/monitoring/03-sdk-design/sensor-lifecycle-management/" data-link-title="感測器生命週期管理" data-link-desc="產品生命週期的五個階段各啟用什麼感測器 — feature flag 整合、取樣率動態調整、感測器開關的可觀察性">感測器生命週期管理</a></li>
<li>查詢消費模式的完整展開 → <a href="/blog/monitoring/04-collector/query-consumption-patterns/" data-link-title="查詢消費模式" data-link-desc="Debug / Alerting / 產品決策 / 安全審計 / 效能監控 — 五種查詢場景各需要什麼事件、什麼欄位、什麼查詢模式">查詢消費模式</a></li>
</ul>
]]></content:encoded></item></channel></rss>