prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  RuntimeError: Requested component 'jaeger' not found in entry points for 'opentelemetry_exporter'
  From the exporters selection of [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#exporter-selection)
  
  >Known values for OTEL_TRACES_EXPORTER are:
  >
  >- "otlp": OTLP
  >- "jaeger": Jaeger gRPC
  >- "zipkin": Zipkin (Defaults to protobuf format)
  >- "none": No automatically configured exporter for traces.
  
  We have split up the exporters based on protocol + serialisation to avoid taking unnecessary dependency so there is no entry point for `jaeger`. If someone reads the spec and follows that recommendation they will run into this error. We should either add an entry point `jaeger` or an alias that solves this problem.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py`
  Content:
  ```
  1 # Copyright The OpenTelemetry Authors
  2 #
  3 # Licensed under the Apache License, Version 2.0 (the "License");
  4 # you may not use this file except in compliance with the License.
  5 # You may obtain a copy of the License at
  6 #
  7 #     http://www.apache.org/licenses/LICENSE-2.0
  8 #
  9 # Unless required by applicable law or agreed to in writing, software
  10 # distributed under the License is distributed on an "AS IS" BASIS,
  11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12 # See the License for the specific language governing permissions and
  13 # limitations under the License.
  14 #
  15 
  16 """
  17 OpenTelemetry SDK Configurator for Easy Instrumentation with Distros
  18 """
  19 
  20 from os import environ
  21 from typing import Sequence, Tuple
  22 
  23 from pkg_resources import iter_entry_points
  24 
  25 from opentelemetry import trace
  26 from opentelemetry.environment_variables import (
  27     OTEL_PYTHON_ID_GENERATOR,
  28     OTEL_TRACES_EXPORTER,
  29 )
  30 from opentelemetry.instrumentation.configurator import BaseConfigurator
  31 from opentelemetry.sdk.trace import TracerProvider
  32 from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
  33 from opentelemetry.sdk.trace.id_generator import IdGenerator
  34 
  35 _EXPORTER_OTLP = "otlp"
  36 _EXPORTER_OTLP_SPAN = "otlp_proto_grpc_span"
  37 
  38 _RANDOM_ID_GENERATOR = "random"
  39 _DEFAULT_ID_GENERATOR = _RANDOM_ID_GENERATOR
  40 
  41 
  42 def _get_id_generator() -> str:
  43     return environ.get(OTEL_PYTHON_ID_GENERATOR, _DEFAULT_ID_GENERATOR)
  44 
  45 
  46 def _get_exporter_names() -> Sequence[str]:
  47     trace_exporters = environ.get(OTEL_TRACES_EXPORTER)
  48 
  49     exporters = set()
  50 
  51     if trace_exporters and trace_exporters.lower().strip() != "none":
  52         exporters.update(
  53             {
  54                 trace_exporter.strip()
  55                 for trace_exporter in trace_exporters.split(",")
  56             }
  57         )
  58 
  59     if _EXPORTER_OTLP in exporters:
  60         exporters.remove(_EXPORTER_OTLP)
  61         exporters.add(_EXPORTER_OTLP_SPAN)
  62 
  63     return list(exporters)
  64 
  65 
  66 def _init_tracing(
  67     exporters: Sequence[SpanExporter], id_generator: IdGenerator
  68 ):
  69     # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name
  70     # from the env variable else defaults to "unknown_service"
  71     provider = TracerProvider(
  72         id_generator=id_generator(),
  73     )
  74     trace.set_tracer_provider(provider)
  75 
  76     for _, exporter_class in exporters.items():
  77         exporter_args = {}
  78         provider.add_span_processor(
  79             BatchSpanProcessor(exporter_class(**exporter_args))
  80         )
  81 
  82 
  83 def _import_tracer_provider_config_components(
  84     selected_components, entry_point_name
  85 ) -> Sequence[Tuple[str, object]]:
  86     component_entry_points = {
  87         ep.name: ep for ep in iter_entry_points(entry_point_name)
  88     }
  89     component_impls = []
  90     for selected_component in selected_components:
  91         entry_point = component_entry_points.get(selected_component, None)
  92         if not entry_point:
  93             raise RuntimeError(
  94                 f"Requested component '{selected_component}' not found in entry points for '{entry_point_name}'"
  95             )
  96 
  97         component_impl = entry_point.load()
  98         component_impls.append((selected_component, component_impl))
  99 
  100     return component_impls
  101 
  102 
  103 def _import_exporters(
  104     exporter_names: Sequence[str],
  105 ) -> Sequence[SpanExporter]:
  106     trace_exporters = {}
  107 
  108     for (
  109         exporter_name,
  110         exporter_impl,
  111     ) in _import_tracer_provider_config_components(
  112         exporter_names, "opentelemetry_exporter"
  113     ):
  114         if issubclass(exporter_impl, SpanExporter):
  115             trace_exporters[exporter_name] = exporter_impl
  116         else:
  117             raise RuntimeError(f"{exporter_name} is not a trace exporter")
  118     return trace_exporters
  119 
  120 
  121 def _import_id_generator(id_generator_name: str) -> IdGenerator:
  122     # pylint: disable=unbalanced-tuple-unpacking
  123     [
  124         (id_generator_name, id_generator_impl)
  125     ] = _import_tracer_provider_config_components(
  126         [id_generator_name.strip()], "opentelemetry_id_generator"
  127     )
  128 
  129     if issubclass(id_generator_impl, IdGenerator):
  130         return id_generator_impl
  131 
  132     raise RuntimeError(f"{id_generator_name} is not an IdGenerator")
  133 
  134 
  135 def _initialize_components():
  136     exporter_names = _get_exporter_names()
  137     trace_exporters = _import_exporters(exporter_names)
  138     id_generator_name = _get_id_generator()
  139     id_generator = _import_id_generator(id_generator_name)
  140     _init_tracing(trace_exporters, id_generator)
  141 
  142 
  143 class _OTelSDKConfigurator(BaseConfigurator):
  144     """A basic Configurator by OTel Python for initalizing OTel SDK components
  145 
  146     Initializes several crucial OTel SDK components (i.e. TracerProvider,
  147     MeterProvider, Processors...) according to a default implementation. Other
  148     Configurators can subclass and slightly alter this initialization.
  149 
  150     NOTE: This class should not be instantiated nor should it become an entry
  151     point on the `opentelemetry-sdk` package. Instead, distros should subclass
  152     this Configurator and enchance it as needed.
  153     """
  154 
  155     def _configure(self, **kwargs):
  156         _initialize_components()
  157
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
  --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
  +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py
  @@ -109,7 +109,7 @@
           exporter_name,
           exporter_impl,
       ) in _import_tracer_provider_config_components(
  -        exporter_names, "opentelemetry_exporter"
  +        exporter_names, "opentelemetry_traces_exporter"
       ):
           if issubclass(exporter_impl, SpanExporter):
               trace_exporters[exporter_name] = exporter_impl
  
verification_info: {"golden_diff": "diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py\n--- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py\n+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py\n@@ -109,7 +109,7 @@\n         exporter_name,\n         exporter_impl,\n     ) in _import_tracer_provider_config_components(\n-        exporter_names, \"opentelemetry_exporter\"\n+        exporter_names, \"opentelemetry_traces_exporter\"\n     ):\n         if issubclass(exporter_impl, SpanExporter):\n             trace_exporters[exporter_name] = exporter_impl\n", "issue": "RuntimeError: Requested component 'jaeger' not found in entry points for 'opentelemetry_exporter'\nFrom the exporters selection of [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md#exporter-selection)\r\n\r\n>Known values for OTEL_TRACES_EXPORTER are:\r\n>\r\n>- \"otlp\": OTLP\r\n>- \"jaeger\": Jaeger gRPC\r\n>- \"zipkin\": Zipkin (Defaults to protobuf format)\r\n>- \"none\": No automatically configured exporter for traces.\r\n\r\nWe have split up the exporters based on protocol + serialisation to avoid taking unnecessary dependency so there is no entry point for `jaeger`. If someone reads the spec and follows that recommendation they will run into this error. We should either add an entry point `jaeger` or an alias that solves this problem.\n", "before_files": [{"content": "# Copyright The OpenTelemetry Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n\"\"\"\nOpenTelemetry SDK Configurator for Easy Instrumentation with Distros\n\"\"\"\n\nfrom os import environ\nfrom typing import Sequence, Tuple\n\nfrom pkg_resources import iter_entry_points\n\nfrom opentelemetry import trace\nfrom opentelemetry.environment_variables import (\n    OTEL_PYTHON_ID_GENERATOR,\n    OTEL_TRACES_EXPORTER,\n)\nfrom opentelemetry.instrumentation.configurator import BaseConfigurator\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter\nfrom opentelemetry.sdk.trace.id_generator import IdGenerator\n\n_EXPORTER_OTLP = \"otlp\"\n_EXPORTER_OTLP_SPAN = \"otlp_proto_grpc_span\"\n\n_RANDOM_ID_GENERATOR = \"random\"\n_DEFAULT_ID_GENERATOR = _RANDOM_ID_GENERATOR\n\n\ndef _get_id_generator() -> str:\n    return environ.get(OTEL_PYTHON_ID_GENERATOR, _DEFAULT_ID_GENERATOR)\n\n\ndef _get_exporter_names() -> Sequence[str]:\n    trace_exporters = environ.get(OTEL_TRACES_EXPORTER)\n\n    exporters = set()\n\n    if trace_exporters and trace_exporters.lower().strip() != \"none\":\n        exporters.update(\n            {\n                trace_exporter.strip()\n                for trace_exporter in trace_exporters.split(\",\")\n            }\n        )\n\n    if _EXPORTER_OTLP in exporters:\n        exporters.remove(_EXPORTER_OTLP)\n        exporters.add(_EXPORTER_OTLP_SPAN)\n\n    return list(exporters)\n\n\ndef _init_tracing(\n    exporters: Sequence[SpanExporter], id_generator: IdGenerator\n):\n    # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name\n    # from the env variable else defaults to \"unknown_service\"\n    provider = TracerProvider(\n        id_generator=id_generator(),\n    )\n    trace.set_tracer_provider(provider)\n\n    for _, exporter_class in exporters.items():\n        exporter_args = {}\n        provider.add_span_processor(\n            BatchSpanProcessor(exporter_class(**exporter_args))\n        )\n\n\ndef _import_tracer_provider_config_components(\n    selected_components, entry_point_name\n) -> Sequence[Tuple[str, object]]:\n    component_entry_points = {\n        ep.name: ep for ep in iter_entry_points(entry_point_name)\n    }\n    component_impls = []\n    for selected_component in selected_components:\n        entry_point = component_entry_points.get(selected_component, None)\n        if not entry_point:\n            raise RuntimeError(\n                f\"Requested component '{selected_component}' not found in entry points for '{entry_point_name}'\"\n            )\n\n        component_impl = entry_point.load()\n        component_impls.append((selected_component, component_impl))\n\n    return component_impls\n\n\ndef _import_exporters(\n    exporter_names: Sequence[str],\n) -> Sequence[SpanExporter]:\n    trace_exporters = {}\n\n    for (\n        exporter_name,\n        exporter_impl,\n    ) in _import_tracer_provider_config_components(\n        exporter_names, \"opentelemetry_exporter\"\n    ):\n        if issubclass(exporter_impl, SpanExporter):\n            trace_exporters[exporter_name] = exporter_impl\n        else:\n            raise RuntimeError(f\"{exporter_name} is not a trace exporter\")\n    return trace_exporters\n\n\ndef _import_id_generator(id_generator_name: str) -> IdGenerator:\n    # pylint: disable=unbalanced-tuple-unpacking\n    [\n        (id_generator_name, id_generator_impl)\n    ] = _import_tracer_provider_config_components(\n        [id_generator_name.strip()], \"opentelemetry_id_generator\"\n    )\n\n    if issubclass(id_generator_impl, IdGenerator):\n        return id_generator_impl\n\n    raise RuntimeError(f\"{id_generator_name} is not an IdGenerator\")\n\n\ndef _initialize_components():\n    exporter_names = _get_exporter_names()\n    trace_exporters = _import_exporters(exporter_names)\n    id_generator_name = _get_id_generator()\n    id_generator = _import_id_generator(id_generator_name)\n    _init_tracing(trace_exporters, id_generator)\n\n\nclass _OTelSDKConfigurator(BaseConfigurator):\n    \"\"\"A basic Configurator by OTel Python for initalizing OTel SDK components\n\n    Initializes several crucial OTel SDK components (i.e. TracerProvider,\n    MeterProvider, Processors...) according to a default implementation. Other\n    Configurators can subclass and slightly alter this initialization.\n\n    NOTE: This class should not be instantiated nor should it become an entry\n    point on the `opentelemetry-sdk` package. Instead, distros should subclass\n    this Configurator and enchance it as needed.\n    \"\"\"\n\n    def _configure(self, **kwargs):\n        _initialize_components()\n", "path": "opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py"}], "after_files": [{"content": "# Copyright The OpenTelemetry Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n\"\"\"\nOpenTelemetry SDK Configurator for Easy Instrumentation with Distros\n\"\"\"\n\nfrom os import environ\nfrom typing import Sequence, Tuple\n\nfrom pkg_resources import iter_entry_points\n\nfrom opentelemetry import trace\nfrom opentelemetry.environment_variables import (\n    OTEL_PYTHON_ID_GENERATOR,\n    OTEL_TRACES_EXPORTER,\n)\nfrom opentelemetry.instrumentation.configurator import BaseConfigurator\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter\nfrom opentelemetry.sdk.trace.id_generator import IdGenerator\n\n_EXPORTER_OTLP = \"otlp\"\n_EXPORTER_OTLP_SPAN = \"otlp_proto_grpc_span\"\n\n_RANDOM_ID_GENERATOR = \"random\"\n_DEFAULT_ID_GENERATOR = _RANDOM_ID_GENERATOR\n\n\ndef _get_id_generator() -> str:\n    return environ.get(OTEL_PYTHON_ID_GENERATOR, _DEFAULT_ID_GENERATOR)\n\n\ndef _get_exporter_names() -> Sequence[str]:\n    trace_exporters = environ.get(OTEL_TRACES_EXPORTER)\n\n    exporters = set()\n\n    if trace_exporters and trace_exporters.lower().strip() != \"none\":\n        exporters.update(\n            {\n                trace_exporter.strip()\n                for trace_exporter in trace_exporters.split(\",\")\n            }\n        )\n\n    if _EXPORTER_OTLP in exporters:\n        exporters.remove(_EXPORTER_OTLP)\n        exporters.add(_EXPORTER_OTLP_SPAN)\n\n    return list(exporters)\n\n\ndef _init_tracing(\n    exporters: Sequence[SpanExporter], id_generator: IdGenerator\n):\n    # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name\n    # from the env variable else defaults to \"unknown_service\"\n    provider = TracerProvider(\n        id_generator=id_generator(),\n    )\n    trace.set_tracer_provider(provider)\n\n    for _, exporter_class in exporters.items():\n        exporter_args = {}\n        provider.add_span_processor(\n            BatchSpanProcessor(exporter_class(**exporter_args))\n        )\n\n\ndef _import_tracer_provider_config_components(\n    selected_components, entry_point_name\n) -> Sequence[Tuple[str, object]]:\n    component_entry_points = {\n        ep.name: ep for ep in iter_entry_points(entry_point_name)\n    }\n    component_impls = []\n    for selected_component in selected_components:\n        entry_point = component_entry_points.get(selected_component, None)\n        if not entry_point:\n            raise RuntimeError(\n                f\"Requested component '{selected_component}' not found in entry points for '{entry_point_name}'\"\n            )\n\n        component_impl = entry_point.load()\n        component_impls.append((selected_component, component_impl))\n\n    return component_impls\n\n\ndef _import_exporters(\n    exporter_names: Sequence[str],\n) -> Sequence[SpanExporter]:\n    trace_exporters = {}\n\n    for (\n        exporter_name,\n        exporter_impl,\n    ) in _import_tracer_provider_config_components(\n        exporter_names, \"opentelemetry_traces_exporter\"\n    ):\n        if issubclass(exporter_impl, SpanExporter):\n            trace_exporters[exporter_name] = exporter_impl\n        else:\n            raise RuntimeError(f\"{exporter_name} is not a trace exporter\")\n    return trace_exporters\n\n\ndef _import_id_generator(id_generator_name: str) -> IdGenerator:\n    # pylint: disable=unbalanced-tuple-unpacking\n    [\n        (id_generator_name, id_generator_impl)\n    ] = _import_tracer_provider_config_components(\n        [id_generator_name.strip()], \"opentelemetry_id_generator\"\n    )\n\n    if issubclass(id_generator_impl, IdGenerator):\n        return id_generator_impl\n\n    raise RuntimeError(f\"{id_generator_name} is not an IdGenerator\")\n\n\ndef _initialize_components():\n    exporter_names = _get_exporter_names()\n    trace_exporters = _import_exporters(exporter_names)\n    id_generator_name = _get_id_generator()\n    id_generator = _import_id_generator(id_generator_name)\n    _init_tracing(trace_exporters, id_generator)\n\n\nclass _OTelSDKConfigurator(BaseConfigurator):\n    \"\"\"A basic Configurator by OTel Python for initalizing OTel SDK components\n\n    Initializes several crucial OTel SDK components (i.e. TracerProvider,\n    MeterProvider, Processors...) according to a default implementation. Other\n    Configurators can subclass and slightly alter this initialization.\n\n    NOTE: This class should not be instantiated nor should it become an entry\n    point on the `opentelemetry-sdk` package. Instead, distros should subclass\n    this Configurator and enchance it as needed.\n    \"\"\"\n\n    def _configure(self, **kwargs):\n        _initialize_components()\n", "path": "opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py"}]}