diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/CHANGELOG.md b/instrumentation/opentelemetry-instrumentation-pymemcache/CHANGELOG.md index 5cff2cb6e..6c734759c 100644 --- a/instrumentation/opentelemetry-instrumentation-pymemcache/CHANGELOG.md +++ b/instrumentation/opentelemetry-instrumentation-pymemcache/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +- Update pymemcache instrumentation to follow semantic conventions + ([#183](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/183)) + ## Version 0.13b0 Released 2020-09-17 diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/__init__.py b/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/__init__.py index a91d3b525..1276f1ffd 100644 --- a/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-pymemcache/src/opentelemetry/instrumentation/pymemcache/__init__.py @@ -55,14 +55,13 @@ logger = logging.getLogger(__name__) # https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/span-general.md#general-network-connection-attributes _HOST = "net.peer.name" _PORT = "net.peer.port" +_TRANSPORT = "net.transport" # Database semantic conventions here: # https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/database.md -_DB = "db.type" -_URL = "db.url" +_DB = "db.system" _DEFAULT_SERVICE = "memcached" _RAWCMD = "db.statement" -_CMD = "memcached.command" COMMANDS = [ "set", "set_many", @@ -115,7 +114,7 @@ def _with_tracer_wrapper(func): @_with_tracer_wrapper def _wrap_cmd(tracer, cmd, wrapped, instance, args, kwargs): with tracer.start_as_current_span( - _CMD, kind=SpanKind.INTERNAL, attributes={} + cmd, kind=SpanKind.CLIENT, attributes={} ) as span: try: if span.is_recording(): @@ -173,9 +172,10 @@ def _get_address_attributes(instance): host, port = instance.server address_attributes[_HOST] = host address_attributes[_PORT] = port - address_attributes[_URL] = "memcached://{}:{}".format(host, port) + address_attributes[_TRANSPORT] = "IP.TCP" elif isinstance(instance.server, str): - address_attributes[_URL] = "memcached://{}".format(instance.server) + address_attributes[_HOST] = instance.server + address_attributes[_TRANSPORT] = "Unix" return address_attributes diff --git a/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py b/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py index 4efb50eb4..2c37570b1 100644 --- a/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py +++ b/instrumentation/opentelemetry-instrumentation-pymemcache/tests/test_pymemcache.py @@ -62,17 +62,12 @@ class PymemcacheClientTestCase( self.assertEqual(num_expected, len(spans)) for span, query in zip(spans, queries_expected): - self.assertEqual(span.name, "memcached.command") - self.assertIs(span.kind, trace_api.SpanKind.INTERNAL) - self.assertEqual( - span.attributes["net.peer.name"], "{}".format(TEST_HOST) - ) + command, *_ = query.split(" ") + self.assertEqual(span.name, command) + self.assertIs(span.kind, trace_api.SpanKind.CLIENT) + self.assertEqual(span.attributes["net.peer.name"], TEST_HOST) self.assertEqual(span.attributes["net.peer.port"], TEST_PORT) - self.assertEqual(span.attributes["db.type"], "memcached") - self.assertEqual( - span.attributes["db.url"], - "memcached://{}:{}".format(TEST_HOST, TEST_PORT), - ) + self.assertEqual(span.attributes["db.system"], "memcached") self.assertEqual(span.attributes["db.statement"], query) def test_set_success(self): @@ -214,10 +209,8 @@ class PymemcacheClientTestCase( spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 2) - self.assertEqual( - spans[0].attributes["db.url"], - "memcached://{}:{}".format(TEST_HOST, TEST_PORT), - ) + self.assertEqual(spans[0].attributes["net.peer.name"], TEST_HOST) + self.assertEqual(spans[0].attributes["net.peer.port"], TEST_PORT) def test_append_stored(self): client = self.make_client([b"STORED\r\n"]) @@ -517,17 +510,12 @@ class PymemcacheHashClientTestCase(TestBase): self.assertEqual(num_expected, len(spans)) for span, query in zip(spans, queries_expected): - self.assertEqual(span.name, "memcached.command") - self.assertIs(span.kind, trace_api.SpanKind.INTERNAL) - self.assertEqual( - span.attributes["net.peer.name"], "{}".format(TEST_HOST) - ) + command, *_ = query.split(" ") + self.assertEqual(span.name, command) + self.assertIs(span.kind, trace_api.SpanKind.CLIENT) + self.assertEqual(span.attributes["net.peer.name"], TEST_HOST) self.assertEqual(span.attributes["net.peer.port"], TEST_PORT) - self.assertEqual(span.attributes["db.type"], "memcached") - self.assertEqual( - span.attributes["db.url"], - "memcached://{}:{}".format(TEST_HOST, TEST_PORT), - ) + self.assertEqual(span.attributes["db.system"], "memcached") self.assertEqual(span.attributes["db.statement"], query) def test_delete_many_found(self):