<?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>Convention on Tarragon</title><link>https://tarrragon.github.io/blog/tags/convention/</link><description>Recent content in Convention 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/tags/convention/index.xml" rel="self" type="application/rss+xml"/><item><title>事件命名規範</title><link>https://tarrragon.github.io/blog/monitoring/01-mental-model/event-naming-convention/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/01-mental-model/event-naming-convention/</guid><description>&lt;p>事件命名的目的是讓事件可以被 grep、過濾和統計。統一的命名規範讓不同時期、不同開發者加入的事件能在同一個查詢框架中使用。&lt;/p>
&lt;h2 id="namespaceaction-格式">namespace.action 格式&lt;/h2>
&lt;p>每個事件名稱由兩部分組成：namespace（事件發生的模組或功能區域）和 action（發生了什麼）。用 &lt;code>.&lt;/code> 分隔。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">terminal.connect.start ← namespace: terminal.connect, action: start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">terminal.connect.done ← namespace: terminal.connect, action: &lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">terminal.input.submit ← namespace: terminal.input, action: submit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">auth.biometric.success ← namespace: auth.biometric, action: success
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">auth.biometric.fallback ← namespace: auth.biometric, action: fallback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">enrollment.qr.scan ← namespace: enrollment.qr, action: scan&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="namespace-層級">Namespace 層級&lt;/h3>
&lt;p>Namespace 的層級深度依功能結構而定。兩層通常足夠（&lt;code>terminal.connect&lt;/code>），三層用於需要進一步區分的場景（&lt;code>terminal.connect.ws&lt;/code>）。超過三層通常代表 namespace 設計過細，增加認知成本但不增加分析價值。&lt;/p>
&lt;h3 id="action-命名">Action 命名&lt;/h3>
&lt;p>Action 使用動詞（&lt;code>start&lt;/code>、&lt;code>submit&lt;/code>、&lt;code>scan&lt;/code>）或狀態（&lt;code>success&lt;/code>、&lt;code>failed&lt;/code>、&lt;code>timeout&lt;/code>）。同一組動作用配對的 action 名稱：&lt;code>start&lt;/code> / &lt;code>done&lt;/code>（成對的生命週期）、&lt;code>success&lt;/code> / &lt;code>failed&lt;/code>（結果分支）。&lt;/p>
&lt;p>避免在 action 中重複 namespace 的資訊。&lt;code>terminal.connect.terminal_connected&lt;/code> 中 &lt;code>terminal&lt;/code> 重複了；&lt;code>terminal.connect.done&lt;/code> 更簡潔。&lt;/p>
&lt;h2 id="命名一致性的工程價值">命名一致性的工程價值&lt;/h2>
&lt;h3 id="grep-友好">Grep 友好&lt;/h3>
&lt;p>統一的 namespace 結構讓開發者用 &lt;code>grep &amp;quot;terminal.connect&amp;quot;&lt;/code> 就能找到所有連線相關事件，不需要知道每個事件的完整名稱。&lt;/p>
&lt;h3 id="統計友好">統計友好&lt;/h3>
&lt;p>按 namespace 前綴分群統計。&lt;code>terminal.*&lt;/code> 的事件數量 = terminal 功能的使用頻率；&lt;code>auth.*&lt;/code> 的事件數量 = 認證觸發頻率。層級結構讓統計的粒度可以調整。&lt;/p>
&lt;h3 id="文件友好">文件友好&lt;/h3>
&lt;p>事件清單按 namespace 排列就是一份結構化的功能地圖。新加入的開發者讀事件清單就能理解系統有哪些功能模組。&lt;/p>
&lt;h2 id="和商業方案的命名對應">和商業方案的命名對應&lt;/h2>
&lt;p>不同的商業監控方案有各自的命名慣例。自架方案用 namespace.action 格式，接入商業方案時需要做對應。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>商業方案&lt;/th>
 &lt;th>命名慣例&lt;/th>
 &lt;th>對應方式&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>GA4&lt;/td>
 &lt;td>&lt;code>event_name&lt;/code> + parameters&lt;/td>
 &lt;td>namespace.action → &lt;code>event_name&lt;/code>，細節放 parameters&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sentry&lt;/td>
 &lt;td>transaction name + spans&lt;/td>
 &lt;td>namespace → transaction，action → span&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mixpanel&lt;/td>
 &lt;td>event name + properties&lt;/td>
 &lt;td>namespace.action → event name&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Datadog RUM&lt;/td>
 &lt;td>action name + view name&lt;/td>
 &lt;td>action → action name，namespace → view&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>對應時保持一個原則：自架方案的事件名稱是 source of truth，商業方案的名稱是它的映射。在自架方案中改名後，映射層跟著改；不要讓商業方案的命名反過來影響自架的命名結構。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>四類事件的定義 → &lt;a href="https://tarrragon.github.io/blog/monitoring/01-mental-model/four-event-types/" data-link-title="四類事件的完整定義" data-link-desc="Event / Error / Metric / Lifecycle 四類事件各自的語意、觸發時機和典型用途 — 分類是監控體系的統一語言">四類事件的完整定義&lt;/a>&lt;/li>
&lt;li>從需求推導收集策略 → &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>&lt;/li>
&lt;li>商業方案的完整比較 → &lt;a href="https://tarrragon.github.io/blog/monitoring/06-commercial-comparison/" data-link-title="模組六：商業方案對照" data-link-desc="Sentry / Crashlytics / Datadog RUM / Mixpanel — 自架 vs 商業的功能和成本取捨">模組六 商業方案比較&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>事件命名的目的是讓事件可以被 grep、過濾和統計。統一的命名規範讓不同時期、不同開發者加入的事件能在同一個查詢框架中使用。</p>
<h2 id="namespaceaction-格式">namespace.action 格式</h2>
<p>每個事件名稱由兩部分組成：namespace（事件發生的模組或功能區域）和 action（發生了什麼）。用 <code>.</code> 分隔。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">terminal.connect.start      ← namespace: terminal.connect, action: start
</span></span><span class="line"><span class="ln">2</span><span class="cl">terminal.connect.done       ← namespace: terminal.connect, action: <span class="k">done</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">terminal.input.submit       ← namespace: terminal.input, action: submit
</span></span><span class="line"><span class="ln">4</span><span class="cl">auth.biometric.success      ← namespace: auth.biometric, action: success
</span></span><span class="line"><span class="ln">5</span><span class="cl">auth.biometric.fallback     ← namespace: auth.biometric, action: fallback
</span></span><span class="line"><span class="ln">6</span><span class="cl">enrollment.qr.scan          ← namespace: enrollment.qr, action: scan</span></span></code></pre></div><h3 id="namespace-層級">Namespace 層級</h3>
<p>Namespace 的層級深度依功能結構而定。兩層通常足夠（<code>terminal.connect</code>），三層用於需要進一步區分的場景（<code>terminal.connect.ws</code>）。超過三層通常代表 namespace 設計過細，增加認知成本但不增加分析價值。</p>
<h3 id="action-命名">Action 命名</h3>
<p>Action 使用動詞（<code>start</code>、<code>submit</code>、<code>scan</code>）或狀態（<code>success</code>、<code>failed</code>、<code>timeout</code>）。同一組動作用配對的 action 名稱：<code>start</code> / <code>done</code>（成對的生命週期）、<code>success</code> / <code>failed</code>（結果分支）。</p>
<p>避免在 action 中重複 namespace 的資訊。<code>terminal.connect.terminal_connected</code> 中 <code>terminal</code> 重複了；<code>terminal.connect.done</code> 更簡潔。</p>
<h2 id="命名一致性的工程價值">命名一致性的工程價值</h2>
<h3 id="grep-友好">Grep 友好</h3>
<p>統一的 namespace 結構讓開發者用 <code>grep &quot;terminal.connect&quot;</code> 就能找到所有連線相關事件，不需要知道每個事件的完整名稱。</p>
<h3 id="統計友好">統計友好</h3>
<p>按 namespace 前綴分群統計。<code>terminal.*</code> 的事件數量 = terminal 功能的使用頻率；<code>auth.*</code> 的事件數量 = 認證觸發頻率。層級結構讓統計的粒度可以調整。</p>
<h3 id="文件友好">文件友好</h3>
<p>事件清單按 namespace 排列就是一份結構化的功能地圖。新加入的開發者讀事件清單就能理解系統有哪些功能模組。</p>
<h2 id="和商業方案的命名對應">和商業方案的命名對應</h2>
<p>不同的商業監控方案有各自的命名慣例。自架方案用 namespace.action 格式，接入商業方案時需要做對應。</p>
<table>
  <thead>
      <tr>
          <th>商業方案</th>
          <th>命名慣例</th>
          <th>對應方式</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GA4</td>
          <td><code>event_name</code> + parameters</td>
          <td>namespace.action → <code>event_name</code>，細節放 parameters</td>
      </tr>
      <tr>
          <td>Sentry</td>
          <td>transaction name + spans</td>
          <td>namespace → transaction，action → span</td>
      </tr>
      <tr>
          <td>Mixpanel</td>
          <td>event name + properties</td>
          <td>namespace.action → event name</td>
      </tr>
      <tr>
          <td>Datadog RUM</td>
          <td>action name + view name</td>
          <td>action → action name，namespace → view</td>
      </tr>
  </tbody>
</table>
<p>對應時保持一個原則：自架方案的事件名稱是 source of truth，商業方案的名稱是它的映射。在自架方案中改名後，映射層跟著改；不要讓商業方案的命名反過來影響自架的命名結構。</p>
<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/derive-collection-from-requirements/" data-link-title="從需求推導「該收集哪些事件」" data-link-desc="從 debug 需求、行為分析需求、效能需求、合規需求四個方向推導事件收集策略 — 避免「什麼都收」和「什麼都不收」">從需求推導「該收集哪些事件」</a></li>
<li>商業方案的完整比較 → <a href="/blog/monitoring/06-commercial-comparison/" data-link-title="模組六：商業方案對照" data-link-desc="Sentry / Crashlytics / Datadog RUM / Mixpanel — 自架 vs 商業的功能和成本取捨">模組六 商業方案比較</a></li>
</ul>
]]></content:encoded></item></channel></rss>