Skip to main content

Metric Naming Conventions

All Excalibur packages follow consistent naming patterns for OpenTelemetry meters, metric instruments, and tags. This document catalogs every meter name, explains the naming pattern, and notes any known inconsistencies.

Meter Naming Pattern

Meters follow a hierarchical dot-separated convention matching the package namespace:

Excalibur.{Domain}.{Component}

Where:

  • Domain is the top-level area (Dispatch, Data, EventSourcing, LeaderElection)
  • Component is the specific subsystem (Core, Transport, CircuitBreaker, etc.)

Examples

PackageMeter NamePattern
Dispatch coreExcalibur.Dispatch.CoreExcalibur.Dispatch.{Component}
Transport layerExcalibur.Dispatch.TransportExcalibur.Dispatch.Transport
Transport-specificExcalibur.Dispatch.Transport.KafkaExcalibur.Dispatch.Transport.{Provider}
Data layerExcalibur.Data.CdcExcalibur.Data.{Component}
Event sourcingExcalibur.EventSourcing.EventStoreExcalibur.EventSourcing.{Component}
Leader electionExcalibur.LeaderElectionExcalibur.LeaderElection

Complete Meter Catalog

Dispatch Domain

Meter NamePackageConstants Class
Excalibur.Dispatch.CoreExcalibur.DispatchDispatchTelemetryConstants.Meters.Core
Excalibur.Dispatch.PipelineExcalibur.DispatchDispatchTelemetryConstants.Meters.Pipeline
Excalibur.Dispatch.TimePolicyExcalibur.DispatchDispatchTelemetryConstants.Meters.TimePolicy
Excalibur.Dispatch.BatchProcessorExcalibur.DispatchDispatchTelemetryConstants.Meters.BatchProcessor
Excalibur.Dispatch.StreamingExcalibur.DispatchStreamingHandlerTelemetryConstants.MeterName
Excalibur.Dispatch.TransportExcalibur.Dispatch.Transport.AbstractionsTransportMeter.MeterName
Excalibur.Dispatch.DeadLetterQueueExcalibur.Dispatch.ObservabilityDeadLetterQueueMetrics.MeterName
Excalibur.Dispatch.CircuitBreakerExcalibur.Dispatch.ObservabilityCircuitBreakerMetrics.MeterName
Excalibur.Dispatch.Observability.ContextExcalibur.Dispatch.ObservabilityContextObservabilityTelemetryConstants.MeterName
Excalibur.Dispatch.ComplianceExcalibur.Dispatch.ComplianceComplianceMetrics.MeterName
Excalibur.Dispatch.Compliance.ErasureExcalibur.Dispatch.ComplianceErasureTelemetryConstants.MeterName
Excalibur.Dispatch.EncryptionExcalibur.Dispatch.ComplianceEncryptionTelemetry.MeterName
Excalibur.Dispatch.BackgroundServicesExcalibur.OutboxBackgroundServiceMetrics.MeterName
Excalibur.Dispatch.SagasExcalibur.SagaSagaMetrics.MeterName
Excalibur.Dispatch.WriteStoresExcalibur.Data.AbstractionsWriteStoreTelemetry.MeterName

Transport-Specific Meters

Transport meters use the pattern Excalibur.Dispatch.Transport.{TransportName}, generated by TransportTelemetryConstants.MeterName(name):

Meter NamePackage
Excalibur.Dispatch.Transport.RabbitMQExcalibur.Dispatch.Transport.RabbitMQ
Excalibur.Dispatch.Transport.KafkaExcalibur.Dispatch.Transport.Kafka
Excalibur.Dispatch.Transport.AzureServiceBusExcalibur.Dispatch.Transport.AzureServiceBus
Excalibur.Dispatch.Transport.GooglePubSubExcalibur.Dispatch.Transport.GooglePubSub
Excalibur.Dispatch.Transport.AwsSqsExcalibur.Dispatch.Transport.AwsSqs

Google Pub/Sub components share a single consolidated meter name via GooglePubSubTelemetryConstants.MeterName. All other transports create their meter instance during AddXxxTransport() DI registration.

Data Domain

Meter NamePackageConstants Class
Excalibur.Data.CdcExcalibur.Data.SqlServerCdcTelemetryConstants.MeterName
Excalibur.Data.AuditExcalibur.Data.ElasticSearchAuditTelemetryConstants.MeterName
Excalibur.Data.PersistenceExcalibur.DataString literal in DefaultPersistenceMetrics
Excalibur.Data.SqlServer.PersistenceExcalibur.Data.SqlServerString literal in SqlServerPersistenceMetrics
Excalibur.Data.Postgres.PersistenceExcalibur.Data.PostgresString literal in PostgresPersistenceMetrics
Excalibur.Data.Postgres.OutboxExcalibur.Data.PostgresString literal in PostgresOutboxStoreMetrics

Event Sourcing Domain

Meter NamePackageConstants Class
Excalibur.EventSourcing.EventStoreExcalibur.EventSourcingEventSourcingMeters.EventStore
Excalibur.EventSourcing.SnapshotStoreExcalibur.EventSourcingEventSourcingMeters.SnapshotStore
Excalibur.EventSourcing.MaterializedViewsExcalibur.EventSourcingMaterializedViewMetrics.MeterName

Leader Election Domain

Meter NamePackageConstants Class
Excalibur.LeaderElectionExcalibur.LeaderElectionLeaderElectionTelemetryConstants.MeterName

Activity Source Naming

Activity source names follow the same pattern as meter names. The framework registers these centrally via AddAllDispatchTracing():

Activity Source NamePackage
Excalibur.Dispatch.CoreDispatch
Excalibur.Dispatch.PipelineDispatch
Excalibur.Dispatch.TimePolicyDispatch
Excalibur.Dispatch.StreamingDispatch
Excalibur.Dispatch.Compliance.ErasureCompliance
Excalibur.Data.CdcData.SqlServer
Excalibur.Data.AuditData.ElasticSearch
Excalibur.LeaderElectionLeaderElection
Excalibur.EventSourcing.EventStoreEventSourcing
Excalibur.EventSourcing.SnapshotStoreEventSourcing

Transport-specific activity sources follow Excalibur.Dispatch.Transport.{TransportName}, matching the meter naming.

Metric Instrument Naming

Individual metric instruments (counters, histograms, gauges) follow a lower-case dot-separated convention:

{prefix}.{component}.{measurement}

Prefix Patterns

PrefixUsed ByExample
dispatch.messages.*Core dispatchdispatch.messages.processed
dispatch.transport.*Transport layerdispatch.transport.messages.sent
dispatch.circuitbreaker.*Circuit breakerdispatch.circuitbreaker.state_changes
dispatch.leaderelection.*Leader electiondispatch.leaderelection.acquisitions
excalibur.streaming.*Streaming handlersexcalibur.streaming.documents.processed
excalibur.cdc.*CDC processingexcalibur.cdc.events.processed
excalibur.audit.*Audit loggingexcalibur.audit.events.recorded
excalibur.erasure.*GDPR erasureexcalibur.erasure.requests.submitted
excalibur.eventsourcing.*Event sourcingexcalibur.eventsourcing.eventstore.operations

Tag Naming

Tags use dot-separated lowercase names following OpenTelemetry semantic conventions:

PatternExampleUsed By
message.*message.type, message.idCore dispatch
dispatch.transport.*dispatch.transport.name, dispatch.transport.destinationTransport layer
error.*error.type, error.retryableAll components
aggregate.*aggregate.id, aggregate.typeEvent sourcing
store.*store.type, store.providerPersistence
cdc.*cdc.capture_instance, cdc.operationCDC
audit.*audit.event_type, audit.severityAudit
erasure.*erasure.scope, erasure.result_statusGDPR erasure

Subscribing with Wildcards

Use OpenTelemetry's wildcard support for broad meter subscriptions:

builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
// All Dispatch meters
metrics.AddMeter("Excalibur.Dispatch.*");

// All data layer meters
metrics.AddMeter("Excalibur.Data.*");

// All event sourcing meters
metrics.AddMeter("Excalibur.EventSourcing.*");

// Everything
metrics.AddMeter("Excalibur.*");
});

Or use the convenience method which registers all known meters by name:

builder.Services.AddOpenTelemetry()
.AddAllDispatchMetrics();

Known Naming Inconsistencies

The following meters use ad-hoc string literals instead of shared constants classes. These are tracked for future harmonization:

Meter NameIssue
Excalibur.Data.PersistenceUses string literal in DefaultPersistenceMetrics, no constants class
Excalibur.Data.SqlServer.PersistenceUses string literal in SqlServerPersistenceMetrics, no constants class
Excalibur.Data.Postgres.PersistenceUses string literal in PostgresPersistenceMetrics, no constants class
Excalibur.Data.Postgres.OutboxUses string literal in PostgresOutboxStoreMetrics, no constants class

Additionally, some metric instrument name prefixes are inconsistent:

  • Core dispatch uses dispatch.* prefix (e.g., dispatch.messages.processed)
  • Streaming uses excalibur.streaming.* prefix (e.g., excalibur.streaming.documents.processed)
  • CDC/audit/erasure use excalibur.* prefix (e.g., excalibur.cdc.events.processed)

The recommended pattern for new instruments is excalibur.{component}.{measurement}.

See Also