Re-add `http.target` to Django old sem conv server duration metric (#2746)

This commit is contained in:
Leighton Chen 2024-07-30 09:55:28 -07:00 committed by GitHub
parent 35cc6f2854
commit b65f67ded5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 168 additions and 144 deletions

View File

@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Fixed
- `opentelemetry-instrumentation-django` Fix regression - `http.target` re-added back to old semconv duration metrics
([#2746](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2746))
## Version 1.26.0/0.47b0 (2024-07-23)
### Added

View File

@ -333,6 +333,7 @@ class _DjangoMiddleware(MiddlewareMixin):
# pylint: disable=too-many-branches
# pylint: disable=too-many-locals
# pylint: disable=too-many-statements
def process_response(self, request, response):
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):
return response
@ -426,6 +427,10 @@ class _DjangoMiddleware(MiddlewareMixin):
duration_attrs_old = _parse_duration_attrs(
duration_attrs, _HTTPStabilityMode.DEFAULT
)
# http.target to be included in old semantic conventions
target = duration_attrs.get(SpanAttributes.HTTP_TARGET)
if target:
duration_attrs_old[SpanAttributes.HTTP_TARGET] = target
self._duration_histogram_old.record(
max(round(duration_s * 1000), 0), duration_attrs_old
)

View File

@ -28,10 +28,6 @@ from opentelemetry import trace
from opentelemetry.instrumentation._semconv import (
OTEL_SEMCONV_STABILITY_OPT_IN,
_OpenTelemetrySemanticConventionStability,
_server_active_requests_count_attrs_new,
_server_active_requests_count_attrs_old,
_server_duration_attrs_new,
_server_duration_attrs_old,
)
from opentelemetry.instrumentation.django import (
DjangoInstrumentor,
@ -48,24 +44,6 @@ from opentelemetry.sdk.metrics.export import (
)
from opentelemetry.sdk.trace import Span
from opentelemetry.sdk.trace.id_generator import RandomIdGenerator
from opentelemetry.semconv.attributes.client_attributes import CLIENT_ADDRESS
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
from opentelemetry.semconv.attributes.exception_attributes import (
EXCEPTION_MESSAGE,
EXCEPTION_TYPE,
)
from opentelemetry.semconv.attributes.http_attributes import (
HTTP_REQUEST_METHOD,
HTTP_REQUEST_METHOD_ORIGINAL,
HTTP_RESPONSE_STATUS_CODE,
HTTP_ROUTE,
)
from opentelemetry.semconv.attributes.network_attributes import (
NETWORK_PROTOCOL_VERSION,
)
from opentelemetry.semconv.attributes.server_attributes import SERVER_PORT
from opentelemetry.semconv.attributes.url_attributes import URL_SCHEME
from opentelemetry.semconv.trace import SpanAttributes
from opentelemetry.test.wsgitestutil import WsgiTestBase
from opentelemetry.trace import (
SpanKind,
@ -197,18 +175,18 @@ class TestMiddleware(WsgiTestBase):
)
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
self.assertEqual(span.attributes["http.method"], "GET")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/route/2020/template/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE],
span.attributes["http.route"],
"^route/(?P<year>[0-9]{4})/template/$",
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 200)
def test_traced_get(self):
Client().get("/traced/")
@ -221,17 +199,15 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^traced/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
self.assertEqual(span.attributes["http.method"], "GET")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/traced/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE], "^traced/"
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 200)
def test_traced_get_new_semconv(self):
Client().get("/traced/")
@ -244,14 +220,14 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^traced/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[SERVER_PORT], 80)
self.assertEqual(span.attributes[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(span.attributes[NETWORK_PROTOCOL_VERSION], "1.1")
self.assertEqual(span.attributes["http.request.method"], "GET")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["server.port"], 80)
self.assertEqual(span.attributes["client.address"], "127.0.0.1")
self.assertEqual(span.attributes["network.protocol.version"], "1.1")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.response.status_code"], 200)
def test_traced_get_both_semconv(self):
Client().get("/traced/")
@ -264,25 +240,23 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^traced/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
self.assertEqual(span.attributes["http.method"], "GET")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/traced/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE], "^traced/"
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[SERVER_PORT], 80)
self.assertEqual(span.attributes[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(span.attributes[NETWORK_PROTOCOL_VERSION], "1.1")
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 200)
self.assertEqual(span.attributes["http.request.method"], "GET")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["server.port"], 80)
self.assertEqual(span.attributes["client.address"], "127.0.0.1")
self.assertEqual(span.attributes["network.protocol.version"], "1.1")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.response.status_code"], 200)
def test_not_recording(self):
mock_tracer = Mock()
@ -318,17 +292,15 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "POST ^traced/" if DJANGO_2_2 else "POST")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "POST")
self.assertEqual(span.attributes["http.method"], "POST")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/traced/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE], "^traced/"
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 200)
def test_traced_post_new_semconv(self):
Client().post("/traced/")
@ -341,14 +313,14 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "POST ^traced/" if DJANGO_2_2 else "POST")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "POST")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[SERVER_PORT], 80)
self.assertEqual(span.attributes[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(span.attributes[NETWORK_PROTOCOL_VERSION], "1.1")
self.assertEqual(span.attributes["http.request.method"], "POST")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["server.port"], 80)
self.assertEqual(span.attributes["client.address"], "127.0.0.1")
self.assertEqual(span.attributes["network.protocol.version"], "1.1")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.response.status_code"], 200)
def test_traced_post_both_semconv(self):
Client().post("/traced/")
@ -361,21 +333,21 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "POST ^traced/" if DJANGO_2_2 else "POST")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.UNSET)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "POST")
self.assertEqual(span.attributes["http.method"], "POST")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/traced/",
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 200)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "POST")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[SERVER_PORT], 80)
self.assertEqual(span.attributes[CLIENT_ADDRESS], "127.0.0.1")
self.assertEqual(span.attributes[NETWORK_PROTOCOL_VERSION], "1.1")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 200)
self.assertEqual(span.attributes["http.request.method"], "POST")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["server.port"], 80)
self.assertEqual(span.attributes["client.address"], "127.0.0.1")
self.assertEqual(span.attributes["network.protocol.version"], "1.1")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^traced/")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 200)
self.assertEqual(span.attributes["http.route"], "^traced/")
self.assertEqual(span.attributes["http.response.status_code"], 200)
def test_error(self):
with self.assertRaises(ValueError):
@ -389,27 +361,21 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^error/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.ERROR)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
self.assertEqual(span.attributes["http.method"], "GET")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/error/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE], "^error/"
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 500)
self.assertEqual(span.attributes["http.route"], "^error/")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 500)
self.assertEqual(len(span.events), 1)
event = span.events[0]
self.assertEqual(event.name, "exception")
self.assertEqual(
event.attributes[SpanAttributes.EXCEPTION_TYPE], "ValueError"
)
self.assertEqual(
event.attributes[SpanAttributes.EXCEPTION_MESSAGE], "error"
)
self.assertEqual(event.attributes["exception.type"], "ValueError")
self.assertEqual(event.attributes["exception.message"], "error")
def test_error_new_semconv(self):
with self.assertRaises(ValueError):
@ -423,18 +389,18 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^error/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.ERROR)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
self.assertEqual(span.attributes["http.request.method"], "GET")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^error/")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 500)
self.assertEqual(span.attributes["http.route"], "^error/")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["http.response.status_code"], 500)
self.assertEqual(len(span.events), 1)
event = span.events[0]
self.assertEqual(event.name, "exception")
self.assertEqual(event.attributes[EXCEPTION_TYPE], "ValueError")
self.assertEqual(event.attributes[EXCEPTION_MESSAGE], "error")
self.assertEqual(span.attributes[ERROR_TYPE], "500")
self.assertEqual(event.attributes["exception.type"], "ValueError")
self.assertEqual(event.attributes["exception.message"], "error")
self.assertEqual(span.attributes["error.type"], "500")
def test_error_both_semconv(self):
with self.assertRaises(ValueError):
@ -448,29 +414,27 @@ class TestMiddleware(WsgiTestBase):
self.assertEqual(span.name, "GET ^error/" if DJANGO_2_2 else "GET")
self.assertEqual(span.kind, SpanKind.SERVER)
self.assertEqual(span.status.status_code, StatusCode.ERROR)
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "GET")
self.assertEqual(span.attributes["http.method"], "GET")
self.assertEqual(
span.attributes[SpanAttributes.HTTP_URL],
span.attributes["http.url"],
"http://testserver/error/",
)
if DJANGO_2_2:
self.assertEqual(
span.attributes[SpanAttributes.HTTP_ROUTE], "^error/"
)
self.assertEqual(span.attributes[SpanAttributes.HTTP_SCHEME], "http")
self.assertEqual(span.attributes[SpanAttributes.HTTP_STATUS_CODE], 500)
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "GET")
self.assertEqual(span.attributes["http.route"], "^error/")
self.assertEqual(span.attributes["http.scheme"], "http")
self.assertEqual(span.attributes["http.status_code"], 500)
self.assertEqual(span.attributes["http.request.method"], "GET")
if DJANGO_2_2:
self.assertEqual(span.attributes[HTTP_ROUTE], "^error/")
self.assertEqual(span.attributes[URL_SCHEME], "http")
self.assertEqual(span.attributes[HTTP_RESPONSE_STATUS_CODE], 500)
self.assertEqual(span.attributes["http.route"], "^error/")
self.assertEqual(span.attributes["url.scheme"], "http")
self.assertEqual(span.attributes["http.response.status_code"], 500)
self.assertEqual(len(span.events), 1)
event = span.events[0]
self.assertEqual(event.name, "exception")
self.assertEqual(event.attributes[EXCEPTION_TYPE], "ValueError")
self.assertEqual(event.attributes[EXCEPTION_MESSAGE], "error")
self.assertEqual(span.attributes[ERROR_TYPE], "500")
self.assertEqual(event.attributes["exception.type"], "ValueError")
self.assertEqual(event.attributes["exception.message"], "error")
self.assertEqual(span.attributes["error.type"], "500")
def test_exclude_lists(self):
client = Client()
@ -545,7 +509,7 @@ class TestMiddleware(WsgiTestBase):
span = span_list[0]
self.assertEqual(span.name, "HTTP")
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "_OTHER")
self.assertEqual(span.attributes["http.method"], "_OTHER")
def test_nonstandard_http_method_span_name_new_semconv(self):
Client().request(
@ -556,9 +520,9 @@ class TestMiddleware(WsgiTestBase):
span = span_list[0]
self.assertEqual(span.name, "HTTP")
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "_OTHER")
self.assertEqual(span.attributes["http.request.method"], "_OTHER")
self.assertEqual(
span.attributes[HTTP_REQUEST_METHOD_ORIGINAL], "NONSTANDARD"
span.attributes["http.request.method_original"], "NONSTANDARD"
)
def test_nonstandard_http_method_span_name_both_semconv(self):
@ -570,10 +534,10 @@ class TestMiddleware(WsgiTestBase):
span = span_list[0]
self.assertEqual(span.name, "HTTP")
self.assertEqual(span.attributes[SpanAttributes.HTTP_METHOD], "_OTHER")
self.assertEqual(span.attributes[HTTP_REQUEST_METHOD], "_OTHER")
self.assertEqual(span.attributes["http.method"], "_OTHER")
self.assertEqual(span.attributes["http.request.method"], "_OTHER")
self.assertEqual(
span.attributes[HTTP_REQUEST_METHOD_ORIGINAL], "NONSTANDARD"
span.attributes["http.request.method_original"], "NONSTANDARD"
)
def test_traced_request_attrs(self):
@ -711,9 +675,20 @@ class TestMiddleware(WsgiTestBase):
"http.server.active_requests",
"http.server.duration",
]
_recommended_attrs = {
"http.server.active_requests": _server_active_requests_count_attrs_old,
"http.server.duration": _server_duration_attrs_old,
expected_duration_attributes = {
"http.method": "GET",
"http.scheme": "http",
"http.flavor": "1.1",
"http.server_name": "testserver",
"net.host.port": 80,
"http.status_code": 200,
"http.target": "^span_name/([0-9]{4})/$",
}
expected_requests_count_attributes = {
"http.method": "GET",
"http.scheme": "http",
"http.flavor": "1.1",
"http.server_name": "testserver",
}
start = default_timer()
for _ in range(3):
@ -740,12 +715,16 @@ class TestMiddleware(WsgiTestBase):
self.assertAlmostEqual(
duration, point.sum, delta=100
)
self.assertDictEqual(
expected_duration_attributes,
dict(point.attributes),
)
if isinstance(point, NumberDataPoint):
number_data_point_seen = True
self.assertEqual(point.value, 0)
for attr in point.attributes:
self.assertIn(
attr, _recommended_attrs[metric.name]
self.assertDictEqual(
expected_requests_count_attributes,
dict(point.attributes),
)
self.assertTrue(histrogram_data_point_seen and number_data_point_seen)
@ -755,9 +734,16 @@ class TestMiddleware(WsgiTestBase):
"http.server.active_requests",
"http.server.request.duration",
]
_recommended_attrs = {
"http.server.active_requests": _server_active_requests_count_attrs_new,
"http.server.request.duration": _server_duration_attrs_new,
expected_duration_attributes = {
"http.request.method": "GET",
"url.scheme": "http",
"network.protocol.version": "1.1",
"http.response.status_code": 200,
"http.route": "^span_name/([0-9]{4})/$",
}
expected_requests_count_attributes = {
"http.request.method": "GET",
"url.scheme": "http",
}
start = default_timer()
for _ in range(3):
@ -784,12 +770,16 @@ class TestMiddleware(WsgiTestBase):
self.assertAlmostEqual(
duration_s, point.sum, places=1
)
self.assertDictEqual(
expected_duration_attributes,
dict(point.attributes),
)
if isinstance(point, NumberDataPoint):
number_data_point_seen = True
self.assertEqual(point.value, 0)
for attr in point.attributes:
self.assertIn(
attr, _recommended_attrs[metric.name]
self.assertDictEqual(
expected_requests_count_attributes,
dict(point.attributes),
)
self.assertTrue(histrogram_data_point_seen and number_data_point_seen)
@ -801,12 +791,29 @@ class TestMiddleware(WsgiTestBase):
"http.server.active_requests",
"http.server.request.duration",
]
active_count_both_attrs = list(_server_active_requests_count_attrs_new)
active_count_both_attrs.extend(_server_active_requests_count_attrs_old)
_recommended_attrs = {
"http.server.active_requests": active_count_both_attrs,
"http.server.request.duration": _server_duration_attrs_new,
"http.server.duration": _server_duration_attrs_old,
expected_duration_attributes_old = {
"http.method": "GET",
"http.scheme": "http",
"http.flavor": "1.1",
"http.server_name": "testserver",
"net.host.port": 80,
"http.status_code": 200,
"http.target": "^span_name/([0-9]{4})/$",
}
expected_duration_attributes_new = {
"http.request.method": "GET",
"url.scheme": "http",
"network.protocol.version": "1.1",
"http.response.status_code": 200,
"http.route": "^span_name/([0-9]{4})/$",
}
expected_requests_count_attributes = {
"http.method": "GET",
"http.scheme": "http",
"http.flavor": "1.1",
"http.server_name": "testserver",
"http.request.method": "GET",
"url.scheme": "http",
}
start = default_timer()
for _ in range(3):
@ -835,16 +842,24 @@ class TestMiddleware(WsgiTestBase):
self.assertAlmostEqual(
duration_s, point.sum, places=1
)
self.assertDictEqual(
expected_duration_attributes_new,
dict(point.attributes),
)
elif metric.name == "http.server.duration":
self.assertAlmostEqual(
duration, point.sum, delta=100
)
self.assertDictEqual(
expected_duration_attributes_old,
dict(point.attributes),
)
if isinstance(point, NumberDataPoint):
number_data_point_seen = True
self.assertEqual(point.value, 0)
for attr in point.attributes:
self.assertIn(
attr, _recommended_attrs[metric.name]
self.assertDictEqual(
expected_requests_count_attributes,
dict(point.attributes),
)
self.assertTrue(histrogram_data_point_seen and number_data_point_seen)
@ -911,9 +926,7 @@ class TestMiddlewareWithTracerProvider(WsgiTestBase):
Client().get("/span_name/1234/")
span_list = self.exporter.get_finished_spans()
print(span_list)
self.assertEqual(
span_list[0].attributes[SpanAttributes.HTTP_STATUS_CODE], 200
)
self.assertEqual(span_list[0].attributes["http.status_code"], 200)
self.assertEqual(trace.SpanKind.INTERNAL, span_list[0].kind)
self.assertEqual(
parent_span.get_span_context().span_id,

View File

@ -395,6 +395,7 @@ def _rewrapped_app(
)
if request_route:
# http.target to be included in old semantic conventions
duration_attrs_old[SpanAttributes.HTTP_TARGET] = str(
request_route
)