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(
18 provider_environment_variable: str, provider: str
19) -> Provider: # type: ignore[type-var]
20 # pylint: disable=import-outside-toplevel,no-name-in-module
21 from opentelemetry.util._importlib_metadata import ( # noqa: PLC0415
22 entry_points,
23 )
24
25 try:
26 provider_name = cast(
27 str,
28 environ.get(provider_environment_variable, f"default_{provider}"),
29 )
30
31 return cast(
32 Provider,
33 next( # type: ignore
34 iter( # type: ignore
35 entry_points( # type: ignore
36 group=f"opentelemetry_{provider}",
37 name=provider_name,
38 )
39 )
40 ).load()(),
41 )
42 except Exception: # pylint: disable=broad-exception-caught
43 logger.exception("Failed to load configured provider %s", provider)
44 raise