Skip to content

Commit 1bc607d

Browse files
lzchenxrmx
authored andcommitted
Fix http.host and net.peer.ip new http semconv mapping (open-telemetry#2814)
1 parent 8064f14 commit 1bc607d

File tree

8 files changed

+59
-48
lines changed
  • instrumentation
    • opentelemetry-instrumentation-asgi
    • opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx
    • opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests
    • opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3
    • opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi
  • opentelemetry-instrumentation/src/opentelemetry/instrumentation

8 files changed

+59
-48
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4040
([#2792](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2792))
4141
- `opentelemetry-instrumentation-tornado` Handle http client exception and record exception info into span
4242
([#2563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2563))
43+
- `opentelemetry-instrumentation` fix `http.host` new http semantic convention mapping to depend on `kind` of span
44+
([#2814](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2814))
4345

4446
## Version 1.26.0/0.47b0 (2024-07-23)
4547

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

+6-4
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
215215
_server_duration_attrs_new,
216216
_server_duration_attrs_old,
217217
_set_http_flavor_version,
218-
_set_http_host,
218+
_set_http_host_server,
219219
_set_http_method,
220220
_set_http_net_host_port,
221-
_set_http_peer_ip,
221+
_set_http_peer_ip_server,
222222
_set_http_peer_port_server,
223223
_set_http_scheme,
224224
_set_http_target,
@@ -342,7 +342,7 @@ def collect_request_attributes(
342342
if scheme:
343343
_set_http_scheme(result, scheme, sem_conv_opt_in_mode)
344344
if server_host:
345-
_set_http_host(result, server_host, sem_conv_opt_in_mode)
345+
_set_http_host_server(result, server_host, sem_conv_opt_in_mode)
346346
if port:
347347
_set_http_net_host_port(result, port, sem_conv_opt_in_mode)
348348
flavor = scope.get("http_version")
@@ -380,7 +380,9 @@ def collect_request_attributes(
380380
_set_http_user_agent(result, http_user_agent[0], sem_conv_opt_in_mode)
381381

382382
if "client" in scope and scope["client"] is not None:
383-
_set_http_peer_ip(result, scope.get("client")[0], sem_conv_opt_in_mode)
383+
_set_http_peer_ip_server(
384+
result, scope.get("client")[0], sem_conv_opt_in_mode
385+
)
384386
_set_http_peer_port_server(
385387
result, scope.get("client")[1], sem_conv_opt_in_mode
386388
)

instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py

+5-14
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@
5353
from opentelemetry.semconv.attributes.network_attributes import (
5454
NETWORK_PROTOCOL_VERSION,
5555
)
56-
from opentelemetry.semconv.attributes.server_attributes import (
57-
SERVER_ADDRESS,
58-
SERVER_PORT,
59-
)
56+
from opentelemetry.semconv.attributes.server_attributes import SERVER_PORT
6057
from opentelemetry.semconv.attributes.url_attributes import (
6158
URL_PATH,
6259
URL_QUERY,
@@ -406,7 +403,6 @@ def validate_outputs(
406403
HTTP_REQUEST_METHOD: "GET",
407404
URL_SCHEME: "http",
408405
SERVER_PORT: 80,
409-
SERVER_ADDRESS: "127.0.0.1",
410406
NETWORK_PROTOCOL_VERSION: "1.0",
411407
URL_PATH: "/",
412408
CLIENT_ADDRESS: "127.0.0.1",
@@ -442,7 +438,6 @@ def validate_outputs(
442438
HTTP_REQUEST_METHOD: "GET",
443439
URL_SCHEME: "http",
444440
SERVER_PORT: 80,
445-
SERVER_ADDRESS: "127.0.0.1",
446441
NETWORK_PROTOCOL_VERSION: "1.0",
447442
URL_PATH: "/",
448443
CLIENT_ADDRESS: "127.0.0.1",
@@ -688,7 +683,7 @@ def test_behavior_with_scope_server_as_none_new_semconv(self):
688683
def update_expected_server(expected):
689684
expected[3]["attributes"].update(
690685
{
691-
SERVER_ADDRESS: "0.0.0.0",
686+
CLIENT_ADDRESS: "0.0.0.0",
692687
SERVER_PORT: 80,
693688
}
694689
)
@@ -715,7 +710,7 @@ def update_expected_server(expected):
715710
SpanAttributes.HTTP_HOST: "0.0.0.0",
716711
SpanAttributes.NET_HOST_PORT: 80,
717712
SpanAttributes.HTTP_URL: "http://0.0.0.0/",
718-
SERVER_ADDRESS: "0.0.0.0",
713+
CLIENT_ADDRESS: "0.0.0.0",
719714
SERVER_PORT: 80,
720715
}
721716
)
@@ -1001,7 +996,6 @@ def test_websocket_new_semconv(self):
1001996
"attributes": {
1002997
URL_SCHEME: self.scope["scheme"],
1003998
SERVER_PORT: self.scope["server"][1],
1004-
SERVER_ADDRESS: self.scope["server"][0],
1005999
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
10061000
URL_PATH: self.scope["path"],
10071001
CLIENT_ADDRESS: self.scope["client"][0],
@@ -1086,7 +1080,6 @@ def test_websocket_both_semconv(self):
10861080
SpanAttributes.HTTP_METHOD: self.scope["method"],
10871081
URL_SCHEME: self.scope["scheme"],
10881082
SERVER_PORT: self.scope["server"][1],
1089-
SERVER_ADDRESS: self.scope["server"][0],
10901083
NETWORK_PROTOCOL_VERSION: self.scope["http_version"],
10911084
URL_PATH: self.scope["path"],
10921085
CLIENT_ADDRESS: self.scope["client"][0],
@@ -1629,7 +1622,6 @@ def test_request_attributes_new_semconv(self):
16291622
attrs,
16301623
{
16311624
HTTP_REQUEST_METHOD: "GET",
1632-
SERVER_ADDRESS: "127.0.0.1",
16331625
URL_PATH: "/",
16341626
URL_QUERY: "foo=bar",
16351627
SERVER_PORT: 80,
@@ -1665,7 +1657,6 @@ def test_request_attributes_both_semconv(self):
16651657
SpanAttributes.NET_PEER_IP: "127.0.0.1",
16661658
SpanAttributes.NET_PEER_PORT: 32767,
16671659
HTTP_REQUEST_METHOD: "GET",
1668-
SERVER_ADDRESS: "127.0.0.1",
16691660
URL_PATH: "/",
16701661
URL_QUERY: "foo=bar",
16711662
SERVER_PORT: 80,
@@ -1690,7 +1681,7 @@ def test_query_string_new_semconv(self):
16901681
_HTTPStabilityMode.HTTP,
16911682
)
16921683
self.assertEqual(attrs[URL_SCHEME], "http")
1693-
self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
1684+
self.assertEqual(attrs[CLIENT_ADDRESS], "127.0.0.1")
16941685
self.assertEqual(attrs[URL_PATH], "/")
16951686
self.assertEqual(attrs[URL_QUERY], "foo=bar")
16961687

@@ -1704,7 +1695,7 @@ def test_query_string_both_semconv(self):
17041695
attrs[SpanAttributes.HTTP_URL], "http://127.0.0.1/?foo=bar"
17051696
)
17061697
self.assertEqual(attrs[URL_SCHEME], "http")
1707-
self.assertEqual(attrs[SERVER_ADDRESS], "127.0.0.1")
1698+
self.assertEqual(attrs[CLIENT_ADDRESS], "127.0.0.1")
17081699
self.assertEqual(attrs[URL_PATH], "/")
17091700
self.assertEqual(attrs[URL_QUERY], "foo=bar")
17101701

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ async def async_response_hook(span, request, response):
202202
_OpenTelemetrySemanticConventionStability,
203203
_OpenTelemetryStabilitySignalType,
204204
_report_new,
205-
_set_http_host,
205+
_set_http_host_client,
206206
_set_http_method,
207207
_set_http_network_protocol_version,
208208
_set_http_peer_port_client,
@@ -342,7 +342,7 @@ def _apply_request_client_attributes_to_span(
342342
if _report_new(semconv):
343343
if url.host:
344344
# http semconv transition: http.host -> server.address
345-
_set_http_host(span_attributes, url.host, semconv)
345+
_set_http_host_client(span_attributes, url.host, semconv)
346346
# http semconv transition: net.sock.peer.addr -> network.peer.address
347347
span_attributes[NETWORK_PEER_ADDRESS] = url.host
348348
if url.port:

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def response_hook(span, request_obj, response)
9292
_OpenTelemetryStabilitySignalType,
9393
_report_new,
9494
_report_old,
95-
_set_http_host,
95+
_set_http_host_client,
9696
_set_http_method,
9797
_set_http_net_peer_name_client,
9898
_set_http_network_protocol_version,
@@ -212,14 +212,14 @@ def get_or_create_headers():
212212
metric_labels, parsed_url.scheme, sem_conv_opt_in_mode
213213
)
214214
if parsed_url.hostname:
215-
_set_http_host(
215+
_set_http_host_client(
216216
metric_labels, parsed_url.hostname, sem_conv_opt_in_mode
217217
)
218218
_set_http_net_peer_name_client(
219219
metric_labels, parsed_url.hostname, sem_conv_opt_in_mode
220220
)
221221
if _report_new(sem_conv_opt_in_mode):
222-
_set_http_host(
222+
_set_http_host_client(
223223
span_attributes,
224224
parsed_url.hostname,
225225
sem_conv_opt_in_mode,

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def response_hook(
103103
_OpenTelemetryStabilitySignalType,
104104
_report_new,
105105
_report_old,
106-
_set_http_host,
106+
_set_http_host_client,
107107
_set_http_method,
108108
_set_http_net_peer_name_client,
109109
_set_http_network_protocol_version,
@@ -491,7 +491,9 @@ def _set_metric_attributes(
491491
sem_conv_opt_in_mode: _HTTPStabilityMode = _HTTPStabilityMode.DEFAULT,
492492
) -> None:
493493

494-
_set_http_host(metric_attributes, instance.host, sem_conv_opt_in_mode)
494+
_set_http_host_client(
495+
metric_attributes, instance.host, sem_conv_opt_in_mode
496+
)
495497
_set_http_scheme(metric_attributes, instance.scheme, sem_conv_opt_in_mode)
496498
_set_http_method(
497499
metric_attributes,

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he
231231
_set_http_net_host,
232232
_set_http_net_host_port,
233233
_set_http_net_peer_name_server,
234-
_set_http_peer_ip,
234+
_set_http_peer_ip_server,
235235
_set_http_peer_port_server,
236236
_set_http_scheme,
237237
_set_http_target,
@@ -360,7 +360,7 @@ def collect_request_attributes(
360360

361361
remote_addr = environ.get("REMOTE_ADDR")
362362
if remote_addr:
363-
_set_http_peer_ip(result, remote_addr, sem_conv_opt_in_mode)
363+
_set_http_peer_ip_server(result, remote_addr, sem_conv_opt_in_mode)
364364

365365
peer_port = environ.get("REMOTE_PORT")
366366
if peer_port:

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_semconv.py

+35-21
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,32 @@ def _set_http_scheme(result, scheme, sem_conv_opt_in_mode):
252252
set_string_attribute(result, URL_SCHEME, scheme)
253253

254254

255-
def _set_http_host(result, host, sem_conv_opt_in_mode):
255+
def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
256256
if _report_old(sem_conv_opt_in_mode):
257-
set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
257+
set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
258258
if _report_new(sem_conv_opt_in_mode):
259-
set_string_attribute(result, SERVER_ADDRESS, host)
259+
set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
260+
261+
262+
def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
263+
if _report_old(sem_conv_opt_in_mode):
264+
set_string_attribute(
265+
result, SpanAttributes.HTTP_USER_AGENT, user_agent
266+
)
267+
if _report_new(sem_conv_opt_in_mode):
268+
set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
260269

261270

262271
# Client
263272

264273

274+
def _set_http_host_client(result, host, sem_conv_opt_in_mode):
275+
if _report_old(sem_conv_opt_in_mode):
276+
set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
277+
if _report_new(sem_conv_opt_in_mode):
278+
set_string_attribute(result, SERVER_ADDRESS, host)
279+
280+
265281
def _set_http_net_peer_name_client(result, peer_name, sem_conv_opt_in_mode):
266282
if _report_old(sem_conv_opt_in_mode):
267283
set_string_attribute(result, SpanAttributes.NET_PEER_NAME, peer_name)
@@ -310,27 +326,32 @@ def _set_http_target(result, target, path, query, sem_conv_opt_in_mode):
310326
set_string_attribute(result, URL_QUERY, query)
311327

312328

313-
def _set_http_peer_ip(result, ip, sem_conv_opt_in_mode):
329+
def _set_http_host_server(result, host, sem_conv_opt_in_mode):
314330
if _report_old(sem_conv_opt_in_mode):
315-
set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
331+
set_string_attribute(result, SpanAttributes.HTTP_HOST, host)
316332
if _report_new(sem_conv_opt_in_mode):
317-
set_string_attribute(result, CLIENT_ADDRESS, ip)
333+
set_string_attribute(result, CLIENT_ADDRESS, host)
318334

319335

320-
def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
336+
# net.peer.ip -> net.sock.peer.addr
337+
# https://github.com/open-telemetry/semantic-conventions/blob/40db676ca0e735aa84f242b5a0fb14e49438b69b/schemas/1.15.0#L18
338+
# net.sock.peer.addr -> client.socket.address for server spans (TODO) AND client.address if missing
339+
# https://github.com/open-telemetry/semantic-conventions/blob/v1.21.0/CHANGELOG.md#v1210-2023-07-13
340+
# https://github.com/open-telemetry/semantic-conventions/blob/main/docs/non-normative/http-migration.md#common-attributes-across-http-client-and-server-spans
341+
def _set_http_peer_ip_server(result, ip, sem_conv_opt_in_mode):
321342
if _report_old(sem_conv_opt_in_mode):
322-
set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
343+
set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
323344
if _report_new(sem_conv_opt_in_mode):
324-
set_int_attribute(result, CLIENT_PORT, port)
345+
# Only populate if not already populated
346+
if not result.get(CLIENT_ADDRESS):
347+
set_string_attribute(result, CLIENT_ADDRESS, ip)
325348

326349

327-
def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
350+
def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
328351
if _report_old(sem_conv_opt_in_mode):
329-
set_string_attribute(
330-
result, SpanAttributes.HTTP_USER_AGENT, user_agent
331-
)
352+
set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
332353
if _report_new(sem_conv_opt_in_mode):
333-
set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
354+
set_int_attribute(result, CLIENT_PORT, port)
334355

335356

336357
def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
@@ -340,13 +361,6 @@ def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
340361
set_string_attribute(result, CLIENT_ADDRESS, name)
341362

342363

343-
def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
344-
if _report_old(sem_conv_opt_in_mode):
345-
set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
346-
if _report_new(sem_conv_opt_in_mode):
347-
set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
348-
349-
350364
def _set_status(
351365
span,
352366
metrics_attributes: dict,

0 commit comments

Comments
 (0)