Skip to content

Commit 4a4e720

Browse files
committed
feat(AGE-298) : enable auto instrumentation without middleware-run
1 parent 586eac7 commit 4a4e720

File tree

4 files changed

+230
-124
lines changed

4 files changed

+230
-124
lines changed

dev-requirements.txt

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ importlib-metadata==8.4.0
2828
# via
2929
# opentelemetry-api
3030
# opentelemetry-instrumentation-flask
31-
opentelemetry-api==1.27.0
31+
opentelemetry-api==1.36.0
3232
# via
3333
# middleware-io (pyproject.toml)
3434
# opentelemetry-exporter-otlp-proto-grpc
@@ -88,11 +88,11 @@ opentelemetry-api==1.27.0
8888
# opentelemetry-resourcedetector-gcp
8989
# opentelemetry-sdk
9090
# opentelemetry-semantic-conventions
91-
opentelemetry-exporter-otlp-proto-common==1.27.0
91+
opentelemetry-exporter-otlp-proto-common==1.36.0
9292
# via opentelemetry-exporter-otlp-proto-grpc
93-
opentelemetry-exporter-otlp-proto-grpc==1.27.0
93+
opentelemetry-exporter-otlp-proto-grpc==1.36.0
9494
# via middleware-io (pyproject.toml)
95-
opentelemetry-instrumentation==0.48b0
95+
opentelemetry-instrumentation==0.57b0
9696
# via
9797
# middleware-io (pyproject.toml)
9898
# opentelemetry-instrumentation-aio-pika
@@ -141,36 +141,36 @@ opentelemetry-instrumentation==0.48b0
141141
# opentelemetry-instrumentation-urllib
142142
# opentelemetry-instrumentation-urllib3
143143
# opentelemetry-instrumentation-wsgi
144-
opentelemetry-instrumentation-aio-pika==0.48b0
144+
opentelemetry-instrumentation-aio-pika==0.57b0
145145
# via middleware-io (pyproject.toml)
146-
opentelemetry-instrumentation-aiohttp-client==0.48b0
146+
opentelemetry-instrumentation-aiohttp-client==0.57b0
147147
# via middleware-io (pyproject.toml)
148-
opentelemetry-instrumentation-aiohttp-server==0.48b0
148+
opentelemetry-instrumentation-aiohttp-server==0.57b0
149149
# via middleware-io (pyproject.toml)
150-
opentelemetry-instrumentation-aiopg==0.48b0
150+
opentelemetry-instrumentation-aiopg==0.57b0
151151
# via middleware-io (pyproject.toml)
152-
opentelemetry-instrumentation-asgi==0.48b0
152+
opentelemetry-instrumentation-asgi==0.57b0
153153
# via
154154
# middleware-io (pyproject.toml)
155155
# opentelemetry-instrumentation-fastapi
156156
# opentelemetry-instrumentation-starlette
157-
opentelemetry-instrumentation-asyncio==0.48b0
157+
opentelemetry-instrumentation-asyncio==0.57b0
158158
# via middleware-io (pyproject.toml)
159-
opentelemetry-instrumentation-asyncpg==0.48b0
159+
opentelemetry-instrumentation-asyncpg==0.57b0
160160
# via middleware-io (pyproject.toml)
161-
opentelemetry-instrumentation-boto==0.48b0
161+
opentelemetry-instrumentation-boto==0.57b0
162162
# via middleware-io (pyproject.toml)
163-
opentelemetry-instrumentation-boto3sqs==0.48b0
163+
opentelemetry-instrumentation-boto3sqs==0.57b0
164164
# via middleware-io (pyproject.toml)
165-
opentelemetry-instrumentation-botocore==0.48b0
165+
opentelemetry-instrumentation-botocore==0.57b0
166166
# via middleware-io (pyproject.toml)
167-
opentelemetry-instrumentation-cassandra==0.48b0
167+
opentelemetry-instrumentation-cassandra==0.57b0
168168
# via middleware-io (pyproject.toml)
169-
opentelemetry-instrumentation-celery==0.48b0
169+
opentelemetry-instrumentation-celery==0.57b0
170170
# via middleware-io (pyproject.toml)
171-
opentelemetry-instrumentation-confluent-kafka==0.48b0
171+
opentelemetry-instrumentation-confluent-kafka==0.57b0
172172
# via middleware-io (pyproject.toml)
173-
opentelemetry-instrumentation-dbapi==0.48b0
173+
opentelemetry-instrumentation-dbapi==0.57b0
174174
# via
175175
# middleware-io (pyproject.toml)
176176
# opentelemetry-instrumentation-aiopg
@@ -180,90 +180,90 @@ opentelemetry-instrumentation-dbapi==0.48b0
180180
# opentelemetry-instrumentation-psycopg2
181181
# opentelemetry-instrumentation-pymysql
182182
# opentelemetry-instrumentation-sqlite3
183-
opentelemetry-instrumentation-django==0.48b0
183+
opentelemetry-instrumentation-django==0.57b0
184184
# via middleware-io (pyproject.toml)
185-
opentelemetry-instrumentation-elasticsearch==0.48b0
185+
opentelemetry-instrumentation-elasticsearch==0.57b0
186186
# via middleware-io (pyproject.toml)
187-
opentelemetry-instrumentation-falcon==0.48b0
187+
opentelemetry-instrumentation-falcon==0.57b0
188188
# via middleware-io (pyproject.toml)
189-
opentelemetry-instrumentation-fastapi==0.48b0
189+
opentelemetry-instrumentation-fastapi==0.57b0
190190
# via middleware-io (pyproject.toml)
191-
opentelemetry-instrumentation-flask==0.48b0
191+
opentelemetry-instrumentation-flask==0.57b0
192192
# via middleware-io (pyproject.toml)
193-
opentelemetry-instrumentation-grpc==0.48b0
193+
opentelemetry-instrumentation-grpc==0.57b0
194194
# via middleware-io (pyproject.toml)
195-
opentelemetry-instrumentation-httpx==0.48b0
195+
opentelemetry-instrumentation-httpx==0.57b0
196196
# via middleware-io (pyproject.toml)
197-
opentelemetry-instrumentation-jinja2==0.48b0
197+
opentelemetry-instrumentation-jinja2==0.57b0
198198
# via middleware-io (pyproject.toml)
199-
opentelemetry-instrumentation-kafka-python==0.48b0
199+
opentelemetry-instrumentation-kafka-python==0.57b0
200200
# via middleware-io (pyproject.toml)
201-
opentelemetry-instrumentation-logging==0.48b0
201+
opentelemetry-instrumentation-logging==0.57b0
202202
# via middleware-io (pyproject.toml)
203-
opentelemetry-instrumentation-mysql==0.48b0
203+
opentelemetry-instrumentation-mysql==0.57b0
204204
# via middleware-io (pyproject.toml)
205-
opentelemetry-instrumentation-mysqlclient==0.48b0
205+
opentelemetry-instrumentation-mysqlclient==0.57b0
206206
# via middleware-io (pyproject.toml)
207-
opentelemetry-instrumentation-pika==0.48b0
207+
opentelemetry-instrumentation-pika==0.57b0
208208
# via middleware-io (pyproject.toml)
209-
opentelemetry-instrumentation-psycopg==0.48b0
209+
opentelemetry-instrumentation-psycopg==0.57b0
210210
# via middleware-io (pyproject.toml)
211-
opentelemetry-instrumentation-psycopg2==0.48b0
211+
opentelemetry-instrumentation-psycopg2==0.57b0
212212
# via middleware-io (pyproject.toml)
213-
opentelemetry-instrumentation-pymemcache==0.48b0
213+
opentelemetry-instrumentation-pymemcache==0.57b0
214214
# via middleware-io (pyproject.toml)
215-
opentelemetry-instrumentation-pymongo==0.48b0
215+
opentelemetry-instrumentation-pymongo==0.57b0
216216
# via middleware-io (pyproject.toml)
217-
opentelemetry-instrumentation-pymysql==0.48b0
217+
opentelemetry-instrumentation-pymysql==0.57b0
218218
# via middleware-io (pyproject.toml)
219-
opentelemetry-instrumentation-pyramid==0.48b0
219+
opentelemetry-instrumentation-pyramid==0.57b0
220220
# via middleware-io (pyproject.toml)
221-
opentelemetry-instrumentation-redis==0.48b0
221+
opentelemetry-instrumentation-redis==0.57b0
222222
# via middleware-io (pyproject.toml)
223-
opentelemetry-instrumentation-remoulade==0.48b0
223+
opentelemetry-instrumentation-remoulade==0.57b0
224224
# via middleware-io (pyproject.toml)
225-
opentelemetry-instrumentation-requests==0.48b0
225+
opentelemetry-instrumentation-requests==0.57b0
226226
# via middleware-io (pyproject.toml)
227-
opentelemetry-instrumentation-sqlalchemy==0.48b0
227+
opentelemetry-instrumentation-sqlalchemy==0.57b0
228228
# via middleware-io (pyproject.toml)
229-
opentelemetry-instrumentation-sqlite3==0.48b0
229+
opentelemetry-instrumentation-sqlite3==0.57b0
230230
# via middleware-io (pyproject.toml)
231-
opentelemetry-instrumentation-starlette==0.48b0
231+
opentelemetry-instrumentation-starlette==0.57b0
232232
# via middleware-io (pyproject.toml)
233-
opentelemetry-instrumentation-system-metrics==0.48b0
233+
opentelemetry-instrumentation-system-metrics==0.57b0
234234
# via middleware-io (pyproject.toml)
235-
opentelemetry-instrumentation-threading==0.48b0
235+
opentelemetry-instrumentation-threading==0.57b0
236236
# via middleware-io (pyproject.toml)
237-
opentelemetry-instrumentation-tornado==0.48b0
237+
opentelemetry-instrumentation-tornado==0.57b0
238238
# via middleware-io (pyproject.toml)
239-
opentelemetry-instrumentation-tortoiseorm==0.48b0
239+
opentelemetry-instrumentation-tortoiseorm==0.57b0
240240
# via middleware-io (pyproject.toml)
241-
opentelemetry-instrumentation-urllib==0.48b0
241+
opentelemetry-instrumentation-urllib==0.57b0
242242
# via middleware-io (pyproject.toml)
243-
opentelemetry-instrumentation-urllib3==0.48b0
243+
opentelemetry-instrumentation-urllib3==0.57b0
244244
# via middleware-io (pyproject.toml)
245-
opentelemetry-instrumentation-wsgi==0.48b0
245+
opentelemetry-instrumentation-wsgi==0.57b0
246246
# via
247247
# middleware-io (pyproject.toml)
248248
# opentelemetry-instrumentation-django
249249
# opentelemetry-instrumentation-falcon
250250
# opentelemetry-instrumentation-flask
251251
# opentelemetry-instrumentation-pyramid
252-
opentelemetry-processor-baggage==0.48b0
252+
opentelemetry-processor-baggage==0.57b0
253253
# via middleware-io (pyproject.toml)
254254
opentelemetry-propagator-aws-xray==1.0.2
255255
# via
256256
# middleware-io (pyproject.toml)
257257
# opentelemetry-instrumentation-botocore
258-
opentelemetry-propagator-b3==1.27.0
258+
opentelemetry-propagator-b3==1.36.0
259259
# via middleware-io (pyproject.toml)
260-
opentelemetry-propagator-gcp==1.7.0
260+
opentelemetry-propagator-gcp==1.9.0
261261
# via middleware-io (pyproject.toml)
262-
opentelemetry-propagator-jaeger==1.27.0
262+
opentelemetry-propagator-jaeger==1.36.0
263263
# via middleware-io (pyproject.toml)
264-
opentelemetry-propagator-ot-trace==0.48b0
264+
opentelemetry-propagator-ot-trace==0.57b0
265265
# via middleware-io (pyproject.toml)
266-
opentelemetry-proto==1.27.0
266+
opentelemetry-proto==1.36.0
267267
# via
268268
# middleware-io (pyproject.toml)
269269
# opentelemetry-exporter-otlp-proto-common
@@ -272,9 +272,9 @@ opentelemetry-resource-detector-azure==0.1.5
272272
# via middleware-io (pyproject.toml)
273273
opentelemetry-resourcedetector-docker==0.4.0
274274
# via middleware-io (pyproject.toml)
275-
opentelemetry-resourcedetector-gcp==1.7.0a0
275+
opentelemetry-resourcedetector-gcp==1.9.0a0
276276
# via middleware-io (pyproject.toml)
277-
opentelemetry-sdk==1.27.0
277+
opentelemetry-sdk==1.36.0
278278
# via
279279
# middleware-io (pyproject.toml)
280280
# opentelemetry-exporter-otlp-proto-grpc
@@ -286,7 +286,7 @@ opentelemetry-sdk==1.27.0
286286
# opentelemetry-sdk-extension-aws
287287
opentelemetry-sdk-extension-aws==2.0.2
288288
# via middleware-io (pyproject.toml)
289-
opentelemetry-semantic-conventions==0.48b0
289+
opentelemetry-semantic-conventions==0.57b0
290290
# via
291291
# middleware-io (pyproject.toml)
292292
# opentelemetry-instrumentation-aiohttp-client
@@ -323,7 +323,7 @@ opentelemetry-semantic-conventions==0.48b0
323323
# opentelemetry-instrumentation-wsgi
324324
# opentelemetry-resourcedetector-docker
325325
# opentelemetry-sdk
326-
opentelemetry-util-http==0.48b0
326+
opentelemetry-util-http==0.57b0
327327
# via
328328
# middleware-io (pyproject.toml)
329329
# opentelemetry-instrumentation-aiohttp-client

middleware/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from middleware.distro import mw_tracker, custom_record_exception_wrapper, record_exception
1+
from middleware.distro import mw_tracker, mw_tracker_internal, custom_record_exception_wrapper, record_exception
22
from opentelemetry.sdk.trace import Span
33
from middleware.options import (
44
MWOptions,
@@ -15,8 +15,9 @@
1515
)
1616

1717
__all__ = [
18-
"mw_tracker",
18+
"mw_tracker_internal",
1919
"record_exception",
20+
"mw_tracker",
2021
"MWOptions",
2122
"DETECT_AWS_BEANSTALK",
2223
"DETECT_AWS_EC2",

middleware/distro.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import sys
66
from logging import getLogger
77
from typing import Optional
8+
9+
import pkg_resources
810
from opentelemetry.instrumentation.distro import BaseDistro
911
from middleware.metrics import create_meter_provider
1012
from middleware.options import MWOptions, parse_bool
@@ -29,7 +31,7 @@
2931
)
3032

3133

32-
def mw_tracker(
34+
def mw_tracker_internal(
3335
options: Optional[MWOptions] = None,
3436
):
3537
"""
@@ -246,7 +248,51 @@ def custom_record_exception(span: Span, exc: Exception):
246248
)
247249

248250

251+
def mw_tracker(options: Optional[MWOptions] = None):
252+
"""
253+
Configures the OpenTelemetry SDK to send telemetry to middleware.
249254
255+
Args:
256+
options (MWOptions, optional): the MWOptions used to
257+
configure the the SDK. These options can be set either as parameters
258+
to this function or through environment variables
259+
260+
Example
261+
--------
262+
>>> from middleware import mw_tracker, MWOptions, record_exception, DETECT_AWS_EC2
263+
>>> mw_tracker(
264+
>>> MWOptions(
265+
>>> access_token="whkvkobudfitutobptgonaezuxpjjypnejbb",
266+
>>> target="https://myapp.middleware.io:443",
267+
>>> console_exporter=True,
268+
>>> debug_log_file=True,
269+
>>> service_name="MyPythonServer",
270+
>>> otel_propagators = "b3,tracecontext",
271+
>>> custom_resource_attributes="call_id=12345678, request_id=987654321",
272+
>>> detectors=[DETECT_AWS_EC2]
273+
>>> )
274+
>>> )
275+
276+
"""
277+
278+
# 1. Load the distro
279+
for entry_point in pkg_resources.iter_entry_points("opentelemetry_distro"):
280+
print(f"Entrypoint distro :", entry_point)
281+
distro_class = entry_point.load()
282+
if issubclass(distro_class, BaseDistro):
283+
distro = distro_class()
284+
distro._configure(options=options)
285+
break
286+
287+
# 2. Auto-instrument all registered instrumentors
288+
for entry_point in pkg_resources.iter_entry_points("opentelemetry_instrumentor"):
289+
print(f"Entrypoint instrumentor :", entry_point)
290+
try:
291+
instrumentor_class = entry_point.load()
292+
instrumentor = instrumentor_class()
293+
instrumentor.instrument()
294+
except Exception as e:
295+
print(f"Failed to instrument {instrumentor_class}: {e}")
250296

251297
# pylint: disable=too-few-public-methods
252298
class MiddlewareDistro(BaseDistro):
@@ -264,8 +310,13 @@ class MiddlewareDistro(BaseDistro):
264310
distro = "middleware.opentelemetry.distro:MiddlewareDistro"
265311
"""
266312

267-
def _configure(self, **kwargs):
313+
def _configure(self, options: Optional[MWOptions] = None, **kwargs):
268314
global isTracker, distro_called
269315
distro_called = True
270316
if not isTracker:
271-
mw_tracker()
317+
mw_tracker_internal()
318+
elif isTracker and options is not None:
319+
mw_tracker_internal(options=options)
320+
321+
def instrument(self, **kwargs):
322+
print("MiddlewareDistro instrument called")

0 commit comments

Comments
 (0)