Skip to content

Commit 2b828bb

Browse files
committed
Add new environment variable OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER
1 parent f42041a commit 2b828bb

File tree

4 files changed

+98
-10
lines changed

4 files changed

+98
-10
lines changed

opentelemetry-sdk/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ classifiers = [
2828
"Typing :: Typed",
2929
]
3030
dependencies = [
31-
"opentelemetry-api == 1.31.0.dev",
32-
"opentelemetry-semantic-conventions == 0.52b0.dev",
31+
"opentelemetry-api == 1.30.0",
32+
"opentelemetry-semantic-conventions == 0.51b0",
3333
"typing-extensions >= 3.7.4",
3434
]
3535

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py

Lines changed: 86 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
OpenTelemetry SDK Configurator for Easy Instrumentation with Distros
1818
"""
1919

20+
import inspect
2021
import logging
2122
import os
2223
from abc import ABC, abstractmethod
2324
from os import environ
2425
from typing import Callable, Dict, List, Optional, Sequence, Tuple, Type, Union
2526

27+
from grpc import ChannelCredentials # type: ignore
28+
from requests import Session
2629
from typing_extensions import Literal
2730

2831
from opentelemetry._events import set_event_logger_provider
@@ -39,6 +42,7 @@
3942
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, LogExporter
4043
from opentelemetry.sdk.environment_variables import (
4144
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
45+
OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER,
4246
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL,
4347
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
4448
OTEL_EXPORTER_OTLP_PROTOCOL,
@@ -90,6 +94,14 @@
9094
_logger = logging.getLogger(__name__)
9195

9296

97+
def _import_config_component(
98+
selected_component: str, entry_point_name: str
99+
) -> object:
100+
return _import_config_components([selected_component], entry_point_name)[
101+
0
102+
][1]
103+
104+
93105
def _import_config_components(
94106
selected_components: List[str], entry_point_name: str
95107
) -> Sequence[Tuple[str, object]]:
@@ -189,11 +201,41 @@ def _get_exporter_names(
189201
]
190202

191203

204+
def _init_exporter(
205+
exporter_class: Type[Union[SpanExporter, MetricExporter, LogExporter]],
206+
otlp_credential_param: tuple[
207+
str, Union[ChannelCredentials | Session]
208+
] = None,
209+
) -> Union[SpanExporter, MetricExporter, LogExporter]:
210+
if not otlp_credential_param:
211+
return exporter_class()
212+
credential_key, credential = otlp_credential_param
213+
params = inspect.signature(exporter_class.__init__).parameters
214+
if (
215+
credential_key == "credentials"
216+
and "credentials" in params
217+
and isinstance(credential, params["credentials"].annotation)
218+
):
219+
print("initializing exporter with credentials.")
220+
return exporter_class(credentials=credential)
221+
if (
222+
credential_key == "session"
223+
and "session" in params
224+
and isinstance(credential, params["session"].annotation)
225+
):
226+
print("initializing exporter with session.")
227+
return exporter_class(session=credential)
228+
return exporter_class()
229+
230+
192231
def _init_tracing(
193232
exporters: Dict[str, Type[SpanExporter]],
194233
id_generator: IdGenerator = None,
195234
sampler: Sampler = None,
196235
resource: Resource = None,
236+
otlp_credential_param: tuple[
237+
str, Union[ChannelCredentials | Session]
238+
] = None,
197239
):
198240
provider = TracerProvider(
199241
id_generator=id_generator,
@@ -203,9 +245,10 @@ def _init_tracing(
203245
set_tracer_provider(provider)
204246

205247
for _, exporter_class in exporters.items():
206-
exporter_args = {}
207248
provider.add_span_processor(
208-
BatchSpanProcessor(exporter_class(**exporter_args))
249+
BatchSpanProcessor(
250+
_init_exporter(exporter_class, otlp_credential_param)
251+
)
209252
)
210253

211254

@@ -214,6 +257,9 @@ def _init_metrics(
214257
str, Union[Type[MetricExporter], Type[MetricReader]]
215258
],
216259
resource: Resource = None,
260+
otlp_credential_param: tuple[
261+
str, Union[ChannelCredentials | Session]
262+
] = None,
217263
):
218264
metric_readers = []
219265

@@ -225,7 +271,9 @@ def _init_metrics(
225271
else:
226272
metric_readers.append(
227273
PeriodicExportingMetricReader(
228-
exporter_or_reader_class(**exporter_args)
274+
_init_exporter(
275+
exporter_or_reader_class, otlp_credential_param
276+
)
229277
)
230278
)
231279

@@ -237,14 +285,18 @@ def _init_logging(
237285
exporters: Dict[str, Type[LogExporter]],
238286
resource: Resource = None,
239287
setup_logging_handler: bool = True,
288+
otlp_credential_param: dict[
289+
str, Union[ChannelCredentials | Session]
290+
] = None,
240291
):
241292
provider = LoggerProvider(resource=resource)
242293
set_logger_provider(provider)
243294

244295
for _, exporter_class in exporters.items():
245-
exporter_args = {}
246296
provider.add_log_record_processor(
247-
BatchLogRecordProcessor(exporter_class(**exporter_args))
297+
BatchLogRecordProcessor(
298+
_init_exporter(exporter_class, otlp_credential_param)
299+
)
248300
)
249301

250302
event_logger_provider = EventLoggerProvider(logger_provider=provider)
@@ -397,13 +449,35 @@ def _initialize_components(
397449
# from the env variable else defaults to "unknown_service"
398450
resource = Resource.create(resource_attributes)
399451

452+
otlp_credential_param = None
453+
credential_env = os.getenv(OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER)
454+
print("looking for creds")
455+
if credential_env:
456+
credentials = _import_config_component(
457+
credential_env, "opentelemetry_otlp_credential_provider"
458+
)()
459+
if isinstance(credentials, ChannelCredentials):
460+
print("found channel creds")
461+
otlp_credential_param = ("credentials", credentials)
462+
elif isinstance(credentials, Session):
463+
print("found session")
464+
otlp_credential_param = ("session", credentials)
465+
else:
466+
raise RuntimeError(
467+
f"{credential_env} is neither a ChannelCredentials or Session type."
468+
)
400469
_init_tracing(
401470
exporters=span_exporters,
402471
id_generator=id_generator,
403472
sampler=sampler,
404473
resource=resource,
474+
otlp_credential_param=otlp_credential_param,
475+
)
476+
_init_metrics(
477+
metric_exporters,
478+
resource,
479+
otlp_credential_param=otlp_credential_param,
405480
)
406-
_init_metrics(metric_exporters, resource)
407481
if setup_logging_handler is None:
408482
setup_logging_handler = (
409483
os.getenv(
@@ -413,7 +487,12 @@ def _initialize_components(
413487
.lower()
414488
== "true"
415489
)
416-
_init_logging(log_exporters, resource, setup_logging_handler)
490+
_init_logging(
491+
log_exporters,
492+
resource,
493+
setup_logging_handler,
494+
otlp_credential_param=otlp_credential_param,
495+
)
417496

418497

419498
class _BaseConfigurator(ABC):

opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER = "OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER"
16+
"""
17+
.. envvar:: OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER
18+
19+
The :envvar:`OTEL_EXPORTER_OTLP_CREDENTIAL_PROVIDER` provides either ChannelCredentials for grpc OTLP exporters,
20+
or request.Session for HTML exporters.
21+
"""
22+
# TODO: add corresponding environment variables specific to just the trace / log / metric exporters.
23+
1524
OTEL_SDK_DISABLED = "OTEL_SDK_DISABLED"
1625
"""
1726
.. envvar:: OTEL_SDK_DISABLED

opentelemetry-sdk/src/opentelemetry/sdk/version/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
__version__ = "1.31.0.dev"
15+
__version__ = "1.30.0"

0 commit comments

Comments
 (0)