Skip to content

Commit ac09080

Browse files
authored
opamp: suppress instrumentation for client requests (#384)
1 parent 9c117bb commit ac09080

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/opentelemetry/_opamp/client.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,18 @@
2020
from typing import Generator, Mapping
2121

2222
from uuid_utils import uuid7
23-
from opentelemetry.util.types import AnyValue
2423

25-
import opentelemetry._opamp.messages as messages
24+
from opentelemetry._opamp import messages
2625
from opentelemetry._opamp.transport.requests import RequestsTransport
2726
from opentelemetry._opamp.version import __version__
2827
from opentelemetry._opamp.proto import opamp_pb2
29-
28+
from opentelemetry.context import (
29+
_SUPPRESS_INSTRUMENTATION_KEY,
30+
attach,
31+
detach,
32+
set_value,
33+
)
34+
from opentelemetry.util.types import AnyValue
3035

3136
_logger = getLogger(__name__)
3237

@@ -128,15 +133,15 @@ def _build_remote_config_status_response_message(self, remote_config_status: opa
128133
return data
129134

130135
def _send(self, data: bytes):
136+
token = attach(set_value(_SUPPRESS_INSTRUMENTATION_KEY, True))
131137
try:
132138
response = self._transport.send(
133139
url=self._endpoint, headers=self._headers, data=data, timeout_millis=self._timeout_millis
134140
)
135141
return response
136-
except:
137-
raise
138142
finally:
139143
self._sequence_num += 1
144+
detach(token)
140145

141146
def _decode_remote_config(
142147
self, remote_config: opamp_pb2.AgentRemoteConfig

tests/integration/test_integration.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ class GRPCIntegrationTestCase(ElasticIntegrationGRPCTestCase):
3636
@classmethod
3737
def requirements(cls):
3838
requirements = super().requirements()
39-
return requirements + [f"opentelemetry-instrumentation-sqlite3=={OTEL_INSTRUMENTATION_VERSION}"]
39+
return requirements + [
40+
f"opentelemetry-instrumentation-sqlite3=={OTEL_INSTRUMENTATION_VERSION}",
41+
f"opentelemetry-instrumentation-requests=={OTEL_INSTRUMENTATION_VERSION}",
42+
]
4043

4144
def script(self):
4245
import sqlite3
@@ -187,6 +190,23 @@ def test_script():
187190
self.assertIn(edot_user_agent, traces_headers[0]["user-agent"])
188191
self.assertIn(edot_user_agent, logs_headers[0]["user-agent"])
189192

193+
def test_opamp_client_requests_are_not_instrumented(self):
194+
def test_script():
195+
from opentelemetry._events import Event, get_event_logger
196+
197+
event = Event(name="test.event", attributes={}, body={"key": "value"})
198+
event_logger = get_event_logger(__name__)
199+
event_logger.emit(event)
200+
201+
env = {"ELASTIC_OTEL_OPAMP_ENDPOINT": "https://httpbin.org/"}
202+
stdout, stderr, returncode = self.run_script(
203+
test_script, environment_variables=env, wrapper_script="opentelemetry-instrument"
204+
)
205+
206+
telemetry = self.get_telemetry()
207+
self.assertFalse(telemetry["traces"])
208+
self.assertTrue(telemetry["logs"])
209+
190210

191211
@pytest.mark.integration
192212
class HTTPIntegrationTestCase(ElasticIntegrationHTTPTestCase):

0 commit comments

Comments
 (0)