1# Copyright The OpenTelemetry Authors
2# SPDX-License-Identifier: Apache-2.0
3
4from logging import getLogger
5from os import environ
6from typing import TYPE_CHECKING, TypeVar, cast
7
8if TYPE_CHECKING:
9 from opentelemetry.metrics import MeterProvider
10 from opentelemetry.trace import TracerProvider
11
12Provider = TypeVar("Provider", "TracerProvider", "MeterProvider")
13
14logger = getLogger(__name__)
15
16
17def _load_provider(provider_environment_variable: str, provider: str) -> Provider: # type: ignore[type-var]
18 # pylint: disable=import-outside-toplevel,no-name-in-module
19 from opentelemetry.util._importlib_metadata import ( # noqa: PLC0415
20 entry_points,
21 )
22
23 try:
24 provider_name = cast(
25 str,
26 environ.get(provider_environment_variable, f"default_{provider}"),
27 )
28
29 return cast(
30 Provider,
31 next( # type: ignore
32 iter( # type: ignore
33 entry_points( # type: ignore
34 group=f"opentelemetry_{provider}",
35 name=provider_name,
36 )
37 )
38 ).load()(),
39 )
40 except Exception: # pylint: disable=broad-exception-caught
41 logger.exception("Failed to load configured provider %s", provider)
42 raise