Skip to content

Commit 83fc65c

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

File tree

4 files changed

+246
-125
lines changed

4 files changed

+246
-125
lines changed

dev-requirements.txt

Lines changed: 71 additions & 61 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,44 @@ 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-aiokafka==0.57b0
151151
# via middleware-io (pyproject.toml)
152-
opentelemetry-instrumentation-asgi==0.48b0
152+
opentelemetry-instrumentation-aiopg==0.57b0
153+
# via middleware-io (pyproject.toml)
154+
opentelemetry-instrumentation-asgi==0.57b0
153155
# via
154156
# middleware-io (pyproject.toml)
155157
# opentelemetry-instrumentation-fastapi
156158
# opentelemetry-instrumentation-starlette
157-
opentelemetry-instrumentation-asyncio==0.48b0
159+
opentelemetry-instrumentation-asyncclick==0.57b0
160+
# via middleware-io (pyproject.toml)
161+
opentelemetry-instrumentation-asyncio==0.57b0
162+
# via middleware-io (pyproject.toml)
163+
opentelemetry-instrumentation-asyncpg==0.57b0
158164
# via middleware-io (pyproject.toml)
159-
opentelemetry-instrumentation-asyncpg==0.48b0
165+
opentelemetry-instrumentation-aws-lambda==0.57b0
160166
# via middleware-io (pyproject.toml)
161-
opentelemetry-instrumentation-boto==0.48b0
167+
opentelemetry-instrumentation-boto==0.57b0
162168
# via middleware-io (pyproject.toml)
163-
opentelemetry-instrumentation-boto3sqs==0.48b0
169+
opentelemetry-instrumentation-boto3sqs==0.57b0
164170
# via middleware-io (pyproject.toml)
165-
opentelemetry-instrumentation-botocore==0.48b0
171+
opentelemetry-instrumentation-botocore==0.57b0
166172
# via middleware-io (pyproject.toml)
167-
opentelemetry-instrumentation-cassandra==0.48b0
173+
opentelemetry-instrumentation-cassandra==0.57b0
168174
# via middleware-io (pyproject.toml)
169-
opentelemetry-instrumentation-celery==0.48b0
175+
opentelemetry-instrumentation-celery==0.57b0
170176
# via middleware-io (pyproject.toml)
171-
opentelemetry-instrumentation-confluent-kafka==0.48b0
177+
opentelemetry-instrumentation-click==0.57b0
172178
# via middleware-io (pyproject.toml)
173-
opentelemetry-instrumentation-dbapi==0.48b0
179+
opentelemetry-instrumentation-confluent-kafka==0.57b0
180+
# via middleware-io (pyproject.toml)
181+
opentelemetry-instrumentation-dbapi==0.57b0
174182
# via
175183
# middleware-io (pyproject.toml)
176184
# opentelemetry-instrumentation-aiopg
@@ -180,90 +188,92 @@ opentelemetry-instrumentation-dbapi==0.48b0
180188
# opentelemetry-instrumentation-psycopg2
181189
# opentelemetry-instrumentation-pymysql
182190
# opentelemetry-instrumentation-sqlite3
183-
opentelemetry-instrumentation-django==0.48b0
191+
opentelemetry-instrumentation-django==0.57b0
192+
# via middleware-io (pyproject.toml)
193+
opentelemetry-instrumentation-elasticsearch==0.57b0
184194
# via middleware-io (pyproject.toml)
185-
opentelemetry-instrumentation-elasticsearch==0.48b0
195+
opentelemetry-instrumentation-falcon==0.57b0
186196
# via middleware-io (pyproject.toml)
187-
opentelemetry-instrumentation-falcon==0.48b0
197+
opentelemetry-instrumentation-fastapi==0.57b0
188198
# via middleware-io (pyproject.toml)
189-
opentelemetry-instrumentation-fastapi==0.48b0
199+
opentelemetry-instrumentation-flask==0.57b0
190200
# via middleware-io (pyproject.toml)
191-
opentelemetry-instrumentation-flask==0.48b0
201+
opentelemetry-instrumentation-grpc==0.57b0
192202
# via middleware-io (pyproject.toml)
193-
opentelemetry-instrumentation-grpc==0.48b0
203+
opentelemetry-instrumentation-httpx==0.57b0
194204
# via middleware-io (pyproject.toml)
195-
opentelemetry-instrumentation-httpx==0.48b0
205+
opentelemetry-instrumentation-jinja2==0.57b0
196206
# via middleware-io (pyproject.toml)
197-
opentelemetry-instrumentation-jinja2==0.48b0
207+
opentelemetry-instrumentation-kafka-python==0.57b0
198208
# via middleware-io (pyproject.toml)
199-
opentelemetry-instrumentation-kafka-python==0.48b0
209+
opentelemetry-instrumentation-logging==0.57b0
200210
# via middleware-io (pyproject.toml)
201-
opentelemetry-instrumentation-logging==0.48b0
211+
opentelemetry-instrumentation-mysql==0.57b0
202212
# via middleware-io (pyproject.toml)
203-
opentelemetry-instrumentation-mysql==0.48b0
213+
opentelemetry-instrumentation-mysqlclient==0.57b0
204214
# via middleware-io (pyproject.toml)
205-
opentelemetry-instrumentation-mysqlclient==0.48b0
215+
opentelemetry-instrumentation-pika==0.57b0
206216
# via middleware-io (pyproject.toml)
207-
opentelemetry-instrumentation-pika==0.48b0
217+
opentelemetry-instrumentation-psycopg==0.57b0
208218
# via middleware-io (pyproject.toml)
209-
opentelemetry-instrumentation-psycopg==0.48b0
219+
opentelemetry-instrumentation-psycopg2==0.57b0
210220
# via middleware-io (pyproject.toml)
211-
opentelemetry-instrumentation-psycopg2==0.48b0
221+
opentelemetry-instrumentation-pymemcache==0.57b0
212222
# via middleware-io (pyproject.toml)
213-
opentelemetry-instrumentation-pymemcache==0.48b0
223+
opentelemetry-instrumentation-pymongo==0.57b0
214224
# via middleware-io (pyproject.toml)
215-
opentelemetry-instrumentation-pymongo==0.48b0
225+
opentelemetry-instrumentation-pymysql==0.57b0
216226
# via middleware-io (pyproject.toml)
217-
opentelemetry-instrumentation-pymysql==0.48b0
227+
opentelemetry-instrumentation-pymssql==0.57b0
218228
# via middleware-io (pyproject.toml)
219-
opentelemetry-instrumentation-pyramid==0.48b0
229+
opentelemetry-instrumentation-pyramid==0.57b0
220230
# via middleware-io (pyproject.toml)
221-
opentelemetry-instrumentation-redis==0.48b0
231+
opentelemetry-instrumentation-redis==0.57b0
222232
# via middleware-io (pyproject.toml)
223-
opentelemetry-instrumentation-remoulade==0.48b0
233+
opentelemetry-instrumentation-remoulade==0.57b0
224234
# via middleware-io (pyproject.toml)
225-
opentelemetry-instrumentation-requests==0.48b0
235+
opentelemetry-instrumentation-requests==0.57b0
226236
# via middleware-io (pyproject.toml)
227-
opentelemetry-instrumentation-sqlalchemy==0.48b0
237+
opentelemetry-instrumentation-sqlalchemy==0.57b0
228238
# via middleware-io (pyproject.toml)
229-
opentelemetry-instrumentation-sqlite3==0.48b0
239+
opentelemetry-instrumentation-sqlite3==0.57b0
230240
# via middleware-io (pyproject.toml)
231-
opentelemetry-instrumentation-starlette==0.48b0
241+
opentelemetry-instrumentation-starlette==0.57b0
232242
# via middleware-io (pyproject.toml)
233-
opentelemetry-instrumentation-system-metrics==0.48b0
243+
opentelemetry-instrumentation-system-metrics==0.57b0
234244
# via middleware-io (pyproject.toml)
235-
opentelemetry-instrumentation-threading==0.48b0
245+
opentelemetry-instrumentation-threading==0.57b0
236246
# via middleware-io (pyproject.toml)
237-
opentelemetry-instrumentation-tornado==0.48b0
247+
opentelemetry-instrumentation-tornado==0.57b0
238248
# via middleware-io (pyproject.toml)
239-
opentelemetry-instrumentation-tortoiseorm==0.48b0
249+
opentelemetry-instrumentation-tortoiseorm==0.57b0
240250
# via middleware-io (pyproject.toml)
241-
opentelemetry-instrumentation-urllib==0.48b0
251+
opentelemetry-instrumentation-urllib==0.57b0
242252
# via middleware-io (pyproject.toml)
243-
opentelemetry-instrumentation-urllib3==0.48b0
253+
opentelemetry-instrumentation-urllib3==0.57b0
244254
# via middleware-io (pyproject.toml)
245-
opentelemetry-instrumentation-wsgi==0.48b0
255+
opentelemetry-instrumentation-wsgi==0.57b0
246256
# via
247257
# middleware-io (pyproject.toml)
248258
# opentelemetry-instrumentation-django
249259
# opentelemetry-instrumentation-falcon
250260
# opentelemetry-instrumentation-flask
251261
# opentelemetry-instrumentation-pyramid
252-
opentelemetry-processor-baggage==0.48b0
262+
opentelemetry-processor-baggage==0.57b0
253263
# via middleware-io (pyproject.toml)
254264
opentelemetry-propagator-aws-xray==1.0.2
255265
# via
256266
# middleware-io (pyproject.toml)
257267
# opentelemetry-instrumentation-botocore
258-
opentelemetry-propagator-b3==1.27.0
268+
opentelemetry-propagator-b3==1.36.0
259269
# via middleware-io (pyproject.toml)
260-
opentelemetry-propagator-gcp==1.7.0
270+
opentelemetry-propagator-gcp==1.9.0
261271
# via middleware-io (pyproject.toml)
262-
opentelemetry-propagator-jaeger==1.27.0
272+
opentelemetry-propagator-jaeger==1.36.0
263273
# via middleware-io (pyproject.toml)
264-
opentelemetry-propagator-ot-trace==0.48b0
274+
opentelemetry-propagator-ot-trace==0.57b0
265275
# via middleware-io (pyproject.toml)
266-
opentelemetry-proto==1.27.0
276+
opentelemetry-proto==1.36.0
267277
# via
268278
# middleware-io (pyproject.toml)
269279
# opentelemetry-exporter-otlp-proto-common
@@ -272,9 +282,9 @@ opentelemetry-resource-detector-azure==0.1.5
272282
# via middleware-io (pyproject.toml)
273283
opentelemetry-resourcedetector-docker==0.4.0
274284
# via middleware-io (pyproject.toml)
275-
opentelemetry-resourcedetector-gcp==1.7.0a0
285+
opentelemetry-resourcedetector-gcp==1.9.0a0
276286
# via middleware-io (pyproject.toml)
277-
opentelemetry-sdk==1.27.0
287+
opentelemetry-sdk==1.36.0
278288
# via
279289
# middleware-io (pyproject.toml)
280290
# opentelemetry-exporter-otlp-proto-grpc
@@ -286,7 +296,7 @@ opentelemetry-sdk==1.27.0
286296
# opentelemetry-sdk-extension-aws
287297
opentelemetry-sdk-extension-aws==2.0.2
288298
# via middleware-io (pyproject.toml)
289-
opentelemetry-semantic-conventions==0.48b0
299+
opentelemetry-semantic-conventions==0.57b0
290300
# via
291301
# middleware-io (pyproject.toml)
292302
# opentelemetry-instrumentation-aiohttp-client
@@ -323,7 +333,7 @@ opentelemetry-semantic-conventions==0.48b0
323333
# opentelemetry-instrumentation-wsgi
324334
# opentelemetry-resourcedetector-docker
325335
# opentelemetry-sdk
326-
opentelemetry-util-http==0.48b0
336+
opentelemetry-util-http==0.57b0
327337
# via
328338
# middleware-io (pyproject.toml)
329339
# opentelemetry-instrumentation-aiohttp-client
@@ -347,7 +357,7 @@ packaging==24.2
347357
# opentelemetry-instrumentation-flask
348358
# opentelemetry-instrumentation-pika
349359
# opentelemetry-instrumentation-sqlalchemy
350-
protobuf==4.25.5
360+
protobuf==5.26.1
351361
# via
352362
# googleapis-common-protos
353363
# opentelemetry-proto

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)