Skip to content

Commit 7e19bee

Browse files
committed
feat: Add GEvent instrumentation support with OTel
Signed-off-by: Varsha GS <[email protected]>
1 parent 685e2ee commit 7e19bee

File tree

2 files changed

+12
-27
lines changed

2 files changed

+12
-27
lines changed

src/instana/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ def boot_agent() -> None:
182182
sqlalchemy, # noqa: F401
183183
starlette, # noqa: F401
184184
urllib3, # noqa: F401
185+
gevent, # noqa: F401
185186
)
186187
from instana.instrumentation.aiohttp import (
187188
client as aiohttp_client, # noqa: F401
@@ -209,8 +210,6 @@ def boot_agent() -> None:
209210
server as tornado_server, # noqa: F401
210211
)
211212

212-
# from instana.instrumentation import gevent_inst # noqa: F401
213-
214213
# Hooks
215214
from instana.hooks import (
216215
hook_gunicorn, # noqa: F401

src/instana/instrumentation/gevent.py

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
"""
77

88
import sys
9-
from ..log import logger
10-
from ..singletons import tracer
9+
10+
from opentelemetry import context
11+
import contextvars
12+
13+
from instana.log import logger
1114

1215

1316
def instrument_gevent():
@@ -16,38 +19,21 @@ def instrument_gevent():
1619
logger.debug("Instrumenting gevent")
1720

1821
import gevent
19-
from opentracing.scope_managers.gevent import GeventScopeManager
20-
from opentracing.scope_managers.gevent import _GeventScope
2122

2223
def spawn_callback(new_greenlet):
2324
"""Handles context propagation for newly spawning greenlets"""
24-
parent_scope = tracer.scope_manager.active
25-
if parent_scope is not None:
26-
# New greenlet, new clean slate. Clone and make active in this new greenlet
27-
# the currently active scope (but don't finish() the span on close - it's a
28-
# clone/not the original and we don't want to close it prematurely)
29-
# TODO: Change to our own ScopeManagers
30-
parent_scope_clone = _GeventScope(
31-
parent_scope.manager, parent_scope.span, finish_on_close=False
32-
)
33-
tracer._scope_manager._set_greenlet_scope(
34-
parent_scope_clone, new_greenlet
35-
)
36-
37-
logger.debug(" -> Updating tracer to use gevent based context management")
38-
tracer._scope_manager = GeventScopeManager()
25+
parent_context = context.get_current()
26+
new_context = contextvars.Context()
27+
28+
new_context.run(lambda: context.attach(parent_context))
29+
new_greenlet.gr_context = new_context
30+
3931
gevent.Greenlet.add_spawn_callback(spawn_callback)
4032
except Exception:
4133
logger.debug("instrument_gevent: ", exc_info=True)
4234

4335

4436
if "gevent" not in sys.modules:
4537
logger.debug("Instrumenting gevent: gevent not detected or loaded. Nothing done.")
46-
elif not hasattr(sys.modules["gevent"], "version_info"):
47-
logger.debug("gevent module has no 'version_info'. Skipping instrumentation.")
48-
elif sys.modules["gevent"].version_info < (1, 4):
49-
logger.debug(
50-
"gevent < 1.4 detected. The Instana package supports gevent versions 1.4 and greater."
51-
)
5238
else:
5339
instrument_gevent()

0 commit comments

Comments
 (0)