Skip to content

Commit b5d3074

Browse files
Implement checking for suppression key in pymongo instrumentation (open-telemetry#736)
* Implement checking for suppression key Add test for suppression key with pymongo changelog update * Linting * pylint * Bad reformat * Update changelog with PR Co-authored-by: Diego Hurtado <[email protected]>
1 parent face2a3 commit b5d3074

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2626
### Changed
2727
- `opentelemetry-instrumentation-jinja2` Allow instrumentation of newer Jinja2 versions.
2828

29+
### Changed
30+
- `opentelemetry-instrumentation-pymongo` Add check for suppression key in PyMongo.
31+
- ([#736](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/736))
32+
2933
### Added
3034
- `opentelemetry-instrumentation-elasticsearch` Added `response_hook` and `request_hook` callbacks
3135
([#670](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/670))

instrumentation/opentelemetry-instrumentation-pymongo/src/opentelemetry/instrumentation/pymongo/__init__.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@
4141

4242
from pymongo import monitoring
4343

44+
from opentelemetry import context
4445
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
4546
from opentelemetry.instrumentation.pymongo.package import _instruments
4647
from opentelemetry.instrumentation.pymongo.version import __version__
48+
from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY
4749
from opentelemetry.semconv.trace import DbSystemValues, SpanAttributes
4850
from opentelemetry.trace import SpanKind, get_tracer
4951
from opentelemetry.trace.status import Status, StatusCode
@@ -57,7 +59,9 @@ def __init__(self, tracer):
5759

5860
def started(self, event: monitoring.CommandStartedEvent):
5961
""" Method to handle a pymongo CommandStartedEvent """
60-
if not self.is_enabled:
62+
if not self.is_enabled or context.get_value(
63+
_SUPPRESS_INSTRUMENTATION_KEY
64+
):
6165
return
6266
command = event.command.get(event.command_name, "")
6367
name = event.command_name
@@ -92,7 +96,9 @@ def started(self, event: monitoring.CommandStartedEvent):
9296

9397
def succeeded(self, event: monitoring.CommandSucceededEvent):
9498
""" Method to handle a pymongo CommandSucceededEvent """
95-
if not self.is_enabled:
99+
if not self.is_enabled or context.get_value(
100+
_SUPPRESS_INSTRUMENTATION_KEY
101+
):
96102
return
97103
span = self._pop_span(event)
98104
if span is None:
@@ -101,7 +107,9 @@ def succeeded(self, event: monitoring.CommandSucceededEvent):
101107

102108
def failed(self, event: monitoring.CommandFailedEvent):
103109
""" Method to handle a pymongo CommandFailedEvent """
104-
if not self.is_enabled:
110+
if not self.is_enabled or context.get_value(
111+
_SUPPRESS_INSTRUMENTATION_KEY
112+
):
105113
return
106114
span = self._pop_span(event)
107115
if span is None:

instrumentation/opentelemetry-instrumentation-pymongo/tests/test_pymongo.py

+27
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
from unittest import mock
1616

17+
from opentelemetry import context
1718
from opentelemetry import trace as trace_api
1819
from opentelemetry.instrumentation.pymongo import (
1920
CommandTracer,
2021
PymongoInstrumentor,
2122
)
23+
from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY
2224
from opentelemetry.semconv.trace import SpanAttributes
2325
from opentelemetry.test.test_base import TestBase
2426

@@ -90,6 +92,31 @@ def test_not_recording(self):
9092
self.assertFalse(mock_span.set_attribute.called)
9193
self.assertFalse(mock_span.set_status.called)
9294

95+
def test_suppression_key(self):
96+
mock_tracer = mock.Mock()
97+
mock_span = mock.Mock()
98+
mock_span.is_recording.return_value = True
99+
mock_tracer.start_span.return_value = mock_span
100+
mock_event = MockEvent({})
101+
mock_event.command.get = mock.Mock()
102+
mock_event.command.get.return_value = "dummy"
103+
104+
token = context.attach(
105+
context.set_value(_SUPPRESS_INSTRUMENTATION_KEY, True)
106+
)
107+
108+
try:
109+
command_tracer = CommandTracer(mock_tracer)
110+
command_tracer.started(event=mock_event)
111+
command_tracer.succeeded(event=mock_event)
112+
finally:
113+
context.detach(token)
114+
115+
# if suppression key is set, CommandTracer methods return immediately, so command.get is not invoked.
116+
self.assertFalse(
117+
mock_event.command.get.called # pylint: disable=no-member
118+
)
119+
93120
def test_failed(self):
94121
mock_event = MockEvent({})
95122
command_tracer = CommandTracer(self.tracer)

0 commit comments

Comments
 (0)