Skip to content

Commit 75ff8a6

Browse files
committed
Add IDs Generator to auto instrumentation config
1 parent 20e9f18 commit 75ff8a6

File tree

7 files changed

+90
-25
lines changed

7 files changed

+90
-25
lines changed

Diff for: opentelemetry-api/setup.cfg

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ opentelemetry_tracer_provider =
5757
opentelemetry_propagator =
5858
tracecontext = opentelemetry.trace.propagation.tracecontext:TraceContextTextMapPropagator
5959
baggage = opentelemetry.baggage.propagation:BaggagePropagator
60+
opentelemetry_ids_generator =
61+
random = opentelemetry.trace.ids_generator:RandomIdsGenerator
6062

6163
[options.extras_require]
6264
test =

Diff for: opentelemetry-instrumentation/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Add IDs Generator as Configurable Property of Auto Instrumentation
6+
([#1404](https://github.com/open-telemetry/opentelemetry-python/pull/1404))
57
- Added support for `OTEL_EXPORTER` to the `opentelemetry-instrument` command ([#1036](https://github.com/open-telemetry/opentelemetry-python/pull/1036))
68

79
## Version 0.14b0

Diff for: opentelemetry-instrumentation/README.rst

+12-16
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,10 @@ The command supports the following configuration options as CLI arguments and en
5151
* ``--exporter`` or ``OTEL_EXPORTER``
5252

5353
Used to specify which trace exporter to use. Can be set to one or more
54-
<<<<<<< HEAD
5554
of the well-known exporter names (see below).
5655

5756
- Defaults to `otlp`.
5857
- Can be set to `none` to disable automatic tracer initialization.
59-
=======
60-
of the well-known exporter names (see below) or a fully
61-
qualified Python import path to a span exporter implementation.
62-
63-
- Defaults to `otlp`.
64-
- Can be set to `none` to disbale automatic tracer initialization.
65-
>>>>>>> Add true auto-instrumentation support to opentelemetry-instrument
6658

6759
You can pass multiple values to configure multiple exporters e.g, ``zipkin,prometheus``
6860

@@ -81,25 +73,22 @@ Well known trace exporter names:
8173

8274
When present the value is passed on to the relevant exporter initializer as ``service_name`` argument.
8375

76+
* ``--ids-generator`` or ``OTEL_IDS_GENERATOR``
77+
78+
Used to specify which IDs Generator to use for the global Tracer Provider. By default, it
79+
will use the random IDs generator.
80+
8481
The code in ``program.py`` needs to use one of the packages for which there is
8582
an OpenTelemetry integration. For a list of the available integrations please
8683
check `here <https://opentelemetry-python.readthedocs.io/en/stable/index.html#integrations>`_
8784

8885
Examples
8986
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
90-
<<<<<<< HEAD
9187

9288
::
9389

9490
opentelemetry-instrument -e otlp flask run --port=3000
9591

96-
=======
97-
98-
::
99-
100-
opentelemetry-instrument -e otlp flask run --port=3000
101-
102-
>>>>>>> Add true auto-instrumentation support to opentelemetry-instrument
10392
The above command will pass ``-e otlp`` to the instrument command and ``--port=3000`` to ``flask run``.
10493

10594
::
@@ -109,6 +98,13 @@ The above command will pass ``-e otlp`` to the instrument command and ``--port=3
10998
The above command will configure global trace provider, attach zipkin and otlp exporters to it and then
11099
start celery with the rest of the arguments.
111100

101+
::
102+
103+
opentelemetry-instrument -g random flask run --port=3000
104+
105+
The above command will configure the global trace provider to use the Random IDs Generator, and then
106+
pass ``--port=3000`` to ``flask run``.
107+
112108
References
113109
----------
114110

Diff for: opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/__init__.py

+15
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,19 @@ def parse_args():
4747
""",
4848
)
4949

50+
parser.add_argument(
51+
"-g",
52+
"--ids-generator",
53+
required=False,
54+
help="""
55+
The IDs Generator to be used with the Tracer Provider.
56+
57+
Examples:
58+
59+
-g=random
60+
""",
61+
)
62+
5063
parser.add_argument(
5164
"-s",
5265
"--service-name",
@@ -70,6 +83,8 @@ def load_config_from_cli_args(args):
7083
environ["OTEL_EXPORTER"] = args.exporter
7184
if args.service_name:
7285
environ["OTEL_SERVICE_NAME"] = args.service_name
86+
if args.ids_generator:
87+
environ["OTEL_IDS_GENERATOR"] = args.ids_generator
7388

7489

7590
def run() -> None:

Diff for: opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/components.py

+32-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
EXPORTER_OTLP_METRIC = "otlp_metric"
3535
_DEFAULT_EXPORTER = EXPORTER_OTLP
3636

37+
RANDOM_IDS_GENERATOR = "random"
38+
_DEFAULT_IDS_GENERATOR = RANDOM_IDS_GENERATOR
39+
40+
41+
def get_ids_generator() -> str:
42+
return Configuration().IDS_GENERATOR or _DEFAULT_IDS_GENERATOR
43+
3744

3845
def get_service_name() -> str:
3946
return Configuration().SERVICE_NAME or ""
@@ -55,10 +62,13 @@ def get_exporter_names() -> Sequence[str]:
5562
return names
5663

5764

58-
def init_tracing(exporters: Sequence[SpanExporter]):
65+
def init_tracing(
66+
exporters: Sequence[SpanExporter], ids_generator: trace.IdsGenerator
67+
):
5968
service_name = get_service_name()
6069
provider = TracerProvider(
6170
resource=Resource.create({"service.name": service_name}),
71+
ids_generator=ids_generator(),
6272
)
6373
trace.set_tracer_provider(provider)
6474

@@ -110,10 +120,30 @@ def import_exporters(
110120
return trace_exporters, metric_exporters
111121

112122

123+
def import_ids_generator(ids_generator_name: str) -> trace.IdsGenerator:
124+
ids_generator_impl = None
125+
126+
for id_generator in iter_entry_points("opentelemetry_ids_generator"):
127+
if id_generator.name == ids_generator_name.strip():
128+
ids_generator_impl = id_generator.load()
129+
break
130+
else:
131+
raise RuntimeError(
132+
"Requested IDs Generator not found: {0}".format(ids_generator_name)
133+
)
134+
135+
if issubclass(ids_generator_impl, trace.IdsGenerator):
136+
return ids_generator_impl
137+
138+
raise RuntimeError("{0} is not an IdsGenerator".format(ids_generator_name))
139+
140+
113141
def initialize_components():
114142
exporter_names = get_exporter_names()
115143
trace_exporters, metric_exporters = import_exporters(exporter_names)
116-
init_tracing(trace_exporters)
144+
ids_generator_name = get_ids_generator()
145+
ids_generator = import_ids_generator(ids_generator_name)
146+
init_tracing(trace_exporters, ids_generator)
117147

118148
# We don't support automatic initialization for metric yet but have added
119149
# some boilerplate in order to make sure current implementation does not

Diff for: opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py

-4
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,7 @@ def initialize():
4646
if (
4747
hasattr(sys, "argv")
4848
and sys.argv[0].split(os.path.sep)[-1] == "celery"
49-
<<<<<<< HEAD
5049
and "worker" in sys.argv[1:]
51-
=======
52-
and "worker" in sys.argv
53-
>>>>>>> Add true auto-instrumentation support to opentelemetry-instrument
5450
):
5551
from celery.signals import worker_process_init # pylint:disable=E0401
5652

Diff for: opentelemetry-instrumentation/tests/test_auto_tracing.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
from opentelemetry.configuration import Configuration
2121
from opentelemetry.instrumentation.auto_instrumentation import components
2222
from opentelemetry.sdk.resources import Resource
23+
from opentelemetry.trace.ids_generator import RandomIdsGenerator
2324

2425

2526
class Provider:
26-
def __init__(self, resource=None):
27+
def __init__(self, resource=None, ids_generator=None):
28+
self.ids_generator = ids_generator
2729
self.processor = None
2830
self.resource = resource
2931

@@ -77,11 +79,12 @@ def tearDown(self):
7779
def test_trace_init_default(self):
7880
environ["OTEL_SERVICE_NAME"] = "my-test-service"
7981
Configuration._reset()
80-
components.init_tracing({"zipkin": Exporter})
82+
components.init_tracing({"zipkin": Exporter}, RandomIdsGenerator)
8183

8284
self.assertEqual(self.set_provider_mock.call_count, 1)
8385
provider = self.set_provider_mock.call_args[0][0]
8486
self.assertIsInstance(provider, Provider)
87+
self.assertIsInstance(provider.ids_generator, RandomIdsGenerator)
8588
self.assertIsInstance(provider.processor, Processor)
8689
self.assertIsInstance(provider.processor.exporter, Exporter)
8790
self.assertEqual(
@@ -91,11 +94,12 @@ def test_trace_init_default(self):
9194
def test_trace_init_otlp(self):
9295
environ["OTEL_SERVICE_NAME"] = "my-otlp-test-service"
9396
Configuration._reset()
94-
components.init_tracing({"otlp": OTLPExporter})
97+
components.init_tracing({"otlp": OTLPExporter}, RandomIdsGenerator)
9598

9699
self.assertEqual(self.set_provider_mock.call_count, 1)
97100
provider = self.set_provider_mock.call_args[0][0]
98101
self.assertIsInstance(provider, Provider)
102+
self.assertIsInstance(provider.ids_generator, RandomIdsGenerator)
99103
self.assertIsInstance(provider.processor, Processor)
100104
self.assertIsInstance(provider.processor.exporter, OTLPExporter)
101105
self.assertIsInstance(provider.resource, Resource)
@@ -104,3 +108,23 @@ def test_trace_init_otlp(self):
104108
"my-otlp-test-service",
105109
)
106110
del environ["OTEL_SERVICE_NAME"]
111+
112+
def test_trace_init_default_random_ids_generator(self):
113+
environ["OTEL_SERVICE_NAME"] = "my-random-ids-generator-test-service"
114+
Configuration._reset()
115+
ids_generator_name = components.get_ids_generator()
116+
ids_generator = components.import_ids_generator(ids_generator_name)
117+
components.init_tracing({"otlp": OTLPExporter}, ids_generator)
118+
119+
self.assertEqual(self.set_provider_mock.call_count, 1)
120+
provider = self.set_provider_mock.call_args[0][0]
121+
self.assertIsInstance(provider, Provider)
122+
self.assertIsInstance(provider.ids_generator, RandomIdsGenerator)
123+
self.assertIsInstance(provider.processor, Processor)
124+
self.assertIsInstance(provider.processor.exporter, OTLPExporter)
125+
self.assertIsInstance(provider.resource, Resource)
126+
self.assertEqual(
127+
provider.resource.attributes.get("service.name"),
128+
"my-random-ids-generator-test-service",
129+
)
130+
del environ["OTEL_SERVICE_NAME"]

0 commit comments

Comments
 (0)