You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This needs a placement/dependency decision before implementation. My suggested first increment is an eino-ext callback handler (to avoid adding OTel SDK dependencies to core) covering ChatModel/Tool/Retriever/Indexer spans first, pinned to one GenAI semconv version, with in-memory exporter tests for parentage, attributes, errors, and streaming completion. Graph/ADK topology and metrics can follow after the base span contract stabilizes. Please confirm core vs eino-ext and the intended semconv stability level.
Placement rationale: I followed the suggestion to keep the OpenTelemetry SDK out of eino core (which currently has no observability dependencies) by putting the handler in eino-ext alongside langfuse and cozeloop. The handler is a standard callbacks.Handler, so it works anywhere core callbacks work, including ADK.
gen_ai.system from the component implementation type (lowercased)
gen_ai.request.model from chat model / embedding callbacks
gen_ai.usage.input_tokens / gen_ai.usage.output_tokens from chat model / embedding callbacks
Streaming invocations get a span whose lifetime follows the stream
Not yet covered: metrics (token-usage counters / histograms) and gen_ai.client.* event attributes. I left those out to keep this first increment reviewable — happy to add them as a follow-up if maintainers want the full surface.
Would love maintainer feedback on whether this placement and scope matches the project direction.
Activity
March-77 commentedon Jul 24, 2026
This needs a placement/dependency decision before implementation. My suggested first increment is an
eino-extcallback handler (to avoid adding OTel SDK dependencies to core) covering ChatModel/Tool/Retriever/Indexer spans first, pinned to one GenAI semconv version, with in-memory exporter tests for parentage, attributes, errors, and streaming completion. Graph/ADK topology and metrics can follow after the base span contract stabilizes. Please confirm core vs eino-ext and the intended semconv stability level.SilenceShine commentedon Aug 6, 2026
我也想要
Ethanz11-creat commentedon Aug 30, 2026
Implemented this as a backend-agnostic handler in eino-ext: cloudwego/eino-ext#980.
Placement rationale: I followed the suggestion to keep the OpenTelemetry SDK out of eino core (which currently has no observability dependencies) by putting the handler in eino-ext alongside
langfuseandcozeloop. The handler is a standardcallbacks.Handler, so it works anywhere core callbacks work, including ADK.What it covers today:
gen_ai.operation.namemapping:ChatModel/AgenticModel→chat,Embedding/Indexer→embeddings,Retriever→retrieve,Tool/tools nodes →execute_tool,Agent/Graph/Workflow/Chain→invoke_agentgen_ai.systemfrom the component implementation type (lowercased)gen_ai.request.modelfrom chat model / embedding callbacksgen_ai.usage.input_tokens/gen_ai.usage.output_tokensfrom chat model / embedding callbacksNot yet covered: metrics (token-usage counters / histograms) and
gen_ai.client.*event attributes. I left those out to keep this first increment reviewable — happy to add them as a follow-up if maintainers want the full surface.Would love maintainer feedback on whether this placement and scope matches the project direction.
feat(callbacks): add native OpenTelemetry callback handler