feat: OpenTelemetry traces, metrics, and logs #102

Merged
jasoncouture merged 7 commits from feat/open-telemetry into main 2026-05-23 16:15:42 -04:00
jasoncouture commented 2026-05-23 16:13:09 -04:00 (Migrated from github.com)

Summary

  • Wire OTEL traces/metrics/logs into the LlamaShears host project only — sub-projects stay unaware. OTLP exporter, env-var configured.
  • Wildcard LlamaShears* source/meter subscriptions so any sub-project ActivitySource/Meter gets picked up without per-call registration.
  • Composable resource attributes via IResourceDetector in DI; AppResourceDetector ships standard service.* / deployment.* attrs.
  • Trace agent turns as GenAI client spans (Aspire dashboard GenAI tab) with gen_ai.* semconv tags.
  • Trace event bus publish/consume as Producer/Consumer; consumer span links back to publisher via captured ActivityContext across async transition.
  • Trace heartbeat ticks with status reasons + child session attrs.
  • AgentHandle carries optional DisposableList for activity-lifetime resources; EC restored on teardown so disposables run under the agent's context.
  • New Telemetry.CreateActivitySourceForType<T> helper standardizes ActivitySource naming.

Side-fixes:

  • Two existing tests asserted handler counts eagerly after PublishAsync returned. Once dispatch became async (Task.Yield in EventHandlerWrapper), those races showed up — switched to poll-with-timeout.
  • Bulk tightened test timeout/wait budgets from 5s to 500ms across tests/ — they all resolve in <100ms in practice.

Test plan

  • dotnet test — 550/550 pass.
  • Local: traces show up in Aspire dashboard GenAI tab on a real LLM call.
## Summary - Wire OTEL traces/metrics/logs into the LlamaShears host project only — sub-projects stay unaware. OTLP exporter, env-var configured. - Wildcard `LlamaShears*` source/meter subscriptions so any sub-project ActivitySource/Meter gets picked up without per-call registration. - Composable resource attributes via `IResourceDetector` in DI; `AppResourceDetector` ships standard `service.*` / `deployment.*` attrs. - Trace agent turns as GenAI client spans (Aspire dashboard GenAI tab) with `gen_ai.*` semconv tags. - Trace event bus publish/consume as Producer/Consumer; consumer span links back to publisher via captured ActivityContext across async transition. - Trace heartbeat ticks with status reasons + child session attrs. - `AgentHandle` carries optional `DisposableList` for activity-lifetime resources; EC restored on teardown so disposables run under the agent's context. - New `Telemetry.CreateActivitySourceForType<T>` helper standardizes ActivitySource naming. Side-fixes: - Two existing tests asserted handler counts eagerly after `PublishAsync` returned. Once dispatch became async (Task.Yield in `EventHandlerWrapper`), those races showed up — switched to poll-with-timeout. - Bulk tightened test timeout/wait budgets from 5s to 500ms across `tests/` — they all resolve in <100ms in practice. ## Test plan - [x] `dotnet test` — 550/550 pass. - [ ] Local: traces show up in Aspire dashboard GenAI tab on a real LLM call.
github-actions[bot] commented 2026-05-23 16:14:55 -04:00 (Migrated from github.com)
Package Line Rate Branch Rate Complexity Health
LlamaShears.Core.Eventing 91% 71% 90
LlamaShears.Core.Abstractions 57% 37% 481
LlamaShears.Api 30% 30% 473
LlamaShears.Provider.Ollama 44% 28% 188
LlamaShears.Core.Eventing.Extensions 100% 100% 1
LlamaShears.Core 46% 43% 1687
LlamaShears.Provider.Onnx.Embeddings 37% 38% 72
LlamaShears.Provider.OpenAI 66% 65% 229
LlamaShears.Api.Web 1% 1% 493
LlamaShears.Hosting 33% 21% 27
LlamaShears.Plugins 0% 100% 1
LlamaShears.Core.Eventing 85% 61% 90
LlamaShears 63% 47% 79
LlamaShears.Plugins.Host 34% 24% 36
LlamaShears.Core.Abstractions 46% 25% 481
LlamaShears.Api 6% 2% 473
LlamaShears.Provider.Ollama 3% 1% 188
LlamaShears.IntegrationTests.Fixtures 73% 57% 64
LlamaShears.Core.Eventing.Extensions 100% 100% 1
StrangeSoft.Plugins.Host 20% 21% 87
LlamaShears.Core 42% 28% 1687
LlamaShears.Provider.Onnx.Embeddings 3% 0% 72
LlamaShears.Provider.OpenAI 2% 0% 229
LlamaShears.Api.Web 18% 7% 493
LlamaShears.Hosting 26% 8% 27
LlamaShears.Plugins 0% 100% 1
LlamaShears.Core.Eventing 85% 61% 90
LlamaShears 63% 47% 79
LlamaShears.Plugins.Host 34% 24% 36
LlamaShears.Core.Abstractions 36% 22% 481
LlamaShears.Api 7% 3% 473
LlamaShears.Provider.Ollama 3% 1% 188
LlamaShears.IntegrationTests.Fixtures 70% 52% 64
LlamaShears.Core.Eventing.Extensions 100% 100% 1
StrangeSoft.Plugins.Host 20% 21% 87
LlamaShears.Core 30% 19% 1687
LlamaShears.Provider.Onnx.Embeddings 3% 0% 72
LlamaShears.Provider.OpenAI 2% 0% 229
LlamaShears.Api.Web 17% 6% 493
LlamaShears.Hosting 26% 8% 27
LlamaShears.Analyzers.CodeFixes 85% 69% 60
LlamaShears.Analyzers 88% 76% 199
Summary 46% (12234 / 36390) 36% (2717 / 11067) 12016
Package | Line Rate | Branch Rate | Complexity | Health -------- | --------- | ----------- | ---------- | ------ LlamaShears.Core.Eventing | 91% | 71% | 90 | ✔ LlamaShears.Core.Abstractions | 57% | 37% | 481 | ➖ LlamaShears.Api | 30% | 30% | 473 | ❌ LlamaShears.Provider.Ollama | 44% | 28% | 188 | ❌ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ LlamaShears.Core | 46% | 43% | 1687 | ❌ LlamaShears.Provider.Onnx.Embeddings | 37% | 38% | 72 | ❌ LlamaShears.Provider.OpenAI | 66% | 65% | 229 | ➖ LlamaShears.Api.Web | 1% | 1% | 493 | ❌ LlamaShears.Hosting | 33% | 21% | 27 | ❌ LlamaShears.Plugins | 0% | 100% | 1 | ❌ LlamaShears.Core.Eventing | 85% | 61% | 90 | ✔ LlamaShears | 63% | 47% | 79 | ➖ LlamaShears.Plugins.Host | 34% | 24% | 36 | ❌ LlamaShears.Core.Abstractions | 46% | 25% | 481 | ❌ LlamaShears.Api | 6% | 2% | 473 | ❌ LlamaShears.Provider.Ollama | 3% | 1% | 188 | ❌ LlamaShears.IntegrationTests.Fixtures | 73% | 57% | 64 | ➖ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ StrangeSoft.Plugins.Host | 20% | 21% | 87 | ❌ LlamaShears.Core | 42% | 28% | 1687 | ❌ LlamaShears.Provider.Onnx.Embeddings | 3% | 0% | 72 | ❌ LlamaShears.Provider.OpenAI | 2% | 0% | 229 | ❌ LlamaShears.Api.Web | 18% | 7% | 493 | ❌ LlamaShears.Hosting | 26% | 8% | 27 | ❌ LlamaShears.Plugins | 0% | 100% | 1 | ❌ LlamaShears.Core.Eventing | 85% | 61% | 90 | ✔ LlamaShears | 63% | 47% | 79 | ➖ LlamaShears.Plugins.Host | 34% | 24% | 36 | ❌ LlamaShears.Core.Abstractions | 36% | 22% | 481 | ❌ LlamaShears.Api | 7% | 3% | 473 | ❌ LlamaShears.Provider.Ollama | 3% | 1% | 188 | ❌ LlamaShears.IntegrationTests.Fixtures | 70% | 52% | 64 | ➖ LlamaShears.Core.Eventing.Extensions | 100% | 100% | 1 | ✔ StrangeSoft.Plugins.Host | 20% | 21% | 87 | ❌ LlamaShears.Core | 30% | 19% | 1687 | ❌ LlamaShears.Provider.Onnx.Embeddings | 3% | 0% | 72 | ❌ LlamaShears.Provider.OpenAI | 2% | 0% | 229 | ❌ LlamaShears.Api.Web | 17% | 6% | 493 | ❌ LlamaShears.Hosting | 26% | 8% | 27 | ❌ LlamaShears.Analyzers.CodeFixes | 85% | 69% | 60 | ✔ LlamaShears.Analyzers | 88% | 76% | 199 | ✔ **Summary** | **46%** (12234 / 36390) | **36%** (2717 / 11067) | **12016** | ❌ <!-- Sticky Pull Request Commentcoverage -->
Sign in to join this conversation.
No description provided.