Skip to content

feat(telemetry): add OpenTelemetry instrumentation for eventstore library events - #89

Draft
yordis wants to merge 1 commit into
mainfrom
eventstore-otel
Draft

feat(telemetry): add OpenTelemetry instrumentation for eventstore library events#89
yordis wants to merge 1 commit into
mainfrom
eventstore-otel

Conversation

@yordis

@yordis yordis commented Apr 19, 2026

Copy link
Copy Markdown
Member

Summary

  • The eventstore library (straw-hat-team/eventstore) now emits its own [:eventstore, operation, suffix] telemetry events (ref: straw-hat-team/eventstore@57000ff). This hooks into those events directly so operators get span coverage at the storage layer, independent of commanded's own event store abstraction.
  • Fixes OpenTelemetryCase environment isolation so tests pass regardless of shell-level OTEL_TRACES_EXPORTER configuration.

@cursor

cursor Bot commented Apr 19, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Adds new OpenTelemetry spans sourced from the underlying EventStore adapter’s telemetry, increasing tracing volume and introducing new span/attribute semantics; risk is mainly around noisy telemetry or mismatched metadata rather than core business logic.

Overview
Adds optional OpenTelemetry instrumentation for EventStore adapter telemetry ([:eventstore, operation, :start|:stop|:exception]), creating client spans with DB/stream/subscription attributes and proper error/exception handling.

Extends Commanded.OpenTelemetry.setup/1 :event_store options to support adapter: :enabled and wires this through EventStore.setup/1. Updates test isolation/handler cleanup to detach both Commanded and adapter-level telemetry handlers, and adds a comprehensive adapter instrumentation test suite.

Reviewed by Cursor Bugbot for commit e95b7ef. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Apr 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c103a542-024e-4e98-89bf-ee65931e0c2e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

This PR extends OpenTelemetry instrumentation for EventStore operations in the Commanded framework. It introduces a new EventStore adapter module for telemetry handler management, updates configuration schema to support adapter-level event store tracing, adds helper functions for span attributes, refactors telemetry event handling, and updates test coverage with assertion corrections and comprehensive integration tests.

Changes

Cohort / File(s) Summary
EventStore Telemetry Instrumentation
lib/commanded/opentelemetry/event_store.ex, lib/commanded/opentelemetry/event_store/adapters/event_store.ex
New adapter module registers handlers for EventStore telemetry events; refactored setup from setup/0 to setup/1 to accept optional config and conditionally enable adapter instrumentation; instrumentation targets 12 EventStore operations with start/stop/exception handlers that build spans with semantic and Commanded-specific attributes.
Configuration & Options Schema
lib/commanded/opentelemetry.ex
Extended event_store option validation to accept [adapter: :enabled | :disabled] keyword list (with :disabled default) or :disabled atom; updated setup flow to pass validated config to EventStore.setup/1.
Telemetry Helpers
lib/commanded/opentelemetry/helpers.ex
Added 8 new attribute-enrichment helper functions (maybe_add_*, to_destination_name) for conditionally prepending OTel semantic attributes; changed error type derivation from to_string/1 to inspect/1 for struct and exception cases.
Public Attributes
lib/commanded/opentelemetry/commanded_attributes.ex
Added 5 new attribute functions returning EventStore-specific span attribute identifiers: eventstore_read_count, eventstore_stream_start_version, eventstore_stream_direction, eventstore_stream_batch_size, eventstore_stream_delete_type.
Test Setup & Teardown
test/support/opentelemetry_case.ex
Extended telemetry handler detachment to include EventStore operation events alongside existing Commanded events.
Test Assertions
test/opentelemetry/aggregate_test.exs, test/opentelemetry/application_test.exs, test/opentelemetry/event_handler_test.exs, test/opentelemetry/event_store_test.exs
Updated exception span attribute expectations: changed error.type from "Elixir.*" prefixed format to bare exception names (e.g., "ArgumentError" instead of "Elixir.ArgumentError"); removed runtime span tests for subscription/ack operations.
EventStore Integration Tests
test/opentelemetry/event_store/adapters/event_store_test.exs
New comprehensive test module validating EventStore telemetry instrumentation: verifies span names, kinds, semantic attributes (messaging.\*, code.function), command-specific attributes (stream UUID, expected version, event count), and error handling for both :stop error results and :exception events.

Sequence Diagram

sequenceDiagram
    participant App as Application
    participant ES as EventStore<br/>Library
    participant ESAdapt as EventStore<br/>Adapter Handler
    participant OTel as OpenTelemetry
    
    App->>ES: Invoke operation<br/>(e.g., append_to_stream)
    ES->>ESAdapt: Emit [:eventstore, action, :start]<br/>telemetry event
    ESAdapt->>ESAdapt: Resolve span name & attributes<br/>from metadata
    ESAdapt->>OTel: Start client-kind<br/>telemetry span
    ES->>ES: Execute operation
    ES->>ESAdapt: Emit [:eventstore, action, :stop]<br/>or :exception event
    ESAdapt->>ESAdapt: Build span attributes<br/>(semantics, error type, etc.)
    ESAdapt->>OTel: Record attributes & status
    ESAdapt->>OTel: End telemetry span
    OTel-->>App: Span recorded
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

Poem

🐰 Hops through telemetry's bright lanes,
EventStore spans now chart their ways,
With attributes set and handlers keen,
The finest traces ever seen!
OpenTelemetry's dance unfolds—
Each operation's story told.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.28% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding OpenTelemetry instrumentation for eventstore library events, which is the core objective of this PR.
Description check ✅ Passed The description is related to the changeset, explaining that the PR hooks into eventstore library telemetry events and fixes OpenTelemetryCase environment isolation for tests.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch eventstore-otel

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
test/opentelemetry/eventstore_test.exs (1)

13-26: Consider centralizing the EventStore operation list.

The test duplicates EventStoreLib’s private operation list, so future operation additions can silently drift between instrumentation, cleanup, and coverage. Exposing a small events/0 helper for tests or sharing a module attribute through a test helper would keep this in sync.

Also applies to: 503-511

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/opentelemetry/eventstore_test.exs` around lines 13 - 26, The test
duplicates EventStoreLib's private operation list; add a single shared source
(either make EventStoreLib expose a small public events/0 function returning the
operation atom list or add a test helper module attribute/events/0 that
delegates to EventStoreLib) and update the test's `@events` to call that helper
instead of hardcoding the list (reference EventStoreLib and the new events/0
helper to locate where to add the shared list and where to replace the
duplicated `@events`).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@test/support/opentelemetry_case.ex`:
- Around line 41-43: The on_exit callback currently only restores
OTEL_TRACES_EXPORTER when prev_exporter is truthy; change it to restore or
remove the variable based on prev_exporter: if prev_exporter is non-nil call
System.put_env("OTEL_TRACES_EXPORTER", prev_exporter), otherwise call
System.delete_env("OTEL_TRACES_EXPORTER") so the test cleans up the environment
when the variable was originally unset; locate and update the on_exit block that
references prev_exporter and System.put_env to implement this conditional
restore/delete logic.

---

Nitpick comments:
In `@test/opentelemetry/eventstore_test.exs`:
- Around line 13-26: The test duplicates EventStoreLib's private operation list;
add a single shared source (either make EventStoreLib expose a small public
events/0 function returning the operation atom list or add a test helper module
attribute/events/0 that delegates to EventStoreLib) and update the test's
`@events` to call that helper instead of hardcoding the list (reference
EventStoreLib and the new events/0 helper to locate where to add the shared list
and where to replace the duplicated `@events`).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0822a9bf-1dd0-4ec7-8b15-0ed8449fd722

📥 Commits

Reviewing files that changed from the base of the PR and between 6aa37fd and 6662f34.

📒 Files selected for processing (4)
  • lib/commanded/opentelemetry.ex
  • lib/commanded/opentelemetry/event_store_lib.ex
  • test/opentelemetry/eventstore_test.exs
  • test/support/opentelemetry_case.ex

Comment thread test/support/opentelemetry_case.ex Outdated
Comment thread lib/commanded/opentelemetry/event_store/adapters/event_store.ex Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8a9af9b. Configure here.

Comment thread test/support/opentelemetry_case.ex Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
lib/commanded/opentelemetry/commanded_attributes.ex (1)

205-252: Optional: hoist the MessagingAttributes alias to the top of the module.

The alias on line 207 is declared mid-module, immediately before its first use. Per common Elixir convention and for consistency with the other OTel modules in this PR (e.g. event_store.ex, event_store/adapters/event_store.ex), consider moving it to the top alongside a module-level alias block.

♻️ Proposed relocation
 defmodule Commanded.OpenTelemetry.CommandedAttributes do
   `@moduledoc` """
   ...
   """
+
+  alias OpenTelemetry.SemConv.Incubating.MessagingAttributes
@@
   # -- Span builder helpers --

-  alias OpenTelemetry.SemConv.Incubating.MessagingAttributes
-
   def maybe_add_operation_type(attrs, nil), do: attrs
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/commanded/opentelemetry/commanded_attributes.ex` around lines 205 - 252,
The alias OpenTelemetry.SemConv.Incubating.MessagingAttributes is declared
mid-module right before its first use; move that alias declaration up into the
module-level alias block alongside the other aliases (so functions like
maybe_add_operation_type/2, maybe_add_destination_name/2, and
maybe_add_subscription_name/2 can reference MessagingAttributes from the top),
ensuring no other code semantics change.
lib/commanded/opentelemetry/event_store.ex (1)

38-40: Nit: hoist alias Commanded.OpenTelemetry.EventStore.Adapters to the module alias block.

The alias is declared mid-module, after @events and right before setup/1. Moving it up with the other aliases (lines 4–10) keeps the module header consistent and matches the convention used elsewhere in this PR.

♻️ Proposed relocation
   alias Commanded.Application, as: CommandedApplication
   alias Commanded.OpenTelemetry.CommandedAttributes
+  alias Commanded.OpenTelemetry.EventStore.Adapters
   alias Commanded.OpenTelemetry.Helpers
   alias OpenTelemetry.SemConv.ErrorAttributes
   alias OpenTelemetry.SemConv.Incubating.CodeAttributes
   alias OpenTelemetry.SemConv.Incubating.MessagingAttributes
   alias OpenTelemetry.Span
@@
   )a

-  alias Commanded.OpenTelemetry.EventStore.Adapters
-
   def setup(config \\ []) do
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/commanded/opentelemetry/event_store.ex` around lines 38 - 40, Move the
mid-module alias declaration for Adapters into the existing module alias block
to keep header consistency: relocate the line alias
Commanded.OpenTelemetry.EventStore.Adapters so it appears alongside the other
alias declarations at the top of the module (before the module attributes like
`@events`), leaving the setup/1 function and `@events` unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@lib/commanded/opentelemetry/commanded_attributes.ex`:
- Around line 205-252: The alias
OpenTelemetry.SemConv.Incubating.MessagingAttributes is declared mid-module
right before its first use; move that alias declaration up into the module-level
alias block alongside the other aliases (so functions like
maybe_add_operation_type/2, maybe_add_destination_name/2, and
maybe_add_subscription_name/2 can reference MessagingAttributes from the top),
ensuring no other code semantics change.

In `@lib/commanded/opentelemetry/event_store.ex`:
- Around line 38-40: Move the mid-module alias declaration for Adapters into the
existing module alias block to keep header consistency: relocate the line alias
Commanded.OpenTelemetry.EventStore.Adapters so it appears alongside the other
alias declarations at the top of the module (before the module attributes like
`@events`), leaving the setup/1 function and `@events` unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f698b2f0-64c4-44a9-83f4-10d4dc77ef53

📥 Commits

Reviewing files that changed from the base of the PR and between 6662f34 and 6bef462.

📒 Files selected for processing (10)
  • lib/commanded/opentelemetry.ex
  • lib/commanded/opentelemetry/commanded_attributes.ex
  • lib/commanded/opentelemetry/event_store.ex
  • lib/commanded/opentelemetry/event_store/adapters/event_store.ex
  • lib/commanded/opentelemetry/helpers.ex
  • test/opentelemetry/aggregate_test.exs
  • test/opentelemetry/application_test.exs
  • test/opentelemetry/event_handler_test.exs
  • test/opentelemetry/event_store/adapters/event_store_test.exs
  • test/opentelemetry/event_store_test.exs
✅ Files skipped from review due to trivial changes (1)
  • test/opentelemetry/event_handler_test.exs
🚧 Files skipped from review as they are similar to previous changes (1)
  • lib/commanded/opentelemetry.ex

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
lib/commanded/aggregates/aggregate_state_builder.ex (1)

193-210: ⚠️ Potential issue | 🟡 Minor

Update the telemetry metadata docs for caller_metadata.

The emitted load/populate metadata now includes caller_metadata, but the telemetry_event metadata specs above still omit it. Since TelemetryRegistry feeds public telemetry docs, this new field should be documented for the affected load and populate events.

📝 Proposed docs update
     %{application: Commanded.Application.t(),
       aggregate_module: module(),
       aggregate_uuid: String.t(),
       aggregate_state: struct(),
-      aggregate_version: non_neg_integer()}
+      aggregate_version: non_neg_integer(),
+      caller_metadata: map()}

Apply the same addition to the load :start/:stop and populate :start/:stop metadata specs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/commanded/aggregates/aggregate_state_builder.ex` around lines 193 - 210,
The telemetry metadata docs are missing the new caller_metadata field; update
the telemetry event metadata specs for the load and populate events (load
:start, load :stop, populate :start, populate :stop) to include caller_metadata
so TelemetryRegistry exposes it; locate the telemetry_metadata function and the
telemetry_event/metadata specs for the load/populate events and add
caller_metadata to their maps/typed specs consistently with how
telemetry_metadata(%Aggregate{}) now returns it.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@lib/commanded/opentelemetry/aggregate_populate.ex`:
- Around line 33-36: The :load :start handler in aggregate_populate.ex attaches
the propagated OTel context via
Helpers.extract_propagated_ctx(...)/:otel_ctx.attach(ctx) but the attached
context is never cleared, causing later spans in the aggregate GenServer to be
incorrectly parented; update the corresponding :load :stop telemetry handler
(the handler that ends the load span) to call Helpers.clear_ctx() immediately
after ending the span so the process restores a clean OTel context state. Ensure
you modify the :load :stop branch in the same module (look for the telemetry
stop handler that pairs with the :load :start logic) and add a call to
Helpers.clear_ctx() right after the span finish/cleanup.

In `@lib/commanded/opentelemetry/event_store/adapters/event_store.ex`:
- Around line 14-27: The `@events` list currently includes subscribe_to_stream and
delete_subscription which can produce orphan root spans from async EventStore
background subscription processes; either verify these telemetry events are only
emitted synchronously with inherited trace context or remove these two symbols
from the `@events` array and also remove/disable the corresponding span creation
logic referenced later in the module (the handlers that create spans for
subscribe_to_stream and delete_subscription found around the other telemetry
handling code). Update the `@events` constant to reflect the decision and ensure
the matching telemetry handler code (the functions creating spans for
subscribe_to_stream and delete_subscription) is cleaned up to avoid emitting
parentless spans.

---

Outside diff comments:
In `@lib/commanded/aggregates/aggregate_state_builder.ex`:
- Around line 193-210: The telemetry metadata docs are missing the new
caller_metadata field; update the telemetry event metadata specs for the load
and populate events (load :start, load :stop, populate :start, populate :stop)
to include caller_metadata so TelemetryRegistry exposes it; locate the
telemetry_metadata function and the telemetry_event/metadata specs for the
load/populate events and add caller_metadata to their maps/typed specs
consistently with how telemetry_metadata(%Aggregate{}) now returns it.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: eeaa6e4f-f190-4d47-af13-38f2af3061ee

📥 Commits

Reviewing files that changed from the base of the PR and between 6bef462 and 6902aa7.

📒 Files selected for processing (12)
  • lib/commanded/aggregates/aggregate.ex
  • lib/commanded/aggregates/aggregate_state_builder.ex
  • lib/commanded/aggregates/supervisor.ex
  • lib/commanded/commands/dispatcher.ex
  • lib/commanded/opentelemetry/aggregate_populate.ex
  • lib/commanded/opentelemetry/commanded_attributes.ex
  • lib/commanded/opentelemetry/event_store.ex
  • lib/commanded/opentelemetry/event_store/adapters/event_store.ex
  • lib/commanded/opentelemetry/helpers.ex
  • test/opentelemetry/aggregate_test.exs
  • test/opentelemetry/event_store_test.exs
  • test/support/opentelemetry_case.ex
🚧 Files skipped from review as they are similar to previous changes (6)
  • test/opentelemetry/aggregate_test.exs
  • test/opentelemetry/event_store_test.exs
  • test/support/opentelemetry_case.ex
  • lib/commanded/opentelemetry/event_store.ex
  • lib/commanded/opentelemetry/commanded_attributes.ex
  • lib/commanded/opentelemetry/helpers.ex

Comment thread lib/commanded/opentelemetry/aggregate_populate.ex Outdated
Comment thread lib/commanded/opentelemetry/event_store/adapters/event_store.ex
@yordis
yordis force-pushed the eventstore-otel branch 4 times, most recently from 9754c14 to e9bf396 Compare April 21, 2026 00:16

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
lib/commanded/opentelemetry/event_store.ex (1)

26-43: ⚠️ Potential issue | 🟠 Major

Guard setup/1 against non-list/non-map arguments.

Calling config[:adapter] at line 41 will crash if setup/1 receives an atom (e.g., :enabled) or nil. The caller in lib/commanded/opentelemetry.ex:225–228 only filters :disabled, passing any other value including nil to setup/1. Normalize non-list inputs to an empty list to prevent runtime errors:

Proposed fix
- def setup(config \\ []) do
+ def setup(config \\ [])
+
+ def setup(config) when config in [nil, :enabled] do
+   setup([])
+ end
+
+ def setup(config) when is_list(config) or is_map(config) do
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/commanded/opentelemetry/event_store.ex` around lines 26 - 43, The setup/1
function can crash when config is nil or an atom because it does
config[:adapter]; before using it, normalize config to a keyword/map by
assigning something like config = if is_map(config) or Keyword.keyword?(config),
do: config, else: [] inside setup/1 so non-list/non-map inputs become an empty
keyword list; then the later check if config[:adapter] == :enabled and call to
Adapters.EventStore.setup() will be safe.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@lib/commanded/opentelemetry/event_store.ex`:
- Around line 26-43: The setup/1 function can crash when config is nil or an
atom because it does config[:adapter]; before using it, normalize config to a
keyword/map by assigning something like config = if is_map(config) or
Keyword.keyword?(config), do: config, else: [] inside setup/1 so
non-list/non-map inputs become an empty keyword list; then the later check if
config[:adapter] == :enabled and call to Adapters.EventStore.setup() will be
safe.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 14eb69ac-0126-4c18-97b7-346946f9aa5f

📥 Commits

Reviewing files that changed from the base of the PR and between 6902aa7 and e9bf396.

📒 Files selected for processing (11)
  • lib/commanded/opentelemetry.ex
  • lib/commanded/opentelemetry/commanded_attributes.ex
  • lib/commanded/opentelemetry/event_store.ex
  • lib/commanded/opentelemetry/event_store/adapters/event_store.ex
  • lib/commanded/opentelemetry/helpers.ex
  • test/opentelemetry/aggregate_test.exs
  • test/opentelemetry/application_test.exs
  • test/opentelemetry/event_handler_test.exs
  • test/opentelemetry/event_store/adapters/event_store_test.exs
  • test/opentelemetry/event_store_test.exs
  • test/support/opentelemetry_case.ex
✅ Files skipped from review due to trivial changes (3)
  • test/opentelemetry/aggregate_test.exs
  • lib/commanded/opentelemetry/commanded_attributes.ex
  • lib/commanded/opentelemetry/event_store/adapters/event_store.ex
🚧 Files skipped from review as they are similar to previous changes (4)
  • test/support/opentelemetry_case.ex
  • test/opentelemetry/event_handler_test.exs
  • test/opentelemetry/application_test.exs
  • lib/commanded/opentelemetry.ex

@yordis
yordis force-pushed the eventstore-otel branch 4 times, most recently from bd187ce to 189d043 Compare April 21, 2026 02:43
@yordis
yordis marked this pull request as draft April 21, 2026 02:45
@yordis
yordis force-pushed the eventstore-otel branch from 9f34621 to 018b534 Compare May 14, 2026 20:04
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis
yordis force-pushed the eventstore-otel branch from 018b534 to e95b7ef Compare May 21, 2026 05:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant