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
8from opentelemetry.util._importlib_metadata import entry_points
9
10if TYPE_CHECKING:
11 from opentelemetry.metrics import MeterProvider
12 from opentelemetry.trace import TracerProvider
13
14Provider = TypeVar("Provider", "TracerProvider", "MeterProvider")
15
16logger = getLogger(__name__)
17
18
19def _load_provider(
20 provider_environment_variable: str, provider: str
21) -> Provider: # type: ignore[type-var]
22 try:
23 provider_name = cast(
24 str,
25 environ.get(provider_environment_variable, f"default_{provider}"),
26 )
27
28 return cast(
29 Provider,
30 next( # type: ignore
31 iter( # type: ignore
32 entry_points( # type: ignore
33 group=f"opentelemetry_{provider}",
34 name=provider_name,
35 )
36 )
37 ).load()(),
38 )
39 except Exception: # pylint: disable=broad-exception-caught
40 logger.exception("Failed to load configured provider %s", provider)
41 raise