Observability (Metrics, Traces, Logs)#
This document describes Helm configuration and metric definitions for each service. Storage Service includes the Storage Core component; Event Aggregation Service and Event Consumer Service use the shared Notification Common library for telemetry.
Part I – Helm configuration by service#
Storage Service#
Helm / behavior |
Details |
|---|---|
Metrics |
|
Ports |
gRPC: |
Logging |
|
Traces |
Not configured by default in Helm. OTLP tracing can be enabled by setting the appropriate OTEL environment variables (e.g. traces exporter and endpoint). |
Logs |
Logs go to stdout only. |
Event Aggregation Service#
Enable metrics and tracing independently in event-aggregation-values.yaml:
observability:
metrics:
enabled: true
endpoint:
grpc: "http://otel-collector.observability.svc.cluster.local:4317"
tracing:
enabled: true
endpoint:
grpc: "http://otel-collector.observability.svc.cluster.local:4317"
Each enabled signal requires its endpoint.grpc value; a missing endpoint
fails chart rendering. The endpoint.http fields are ignored. Log export is
on when either signal is enabled, using the tracing endpoint or falling back to
the metrics endpoint. logging.level sets the service log level.
When either signal is enabled, observability takes precedence over the legacy
telemetry block. When both signals are disabled, telemetry.enabled and
telemetry.otlp_*_endpoint remain in effect. Disable telemetry.enabled too
if turning off export from a deployment that used the legacy settings.
gRPC authentication refusals are recorded as UNAUTHENTICATED; signing-key
retrieval failures in jwt mode are INTERNAL. REST authentication refusals
and oversized-body refusals return before request tracing starts, so they have
no request span. Both are logged at WARNING. Check response results as well
as HTTP status when monitoring publication: HTTP 200 can contain a failed
publishing result. See
Event Aggregation Operations for request
limits, capacity and deployment checks.
Event Consumer Service#
Enable metrics and tracing independently in event-consumer-values.yaml:
observability:
metrics:
enabled: true
endpoint:
grpc: "http://otel-collector.observability.svc.cluster.local:4317"
tracing:
enabled: true
endpoint:
grpc: "http://otel-collector.observability.svc.cluster.local:4317"
Supply an OTLP/gRPC endpoint for each enabled signal. The endpoint.http fields
are not used by this service. Log export is enabled whenever either signal is on;
logs use the tracing endpoint, or the metrics endpoint when only metrics are
enabled. logging.level controls the service log level.
If either observability signal is enabled, this block takes precedence over
telemetry. If both are disabled, the legacy telemetry.enabled and
telemetry.otlp_*_endpoint settings remain in effect. To disable export on a
deployment that uses legacy settings, disable telemetry.enabled too.
For a per-pod capacity check, use GET /api/v1beta/metrics/channel-pool on the
REST port. This JSON endpoint is independent of OTLP export and reports
non-durable stream slots, despite its channels_in_use and
channels_total field names. See
Event Consumer Operations for scaling and
health-probe guidance.
Non-durable logs, stream traces and cache_writer.* metrics identify a queue by
queue_ref (sha256- followed by 12 hexadecimal characters), not the reconnect
token. Update dashboards that used queue_id for those streams; durable queues
still use queue_id. gRPC token refusals are recorded as UNAUTHENTICATED;
JWKS-fetch failures in jwt mode are INTERNAL. REST authentication failures
return 401 before request tracing starts, so those refusals have no request
span.
Part II – Metric explanations by service#
Storage Service#
Common attributes include method, API version, storage backend, pod name, package version, and result.
Metric name |
Type |
Description |
|---|---|---|
|
Counter |
Total storage API requests |
|
Histogram |
Request duration (seconds) |
|
Counter |
Requests to the storage backend SDK |
|
Histogram |
Backend SDK call duration |
|
Histogram (U64) |
Items returned per enumeration (list, list_stat, enumerate, enumerate_versions) |
|
Counter |
Redirect URLs returned for read operations |
|
Histogram (U64) |
Chunk size from backend (bytes) |
|
Histogram (U64) |
Total size of read objects (bytes) |
|
Counter |
Write operations by upload method (body, redirect, multipart) |
gRPC server metrics#
Metric name |
Type |
Description |
|---|---|---|
|
Counter |
Server calls started |
|
Histogram (U64) |
Compressed bytes received per RPC |
|
Histogram (U64) |
Compressed bytes sent per call |
|
Histogram (f64) |
Call duration (seconds). Attributes: grpc.method, grpc.service, grpc.name, grpc.status |
Metadata cache#
Metric name |
Type |
Description |
|---|---|---|
|
Counter |
Cache access count (attributes: pod, name) |
|
Counter |
Cache miss count |
|
Gauge |
Current cache entry count |
|
Gauge |
Cache memory footprint (bytes) |
Metadata backends#
S3: storage_s3_metadata_list_objects_latency, storage_s3_metadata_get_object_latency, storage_s3_metadata_put_object_latency, storage_s3_metadata_delete_object_latency (histograms).
DynamoDB: storage_aws_dynamodb_metadata_put_item_latency, storage_aws_dynamodb_metadata_delete_item_latency, storage_aws_dynamodb_metadata_batch_get_item_latency, storage_aws_dynamodb_metadata_batch_get_item_request_items, storage_aws_dynamodb_metadata_query_latency.
Azure Blob: storage_azure_blob_metadata_list_blobs_latency, storage_azure_blob_metadata_get_blob_latency, storage_azure_blob_metadata_put_blob_latency, storage_azure_blob_metadata_delete_blob_latency.
Azure Table: storage_azure_table_metadata_query_latency, storage_azure_table_metadata_query_response_size, storage_azure_table_metadata_delete_latency, storage_azure_table_metadata_update_latency, storage_azure_table_metadata_insert_or_update_latency.
HTTP status is also recorded per backend call (per status code).
Pub/sub#
SQS: storage_sqs_delete_message_batch_latency, storage_sqs_delete_message_batch_batch_size, storage_sqs_delete_message_batch_active_requests, storage_sqs_receive_message_latency, storage_sqs_receive_message_batch_size, storage_sqs_receive_message_active_requests, storage_sqs_events_per_message.
Azure Service Bus: storage_azure_service_bus_receive_messages_latency, storage_azure_service_bus_receive_messages_batch_size, storage_azure_service_bus_receive_messages_active_requests, storage_azure_service_bus_complete_message_latency, storage_azure_service_bus_complete_message_active_requests.
Notification client: storage_notification_service_publish_latency, storage_notification_service_publish_active_requests. OAuth2: storage_oauth2_client_credentials_provider_get_token_latency, storage_oauth2_client_credentials_provider_get_token_results.
Event Aggregation Service#
Uses the same gRPC server metrics as Event Consumer Service (Notification Common), listed in the Event Consumer Service section. It does not define additional service-specific metrics.
Event Consumer Service#
Consumer metrics (Event Consumer Service only)#
Metric name |
Type |
Description |
|---|---|---|
|
Counter |
Events processed by event type (label: event_type) |
|
Counter |
Successfully processed events |
|
Counter |
Events that failed during processing |
|
Histogram |
Time spent processing each event (ms) |
SSE metrics (Event Consumer Service only)#
Metric name |
Type |
Description |
|---|---|---|
|
UpDownCounter |
Active SSE connections |
|
Counter |
Total SSE connections established |
|
Histogram |
Connection duration (ms) |
|
Counter |
Events sent via SSE |
|
Histogram |
Events sent per SSE connection |
|
Counter |
SSE connection errors |
Labels include endpoint and, where applicable, event_type.