HTTP transition for asgi (#2610)

This commit is contained in:
Leighton Chen
2024-07-03 11:19:34 -07:00
committed by GitHub
parent a3e457ca8c
commit c9bad6269c
10 changed files with 1111 additions and 145 deletions

View File

@ -17,6 +17,10 @@ import threading
from enum import Enum
from opentelemetry.instrumentation.utils import http_status_to_status_code
from opentelemetry.semconv.attributes.client_attributes import (
CLIENT_ADDRESS,
CLIENT_PORT,
)
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
from opentelemetry.semconv.attributes.http_attributes import (
HTTP_REQUEST_METHOD,
@ -33,11 +37,18 @@ from opentelemetry.semconv.attributes.server_attributes import (
)
from opentelemetry.semconv.attributes.url_attributes import (
URL_FULL,
URL_PATH,
URL_QUERY,
URL_SCHEME,
)
from opentelemetry.semconv.attributes.user_agent_attributes import (
USER_AGENT_ORIGINAL,
)
from opentelemetry.semconv.trace import SpanAttributes
from opentelemetry.trace.status import Status, StatusCode
# These lists represent attributes for metrics that are currently supported
_client_duration_attrs_old = [
SpanAttributes.HTTP_STATUS_CODE,
SpanAttributes.HTTP_HOST,
@ -85,13 +96,12 @@ _server_active_requests_count_attrs_old = [
SpanAttributes.HTTP_SCHEME,
SpanAttributes.HTTP_FLAVOR,
SpanAttributes.HTTP_SERVER_NAME,
SpanAttributes.NET_HOST_NAME,
SpanAttributes.NET_HOST_PORT,
]
_server_active_requests_count_attrs_new = [
HTTP_REQUEST_METHOD,
URL_SCHEME,
# TODO: Support SERVER_ADDRESS AND SERVER_PORT
]
OTEL_SEMCONV_STABILITY_OPT_IN = "OTEL_SEMCONV_STABILITY_OPT_IN"
@ -280,14 +290,14 @@ def _set_http_net_host(result, host, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.NET_HOST_NAME, host)
if _report_new(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.SERVER_ADDRESS, host)
set_string_attribute(result, SERVER_ADDRESS, host)
def _set_http_net_host_port(result, port, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_int_attribute(result, SpanAttributes.NET_HOST_PORT, port)
if _report_new(sem_conv_opt_in_mode):
set_int_attribute(result, SpanAttributes.SERVER_PORT, port)
set_int_attribute(result, SERVER_PORT, port)
def _set_http_target(result, target, path, query, sem_conv_opt_in_mode):
@ -295,23 +305,23 @@ def _set_http_target(result, target, path, query, sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.HTTP_TARGET, target)
if _report_new(sem_conv_opt_in_mode):
if path:
set_string_attribute(result, SpanAttributes.URL_PATH, path)
set_string_attribute(result, URL_PATH, path)
if query:
set_string_attribute(result, SpanAttributes.URL_QUERY, query)
set_string_attribute(result, URL_QUERY, query)
def _set_http_peer_ip(result, ip, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.NET_PEER_IP, ip)
if _report_new(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.CLIENT_ADDRESS, ip)
set_string_attribute(result, CLIENT_ADDRESS, ip)
def _set_http_peer_port_server(result, port, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_int_attribute(result, SpanAttributes.NET_PEER_PORT, port)
if _report_new(sem_conv_opt_in_mode):
set_int_attribute(result, SpanAttributes.CLIENT_PORT, port)
set_int_attribute(result, CLIENT_PORT, port)
def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
@ -320,32 +330,28 @@ def _set_http_user_agent(result, user_agent, sem_conv_opt_in_mode):
result, SpanAttributes.HTTP_USER_AGENT, user_agent
)
if _report_new(sem_conv_opt_in_mode):
set_string_attribute(
result, SpanAttributes.USER_AGENT_ORIGINAL, user_agent
)
set_string_attribute(result, USER_AGENT_ORIGINAL, user_agent)
def _set_http_net_peer_name_server(result, name, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.NET_PEER_NAME, name)
if _report_new(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.CLIENT_ADDRESS, name)
set_string_attribute(result, CLIENT_ADDRESS, name)
def _set_http_flavor_version(result, version, sem_conv_opt_in_mode):
if _report_old(sem_conv_opt_in_mode):
set_string_attribute(result, SpanAttributes.HTTP_FLAVOR, version)
if _report_new(sem_conv_opt_in_mode):
set_string_attribute(
result, SpanAttributes.NETWORK_PROTOCOL_VERSION, version
)
set_string_attribute(result, NETWORK_PROTOCOL_VERSION, version)
def _set_status(
span,
metrics_attributes,
status_code_str,
status_code,
status_code_str,
sem_conv_opt_in_mode,
):
if status_code < 0:
@ -366,12 +372,8 @@ def _set_status(
span.set_attribute(SpanAttributes.HTTP_STATUS_CODE, status_code)
metrics_attributes[SpanAttributes.HTTP_STATUS_CODE] = status_code
if _report_new(sem_conv_opt_in_mode):
span.set_attribute(
SpanAttributes.HTTP_RESPONSE_STATUS_CODE, status_code
)
metrics_attributes[SpanAttributes.HTTP_RESPONSE_STATUS_CODE] = (
status_code
)
span.set_attribute(HTTP_RESPONSE_STATUS_CODE, status_code)
metrics_attributes[HTTP_RESPONSE_STATUS_CODE] = status_code
if status == StatusCode.ERROR:
span.set_attribute(ERROR_TYPE, status_code_str)
metrics_attributes[ERROR_TYPE] = status_code_str