11"""Internal module for setting up OpenTelemetry meter provider."""
22
33import logging
4+ import os
45from typing import Optional
56
67from 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+ )
814from opentelemetry .sdk .metrics import (
915 MeterProvider ,
1016 Counter ,
2329from sap_cloud_sdk .core .telemetry .config import (
2430 get_config ,
2531 create_resource_attributes_from_env ,
32+ ENV_OTLP_PROTOCOL ,
2633)
2734from sap_cloud_sdk .core ._version import get_version
2835from 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 )
0 commit comments