From 8afbd83e8c715f6634ec7f15d1976a0ee79ff4b6 Mon Sep 17 00:00:00 2001 From: stschenk Date: Fri, 6 Nov 2020 09:37:28 -0800 Subject: [PATCH 1/5] add param to control collection of db.statement.parameters --- .../tests/test_aiopg_integration.py | 6 ++- .../CHANGELOG.md | 3 ++ .../instrumentation/dbapi/__init__.py | 15 ++++++- .../tests/test_dbapi_integration.py | 43 +++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py b/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py index 78ea4552e2..89e7cc05a5 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py +++ b/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py @@ -199,7 +199,11 @@ def test_span_succeeded(self): "user": "user", } db_integration = AiopgIntegration( - self.tracer, "testcomponent", "testtype", connection_attributes + self.tracer, + "testcomponent", + "testtype", + connection_attributes, + capture_parameters=True, ) mock_connection = async_call( db_integration.wrapped_connection( diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md index e110055da1..00b71f032c 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md +++ b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +Stop capturing query parameters by default + ([#????](https://github.com/open-telemetry/opentelemetry-python/pull/???)) + ## Version 0.13b0 Released 2020-09-17 diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py index 0047ab1851..39d7e3f361 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/src/opentelemetry/instrumentation/dbapi/__init__.py @@ -62,6 +62,7 @@ def trace_integration( database_type: str = "", connection_attributes: typing.Dict = None, tracer_provider: typing.Optional[TracerProvider] = None, + capture_parameters: bool = False, ): """Integrate with DB API library. https://www.python.org/dev/peps/pep-0249/ @@ -76,6 +77,7 @@ def trace_integration( user in Connection object. tracer_provider: The :class:`opentelemetry.trace.TracerProvider` to use. If ommited the current configured one is used. + capture_parameters: Configure if db.statement.parameters should be captured. """ wrap_connect( __name__, @@ -86,6 +88,7 @@ def trace_integration( connection_attributes, version=__version__, tracer_provider=tracer_provider, + capture_parameters=capture_parameters, ) @@ -98,6 +101,7 @@ def wrap_connect( connection_attributes: typing.Dict = None, version: str = "", tracer_provider: typing.Optional[TracerProvider] = None, + capture_parameters: bool = False, ): """Integrate with DB API library. https://www.python.org/dev/peps/pep-0249/ @@ -111,6 +115,8 @@ def wrap_connect( database_type: The Database type. For any SQL database, "sql". connection_attributes: Attribute names for database, port, host and user in Connection object. + capture_parameters: Configure if db.statement.parameters should be captured. + """ # pylint: disable=unused-argument @@ -127,6 +133,7 @@ def wrap_connect_( connection_attributes=connection_attributes, version=version, tracer_provider=tracer_provider, + capture_parameters=capture_parameters, ) return db_integration.wrapped_connection(wrapped, args, kwargs) @@ -159,6 +166,7 @@ def instrument_connection( connection_attributes: typing.Dict = None, version: str = "", tracer_provider: typing.Optional[TracerProvider] = None, + capture_parameters=False, ): """Enable instrumentation in a database connection. @@ -170,7 +178,7 @@ def instrument_connection( database_type: The Database type. For any SQL database, "sql". connection_attributes: Attribute names for database, port, host and user in a connection object. - + capture_parameters: Configure if db.statement.parameters should be captured. Returns: An instrumented connection. """ @@ -181,6 +189,7 @@ def instrument_connection( connection_attributes=connection_attributes, version=version, tracer_provider=tracer_provider, + capture_parameters=capture_parameters, ) db_integration.get_connection_attributes(connection) return get_traced_connection_proxy(connection, db_integration) @@ -211,6 +220,7 @@ def __init__( connection_attributes=None, version: str = "", tracer_provider: typing.Optional[TracerProvider] = None, + capture_parameters: bool = False, ): self.connection_attributes = connection_attributes if self.connection_attributes is None: @@ -223,6 +233,7 @@ def __init__( self._name = name self._version = version self._tracer_provider = tracer_provider + self.capture_parameters = capture_parameters self.database_component = database_component self.database_type = database_type self.connection_props = {} @@ -327,7 +338,7 @@ def _populate_span( ) in self._db_api_integration.span_attributes.items(): span.set_attribute(attribute_key, attribute_value) - if len(args) > 1: + if self._db_api_integration.capture_parameters and len(args) > 1: span.set_attribute("db.statement.parameters", str(args[1])) def traced_execution( diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py index f2abb8b6dc..a43bf8b0b8 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py @@ -53,6 +53,49 @@ def test_span_succeeded(self): self.assertEqual(span.name, "testcomponent.testdatabase") self.assertIs(span.kind, trace_api.SpanKind.CLIENT) + self.assertEqual(span.attributes["component"], "testcomponent") + self.assertEqual(span.attributes["db.type"], "testtype") + self.assertEqual(span.attributes["db.instance"], "testdatabase") + self.assertEqual(span.attributes["db.statement"], "Test query") + self.assertFalse("db.statement.parameters" in span.attributes) + self.assertEqual(span.attributes["db.user"], "testuser") + self.assertEqual(span.attributes["net.peer.name"], "testhost") + self.assertEqual(span.attributes["net.peer.port"], 123) + self.assertIs( + span.status.status_code, trace_api.status.StatusCode.UNSET, + ) + + def test_span_succeeded_without_capture_of_statement_parameters(self): + connection_props = { + "database": "testdatabase", + "server_host": "testhost", + "server_port": 123, + "user": "testuser", + } + connection_attributes = { + "database": "database", + "port": "server_port", + "host": "server_host", + "user": "user", + } + db_integration = dbapi.DatabaseApiIntegration( + self.tracer, + "testcomponent", + "testtype", + connection_attributes, + capture_parameters=True, + ) + mock_connection = db_integration.wrapped_connection( + mock_connect, {}, connection_props + ) + cursor = mock_connection.cursor() + cursor.execute("Test query", ("param1Value", False)) + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + self.assertEqual(span.name, "testcomponent.testdatabase") + self.assertIs(span.kind, trace_api.SpanKind.CLIENT) + self.assertEqual(span.attributes["component"], "testcomponent") self.assertEqual(span.attributes["db.type"], "testtype") self.assertEqual(span.attributes["db.instance"], "testdatabase") From e752b15731a99e7b1da389767fa8063cd0247a89 Mon Sep 17 00:00:00 2001 From: stschenk Date: Fri, 6 Nov 2020 09:41:12 -0800 Subject: [PATCH 2/5] update change log --- .../opentelemetry-instrumentation-dbapi/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md index 00b71f032c..5617cb5a43 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md +++ b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased Stop capturing query parameters by default - ([#????](https://github.com/open-telemetry/opentelemetry-python/pull/???)) + ([#156](https://github.com/open-telemetry/opentelemetry-python/pull/156)) ## Version 0.13b0 From 8604bf378342ca6c015ea9e741f7f3c8d4389408 Mon Sep 17 00:00:00 2001 From: stschenk Date: Sun, 8 Nov 2020 08:44:26 -0800 Subject: [PATCH 3/5] update changelog --- .../opentelemetry-instrumentation-dbapi/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md index 5617cb5a43..fce916f6f9 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md +++ b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md @@ -19,7 +19,7 @@ Released 2020-09-17 Released 2020-08-14 - Change package name to opentelemetry-instrumentation-dbapi - ([#966](https://github.com/open-telemetry/opentelemetry-python/pull/966)) + ([#156](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/156)) ## 0.7b1 From 6bf1013d2e4240fb80bee7e1fb2ea1b0f78195ea Mon Sep 17 00:00:00 2001 From: stschenk <72463443+stschenk@users.noreply.github.com> Date: Sun, 8 Nov 2020 08:52:09 -0800 Subject: [PATCH 4/5] Apply suggestions from code review Co-authored-by: Yusuke Tsutsumi --- .../tests/test_dbapi_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py index a43bf8b0b8..40176363ce 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py +++ b/instrumentation/opentelemetry-instrumentation-dbapi/tests/test_dbapi_integration.py @@ -65,7 +65,7 @@ def test_span_succeeded(self): span.status.status_code, trace_api.status.StatusCode.UNSET, ) - def test_span_succeeded_without_capture_of_statement_parameters(self): + def test_span_succeeded_with_capture_of_statement_parameters(self): connection_props = { "database": "testdatabase", "server_host": "testhost", From 09f7ab2467155b286e906bd07a655e774f575d43 Mon Sep 17 00:00:00 2001 From: stschenk Date: Mon, 9 Nov 2020 08:50:49 -0800 Subject: [PATCH 5/5] Fixup Changelog --- .../opentelemetry-instrumentation-dbapi/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md index fce916f6f9..37f59c0187 100644 --- a/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md +++ b/instrumentation/opentelemetry-instrumentation-dbapi/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased Stop capturing query parameters by default - ([#156](https://github.com/open-telemetry/opentelemetry-python/pull/156)) + ([#156](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/156)) ## Version 0.13b0 @@ -19,7 +19,7 @@ Released 2020-09-17 Released 2020-08-14 - Change package name to opentelemetry-instrumentation-dbapi - ([#156](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/156)) + ([#966](https://github.com/open-telemetry/opentelemetry-python/pull/966)) ## 0.7b1