Skip to content

Commit b9a42e2

Browse files
authored
Merge pull request #156 from stschenk/dbapi-skip-params-by-default
2 parents dad5f5b + c779e8d commit b9a42e2

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,11 @@ def test_span_succeeded(self):
199199
"user": "user",
200200
}
201201
db_integration = AiopgIntegration(
202-
self.tracer, "testcomponent", "testtype", connection_attributes
202+
self.tracer,
203+
"testcomponent",
204+
"testtype",
205+
connection_attributes,
206+
capture_parameters=True,
203207
)
204208
mock_connection = async_call(
205209
db_integration.wrapped_connection(

instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
Stop capturing query parameters by default
6+
([#156](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/156))
7+
58
## Version 0.13b0
69

710
Released 2020-09-17

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

+13-2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def trace_integration(
6262
database_type: str = "",
6363
connection_attributes: typing.Dict = None,
6464
tracer_provider: typing.Optional[TracerProvider] = None,
65+
capture_parameters: bool = False,
6566
):
6667
"""Integrate with DB API library.
6768
https://www.python.org/dev/peps/pep-0249/
@@ -76,6 +77,7 @@ def trace_integration(
7677
user in Connection object.
7778
tracer_provider: The :class:`opentelemetry.trace.TracerProvider` to
7879
use. If ommited the current configured one is used.
80+
capture_parameters: Configure if db.statement.parameters should be captured.
7981
"""
8082
wrap_connect(
8183
__name__,
@@ -86,6 +88,7 @@ def trace_integration(
8688
connection_attributes,
8789
version=__version__,
8890
tracer_provider=tracer_provider,
91+
capture_parameters=capture_parameters,
8992
)
9093

9194

@@ -98,6 +101,7 @@ def wrap_connect(
98101
connection_attributes: typing.Dict = None,
99102
version: str = "",
100103
tracer_provider: typing.Optional[TracerProvider] = None,
104+
capture_parameters: bool = False,
101105
):
102106
"""Integrate with DB API library.
103107
https://www.python.org/dev/peps/pep-0249/
@@ -111,6 +115,8 @@ def wrap_connect(
111115
database_type: The Database type. For any SQL database, "sql".
112116
connection_attributes: Attribute names for database, port, host and
113117
user in Connection object.
118+
capture_parameters: Configure if db.statement.parameters should be captured.
119+
114120
"""
115121

116122
# pylint: disable=unused-argument
@@ -127,6 +133,7 @@ def wrap_connect_(
127133
connection_attributes=connection_attributes,
128134
version=version,
129135
tracer_provider=tracer_provider,
136+
capture_parameters=capture_parameters,
130137
)
131138
return db_integration.wrapped_connection(wrapped, args, kwargs)
132139

@@ -159,6 +166,7 @@ def instrument_connection(
159166
connection_attributes: typing.Dict = None,
160167
version: str = "",
161168
tracer_provider: typing.Optional[TracerProvider] = None,
169+
capture_parameters=False,
162170
):
163171
"""Enable instrumentation in a database connection.
164172
@@ -170,7 +178,7 @@ def instrument_connection(
170178
database_type: The Database type. For any SQL database, "sql".
171179
connection_attributes: Attribute names for database, port, host and
172180
user in a connection object.
173-
181+
capture_parameters: Configure if db.statement.parameters should be captured.
174182
Returns:
175183
An instrumented connection.
176184
"""
@@ -181,6 +189,7 @@ def instrument_connection(
181189
connection_attributes=connection_attributes,
182190
version=version,
183191
tracer_provider=tracer_provider,
192+
capture_parameters=capture_parameters,
184193
)
185194
db_integration.get_connection_attributes(connection)
186195
return get_traced_connection_proxy(connection, db_integration)
@@ -211,6 +220,7 @@ def __init__(
211220
connection_attributes=None,
212221
version: str = "",
213222
tracer_provider: typing.Optional[TracerProvider] = None,
223+
capture_parameters: bool = False,
214224
):
215225
self.connection_attributes = connection_attributes
216226
if self.connection_attributes is None:
@@ -223,6 +233,7 @@ def __init__(
223233
self._name = name
224234
self._version = version
225235
self._tracer_provider = tracer_provider
236+
self.capture_parameters = capture_parameters
226237
self.database_component = database_component
227238
self.database_type = database_type
228239
self.connection_props = {}
@@ -327,7 +338,7 @@ def _populate_span(
327338
) in self._db_api_integration.span_attributes.items():
328339
span.set_attribute(attribute_key, attribute_value)
329340

330-
if len(args) > 1:
341+
if self._db_api_integration.capture_parameters and len(args) > 1:
331342
span.set_attribute("db.statement.parameters", str(args[1]))
332343

333344
def traced_execution(

instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py

+43
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,49 @@ def test_span_succeeded(self):
5353
self.assertEqual(span.name, "testcomponent.testdatabase")
5454
self.assertIs(span.kind, trace_api.SpanKind.CLIENT)
5555

56+
self.assertEqual(span.attributes["component"], "testcomponent")
57+
self.assertEqual(span.attributes["db.type"], "testtype")
58+
self.assertEqual(span.attributes["db.instance"], "testdatabase")
59+
self.assertEqual(span.attributes["db.statement"], "Test query")
60+
self.assertFalse("db.statement.parameters" in span.attributes)
61+
self.assertEqual(span.attributes["db.user"], "testuser")
62+
self.assertEqual(span.attributes["net.peer.name"], "testhost")
63+
self.assertEqual(span.attributes["net.peer.port"], 123)
64+
self.assertIs(
65+
span.status.status_code, trace_api.status.StatusCode.UNSET,
66+
)
67+
68+
def test_span_succeeded_with_capture_of_statement_parameters(self):
69+
connection_props = {
70+
"database": "testdatabase",
71+
"server_host": "testhost",
72+
"server_port": 123,
73+
"user": "testuser",
74+
}
75+
connection_attributes = {
76+
"database": "database",
77+
"port": "server_port",
78+
"host": "server_host",
79+
"user": "user",
80+
}
81+
db_integration = dbapi.DatabaseApiIntegration(
82+
self.tracer,
83+
"testcomponent",
84+
"testtype",
85+
connection_attributes,
86+
capture_parameters=True,
87+
)
88+
mock_connection = db_integration.wrapped_connection(
89+
mock_connect, {}, connection_props
90+
)
91+
cursor = mock_connection.cursor()
92+
cursor.execute("Test query", ("param1Value", False))
93+
spans_list = self.memory_exporter.get_finished_spans()
94+
self.assertEqual(len(spans_list), 1)
95+
span = spans_list[0]
96+
self.assertEqual(span.name, "testcomponent.testdatabase")
97+
self.assertIs(span.kind, trace_api.SpanKind.CLIENT)
98+
5699
self.assertEqual(span.attributes["component"], "testcomponent")
57100
self.assertEqual(span.attributes["db.type"], "testtype")
58101
self.assertEqual(span.attributes["db.instance"], "testdatabase")

0 commit comments

Comments
 (0)