mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-23 01:55:53 +03:00
parent
08c8469322
commit
91fa9cca99
3 changed files with 25 additions and 0 deletions
1
changelog.d/10199.misc
Normal file
1
changelog.d/10199.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Expose opentracing trace id in response headers.
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue