<?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>Otlp on Tarragon</title><link>https://tarrragon.github.io/blog/tags/otlp/</link><description>Recent content in Otlp on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 23 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/otlp/index.xml" rel="self" type="application/rss+xml"/><item><title>跟 OpenTelemetry 的 schema 差異對照</title><link>https://tarrragon.github.io/blog/monitoring/02-log-schema/otel-comparison/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/02-log-schema/otel-comparison/</guid><description>&lt;p>OpenTelemetry（OTLP）是 server-side 可觀測性的業界標準，定義了 traces、metrics、logs 三種 signal 的資料格式和傳輸協定。自架的 event schema 和 OTLP 在設計目標、複雜度和適用場景上有明確差異。&lt;/p>
&lt;h2 id="設計目標差異">設計目標差異&lt;/h2>
&lt;h3 id="otlp">OTLP&lt;/h3>
&lt;p>OTLP 的設計目標是「跨語言、跨框架、跨 vendor 的統一可觀測性標準」。它支援分散式追蹤（trace context propagation）、多維度 metric（histogram、summary、exponential histogram）、結構化 log。&lt;/p>
&lt;p>OTLP 的資料模型假設 server-side 的基礎設施：collector（如 OTel Collector）做資料路由和轉換，backend（如 Jaeger、Prometheus、Grafana）做儲存和視覺化。&lt;/p>
&lt;h3 id="自架-event-schema">自架 event schema&lt;/h3>
&lt;p>自架 schema 的設計目標是「client-side 監控的最小可用結構」。它假設的基礎設施是一個 HTTP endpoint + JSONL 檔案 + grep。不需要分散式追蹤（client 端通常是單一服務），不需要多維度 metric（counter 和 gauge 用 event 的 data 欄位表示即可）。&lt;/p>
&lt;h2 id="具體差異">具體差異&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>OTLP&lt;/th>
 &lt;th>自架 event schema&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Signal 類型&lt;/td>
 &lt;td>Trace / Metric / Log 三種獨立 signal&lt;/td>
 &lt;td>統一的 event 格式 + type 欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>傳輸格式&lt;/td>
 &lt;td>Protobuf（HTTP/gRPC）&lt;/td>
 &lt;td>JSON（HTTP POST）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Trace context&lt;/td>
 &lt;td>SpanID / TraceID / ParentSpanID&lt;/td>
 &lt;td>Session ID（無分散式追蹤）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Metric 模型&lt;/td>
 &lt;td>Sum / Gauge / Histogram / Summary&lt;/td>
 &lt;td>data 欄位中的數值&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Resource&lt;/td>
 &lt;td>結構化的 resource attributes&lt;/td>
 &lt;td>source 欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Schema 複雜度&lt;/td>
 &lt;td>高（完整的 Protobuf 定義）&lt;/td>
 &lt;td>低（JSON Schema，核心 6 欄位）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="自架-schema-簡化了什麼">自架 schema 簡化了什麼&lt;/h2>
&lt;h3 id="不做分散式追蹤">不做分散式追蹤&lt;/h3>
&lt;p>OTLP 的 trace signal 用 TraceID 和 SpanID 把跨服務的請求關聯起來。Client-side 監控通常不需要這個能力 — app 是單一服務，不存在跨服務的請求鏈路。&lt;/p>
&lt;p>自架 schema 用 session ID 關聯同一次使用中的事件，滿足「使用者在這次操作中做了什麼」的分析需求。&lt;/p>
&lt;h3 id="不用-protobuf">不用 Protobuf&lt;/h3>
&lt;p>OTLP 用 Protobuf 編碼資料，效率高（binary 格式、schema 驗證在編譯期）。但 Protobuf 需要 schema 檔案（.proto）、程式碼生成、和 SDK 語言的 Protobuf 套件。&lt;/p>
&lt;p>自架 schema 用 JSON，人類可讀、grep 友好、不需要額外工具。JSON 的效率比 Protobuf 低（文字格式、體積較大），但在 client-side 監控的事件量下（每分鐘數十到數百筆），效率差異不構成瓶頸。&lt;/p>
&lt;h3 id="簡化-metric-模型">簡化 metric 模型&lt;/h3>
&lt;p>OTLP 的 metric signal 支援 histogram（分桶分佈）、summary（百分位）、exponential histogram（自適應分桶）。這些模型在 server-side 的高頻度 metric 收集中有意義。&lt;/p>
&lt;p>自架 schema 把 metric 記錄為 event 的 data 欄位中的數值（&lt;code>{&amp;quot;type&amp;quot;: &amp;quot;metric&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;connect.duration&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;value_ms&amp;quot;: 320}}&lt;/code>）。統計分析在 collector 端用查詢完成，不在 schema 層做聚合。&lt;/p>
&lt;h2 id="什麼時候切換到-otlp">什麼時候切換到 OTLP&lt;/h2>
&lt;p>以下訊號出現時，自架 schema 的簡化可能成為限制：&lt;/p></description><content:encoded><![CDATA[<p>OpenTelemetry（OTLP）是 server-side 可觀測性的業界標準，定義了 traces、metrics、logs 三種 signal 的資料格式和傳輸協定。自架的 event schema 和 OTLP 在設計目標、複雜度和適用場景上有明確差異。</p>
<h2 id="設計目標差異">設計目標差異</h2>
<h3 id="otlp">OTLP</h3>
<p>OTLP 的設計目標是「跨語言、跨框架、跨 vendor 的統一可觀測性標準」。它支援分散式追蹤（trace context propagation）、多維度 metric（histogram、summary、exponential histogram）、結構化 log。</p>
<p>OTLP 的資料模型假設 server-side 的基礎設施：collector（如 OTel Collector）做資料路由和轉換，backend（如 Jaeger、Prometheus、Grafana）做儲存和視覺化。</p>
<h3 id="自架-event-schema">自架 event schema</h3>
<p>自架 schema 的設計目標是「client-side 監控的最小可用結構」。它假設的基礎設施是一個 HTTP endpoint + JSONL 檔案 + grep。不需要分散式追蹤（client 端通常是單一服務），不需要多維度 metric（counter 和 gauge 用 event 的 data 欄位表示即可）。</p>
<h2 id="具體差異">具體差異</h2>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>OTLP</th>
          <th>自架 event schema</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Signal 類型</td>
          <td>Trace / Metric / Log 三種獨立 signal</td>
          <td>統一的 event 格式 + type 欄位</td>
      </tr>
      <tr>
          <td>傳輸格式</td>
          <td>Protobuf（HTTP/gRPC）</td>
          <td>JSON（HTTP POST）</td>
      </tr>
      <tr>
          <td>Trace context</td>
          <td>SpanID / TraceID / ParentSpanID</td>
          <td>Session ID（無分散式追蹤）</td>
      </tr>
      <tr>
          <td>Metric 模型</td>
          <td>Sum / Gauge / Histogram / Summary</td>
          <td>data 欄位中的數值</td>
      </tr>
      <tr>
          <td>Resource</td>
          <td>結構化的 resource attributes</td>
          <td>source 欄位</td>
      </tr>
      <tr>
          <td>Schema 複雜度</td>
          <td>高（完整的 Protobuf 定義）</td>
          <td>低（JSON Schema，核心 6 欄位）</td>
      </tr>
  </tbody>
</table>
<h2 id="自架-schema-簡化了什麼">自架 schema 簡化了什麼</h2>
<h3 id="不做分散式追蹤">不做分散式追蹤</h3>
<p>OTLP 的 trace signal 用 TraceID 和 SpanID 把跨服務的請求關聯起來。Client-side 監控通常不需要這個能力 — app 是單一服務，不存在跨服務的請求鏈路。</p>
<p>自架 schema 用 session ID 關聯同一次使用中的事件，滿足「使用者在這次操作中做了什麼」的分析需求。</p>
<h3 id="不用-protobuf">不用 Protobuf</h3>
<p>OTLP 用 Protobuf 編碼資料，效率高（binary 格式、schema 驗證在編譯期）。但 Protobuf 需要 schema 檔案（.proto）、程式碼生成、和 SDK 語言的 Protobuf 套件。</p>
<p>自架 schema 用 JSON，人類可讀、grep 友好、不需要額外工具。JSON 的效率比 Protobuf 低（文字格式、體積較大），但在 client-side 監控的事件量下（每分鐘數十到數百筆），效率差異不構成瓶頸。</p>
<h3 id="簡化-metric-模型">簡化 metric 模型</h3>
<p>OTLP 的 metric signal 支援 histogram（分桶分佈）、summary（百分位）、exponential histogram（自適應分桶）。這些模型在 server-side 的高頻度 metric 收集中有意義。</p>
<p>自架 schema 把 metric 記錄為 event 的 data 欄位中的數值（<code>{&quot;type&quot;: &quot;metric&quot;, &quot;name&quot;: &quot;connect.duration&quot;, &quot;data&quot;: {&quot;value_ms&quot;: 320}}</code>）。統計分析在 collector 端用查詢完成，不在 schema 層做聚合。</p>
<h2 id="什麼時候切換到-otlp">什麼時候切換到 OTLP</h2>
<p>以下訊號出現時，自架 schema 的簡化可能成為限制：</p>
<p><strong>需要和 server-side 追蹤關聯</strong>：Client 端的操作要關聯到 server 端的 trace（「使用者點擊按鈕到 database query 的完整路徑」）。需要 OTLP 的 trace context propagation。</p>
<p><strong>事件量超過 JSONL 的處理能力</strong>：每秒數千筆事件時，JSON 的解析和 JSONL 的 grep 查詢成為瓶頸。OTLP + OTel Collector + 時間序列 DB 的管線能處理更高的吞吐量。</p>
<p><strong>需要接入多個 backend</strong>：同時送資料到 Prometheus（metric）、Jaeger（trace）、Elasticsearch（log）。OTel Collector 原生支援多 backend 路由，自架方案需要自己實作。</p>
<p>切換策略：SDK 層的 API 不變（init / event / error / metric），只改底層的傳輸和編碼。從 JSON POST 改成 OTLP export，SDK 的使用者不需要改程式碼。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>自架 schema 的完整定義 → <a href="/blog/monitoring/02-log-schema/event-schema-fields/" data-link-title="event.schema.json 完整欄位解說" data-link-desc="監控事件的 JSON Schema 定義 — 每個欄位的語意、必填/選填、資料型別和設計理由">event.schema.json 完整欄位解說</a></li>
<li>Server-side 的可觀測性 → <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">backend 04 可觀測性</a></li>
<li>Collector 的設計 → <a href="/blog/monitoring/04-collector/" data-link-title="模組四：Collector 設計" data-link-desc="收 → 驗 → 存 → 查 → 觸發的完整鏈路 — Go 單一 binary、可插拔 Storage Backend、rule engine">模組四 Collector 設計</a></li>
</ul>
]]></content:encoded></item><item><title>Datadog OTLP Ingestion 與 OTel 整合</title><link>https://tarrragon.github.io/blog/backend/04-observability/vendors/datadog/otlp-ingestion-otel-integration/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/04-observability/vendors/datadog/otlp-ingestion-otel-integration/</guid><description>&lt;blockquote>
&lt;p>本文是 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/vendors/datadog/" data-link-title="Datadog" data-link-desc="All-in-one SaaS 觀測平台、APM / Logs / Metrics / RUM / Security">Datadog&lt;/a> 的 vendor deep article，深化 overview「OTLP ingestion」段。初次接觸 Datadog 的讀者建議先讀 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/vendors/datadog/" data-link-title="Datadog" data-link-desc="All-in-one SaaS 觀測平台、APM / Logs / Metrics / RUM / Security">Datadog 服務頁&lt;/a>。&lt;/p>&lt;/blockquote>
&lt;h2 id="問題情境">問題情境&lt;/h2>
&lt;p>兩種觸發情境會讓團隊需要 Datadog 的 OTLP ingestion：&lt;/p>
&lt;p>團隊已經使用 Datadog APM，但新服務或新語言想用 OTel SDK 避免 vendor lock-in。Datadog SDK 覆蓋的語言有限（Go / Java / Python / Ruby / Node / .NET / PHP / C++），如果服務用 Rust / Elixir / Kotlin multiplatform，OTel SDK 的覆蓋更廣。&lt;/p>
&lt;p>另一種情境是團隊原本用 OTel + Jaeger 或 OTel + Grafana，現在想把 visualization 遷到 Datadog 但不想重新 instrument。OTLP ingestion 讓 OTel SDK 產出的 traces / metrics / logs 直接送進 Datadog，不改 application code。&lt;/p>
&lt;h2 id="核心概念">核心概念&lt;/h2>
&lt;h3 id="datadog-agent-的-otlp-receiver">Datadog Agent 的 OTLP receiver&lt;/h3>
&lt;p>Datadog Agent 6.32+ 內建 OTLP receiver，接受 gRPC（port 4317）和 HTTP（port 4318）兩種 protocol。Agent 收到 OTLP 資料後轉換成 Datadog 內部格式，走跟 Datadog SDK 相同的 pipeline（sampling、tagging、forwarding to Datadog backend）。&lt;/p>
&lt;p>這代表 OTLP path 的資料在 Datadog UI 裡跟 Datadog SDK path 的資料一樣被處理 — 相同的 APM trace waterfall、相同的 service map、相同的 error tracking。差異在 metadata 完整度（見下方 feature parity）。&lt;/p>
&lt;h3 id="三種-signal-的-otlp-支援度">三種 signal 的 OTLP 支援度&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Signal&lt;/th>
 &lt;th>OTLP 支援&lt;/th>
 &lt;th>到 Datadog 的對應&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Traces&lt;/td>
 &lt;td>完整（OTLP gRPC / HTTP）&lt;/td>
 &lt;td>APM traces、service map、error tracking&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Metrics&lt;/td>
 &lt;td>完整（OTLP gRPC / HTTP）&lt;/td>
 &lt;td>Custom metrics（按 metric 計費）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Logs&lt;/td>
 &lt;td>有限（Agent 7.54+ 支援 OTLP logs）&lt;/td>
 &lt;td>Datadog Logs（按 ingestion volume 計費）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Traces 的 OTLP 支援最成熟、metrics 次之、logs 最新。混合環境常見做法是 traces + metrics 走 OTLP、logs 走 Datadog Agent 的原生 log collection（file tailing / container stdout）。&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是 <a href="/blog/backend/04-observability/vendors/datadog/" data-link-title="Datadog" data-link-desc="All-in-one SaaS 觀測平台、APM / Logs / Metrics / RUM / Security">Datadog</a> 的 vendor deep article，深化 overview「OTLP ingestion」段。初次接觸 Datadog 的讀者建議先讀 <a href="/blog/backend/04-observability/vendors/datadog/" data-link-title="Datadog" data-link-desc="All-in-one SaaS 觀測平台、APM / Logs / Metrics / RUM / Security">Datadog 服務頁</a>。</p></blockquote>
<h2 id="問題情境">問題情境</h2>
<p>兩種觸發情境會讓團隊需要 Datadog 的 OTLP ingestion：</p>
<p>團隊已經使用 Datadog APM，但新服務或新語言想用 OTel SDK 避免 vendor lock-in。Datadog SDK 覆蓋的語言有限（Go / Java / Python / Ruby / Node / .NET / PHP / C++），如果服務用 Rust / Elixir / Kotlin multiplatform，OTel SDK 的覆蓋更廣。</p>
<p>另一種情境是團隊原本用 OTel + Jaeger 或 OTel + Grafana，現在想把 visualization 遷到 Datadog 但不想重新 instrument。OTLP ingestion 讓 OTel SDK 產出的 traces / metrics / logs 直接送進 Datadog，不改 application code。</p>
<h2 id="核心概念">核心概念</h2>
<h3 id="datadog-agent-的-otlp-receiver">Datadog Agent 的 OTLP receiver</h3>
<p>Datadog Agent 6.32+ 內建 OTLP receiver，接受 gRPC（port 4317）和 HTTP（port 4318）兩種 protocol。Agent 收到 OTLP 資料後轉換成 Datadog 內部格式，走跟 Datadog SDK 相同的 pipeline（sampling、tagging、forwarding to Datadog backend）。</p>
<p>這代表 OTLP path 的資料在 Datadog UI 裡跟 Datadog SDK path 的資料一樣被處理 — 相同的 APM trace waterfall、相同的 service map、相同的 error tracking。差異在 metadata 完整度（見下方 feature parity）。</p>
<h3 id="三種-signal-的-otlp-支援度">三種 signal 的 OTLP 支援度</h3>
<table>
  <thead>
      <tr>
          <th>Signal</th>
          <th>OTLP 支援</th>
          <th>到 Datadog 的對應</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Traces</td>
          <td>完整（OTLP gRPC / HTTP）</td>
          <td>APM traces、service map、error tracking</td>
      </tr>
      <tr>
          <td>Metrics</td>
          <td>完整（OTLP gRPC / HTTP）</td>
          <td>Custom metrics（按 metric 計費）</td>
      </tr>
      <tr>
          <td>Logs</td>
          <td>有限（Agent 7.54+ 支援 OTLP logs）</td>
          <td>Datadog Logs（按 ingestion volume 計費）</td>
      </tr>
  </tbody>
</table>
<p>Traces 的 OTLP 支援最成熟、metrics 次之、logs 最新。混合環境常見做法是 traces + metrics 走 OTLP、logs 走 Datadog Agent 的原生 log collection（file tailing / container stdout）。</p>
<h3 id="datadog-sdk-vs-otel-sdk-feature-parity">Datadog SDK vs OTel SDK feature parity</h3>
<table>
  <thead>
      <tr>
          <th>功能</th>
          <th>Datadog SDK</th>
          <th>OTel SDK → Datadog</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Distributed tracing</td>
          <td>有</td>
          <td>有（完整）</td>
      </tr>
      <tr>
          <td>Continuous profiling</td>
          <td>有</td>
          <td>無（Datadog 專有）</td>
      </tr>
      <tr>
          <td>ASM（Application Security）</td>
          <td>有</td>
          <td>無（需要 Datadog library）</td>
      </tr>
      <tr>
          <td>CI Visibility</td>
          <td>有</td>
          <td>無</td>
      </tr>
      <tr>
          <td>Dynamic instrumentation</td>
          <td>有</td>
          <td>無</td>
      </tr>
      <tr>
          <td>Runtime metrics（GC、thread）</td>
          <td>自動</td>
          <td>需手動配置 OTel metric instrumentation</td>
      </tr>
      <tr>
          <td>Log correlation（trace_id 注入 log）</td>
          <td>自動</td>
          <td>需手動配置（MDC / context propagation）</td>
      </tr>
      <tr>
          <td>Unified service tagging</td>
          <td>自動（<code>DD_SERVICE</code> / <code>DD_ENV</code> / <code>DD_VERSION</code>）</td>
          <td>需 resource attribute mapping</td>
      </tr>
  </tbody>
</table>
<p>判讀：如果團隊需要 profiling / ASM / CI Visibility，對應服務仍需 Datadog SDK。其他服務可以用 OTel SDK + OTLP ingestion，兩者在同一個 Datadog org 共存。</p>
<h2 id="配置-step-by-step">配置 step-by-step</h2>
<h3 id="datadog-agent-otlp-設定">Datadog Agent OTLP 設定</h3>





<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"># datadog.yaml</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">otlp_config</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">receiver</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">protocols</span><span class="p">:</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">grpc</span><span class="p">:</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">endpoint</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="p">:</span><span class="m">4317</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">http</span><span class="p">:</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">endpoint</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="p">:</span><span class="m">4318</span></span></span></code></pre></div><p>Agent 重啟後用 <code>datadog-agent status</code> 確認 OTLP receiver 啟動。</p>
<h3 id="otel-sdk-endpoint-配置">OTel SDK endpoint 配置</h3>





<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"><span class="c1"># 環境變數（語言無關）</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">export</span> <span class="nv">OTEL_EXPORTER_OTLP_ENDPOINT</span><span class="o">=</span><span class="s2">&#34;http://datadog-agent:4317&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nb">export</span> <span class="nv">OTEL_EXPORTER_OTLP_PROTOCOL</span><span class="o">=</span><span class="s2">&#34;grpc&#34;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="nb">export</span> <span class="nv">OTEL_SERVICE_NAME</span><span class="o">=</span><span class="s2">&#34;checkout-api&#34;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nb">export</span> <span class="nv">OTEL_RESOURCE_ATTRIBUTES</span><span class="o">=</span><span class="s2">&#34;deployment.environment=production,service.version=1.2.3&#34;</span></span></span></code></pre></div><h3 id="resource-attribute--datadog-tag-mapping">Resource attribute → Datadog tag mapping</h3>
<p>Datadog Agent 自動把 OTel resource attributes 轉成 Datadog tags：</p>
<table>
  <thead>
      <tr>
          <th>OTel resource attribute</th>
          <th>Datadog tag</th>
          <th>備註</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>service.name</code></td>
          <td><code>service</code></td>
          <td>Datadog unified service tagging 的核心</td>
      </tr>
      <tr>
          <td><code>deployment.environment</code></td>
          <td><code>env</code></td>
          <td>必填、否則 Datadog UI 的環境篩選失效</td>
      </tr>
      <tr>
          <td><code>service.version</code></td>
          <td><code>version</code></td>
          <td>用於 deployment tracking</td>
      </tr>
      <tr>
          <td><code>host.name</code></td>
          <td><code>host</code></td>
          <td>Agent 通常自動帶、不需手動設</td>
      </tr>
      <tr>
          <td><code>container.name</code></td>
          <td><code>container_name</code></td>
          <td>K8s 環境自動帶</td>
      </tr>
  </tbody>
</table>
<p>如果 resource attribute 沒設 <code>deployment.environment</code>，Datadog 會把 trace 歸到 <code>env:none</code> — 在 APM 介面幾乎不可見。這是最常見的 OTLP onboarding 問題。</p>
<h3 id="otel-collector--datadogalternative-path">OTel Collector → Datadog（alternative path）</h3>
<p>如果不想讓 application 直連 Datadog Agent，可以在中間放 OTel Collector：</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"># otel-collector-config.yaml</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">exporters</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">datadog</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">api</span><span class="p">:</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">key</span><span class="p">:</span><span class="w"> </span><span class="l">${DD_API_KEY}</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">site</span><span class="p">:</span><span class="w"> </span><span class="l">datadoghq.com</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w"></span><span class="nt">service</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">pipelines</span><span class="p">:</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">traces</span><span class="p">:</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">receivers</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">otlp]</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">processors</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">batch]</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">exporters</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">datadog]</span></span></span></code></pre></div><p>OTel Collector 的 <code>datadog</code> exporter 直接把資料送到 Datadog backend（不經 Agent）。適合已有 OTel Collector 基礎設施、不想每個 node 都部署 Datadog Agent 的場景。</p>
<h2 id="故障與邊界">故障與邊界</h2>
<h3 id="resource-attribute-mapping-不對齊">Resource attribute mapping 不對齊</h3>
<p>OTel 的 <code>service.name</code> 用 dot notation（如 <code>com.example.checkout</code>），Datadog 預設用 hyphen（如 <code>checkout-api</code>）。如果 mapping 不一致，同一個服務在 Datadog APM 的 service map 會出現多個節點（OTel path 一個、Datadog SDK path 一個）。</p>
<p>修法：統一 <code>service.name</code> 命名。如果兩種 SDK 並存，在 OTel SDK 的 resource attribute 設跟 Datadog SDK 的 <code>DD_SERVICE</code> 完全相同的值。</p>
<h3 id="metric-naming-convention-差異">Metric naming convention 差異</h3>
<p>OTel metric 用 dot notation（<code>http.server.request.duration</code>），Datadog 預設用 underscore（<code>http_server_request_duration</code>）。Agent 會自動轉換（dot → underscore），但如果團隊同時有 Datadog SDK 產出的 metric 跟 OTel SDK 產出的 metric，兩者可能在 Datadog 裡產生重複（語意相同但名稱不同）。</p>
<p>修法：用 OTel Collector 的 <code>metricstransform</code> processor 在 export 前統一命名，或在 Datadog 用 metric alias 合併。</p>
<h3 id="log-correlation-在-otlp-path-的限制">Log correlation 在 OTLP path 的限制</h3>
<p>Datadog SDK 自動把 <code>dd.trace_id</code> 和 <code>dd.span_id</code> 注入 application log（如 Python logging、Java MDC）。OTel SDK 不做這件事 — log correlation 需要手動設定（把 <code>trace_id</code> 從 OTel context 注入 logging framework）。</p>
<p>如果 log correlation 缺失，Datadog 的 trace → log 跳轉功能失效。修法依語言不同：Java 用 MDC + OTel Java agent 的 log context instrumentation；Python 用 <code>opentelemetry-instrumentation-logging</code>；Go 需要手動從 span context 取 trace ID 寫到 log field。</p>
<h2 id="容量與成本">容量與成本</h2>
<p>OTLP path 的計費跟 Datadog SDK path 相同：</p>
<table>
  <thead>
      <tr>
          <th>Signal</th>
          <th>計費單位</th>
          <th>OTLP vs Datadog SDK</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>APM traces</td>
          <td>Per ingested span</td>
          <td>相同</td>
      </tr>
      <tr>
          <td>Metrics</td>
          <td>Per custom metric（unique metric name × tag combination）</td>
          <td>相同</td>
      </tr>
      <tr>
          <td>Logs</td>
          <td>Per ingested GB</td>
          <td>相同</td>
      </tr>
  </tbody>
</table>
<p>成本差異不在 ingestion pricing，在 <strong>feature access</strong>。用 OTel SDK 失去 Profiling / ASM / CI Visibility，這些功能需要 Datadog SDK。如果團隊需要這些功能，走 OTLP 反而要為核心服務額外部署 Datadog SDK — 雙 SDK 的 maintenance cost 可能超過直接全用 Datadog SDK。</p>
<p>判斷分水嶺：如果 &gt; 80% 的服務不需要 Profiling / ASM，走 OTLP + 少數服務用 Datadog SDK 是合理的混合模式。如果核心服務都需要 Profiling，全用 Datadog SDK 更簡單。</p>
<h2 id="整合與下一步">整合與下一步</h2>
<ul>
<li><a href="/blog/backend/04-observability/vendors/datadog/" data-link-title="Datadog" data-link-desc="All-in-one SaaS 觀測平台、APM / Logs / Metrics / RUM / Security">Datadog 服務頁</a>：overview 與日常操作</li>
<li><a href="../cost-governance-agent-config/">Datadog 成本治理</a>：Agent 配置與 cost control</li>
<li><a href="/blog/backend/04-observability/cases/datadog-otel-migration-practice/" data-link-title="4.C7 Datadog：OTel 相容遷移實務" data-link-desc="APM 採集從專有代理轉向 OTel 相容模式的治理案例。">4.C7 Datadog OTel migration</a>：從 Datadog SDK 轉向 OTel 相容模式的治理案例</li>
<li><a href="/blog/backend/04-observability/vendors/opentelemetry/collector-deployment-patterns/" data-link-title="OTel Collector 部署模式：agent / gateway / sidecar 與 pipeline 設計" data-link-desc="說明 OpenTelemetry Collector 三種部署位置的責任分工、receivers/processors/exporters pipeline 設計，以及 collector 失效、記憶體壓力與 backpressure 的故障演練與容量邊界">OpenTelemetry Collector 部署模式</a>：OTel Collector → Datadog 的 alternative path</li>
<li><a href="../migrate-from-new-relic/">← New Relic migration</a>：New Relic → Datadog 的遷移中 OTLP 扮演的橋接角色</li>
</ul>
]]></content:encoded></item></channel></rss>