<?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>Rule-Engine on Tarragon</title><link>https://tarrragon.github.io/blog/tags/rule-engine/</link><description>Recent content in Rule-Engine 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/rule-engine/index.xml" rel="self" type="application/rss+xml"/><item><title>Rule engine 設計</title><link>https://tarrragon.github.io/blog/monitoring/04-collector/rule-engine/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/04-collector/rule-engine/</guid><description>&lt;p>Rule engine 是 collector 的主動處理層。事件寫入儲存後，rule engine 檢查事件是否匹配預定義的規則，匹配時執行對應的動作。沒有 rule engine 的 collector 是被動的資料倉庫 — 開發者需要主動查詢才能發現問題。Rule engine 讓 collector 能在問題發生時主動通知。&lt;/p>
&lt;h2 id="三段式規則結構">三段式規則結構&lt;/h2>
&lt;p>每條規則由三部分組成：條件（什麼事件觸發）、動作（觸發後做什麼）、模板（動作的內容格式）。&lt;/p>
&lt;h3 id="條件">條件&lt;/h3>
&lt;p>條件定義「哪些事件匹配這條規則」。條件是事件欄位的過濾器 — 事件類型、事件名稱、屬性值的比較。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;condition&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;terminal.connect.*&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;severity&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;fatal&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>條件支援的匹配方式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>精確匹配&lt;/strong>：&lt;code>&amp;quot;type&amp;quot;: &amp;quot;error&amp;quot;&lt;/code> — 事件類型必須是 error&lt;/li>
&lt;li>&lt;strong>前綴匹配&lt;/strong>：&lt;code>&amp;quot;name&amp;quot;: &amp;quot;terminal.connect.*&amp;quot;&lt;/code> — 事件名稱以 &lt;code>terminal.connect.&lt;/code> 開頭&lt;/li>
&lt;li>&lt;strong>數值比較&lt;/strong>：&lt;code>&amp;quot;data.duration_ms&amp;quot;: { &amp;quot;gt&amp;quot;: 5000 }&lt;/code> — 持續時間超過 5 秒&lt;/li>
&lt;li>&lt;strong>組合條件&lt;/strong>：多個欄位條件同時滿足（AND 邏輯）&lt;/li>
&lt;/ul>
&lt;h3 id="動作">動作&lt;/h3>
&lt;p>動作定義「條件匹配後做什麼」。常見的動作類型：&lt;/p>
&lt;p>&lt;strong>通知&lt;/strong>：發送訊息到指定管道（email、Slack webhook、Telegram bot、桌面通知）。&lt;/p>
&lt;p>&lt;strong>寫 summary&lt;/strong>：把匹配的事件摘要寫入 summary 檔案，供定期 review。和逐筆事件不同，summary 是聚合後的結果（例如「過去一小時有 15 個 terminal.connect.failed」）。&lt;/p>
&lt;p>&lt;strong>觸發 webhook&lt;/strong>：向外部 URL 發送 HTTP POST，讓其他系統可以接收事件並做進一步處理。&lt;/p>
&lt;p>&lt;strong>執行腳本&lt;/strong>：在 collector server 上執行預定義的 shell script。適合自動化回應（重啟服務、清理暫存檔、輪替 log）。執行腳本的安全風險需要控制 — 只允許白名單內的腳本。&lt;/p>
&lt;h3 id="模板">模板&lt;/h3>
&lt;p>模板定義動作的內容格式。通知的訊息內容、webhook 的 request body — 用模板語法（Go template 或 mustache）把事件欄位填入。&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">{{ .name }} 發生於 {{ .ts }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">嚴重度：{{ .data.severity }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">訊息：{{ .data.message }}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模板讓同一個動作類型適用不同的事件 — 不需要為每種事件寫不同的通知函式。&lt;/p>
&lt;h2 id="規則評估時機">規則評估時機&lt;/h2>
&lt;h3 id="即時評估">即時評估&lt;/h3>
&lt;p>每個事件寫入後立即評估所有規則。適合需要即時回應的規則（fatal error 通知）。&lt;/p>
&lt;p>即時評估的成本和規則數量成正比 — 100 條規則代表每個事件寫入後做 100 次條件匹配。規則數量在數十條以內時，評估時間可以忽略。&lt;/p>
&lt;h3 id="批次評估">批次評估&lt;/h3>
&lt;p>定期（每分鐘、每小時）掃描一段時間內的事件，評估聚合類規則。適合基於統計的規則（「過去 5 分鐘 error 數量超過 10」「過去 1 小時某 endpoint 的 P95 回應時間超過 2 秒」）。&lt;/p>
&lt;p>批次評估需要時間窗口的概念 — 規則條件中包含時間範圍和聚合函式（count、avg、max、percentile）。&lt;/p>
&lt;h3 id="混合策略">混合策略&lt;/h3>
&lt;p>即時評估用於單一事件觸發的規則（fatal error → 立即通知），批次評估用於聚合觸發的規則（error rate 異常 → 定期檢查）。兩者可以共存。&lt;/p>
&lt;h2 id="規則管理">規則管理&lt;/h2>
&lt;p>規則以 JSON 或 YAML 檔案儲存在 collector 的設定目錄中。新增、修改、刪除規則是編輯檔案 + 重新載入 collector（signal 或 API call）。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">fatal-error-notify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">condition&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">error&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">data.severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">fatal&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">slack&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">webhook&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://hooks.slack.com/...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;FATAL: {{ .name }} at {{ .ts }}&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>規則檔案版本控制在 git 中，和 collector 的其他設定一起管理。規則變更歷史可追溯。&lt;/p>
&lt;h2 id="shell-執行的安全邊界">Shell 執行的安全邊界&lt;/h2>
&lt;p>Rule engine 的「執行腳本」動作在 collector 主機上執行 shell command。這個能力和 collector 的認證狀態組合後產生不同的風險等級。&lt;/p></description><content:encoded><![CDATA[<p>Rule engine 是 collector 的主動處理層。事件寫入儲存後，rule engine 檢查事件是否匹配預定義的規則，匹配時執行對應的動作。沒有 rule engine 的 collector 是被動的資料倉庫 — 開發者需要主動查詢才能發現問題。Rule engine 讓 collector 能在問題發生時主動通知。</p>
<h2 id="三段式規則結構">三段式規則結構</h2>
<p>每條規則由三部分組成：條件（什麼事件觸發）、動作（觸發後做什麼）、模板（動作的內容格式）。</p>
<h3 id="條件">條件</h3>
<p>條件定義「哪些事件匹配這條規則」。條件是事件欄位的過濾器 — 事件類型、事件名稱、屬性值的比較。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nt">&#34;condition&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;error&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;terminal.connect.*&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="nt">&#34;severity&#34;</span><span class="p">:</span> <span class="s2">&#34;fatal&#34;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>條件支援的匹配方式：</p>
<ul>
<li><strong>精確匹配</strong>：<code>&quot;type&quot;: &quot;error&quot;</code> — 事件類型必須是 error</li>
<li><strong>前綴匹配</strong>：<code>&quot;name&quot;: &quot;terminal.connect.*&quot;</code> — 事件名稱以 <code>terminal.connect.</code> 開頭</li>
<li><strong>數值比較</strong>：<code>&quot;data.duration_ms&quot;: { &quot;gt&quot;: 5000 }</code> — 持續時間超過 5 秒</li>
<li><strong>組合條件</strong>：多個欄位條件同時滿足（AND 邏輯）</li>
</ul>
<h3 id="動作">動作</h3>
<p>動作定義「條件匹配後做什麼」。常見的動作類型：</p>
<p><strong>通知</strong>：發送訊息到指定管道（email、Slack webhook、Telegram bot、桌面通知）。</p>
<p><strong>寫 summary</strong>：把匹配的事件摘要寫入 summary 檔案，供定期 review。和逐筆事件不同，summary 是聚合後的結果（例如「過去一小時有 15 個 terminal.connect.failed」）。</p>
<p><strong>觸發 webhook</strong>：向外部 URL 發送 HTTP POST，讓其他系統可以接收事件並做進一步處理。</p>
<p><strong>執行腳本</strong>：在 collector server 上執行預定義的 shell script。適合自動化回應（重啟服務、清理暫存檔、輪替 log）。執行腳本的安全風險需要控制 — 只允許白名單內的腳本。</p>
<h3 id="模板">模板</h3>
<p>模板定義動作的內容格式。通知的訊息內容、webhook 的 request body — 用模板語法（Go template 或 mustache）把事件欄位填入。</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">{{ .name }} 發生於 {{ .ts }}
</span></span><span class="line"><span class="ln">2</span><span class="cl">嚴重度：{{ .data.severity }}
</span></span><span class="line"><span class="ln">3</span><span class="cl">訊息：{{ .data.message }}</span></span></code></pre></div><p>模板讓同一個動作類型適用不同的事件 — 不需要為每種事件寫不同的通知函式。</p>
<h2 id="規則評估時機">規則評估時機</h2>
<h3 id="即時評估">即時評估</h3>
<p>每個事件寫入後立即評估所有規則。適合需要即時回應的規則（fatal error 通知）。</p>
<p>即時評估的成本和規則數量成正比 — 100 條規則代表每個事件寫入後做 100 次條件匹配。規則數量在數十條以內時，評估時間可以忽略。</p>
<h3 id="批次評估">批次評估</h3>
<p>定期（每分鐘、每小時）掃描一段時間內的事件，評估聚合類規則。適合基於統計的規則（「過去 5 分鐘 error 數量超過 10」「過去 1 小時某 endpoint 的 P95 回應時間超過 2 秒」）。</p>
<p>批次評估需要時間窗口的概念 — 規則條件中包含時間範圍和聚合函式（count、avg、max、percentile）。</p>
<h3 id="混合策略">混合策略</h3>
<p>即時評估用於單一事件觸發的規則（fatal error → 立即通知），批次評估用於聚合觸發的規則（error rate 異常 → 定期檢查）。兩者可以共存。</p>
<h2 id="規則管理">規則管理</h2>
<p>規則以 JSON 或 YAML 檔案儲存在 collector 的設定目錄中。新增、修改、刪除規則是編輯檔案 + 重新載入 collector（signal 或 API call）。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">fatal-error-notify</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span><span class="nt">condition</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">      </span><span class="nt">data.severity</span><span class="p">:</span><span class="w"> </span><span class="l">fatal</span><span class="w">
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="w">    </span><span class="nt">action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">slack</span><span class="w">
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="w">      </span><span class="nt">webhook</span><span class="p">:</span><span class="w"> </span><span class="l">https://hooks.slack.com/...</span><span class="w">
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="w">      </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;FATAL: {{ .name }} at {{ .ts }}&#34;</span></span></span></code></pre></div><p>規則檔案版本控制在 git 中，和 collector 的其他設定一起管理。規則變更歷史可追溯。</p>
<h2 id="shell-執行的安全邊界">Shell 執行的安全邊界</h2>
<p>Rule engine 的「執行腳本」動作在 collector 主機上執行 shell command。這個能力和 collector 的認證狀態組合後產生不同的風險等級。</p>
<h3 id="攻擊鏈">攻擊鏈</h3>
<p>無認證模式下，攻擊者可以向 collector 的 <code>/v1/events</code> endpoint 注入偽造事件。如果偽造事件匹配了一條規則、且規則的動作是執行 free-form shell command，攻擊者等於取得了 collector 主機的命令執行權（RCE — Remote Code Execution）。</p>
<p>攻擊路徑：注入假事件 → 匹配 rule → 執行 shell → RCE。</p>
<h3 id="防護措施">防護措施</h3>
<p><strong>Rule 定義不可透過 API 新增</strong>。Rule 只能由管理員透過配置檔或 CLI 設定，collector 的 HTTP API 不提供 rule CRUD endpoint。攻擊者即使能注入事件也無法新增 rule — 但現有 rule 的條件如果太寬（例如 <code>type: error</code> 沒有進一步限定 name），偽造的 error 事件仍可能匹配。</p>
<p><strong>Shell command 使用 allowlist</strong>。Rule 的 action 指定 command name（如 <code>restart-ttyd</code>），command 的實際路徑在配置檔的 allowlist 中定義。Rule 不接受 free-form shell string（如 <code>sh -c &quot;rm -rf /&quot;</code>）。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># 配置檔</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w"></span><span class="nt">allowed_commands</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">  </span><span class="nt">restart-ttyd</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/bin/restart-ttyd.sh</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">  </span><span class="nt">notify-slack</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/bin/notify-slack.sh</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w"></span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">fatal-error-response</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">    </span><span class="nt">condition</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">      </span><span class="nt">data.severity</span><span class="p">:</span><span class="w"> </span><span class="l">fatal</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">    </span><span class="nt">action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">command</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">      </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="l">restart-ttyd </span><span class="w"> </span><span class="c"># 只接受 allowlist 中的 name</span></span></span></code></pre></div><p><strong>無認證模式下的額外限制</strong>。Collector 無認證時（同區網信任），建議禁用 command 類型的動作、只允許通知和 webhook。認證啟用後才解鎖 command 動作 — 認證確保只有授權的 SDK 實例能送事件，降低偽造事件觸發 rule 的風險。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Collector 的完整架構 → <a href="/blog/monitoring/04-collector/architecture/" data-link-title="Collector 架構" data-link-desc="HTTP endpoint → JSON Schema 驗證 → 儲存 → 查詢 → rule engine 的五段式處理鏈路">Collector 架構</a></li>
<li>規模成長後的演進路徑 → <a href="/blog/monitoring/04-collector/scaling-evolution/" data-link-title="規模演進" data-link-desc="可插拔 Storage Backend 架構 — SQLite 預設、PostgreSQL 觸發切換、時間序列 DB 長期演進">規模演進</a></li>
<li>事件的分類和命名 → <a href="/blog/monitoring/01-mental-model/four-event-types/" data-link-title="四類事件的完整定義" data-link-desc="Event / Error / Metric / Lifecycle 四類事件各自的語意、觸發時機和典型用途 — 分類是監控體系的統一語言">監控心智模型 四類事件</a></li>
<li>Rule engine 在偽造流量偵測的應用 → <a href="/blog/monitoring/07-security-privacy/client-sdk-authentication/" data-link-title="Client-side SDK 認證的根本限制" data-link-desc="嵌在 client 端的 credential 必然可被提取 — 認清 architecture 天花板後的多層緩解策略，從 origin 驗證到 device attestation">Client-side SDK 認證</a></li>
</ul>
]]></content:encoded></item><item><title>模組四：Collector 設計</title><link>https://tarrragon.github.io/blog/monitoring/04-collector/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/04-collector/</guid><description>&lt;p>回答「收到的事件怎麼處理」。挑戰在 collector 端，不在 SDK 端。&lt;/p>
&lt;h2 id="待寫章節">待寫章節&lt;/h2>
&lt;ul>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Collector 架構（HTTP endpoint → JSON Schema 驗證 → 儲存 → 查詢 → rule engine）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> JSONL 匯出與備份格式（匯出格式、gzip 壓縮、備份保留）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 查詢 API 設計（CLI grep 友好 vs HTTP 查詢 endpoint）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Rule engine 設計（條件 → 動作 → 模板）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 規模演進：可插拔 Storage Backend（SQLite 預設 / PostgreSQL 觸發）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 功能分層與 Backend 選擇（SQLite 層 vs PostgreSQL 層的功能邊界）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> SQLite Backend 效能基準（寫入吞吐 / 查詢延遲 / 資源消耗的量化預期）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Ingestion Scaling（四層防線 — SDK 取樣 → Collector 背壓 → 水平擴展 → Queue 解耦）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 查詢消費模式（Debug / Alerting / 產品決策 / 安全審計 / 效能監控）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> DevOps Dashboard 設計&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Developer Dashboard 設計&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 中台 Dashboard 設計&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Container 部署設計（SQLite 在 container 中的 I/O 考量、volume mount、graceful shutdown）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 讀寫分離與查詢擴展（讀寫競爭辨識、Read Replica、預聚合、CQRS 判讀訊號）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> 端到端資料完整性（資料損失地圖、完整性指標、被自己 SDK DDoS 的防護）&lt;/li>
&lt;li>&lt;input checked="" disabled="" type="checkbox"> Error Fingerprint 與去重分群（fingerprint 演算法、message normalization、error_groups 表）&lt;/li>
&lt;/ul>
&lt;h2 id="跨分類引用">跨分類引用&lt;/h2>
&lt;ul>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/backend/01-database/" data-link-title="模組一：資料庫與持久化" data-link-desc="整理 SQL、transaction、migration 與 repository adapter 的後端實務">backend 01 資料庫&lt;/a>：PostgreSQL backend 的資料庫設計、&lt;a href="https://tarrragon.github.io/blog/backend/01-database/state-ownership-query-boundary/" data-link-title="1.8 State Ownership 與 Query Boundary" data-link-desc="正式狀態 vs 派生狀態的責任分層、CQRS / event sourcing / materialized view、四種 query 邊界">State Ownership 與 Query Boundary&lt;/a>&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/observability-query-design/" data-link-title="4.23 觀測查詢設計" data-link-desc="把觀測資料的讀取路徑當系統設計問題處理：三種查詢模式、storage tiering、pre-aggregation 與資源治理">backend 04 觀測查詢設計&lt;/a>：觀測領域的讀取路徑設計、CQRS 特化應用&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/" data-link-title="模組九：效能工程與容量規劃" data-link-desc="把『目前配置能撐多少、要加多少機器』變成可量化、可驗證、可改進的工程流程">backend 09 效能容量&lt;/a>：高併發寫入 / 大資料查詢的效能挑戰&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/devops/03-traffic-management/" data-link-title="模組三：流量管控" data-link-desc="收到的流量超過處理能力時怎麼辦 — 背壓、rate limit、熔斷、bulkhead 四種防護機制">DevOps 流量管控&lt;/a>：背壓、rate limit、熔斷的基礎概念&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/devops/07-burst-traffic/" data-link-title="模組七：突發流量應對" data-link-desc="行銷活動或新聞曝光帶來 10x-100x 流量時怎麼撐 — 突發分類、降級策略、queue 緩衝、規模分級應對">DevOps 突發流量&lt;/a>：突發流量分類、降級策略、queue 緩衝&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/infra/air-gapped/air-gapped-monitoring/" data-link-title="斷網環境的監控與可觀測性" data-link-desc="Self-hosted 監控（Prometheus &amp;#43; Grafana）、離線 log 收集（Loki / ELK）、不能 phone home 的告警、NTP 時間同步">斷網環境的監控&lt;/a>：Collector 在斷網環境的部署方式——endpoint 改指 self-hosted backend、SDK 的 offline buffer 更重要&lt;/li>
&lt;li>實作 repo：tarrragon/monitor 的 collector/ + docs/challenges/（撞牆記錄）&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>回答「收到的事件怎麼處理」。挑戰在 collector 端，不在 SDK 端。</p>
<h2 id="待寫章節">待寫章節</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> Collector 架構（HTTP endpoint → JSON Schema 驗證 → 儲存 → 查詢 → rule engine）</li>
<li><input checked="" disabled="" type="checkbox"> JSONL 匯出與備份格式（匯出格式、gzip 壓縮、備份保留）</li>
<li><input checked="" disabled="" type="checkbox"> 查詢 API 設計（CLI grep 友好 vs HTTP 查詢 endpoint）</li>
<li><input checked="" disabled="" type="checkbox"> Rule engine 設計（條件 → 動作 → 模板）</li>
<li><input checked="" disabled="" type="checkbox"> 規模演進：可插拔 Storage Backend（SQLite 預設 / PostgreSQL 觸發）</li>
<li><input checked="" disabled="" type="checkbox"> 功能分層與 Backend 選擇（SQLite 層 vs PostgreSQL 層的功能邊界）</li>
<li><input checked="" disabled="" type="checkbox"> SQLite Backend 效能基準（寫入吞吐 / 查詢延遲 / 資源消耗的量化預期）</li>
<li><input checked="" disabled="" type="checkbox"> Ingestion Scaling（四層防線 — SDK 取樣 → Collector 背壓 → 水平擴展 → Queue 解耦）</li>
<li><input checked="" disabled="" type="checkbox"> 查詢消費模式（Debug / Alerting / 產品決策 / 安全審計 / 效能監控）</li>
<li><input checked="" disabled="" type="checkbox"> DevOps Dashboard 設計</li>
<li><input checked="" disabled="" type="checkbox"> Developer Dashboard 設計</li>
<li><input checked="" disabled="" type="checkbox"> 中台 Dashboard 設計</li>
<li><input checked="" disabled="" type="checkbox"> Container 部署設計（SQLite 在 container 中的 I/O 考量、volume mount、graceful shutdown）</li>
<li><input checked="" disabled="" type="checkbox"> 讀寫分離與查詢擴展（讀寫競爭辨識、Read Replica、預聚合、CQRS 判讀訊號）</li>
<li><input checked="" disabled="" type="checkbox"> 端到端資料完整性（資料損失地圖、完整性指標、被自己 SDK DDoS 的防護）</li>
<li><input checked="" disabled="" type="checkbox"> Error Fingerprint 與去重分群（fingerprint 演算法、message normalization、error_groups 表）</li>
</ul>
<h2 id="跨分類引用">跨分類引用</h2>
<ul>
<li>→ <a href="/blog/backend/01-database/" data-link-title="模組一：資料庫與持久化" data-link-desc="整理 SQL、transaction、migration 與 repository adapter 的後端實務">backend 01 資料庫</a>：PostgreSQL backend 的資料庫設計、<a href="/blog/backend/01-database/state-ownership-query-boundary/" data-link-title="1.8 State Ownership 與 Query Boundary" data-link-desc="正式狀態 vs 派生狀態的責任分層、CQRS / event sourcing / materialized view、四種 query 邊界">State Ownership 與 Query Boundary</a></li>
<li>→ <a href="/blog/backend/04-observability/observability-query-design/" data-link-title="4.23 觀測查詢設計" data-link-desc="把觀測資料的讀取路徑當系統設計問題處理：三種查詢模式、storage tiering、pre-aggregation 與資源治理">backend 04 觀測查詢設計</a>：觀測領域的讀取路徑設計、CQRS 特化應用</li>
<li>→ <a href="/blog/backend/09-performance-capacity/" data-link-title="模組九：效能工程與容量規劃" data-link-desc="把『目前配置能撐多少、要加多少機器』變成可量化、可驗證、可改進的工程流程">backend 09 效能容量</a>：高併發寫入 / 大資料查詢的效能挑戰</li>
<li>→ <a href="/blog/devops/03-traffic-management/" data-link-title="模組三：流量管控" data-link-desc="收到的流量超過處理能力時怎麼辦 — 背壓、rate limit、熔斷、bulkhead 四種防護機制">DevOps 流量管控</a>：背壓、rate limit、熔斷的基礎概念</li>
<li>→ <a href="/blog/devops/07-burst-traffic/" data-link-title="模組七：突發流量應對" data-link-desc="行銷活動或新聞曝光帶來 10x-100x 流量時怎麼撐 — 突發分類、降級策略、queue 緩衝、規模分級應對">DevOps 突發流量</a>：突發流量分類、降級策略、queue 緩衝</li>
<li>→ <a href="/blog/infra/air-gapped/air-gapped-monitoring/" data-link-title="斷網環境的監控與可觀測性" data-link-desc="Self-hosted 監控（Prometheus &#43; Grafana）、離線 log 收集（Loki / ELK）、不能 phone home 的告警、NTP 時間同步">斷網環境的監控</a>：Collector 在斷網環境的部署方式——endpoint 改指 self-hosted backend、SDK 的 offline buffer 更重要</li>
<li>實作 repo：tarrragon/monitor 的 collector/ + docs/challenges/（撞牆記錄）</li>
</ul>
]]></content:encoded></item></channel></rss>