模型 / 資料集
traceloop/openllmetry avatar
traceloop/openllmetry

OpenLLMetry:把 LLM 呼叫接進既有 OpenTelemetry 管線的取捨

Open-source observability for your GenAI or LLM application, based on OpenTelemetry

7,430 個 Star1,078 個 ForkPythonApache-2.0

秒懂

它是什麼?
OpenLLMetry 是 Traceloop 在 Apache-2.0 下維護的一組 OpenTelemetry 擴充,替 OpenAI、Anthropic、向量資料庫等呼叫產生標準 span。它的價值不在於另建一套後端,而在於讓你沿用已經在跑的 collector 與 APM;代價是你必須接受語意慣例仍在演進、版本迭代極快這兩個前提。
適合誰用?
已經在用 OpenTelemetry 的團隊,OpenLLMetry 的採用成本最低:pip install traceloop-sdk 加上 Traceloop.init() 兩行就能產生 span,之後要不要換後端只是改 exporter 設定。反過來說,如果你的需求集中在 prompt 版本管理、資料集與離線評測,或團隊裡沒有人想碰 collector,LLM 專用平台會比這條路徑直接。
可以商用嗎?
可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 37 天前。
用什麼語言寫的?
主要是 Python(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它要解的問題:LLM 呼叫在既有追蹤裡是黑盒

一般 APM 看得到 HTTP 請求進出,卻看不到這次請求裡塞了幾段 prompt、用了哪個模型、token 怎麼算、向量檢索花了多久。OpenLLMetry 針對的正是這個斷層。README 的定位寫得很直白:一組建立在 OpenTelemetry 之上的擴充,替 LLM 應用提供觀測能力,而因為底層就是 OpenTelemetry,所以能接上你既有的觀測方案,例如 Datadog、Honeycomb 等。

目標讀者是已經有觀測管線、不想為 LLM 再養一套後端的工程團隊。README 也給了另一條路徑:如果你已經在做 OpenTelemetry instrumentation,可以直接單獨加它的 instrumentation 套件,不一定要用 Traceloop 的 SDK。這個雙軌設計決定了它的適用邊界,後面幾節會回到這一點。

要注意的是,repo 的 topics 同時掛了 good-first-issue 與 help-wanted,README 也放了 PRs-Welcome 徽章。這代表專案歡迎外部貢獻,但也意味著部分 instrumentation 的成熟度可能不一致,選用時最好只依賴你實際會用到的那幾個。

機制:span 由 instrumentation 產生,SDK 只負責組裝

README 對「instrument 什麼」的說明分成兩層。第一層是 OpenTelemetry 本來就能 instrument 的東西,例如資料庫查詢、API 呼叫。第二層才是 OpenLLMetry 自己加的自訂擴充,用來涵蓋對 OpenAI、Anthropic 的呼叫,以及 Chroma、Pinecone、Qdrant、Weaviate 這類向量資料庫。

資料流因此是:你的程式呼叫模型或向量庫,對應的 instrumentation 攔截這次呼叫並產生 span,span 經由 OpenTelemetry 的 exporter 送到 collector 或後端。Traceloop SDK 在這個架構裡的角色不是傳輸層,而是把安裝與初始化包裝起來,README 說它「讓 OpenLLMetry 容易上手,同時仍然輸出標準 OpenTelemetry 資料」。換句話說,SDK 是可以拆掉的,拆掉之後你得到的是同樣格式的資料。

這個設計的另一個含意是:span 的屬性欄位遵循語意慣例。README 開頭提到,Traceloop 的語意慣例已經進入 OpenTelemetry 專案的討論。語意慣例一旦調整,欄位名稱或結構就可能跟著動,這也是後面談升級成本時的主要變數。

裝起來:兩行初始化,以及 disable_batch 這個開關

README 給的最短路徑是安裝 SDK:

pip install traceloop-sdk

接著在程式裡加兩行:

from traceloop.sdk import Traceloop Traceloop.init()

README 的說法是這樣就開始追蹤你的程式。若在本機執行,它建議關閉批次傳送,讓 trace 立刻出現:

Traceloop.init(disable_batch=True)

這個參數值得多想一秒。批次傳送是為了降低網路往返與後端壓力,關掉之後每一次 span 幾乎即時送出,本機開發時看得到效果,但在高流量環境會放大出口流量。把它當成開發環境的開關,而不是正式環境的預設值。

至於送到哪裡,README 列了一長串標示為已支援且測試過的目的地,包含 Traceloop、Axiom、Azure Application Insights、Braintrust、Dash0、Datadog、Dynatrace、Google Cloud、Grafana、Highlight、Honeycomb、HyperDX、IBM Instana、KloudMate、Laminar、New Relic、OpenTelemetry Collector、Oracle Cloud、Scorecard、Service Now Cloud Observability、SigNoz、Sentry、Splunk、Tencent Cloud。每個目的地的接法 README 指向官方 docs 的 integrations/exporting 頁面,本文沒有實際照著設定過,所以不逐項轉述。

若你走的是「已經有 OpenTelemetry」那條路,README 的說法是直接加它的 instrumentation 套件即可,不必引入 SDK。這條路的設定細節在 README 裡沒有展開,需要看 docs。

限制:語意慣例還在動,版本迭代也快

第一個限制寫在 README 自己身上。它把「語意慣例已成為 OpenTelemetry 的一部分」當成新訊發布,並附上社群討論連結。對使用者來說,這件事是雙面的:標準化意味著欄位長期會更穩定,但也意味著在定案之前,慣例仍可能被調整。你如果在後端寫了依賴特定屬性名稱的查詢或儀表板,升級 instrumentation 時就得回頭核對。

第二個限制是版本節奏。從提供的 release 清單看,0.62.1 到 0.62.2 相隔約六週,0.62.2 到 0.62.3 只隔一天。三個版本都還在 0.x。0.x 的語意是 API 尚未宣告穩定,這對照上面那條語意慣例的變動風險,方向是一致的。實際的升級成本取決於你用了哪些 instrumentation,以及你有多少下游查詢綁在特定欄位上,這部分材料沒有提供,無法給出數字。

第三個限制是內容邊界。LLM 的 span 天然會帶上 prompt 與 completion,這些是使用者資料。README 沒有在這裡著墨,但選用前必須自己確認:你的 collector 與後端是否允許接收這些內容,以及是否需要在上報前先做遮蔽。這是設計問題,不是套件缺陷,但它決定了你能不能直接把 Traceloop.init() 丟進正式環境。

還有一個容易被忽略的失敗模式:instrumentation 靠攔截函式庫呼叫運作,所以初始化順序會影響結果。Traceloop.init() 必須早於被 instrument 的客戶端被匯入或建立,否則那一段呼叫不會產生 span。README 的範例是兩行相鄰的最簡寫法,沒有示範在複雜匯入結構下該放哪裡。

替代方案:LLM 專用平台與 OpenTelemetry 原生路線

最直接的替代是 LLM 專用觀測平台,Langfuse 是這類工具的代表。差別在資料模型與重心。OpenLLMetry 產生的是通用 OpenTelemetry span,重點是讓 LLM 呼叫跟你既有的服務追蹤落在同一條時間軸上,你可以沿用現成的 collector、取樣策略與告警。Langfuse 這類平台則圍繞 LLM 工作流設計,prompt 版本、資料集、離線評測、人工標註通常是內建功能,代價是你多了一個要維運或付費的系統,而且它跟你的服務追蹤是兩套資料。

如果你已經在用 OpenTelemetry,這個取捨其實不難:多接一個後端比多養一套平台便宜。如果你什麼都還沒建,而且團隊關注的是 prompt 品質與評測迴圈,那從 OpenLLMetry 起步會多繞一圈。

另一條路是不用 SDK,只挑需要的 instrumentation 套件。README 明確支持這種用法,好處是依賴面最小,壞處是你要自己處理 exporter 與 resource 的設定,README 在這部分沒有給完整範例。至於 repo 裡同時存在的 JS/TS 版本 OpenLLMetry-JS,本文沒有足夠材料比較兩者的功能落差,只能指出它存在。

授權與維護:Apache-2.0,廠商主導的開源

授權是 Apache-2.0,README 的徽章與說明都這樣標示。這是一個寬鬆授權,允許修改與商用,並附帶專利授權條款。本文不提供法律意見,實際使用前請依你的組織流程確認授權合規,特別是如果你打算把 instrumentation 包進自家產品再散布。

維護面有兩件事需要分開看。專案由 Traceloop 這家公司建置與維護,README 也標了 Y Combinator 的徽章。公司主導的開源專案通常開發活躍,但路線圖會受商業產品影響,例如預設 exporter 指向 Traceloop 自家服務。這是常見模式,不是問題,只是採用時要意識到你依賴的是一條有商業動機的維護曲線。

另一件事是社群。README 提供 Slack 頻道與 GitHub Issues,topics 裡有 good-first-issue 與 help-wanted。這表示外部貢獻是被鼓勵的,但同時也提醒:不同 instrumentation 的維護深度可能不同。實際做法是檢查你打算依賴的那幾個套件近期的提交狀況,而不是看整個 repo 的活躍度。

升級成本的估算方式很具體:每次升版前,先確認你綁定的語意慣例屬性有沒有變,再確認你用的 instrumentation 套件有沒有對應更新。如果你的後端查詢是寫死欄位名稱的,這件事不能省。

誰該採用,以及先驗證什麼

已經在用 OpenTelemetry 的團隊是主要受益者。你們的 collector、取樣、告警都已經在跑,OpenLLMetry 只是往這條管線裡多丟一類 span,採用成本是兩行初始化加上 exporter 設定。反過來說,如果團隊的需求清單上排前面的是 prompt 版本管理、資料集與離線評測,或者根本沒有人想碰 collector 設定,那 LLM 專用平台會更貼近需求,OpenLLMetry 只會讓你多一層要接的線。

在你把 Traceloop.init() 放進正式環境之前,有三件事可以實測。第一,先在本機用 disable_batch=True 跑一次,確認你要觀測的那幾個客戶端真的產生 span,特別是確認 Traceloop.init() 的匯入位置早於這些客戶端。第二,把 span 送到你實際要用的後端,確認 LLM 語意慣例的屬性欄位在那裡能被查詢與視覺化,而不是變成一堆散落的未知欄位。第三,確認 prompt 與 completion 內容的傳輸邊界,決定要不要在上報前處理。

這三件事做完,你對 OpenLLMetry 的判斷就不會建立在 README 的支援清單上,而是建立在你自己的管線跑不跑得通。

編輯結論

已經在用 OpenTelemetry 的團隊,OpenLLMetry 的採用成本最低:pip install traceloop-sdk 加上 Traceloop.init() 兩行就能產生 span,之後要不要換後端只是改 exporter 設定。反過來說,如果你的需求集中在 prompt 版本管理、資料集與離線評測,或團隊裡沒有人想碰 collector,LLM 專用平台會比這條路徑直接。動手前先確認三件事:你的 collector 或 APM 是否吃得下 LLM 語意慣例的屬性欄位、Traceloop.init() 在匯入順序上是否早於被 instrument 的客戶端、以及你的環境是否允許把 prompt 與 completion 內容送出邊界。這三點沒確認就上線,通常不是套件壞掉,而是資料到了後端卻拼不回一次完整的對話。

官方來源

  1. License: Apache-2.0
  2. Project website
  3. README
  4. Releases
  5. traceloop/openllmetry on GitHub
社群筆記

社群筆記