Skip to content

Commit e9f529d

Browse files
feat: enable OTLP protocol parameterization for metrics
1 parent 86246dc commit e9f529d

File tree

5 files changed

+142
-185
lines changed

5 files changed

+142
-185
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "sap-cloud-sdk"
3-
version = "0.10.1"
3+
version = "0.11.0"
44
description = "SAP Cloud SDK for Python"
55
readme = "README.md"
66
license = "Apache-2.0"

src/sap_cloud_sdk/core/telemetry/_provider.py

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
"""Internal module for setting up OpenTelemetry meter provider."""
22

33
import logging
4+
import os
45
from typing import Optional
56

67
from opentelemetry import metrics
7-
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
8+
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
9+
OTLPMetricExporter as GRPCMetricExporter,
10+
)
11+
from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
12+
OTLPMetricExporter as HTTPMetricExporter,
13+
)
814
from opentelemetry.sdk.metrics import (
915
MeterProvider,
1016
Counter,
@@ -23,6 +29,7 @@
2329
from sap_cloud_sdk.core.telemetry.config import (
2430
get_config,
2531
create_resource_attributes_from_env,
32+
ENV_OTLP_PROTOCOL,
2633
)
2734
from sap_cloud_sdk.core._version import get_version
2835
from sap_cloud_sdk.core.telemetry.constants import SDK_PACKAGE_NAME
@@ -69,12 +76,27 @@ def shutdown() -> None:
6976
_meter_provider = None
7077

7178

72-
def _setup_meter_provider() -> Optional[MeterProvider]:
73-
"""Set up the OpenTelemetry meter provider.
79+
def _create_metric_exporter():
80+
protocol = os.getenv(ENV_OTLP_PROTOCOL, "grpc").lower()
81+
exporter_classes = {"grpc": GRPCMetricExporter, "http/protobuf": HTTPMetricExporter}
7482

75-
Returns:
76-
MeterProvider instance if enabled, None if disabled.
77-
"""
83+
if protocol not in exporter_classes:
84+
raise ValueError(
85+
f"Unsupported OTEL_EXPORTER_OTLP_PROTOCOL: '{protocol}'. "
86+
"Supported values are 'grpc' and 'http/protobuf'."
87+
)
88+
temporality: dict[type, AggregationTemporality] = {
89+
Counter: AggregationTemporality.DELTA,
90+
Histogram: AggregationTemporality.DELTA,
91+
ObservableCounter: AggregationTemporality.DELTA,
92+
ObservableGauge: AggregationTemporality.DELTA,
93+
ObservableUpDownCounter: AggregationTemporality.DELTA,
94+
UpDownCounter: AggregationTemporality.DELTA,
95+
}
96+
return exporter_classes[protocol](preferred_temporality=temporality)
97+
98+
99+
def _setup_meter_provider() -> Optional[MeterProvider]:
78100
config = get_config()
79101

80102
if not config.enabled:
@@ -83,23 +105,8 @@ def _setup_meter_provider() -> Optional[MeterProvider]:
83105

84106
try:
85107
resource = Resource.create(create_resource_attributes_from_env())
86-
87-
exporter = OTLPMetricExporter(
88-
endpoint=config.otlp_endpoint,
89-
preferred_temporality={
90-
Counter: AggregationTemporality.DELTA,
91-
Histogram: AggregationTemporality.DELTA,
92-
ObservableCounter: AggregationTemporality.DELTA,
93-
ObservableGauge: AggregationTemporality.DELTA,
94-
ObservableUpDownCounter: AggregationTemporality.DELTA,
95-
UpDownCounter: AggregationTemporality.DELTA,
96-
},
97-
)
98-
99-
# Create metric reader with periodic export
108+
exporter = _create_metric_exporter()
100109
reader = PeriodicExportingMetricReader(exporter=exporter)
101-
102-
# Create and set meter provider
103110
provider = MeterProvider(resource=resource, metric_readers=[reader])
104111

105112
metrics.set_meter_provider(provider)

src/sap_cloud_sdk/core/telemetry/user-guide.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,16 @@ Use an OTLP collector:
210210
export OTEL_EXPORTER_OTLP_ENDPOINT="https://otel-collector.example.com"
211211
```
212212

213+
### Transport protocol
214+
215+
Both traces and metrics use gRPC by default. Switch to HTTP/protobuf by setting:
216+
217+
```bash
218+
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
219+
```
220+
221+
Supported values: `grpc` (default), `http/protobuf`.
222+
213223
### Span processor
214224

215225
By default, `auto_instrument` uses `BatchSpanProcessor`, which exports spans asynchronously in a background thread and is recommended for production workloads. If you need synchronous span processing (e.g. in short-lived scripts or tests where the process may exit before the batch is flushed), pass `disable_batch=True`:

0 commit comments

Comments
 (0)