diff --git a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/CHANGELOG.md b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/CHANGELOG.md index faa3340d9dc5..4c60d391d716 100644 --- a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/CHANGELOG.md +++ b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/CHANGELOG.md @@ -5,6 +5,9 @@ **Breaking Changes** - This library is renamed to `microsoft-opentelemetry-exporter-azuremonitor`. +- Change span to envelope conversion to adhere to common schema and other languages + ([#15344](https://github.com/Azure/azure-sdk-for-python/pull/15344)) + ## 0.5b.0 (2020-09-24) - Change epoch for live metrics diff --git a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/microsoft/opentelemetry/exporter/azuremonitor/export/trace/__init__.py b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/microsoft/opentelemetry/exporter/azuremonitor/export/trace/__init__.py index 05969d3d99ee..0d36aed066cc 100644 --- a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/microsoft/opentelemetry/exporter/azuremonitor/export/trace/__init__.py +++ b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/microsoft/opentelemetry/exporter/azuremonitor/export/trace/__init__.py @@ -8,7 +8,6 @@ from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult from opentelemetry.sdk.util import ns_to_iso_str from opentelemetry.trace import Span, SpanKind -from opentelemetry.trace.status import StatusCode from microsoft.opentelemetry.exporter.azuremonitor import utils from microsoft.opentelemetry.exporter.azuremonitor._generated.models import ( @@ -78,31 +77,44 @@ def convert_span_to_envelope(span: Span) -> TelemetryItem: if span.kind in (SpanKind.CONSUMER, SpanKind.SERVER): envelope.name = "Microsoft.ApplicationInsights.Request" data = RequestData( + name=span.name, id="{:016x}".format(span.context.span_id), duration=utils.ns_to_duration(span.end_time - span.start_time), response_code=str(span.status.status_code.value), - success=span.status.status_code - == StatusCode.OK, # Modify based off attributes or Status + success=span.status.is_ok, properties={}, ) envelope.data = MonitorBase(base_data=data, base_type="RequestData") - if "http.method" in span.attributes: - data.name = span.attributes["http.method"] + if "http.method" in span.attributes: # HTTP if "http.route" in span.attributes: - data.name = data.name + " " + span.attributes["http.route"] - envelope.tags["ai.operation.name"] = data.name - data.properties["request.name"] = data.name + envelope.tags["ai.operation.name"] = span.attributes["http.route"] elif "http.path" in span.attributes: - data.properties["request.name"] = ( - data.name + " " + span.attributes["http.path"] - ) - if "http.url" in span.attributes: - data.url = span.attributes["http.url"] - data.properties["request.url"] = span.attributes["http.url"] - if "http.status_code" in span.attributes: - status_code = span.attributes["http.status_code"] - data.response_code = str(status_code) - data.success = 200 <= status_code < 400 + envelope.tags["ai.operation.name"] = span.attributes["http.path"] + else: + envelope.tags["ai.operation.name"] = span.name + + if "http.url" in span.attributes: + data.url = span.attributes["http.url"] + data.properties["request.url"] = span.attributes["http.url"] + if "http.status_code" in span.attributes: + status_code = span.attributes["http.status_code"] + data.response_code = str(status_code) + elif "messaging.system" in span.attributes: # Messaging + envelope.tags["ai.operation.name"] = span.name + + if "messaging.destination" in span.attributes: + if "net.peer.name" in span.attributes: + data.properties["source"] = "{}/{}".format( + span.attributes["net.peer.name"], + span.attributes["messaging.destination"], + ) + elif "net.peer.ip" in span.attributes: + data.properties["source"] = "{}/{}".format( + span.attributes["net.peer.ip"], + span.attributes["messaging.destination"], + ) + else: + data.properties["source"] = span.attributes["messaging.destination"] else: envelope.name = "Microsoft.ApplicationInsights.RemoteDependency" data = RemoteDependencyData( @@ -110,43 +122,74 @@ def convert_span_to_envelope(span: Span) -> TelemetryItem: id="{:016x}".format(span.context.span_id), result_code=str(span.status.status_code.value), duration=utils.ns_to_duration(span.end_time - span.start_time), - success=span.status.status_code - == StatusCode.OK, # Modify based off attributes or Status + success=span.status.is_ok, properties={}, ) envelope.data = MonitorBase( base_data=data, base_type="RemoteDependencyData" ) if span.kind in (SpanKind.CLIENT, SpanKind.PRODUCER): - if ( - "component" in span.attributes - and span.attributes["component"] == "http" - ): - # TODO: check other component types (e.g. db) + if "http.method" in span.attributes: # HTTP data.type = "HTTP" - if "http.url" in span.attributes: - url = span.attributes["http.url"] - # data is the url - data.data = url - parse_url = urlparse(url) - # TODO: error handling, probably put scheme as well - # target matches authority (host:port) - data.target = parse_url.netloc - if "http.method" in span.attributes: - # name is METHOD/path - data.name = ( - span.attributes["http.method"] + "/" + parse_url.path + if "net.peer.port" in span.attributes: + name = "" + if "net.peer.name" in span.attributes: + name = span.attributes["net.peer.name"] + elif "net.peer.ip" in span.attributes: + name = str(span.attributes["net.peer.ip"]) + data.target = "{}:{}".format( + name, + str(span.attributes["net.peer.port"]), ) - if "http.status_code" in span.attributes: - status_code = span.attributes["http.status_code"] - data.result_code = str(status_code) - data.success = 200 <= status_code < 400 + elif "http.url" in span.attributes: + url = span.attributes["http.url"] + # data is the url + data.data = url + parse_url = urlparse(url) + # target matches authority (host:port) + data.target = parse_url.netloc + if "http.status_code" in span.attributes: + status_code = span.attributes["http.status_code"] + data.result_code = str(status_code) + elif "db.system" in span.attributes: # Database + data.type = span.attributes["db.system"] + # data is the full statement + if "db.statement" in span.attributes: + data.data = span.attributes["db.statement"] + if "db.name" in span.attributes: + data.target = span.attributes["db.name"] + else: + data.target = span.attributes["db.system"] + elif "rpc.system" in span.attributes: # Rpc + data.type = "rpc.system" + if "rpc.service" in span.attributes: + data.target = span.attributes["rpc.service"] + else: + data.target = span.attributes["rpc.system"] + elif "messaging.system" in span.attributes: # Messaging + data.type = "Queue Message | {}" \ + .format(span.attributes["messaging.system"]) + if "net.peer.ip" in span.attributes and \ + "messaging.destination" in span.attributes: + data.target = "{}/{}".format( + span.attributes["net.peer.ip"], + span.attributes["messaging.destination"] + ) + else: + data.target = span.attributes["messaging.system"] + else: + # TODO: Azure specific types + data.type = "N/A" else: # SpanKind.INTERNAL data.type = "InProc" data.success = True for key in span.attributes: - # This removes redundant data from ApplicationInsights - if key.startswith("http."): + # Remove Opentelemetry related span attributes from custom dimensions + if key.startswith("http.") or \ + key.startswith("db.") or \ + key.startswith("rpc.") or \ + key.startswith("net.") or \ + key.startswith("messaging."): continue data.properties[key] = span.attributes[key] if span.links: diff --git a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_base_exporter.py b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_base_exporter.py index 09b2bcde839c..c33e1e537b29 100644 --- a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_base_exporter.py +++ b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_base_exporter.py @@ -20,7 +20,7 @@ from microsoft.opentelemetry.exporter.azuremonitor.options import ExporterOptions from microsoft.opentelemetry.exporter.azuremonitor._generated.models import MonitorBase, TelemetryItem -TEST_FOLDER = os.path.abspath(".test") +TEST_FOLDER = os.path.abspath(".test.base") STORAGE_PATH = os.path.join(TEST_FOLDER) diff --git a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_storage.py b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_storage.py index e50e2ff48636..8e4e3e601300 100644 --- a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_storage.py +++ b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/test_storage.py @@ -13,7 +13,7 @@ _seconds, ) -TEST_FOLDER = os.path.abspath(".test") +TEST_FOLDER = os.path.abspath(".test.storage") def throw(exc_type, *args, **kwargs): def func(*_args, **_kwargs): @@ -70,6 +70,14 @@ def test_lease_error(self): # pylint: disable=protected-access class TestLocalFileStorage(unittest.TestCase): + @classmethod + def setup_class(cls): + os.makedirs(TEST_FOLDER, exist_ok=True) + + @classmethod + def tearDownClass(cls): + shutil.rmtree(TEST_FOLDER, True) + def test_get_nothing(self): with LocalFileStorage(os.path.join(TEST_FOLDER, "test", "a")) as stor: pass diff --git a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/trace/test_trace.py b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/trace/test_trace.py index 8605299089b3..bf92b8314aaf 100644 --- a/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/trace/test_trace.py +++ b/sdk/monitor/microsoft-opentelemetry-exporter-azuremonitor/tests/trace/test_trace.py @@ -21,7 +21,7 @@ ) from microsoft.opentelemetry.exporter.azuremonitor.options import ExporterOptions -TEST_FOLDER = os.path.abspath(".test") +TEST_FOLDER = os.path.abspath(".test.trace") STORAGE_PATH = os.path.join(TEST_FOLDER) @@ -234,7 +234,6 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", "http.method": "GET", "http.url": "https://www.wikipedia.org/wiki/Rabbit", "http.status_code": 200, @@ -249,9 +248,6 @@ def test_span_to_envelope(self): envelope = exporter._span_to_envelope(span) self.assertEqual(envelope.instrumentation_key, "12345678-1234-5678-abcd-12345678abcd") - self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.RemoteDependency" - ) self.assertEqual( envelope.tags["ai.operation.parentId"], "a6f5d48acb4d31da" ) @@ -259,20 +255,46 @@ def test_span_to_envelope(self): envelope.tags["ai.operation.id"], "1bbd944a73a05d89eab5d3740a213ee7", ) + self.assertEqual( + envelope.name, "Microsoft.ApplicationInsights.RemoteDependency" + ) self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.name, "GET//wiki/Rabbit") + self.assertEqual(envelope.data.base_data.name, "test") + self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") + self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") + self.assertEqual(envelope.data.base_data.result_code, "200") + self.assertTrue(envelope.data.base_data.success) + + self.assertEqual(envelope.data.base_type, "RemoteDependencyData") + self.assertEqual(envelope.data.base_data.type, "HTTP") + self.assertEqual(envelope.data.base_data.target, "www.wikipedia.org") self.assertEqual( envelope.data.base_data.data, "https://www.wikipedia.org/wiki/Rabbit", ) - self.assertEqual(envelope.data.base_data.target, "www.wikipedia.org") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") self.assertEqual(envelope.data.base_data.result_code, "200") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.type, "HTTP") - self.assertEqual(envelope.data.base_type, "RemoteDependencyData") - # SpanKind.CLIENT unknown type + span.attributes = { + "component": "http", + "http.method": "GET", + "net.peer.port": 1234, + "net.peer.name": "testhost", + "http.status_code": 200, + } + envelope = exporter._span_to_envelope(span) + self.assertEqual(envelope.data.base_data.target, "testhost:1234") + + span.attributes = { + "component": "http", + "http.method": "GET", + "net.peer.port": 1234, + "net.peer.ip": "127.0.0.1", + "http.status_code": 200, + } + envelope = exporter._span_to_envelope(span) + self.assertEqual(envelope.data.base_data.target, "127.0.0.1:1234") + + # SpanKind.CLIENT Database span = trace._Span( name="test", context=SpanContext( @@ -284,35 +306,25 @@ def test_span_to_envelope(self): sampler=None, trace_config=None, resource=None, - attributes={}, + attributes={ + "db.system": "sql", + "db.statement": "Test Query", + "db.name": "test db", + }, events=None, links=[], kind=SpanKind.CLIENT, ) - span.status = Status(status_code=StatusCode.OK) span.start(start_time=start_time) span.end(end_time=end_time) + span.status = Status(status_code=StatusCode.OK) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.instrumentation_key, - "12345678-1234-5678-abcd-12345678abcd") - self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.RemoteDependency" - ) - self.assertEqual( - envelope.tags["ai.operation.parentId"], "a6f5d48acb4d31da" - ) - self.assertEqual( - envelope.tags["ai.operation.id"], - "1bbd944a73a05d89eab5d3740a213ee7", - ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.name, "test") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.type, None) - self.assertEqual(envelope.data.base_type, "RemoteDependencyData") + self.assertTrue(envelope.data.base_data.success) + self.assertEqual(envelope.data.base_data.type, "sql") + self.assertEqual(envelope.data.base_data.target, "test db") + self.assertEqual(envelope.data.base_data.data, "Test Query") - # SpanKind.CLIENT missing method + # SpanKind.CLIENT rpc span = trace._Span( name="test", context=SpanContext( @@ -325,44 +337,22 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 200, + "rpc.system": "rpc", + "rpc.service": "Test service", }, events=None, links=[], kind=SpanKind.CLIENT, ) - span.status = Status(status_code=StatusCode.OK) span.start(start_time=start_time) span.end(end_time=end_time) + span.status = Status(status_code=StatusCode.OK) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.instrumentation_key, - "12345678-1234-5678-abcd-12345678abcd") - self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.RemoteDependency" - ) - self.assertEqual( - envelope.tags["ai.operation.parentId"], "a6f5d48acb4d31da" - ) - self.assertEqual( - envelope.tags["ai.operation.id"], - "1bbd944a73a05d89eab5d3740a213ee7", - ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.name, "test") - self.assertEqual( - envelope.data.base_data.data, - "https://www.wikipedia.org/wiki/Rabbit", - ) - self.assertEqual(envelope.data.base_data.target, "www.wikipedia.org") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") - self.assertEqual(envelope.data.base_data.result_code, "200") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.type, "HTTP") - self.assertEqual(envelope.data.base_type, "RemoteDependencyData") + self.assertTrue(envelope.data.base_data.success) + self.assertEqual(envelope.data.base_data.type, "rpc.system") + self.assertEqual(envelope.data.base_data.target, "Test service") - # SpanKind.SERVER HTTP - 200 request + # SpanKind.CLIENT messaging span = trace._Span( name="test", context=SpanContext( @@ -375,49 +365,23 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", - "http.method": "GET", - "http.path": "/wiki/Rabbit", - "http.route": "/wiki/Rabbit", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 200, + "messaging.system": "messaging", + "net.peer.ip": "127.0.0.1", + "messaging.destination": "celery", }, events=None, links=[], - kind=SpanKind.SERVER, + kind=SpanKind.CLIENT, ) - span.status = Status(status_code=StatusCode.OK) span.start(start_time=start_time) span.end(end_time=end_time) + span.status = Status(status_code=StatusCode.OK) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.instrumentation_key, - "12345678-1234-5678-abcd-12345678abcd") - self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.Request" - ) - self.assertEqual( - envelope.tags["ai.operation.parentId"], "a6f5d48acb4d31da" - ) - self.assertEqual( - envelope.tags["ai.operation.id"], - "1bbd944a73a05d89eab5d3740a213ee7", - ) - self.assertEqual( - envelope.tags["ai.operation.name"], "GET /wiki/Rabbit" - ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.response_code, "200") - self.assertEqual(envelope.data.base_data.name, "GET /wiki/Rabbit") - self.assertEqual(envelope.data.base_data.success, True) - self.assertEqual( - envelope.data.base_data.url, - "https://www.wikipedia.org/wiki/Rabbit", - ) - self.assertEqual(envelope.data.base_type, "RequestData") + self.assertTrue(envelope.data.base_data.success) + self.assertEqual(envelope.data.base_data.type, "Queue Message | messaging") + self.assertEqual(envelope.data.base_data.target, "127.0.0.1/celery") - # SpanKind.SERVER HTTP - Failed request + # SpanKind.INTERNAL span = trace._Span( name="test", context=SpanContext( @@ -430,49 +394,22 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", - "http.method": "GET", - "http.path": "/wiki/Rabbit", - "http.route": "/wiki/Rabbit", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, + "messaging.system": "messaging", + "net.peer.ip": "127.0.0.1", + "messaging.destination": "celery", }, events=None, links=[], - kind=SpanKind.SERVER, + kind=SpanKind.INTERNAL, ) - span.status = Status(status_code=StatusCode.OK) span.start(start_time=start_time) span.end(end_time=end_time) + span.status = Status(status_code=StatusCode.OK) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.instrumentation_key, - "12345678-1234-5678-abcd-12345678abcd") - self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.Request" - ) - self.assertEqual( - envelope.tags["ai.operation.parentId"], "a6f5d48acb4d31da" - ) - self.assertEqual( - envelope.tags["ai.operation.id"], - "1bbd944a73a05d89eab5d3740a213ee7", - ) - self.assertEqual( - envelope.tags["ai.operation.name"], "GET /wiki/Rabbit" - ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.response_code, "400") - self.assertEqual(envelope.data.base_data.name, "GET /wiki/Rabbit") - self.assertEqual(envelope.data.base_data.success, False) - self.assertEqual( - envelope.data.base_data.url, - "https://www.wikipedia.org/wiki/Rabbit", - ) - self.assertEqual(envelope.data.base_type, "RequestData") + self.assertTrue(envelope.data.base_data.success) + self.assertEqual(envelope.data.base_data.type, "InProc") - # SpanKind.SERVER unknown type + # SpanKind.SERVER HTTP span = trace._Span( name="test", context=SpanContext( @@ -485,12 +422,11 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", "http.method": "GET", "http.path": "/wiki/Rabbit", "http.route": "/wiki/Rabbit", "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, + "http.status_code": 200, }, events=None, links=[], @@ -512,52 +448,25 @@ def test_span_to_envelope(self): envelope.tags["ai.operation.id"], "1bbd944a73a05d89eab5d3740a213ee7", ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") + self.assertEqual(envelope.data.base_type, "RequestData") + self.assertEqual(envelope.data.base_data.name, "test") self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_type, "RequestData") - - # SpanKind.INTERNAL - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=None, - sampler=None, - trace_config=None, - resource=None, - attributes={"key1": "value1"}, - events=None, - links=[], - kind=SpanKind.INTERNAL, - ) - span.status = Status(status_code=StatusCode.OK) - span.start(start_time=start_time) - span.end(end_time=end_time) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.instrumentation_key, - "12345678-1234-5678-abcd-12345678abcd") + self.assertEqual(envelope.data.base_data.response_code, "200") + self.assertTrue(envelope.data.base_data.success) self.assertEqual( - envelope.name, "Microsoft.ApplicationInsights.RemoteDependency" + envelope.tags["ai.operation.name"], "/wiki/Rabbit" ) - self.assertRaises( - KeyError, lambda: envelope.tags["ai.operation.parentId"] + self.assertEqual( + envelope.data.base_data.url, + "https://www.wikipedia.org/wiki/Rabbit", ) self.assertEqual( - envelope.tags["ai.operation.id"], - "1bbd944a73a05d89eab5d3740a213ee7", + envelope.data.base_data.properties["request.url"], + "https://www.wikipedia.org/wiki/Rabbit", ) - self.assertEqual(envelope.time, "2019-12-04T21:18:36.027613Z") - self.assertEqual(envelope.data.base_data.name, "test") - self.assertEqual(envelope.data.base_data.duration, "0.00:00:01.001") - self.assertEqual(envelope.data.base_data.id, "a6f5d48acb4d31d9") - self.assertEqual(envelope.data.base_data.type, "InProc") - self.assertEqual(envelope.data.base_type, "RemoteDependencyData") - # Attributes + # SpanKind.SERVER messaging span = trace._Span( name="test", context=SpanContext( @@ -570,37 +479,27 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 200, - "test": "asd", + "messaging.system": "messaging", + "net.peer.name": "test name", + "net.peer.ip": "127.0.0.1", + "messaging.destination": "celery", }, events=None, links=[], - kind=SpanKind.CLIENT, + kind=SpanKind.SERVER, ) span.status = Status(status_code=StatusCode.OK) span.start(start_time=start_time) span.end(end_time=end_time) envelope = exporter._span_to_envelope(span) - self.assertEqual(len(envelope.data.base_data.properties), 2) + self.assertEqual(envelope.data.base_data.name, "test") + self.assertEqual(envelope.tags["ai.operation.name"], "test") self.assertEqual( - envelope.data.base_data.properties["component"], "http" + envelope.data.base_data.properties["source"], + "test name/celery", ) - self.assertEqual(envelope.data.base_data.properties["test"], "asd") - # Links - links = [] - links.append( - Link( - context=SpanContext( - trace_id=36873507687745823477771305566750195432, - span_id=12030755672171557338, - is_remote=False, - ) - ) - ) + # Status/success error span = trace._Span( name="test", context=SpanContext( @@ -613,82 +512,22 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", + "test": "asd", "http.method": "GET", "http.url": "https://www.wikipedia.org/wiki/Rabbit", "http.status_code": 200, }, events=None, - links=links, - kind=SpanKind.CLIENT, - ) - span.status = Status(status_code=StatusCode.OK) - span.start(start_time=start_time) - span.end(end_time=end_time) - envelope = exporter._span_to_envelope(span) - self.assertEqual(len(envelope.data.base_data.properties), 2) - json_dict = json.loads( - envelope.data.base_data.properties["_MS.links"] - )[0] - self.assertEqual(json_dict["id"], "a6f5d48acb4d31da") - - # Status - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "http", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 500, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.status = Status(status_code=StatusCode.OK) - span.start(start_time=start_time) - span.end(end_time=end_time) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.response_code, "500") - self.assertFalse(envelope.data.base_data.success) - - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "http", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 500, - }, - events=None, links=[], kind=SpanKind.CLIENT, ) - span.status = Status(status_code=StatusCode.OK) + span.status = Status(status_code=StatusCode.ERROR) span.start(start_time=start_time) span.end(end_time=end_time) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.result_code, "500") self.assertFalse(envelope.data.base_data.success) + # Properties span = trace._Span( name="test", context=SpanContext( @@ -701,36 +540,10 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.status = Status(status_code=StatusCode.OK) - span.start(start_time=start_time) - span.end(end_time=end_time) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.response_code, "0") - self.assertTrue(envelope.data.base_data.success) - - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "http", + "test": "asd", "http.method": "GET", "http.url": "https://www.wikipedia.org/wiki/Rabbit", + "http.status_code": 200, }, events=None, links=[], @@ -740,36 +553,20 @@ def test_span_to_envelope(self): span.start(start_time=start_time) span.end(end_time=end_time) envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.result_code, "0") - self.assertTrue(envelope.data.base_data.success) + self.assertEqual(len(envelope.data.base_data.properties), 1) + self.assertEqual(envelope.data.base_data.properties["test"], "asd") - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "http", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - }, - events=None, - links=[], - kind=SpanKind.SERVER, + # Links + links = [] + links.append( + Link( + context=SpanContext( + trace_id=36873507687745823477771305566750195432, + span_id=12030755672171557338, + is_remote=False, + ) + ) ) - span.start(start_time=start_time) - span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.UNSET) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.response_code, "1") - self.assertFalse(envelope.data.base_data.success) - span = trace._Span( name="test", context=SpanContext( @@ -782,185 +579,20 @@ def test_span_to_envelope(self): trace_config=None, resource=None, attributes={ - "component": "http", "http.method": "GET", "http.url": "https://www.wikipedia.org/wiki/Rabbit", + "http.status_code": 200, }, events=None, - links=[], + links=links, kind=SpanKind.CLIENT, ) - span.start(start_time=start_time) - span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.UNSET) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.result_code, "1") - self.assertFalse(envelope.data.base_data.success) - - # Server route attribute - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "HTTP", - "http.method": "GET", - "http.route": "/wiki/Rabbit", - "http.path": "/wiki/Rabbitz", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.start(start_time=start_time) - span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.OK) - envelope = exporter._span_to_envelope(span) - self.assertEqual( - envelope.data.base_data.properties["request.name"], - "GET /wiki/Rabbit", - ) - self.assertEqual( - envelope.data.base_data.properties["request.url"], - "https://www.wikipedia.org/wiki/Rabbit", - ) - - # Server method attribute missing - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "HTTP", - "http.path": "/wiki/Rabbitz", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.start(start_time=start_time) - span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.OK) - envelope = exporter._span_to_envelope(span) - self.assertIsNone(envelope.data.base_data.name) - - # Server route attribute missing - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "HTTP", - "http.method": "GET", - "http.path": "/wiki/Rabbitz", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.start(start_time=start_time) - span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.OK) - envelope = exporter._span_to_envelope(span) - self.assertEqual(envelope.data.base_data.name, "GET") - self.assertEqual( - envelope.data.base_data.properties["request.name"], - "GET /wiki/Rabbitz", - ) - self.assertEqual( - envelope.data.base_data.properties["request.url"], - "https://www.wikipedia.org/wiki/Rabbit", - ) - - # Server route and path attribute missing - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "HTTP", - "http.method": "GET", - "http.url": "https://www.wikipedia.org/wiki/Rabbit", - "http.status_code": 400, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) - span.start(start_time=start_time) - span.end(end_time=end_time) span.status = Status(status_code=StatusCode.OK) - envelope = exporter._span_to_envelope(span) - self.assertIsNone( - envelope.data.base_data.properties.get("request.name") - ) - self.assertEqual( - envelope.data.base_data.properties["request.url"], - "https://www.wikipedia.org/wiki/Rabbit", - ) - - # Server http.url missing - span = trace._Span( - name="test", - context=SpanContext( - trace_id=36873507687745823477771305566750195431, - span_id=12030755672171557337, - is_remote=False, - ), - parent=parent_span, - sampler=None, - trace_config=None, - resource=None, - attributes={ - "component": "HTTP", - "http.method": "GET", - "http.route": "/wiki/Rabbit", - "http.path": "/wiki/Rabbitz", - "http.status_code": 400, - }, - events=None, - links=[], - kind=SpanKind.SERVER, - ) span.start(start_time=start_time) span.end(end_time=end_time) - span.status = Status(status_code=StatusCode.OK) envelope = exporter._span_to_envelope(span) - self.assertIsNone(envelope.data.base_data.url) - self.assertIsNone( - envelope.data.base_data.properties.get("request.url") - ) + self.assertEqual(len(envelope.data.base_data.properties), 1) + json_dict = json.loads( + envelope.data.base_data.properties["_MS.links"] + )[0] + self.assertEqual(json_dict["id"], "a6f5d48acb4d31da")