Expose opentracing trace id in response headers (#10199)

Fixes: #9480
This commit is contained in:
Richard van der Hoff 2021-06-18 11:43:22 +01:00 committed by GitHub
parent 08c8469322
commit 91fa9cca99
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 0 deletions

1
changelog.d/10199.misc Normal file
View file

@ -0,0 +1 @@
Expose opentracing trace id in response headers.

View file

@ -35,6 +35,7 @@ from synapse.http.servlet import (
parse_string_from_args, parse_string_from_args,
parse_strings_from_args, parse_strings_from_args,
) )
from synapse.logging import opentracing
from synapse.logging.context import run_in_background from synapse.logging.context import run_in_background
from synapse.logging.opentracing import ( from synapse.logging.opentracing import (
SynapseTags, SynapseTags,
@ -345,6 +346,8 @@ class BaseFederationServlet:
) )
with scope: with scope:
opentracing.inject_response_headers(request.responseHeaders)
if origin and self.RATELIMIT: if origin and self.RATELIMIT:
with ratelimiter.ratelimit(origin) as d: with ratelimiter.ratelimit(origin) as d:
await d await d

View file

@ -173,6 +173,7 @@ from typing import TYPE_CHECKING, Collection, Dict, List, Optional, Pattern, Typ
import attr import attr
from twisted.internet import defer from twisted.internet import defer
from twisted.web.http_headers import Headers
from synapse.config import ConfigError from synapse.config import ConfigError
from synapse.util import json_decoder, json_encoder from synapse.util import json_decoder, json_encoder
@ -668,6 +669,25 @@ def inject_header_dict(
headers[key.encode()] = [value.encode()] headers[key.encode()] = [value.encode()]
def inject_response_headers(response_headers: Headers) -> None:
"""Inject the current trace id into the HTTP response headers"""
if not opentracing:
return
span = opentracing.tracer.active_span
if not span:
return
# This is a bit implementation-specific.
#
# Jaeger's Spans have a trace_id property; other implementations (including the
# dummy opentracing.span.Span which we use if init_tracer is not called) do not
# expose it
trace_id = getattr(span, "trace_id", None)
if trace_id is not None:
response_headers.addRawHeader("Synapse-Trace-Id", f"{trace_id:x}")
@ensure_active_span("get the active span context as a dict", ret={}) @ensure_active_span("get the active span context as a dict", ret={})
def get_active_span_text_map(destination=None): def get_active_span_text_map(destination=None):
""" """
@ -843,6 +863,7 @@ def trace_servlet(request: "SynapseRequest", extract_context: bool = False):
scope = start_active_span(request_name) scope = start_active_span(request_name)
with scope: with scope:
inject_response_headers(request.responseHeaders)
try: try:
yield yield
finally: finally: