mirror of
https://github.com/element-hq/synapse.git
synced 2025-10-03 00:01:04 -04:00
Compare commits
5 Commits
6ac4454d67
...
648a24f08f
Author | SHA1 | Date | |
---|---|---|---|
|
648a24f08f | ||
|
7b31c569c1 | ||
|
db2835e294 | ||
|
5cc63af08b | ||
|
094c01db4b |
@ -1 +1 @@
|
|||||||
Switch back to own custom `LogContextScopeManager` instead of OpenTracing's `ContextVarsScopeManager` which was causing problems when using the experimental `SYNAPSE_ASYNC_IO_REACTOR` option with tracing enabled.
|
Switch back to our own custom `LogContextScopeManager` instead of OpenTracing's `ContextVarsScopeManager` which was causing problems when using the experimental `SYNAPSE_ASYNC_IO_REACTOR` option with tracing enabled.
|
||||||
|
@ -268,7 +268,7 @@ def run_as_background_process(
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Since we track the tracing scope in the `LoggingContext`, before we move to the
|
# Since we track the tracing scope in the `LoggingContext`, before we move to the
|
||||||
# sentinel logcontext (or a new new `LoggingContext`), grab the currently active
|
# sentinel logcontext (or a new `LoggingContext`), grab the currently active
|
||||||
# tracing span (if any) so that we can create a cross-link to the background process
|
# tracing span (if any) so that we can create a cross-link to the background process
|
||||||
# trace.
|
# trace.
|
||||||
original_active_tracing_span = active_span(tracer=test_only_tracer)
|
original_active_tracing_span = active_span(tracer=test_only_tracer)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
from typing import Awaitable, Dict, cast
|
from typing import Awaitable, Optional, cast
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from twisted.internet.testing import MemoryReactorClock
|
from twisted.internet.testing import MemoryReactorClock
|
||||||
@ -35,7 +35,6 @@ from synapse.logging.opentracing import (
|
|||||||
tag_args,
|
tag_args,
|
||||||
trace_with_opname,
|
trace_with_opname,
|
||||||
)
|
)
|
||||||
from synapse.logging.scopecontextmanager import LogContextScopeManager
|
|
||||||
from synapse.metrics.background_process_metrics import run_as_background_process
|
from synapse.metrics.background_process_metrics import run_as_background_process
|
||||||
from synapse.util.clock import Clock
|
from synapse.util.clock import Clock
|
||||||
|
|
||||||
@ -49,8 +48,11 @@ except ImportError:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
import opentracing
|
import opentracing
|
||||||
|
|
||||||
|
from synapse.logging.scopecontextmanager import LogContextScopeManager
|
||||||
except ImportError:
|
except ImportError:
|
||||||
opentracing = None # type: ignore
|
opentracing = None # type: ignore
|
||||||
|
LogContextScopeManager = None # type: ignore
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -70,7 +72,7 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
opentracing backend is Jaeger.
|
opentracing backend is Jaeger.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if opentracing is None:
|
if opentracing is None or LogContextScopeManager is None:
|
||||||
skip = "Requires opentracing" # type: ignore[unreachable]
|
skip = "Requires opentracing" # type: ignore[unreachable]
|
||||||
if jaeger_client is None:
|
if jaeger_client is None:
|
||||||
skip = "Requires jaeger_client" # type: ignore[unreachable]
|
skip = "Requires jaeger_client" # type: ignore[unreachable]
|
||||||
@ -327,11 +329,12 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
reactor, clock = get_clock()
|
reactor, clock = get_clock()
|
||||||
|
|
||||||
callback_finished = False
|
callback_finished = False
|
||||||
active_span_in_callback = None
|
active_span_in_callback: Optional[jaeger_client.Span] = None
|
||||||
|
|
||||||
async def bg_task() -> None:
|
async def bg_task() -> None:
|
||||||
nonlocal callback_finished, active_span_in_callback
|
nonlocal callback_finished, active_span_in_callback
|
||||||
try:
|
try:
|
||||||
|
assert isinstance(self._tracer.active_span, jaeger_client.Span)
|
||||||
active_span_in_callback = self._tracer.active_span
|
active_span_in_callback = self._tracer.active_span
|
||||||
finally:
|
finally:
|
||||||
# When exceptions happen, we still want to mark the callback as finished
|
# When exceptions happen, we still want to mark the callback as finished
|
||||||
@ -388,11 +391,12 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
reactor, clock = get_clock()
|
reactor, clock = get_clock()
|
||||||
|
|
||||||
callback_finished = False
|
callback_finished = False
|
||||||
active_span_in_callback = None
|
active_span_in_callback: Optional[jaeger_client.Span] = None
|
||||||
|
|
||||||
async def bg_task() -> None:
|
async def bg_task() -> None:
|
||||||
nonlocal callback_finished, active_span_in_callback
|
nonlocal callback_finished, active_span_in_callback
|
||||||
try:
|
try:
|
||||||
|
assert isinstance(self._tracer.active_span, jaeger_client.Span)
|
||||||
active_span_in_callback = self._tracer.active_span
|
active_span_in_callback = self._tracer.active_span
|
||||||
finally:
|
finally:
|
||||||
# When exceptions happen, we still want to mark the callback as finished
|
# When exceptions happen, we still want to mark the callback as finished
|
||||||
@ -452,22 +456,22 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
expected_spans,
|
expected_spans,
|
||||||
)
|
)
|
||||||
|
|
||||||
span_map: Dict[str, jaeger_client.SpanContext] = {
|
span_map = {span.operation_name: span for span in self._reporter.get_spans()}
|
||||||
span.operation_name: span for span in self._reporter.get_spans()
|
|
||||||
}
|
|
||||||
span_id_to_friendly_name = {
|
span_id_to_friendly_name = {
|
||||||
span.context.span_id: span.operation_name
|
span.span_id: span.operation_name for span in self._reporter.get_spans()
|
||||||
for span in self._reporter.get_spans()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_span_friendly_name(span_id: int) -> str:
|
def get_span_friendly_name(span_id: Optional[int]) -> str:
|
||||||
|
if span_id is None:
|
||||||
|
return "None"
|
||||||
|
|
||||||
return span_id_to_friendly_name.get(span_id, f"unknown span {span_id}")
|
return span_id_to_friendly_name.get(span_id, f"unknown span {span_id}")
|
||||||
|
|
||||||
# Ensure the background process trace/span is disconnected from the request
|
# Ensure the background process trace/span is disconnected from the request
|
||||||
# trace/span.
|
# trace/span.
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
get_span_friendly_name(span_map["bgproc.some-bg-task"].context.parent_id),
|
get_span_friendly_name(span_map["bgproc.some-bg-task"].parent_id),
|
||||||
get_span_friendly_name(span_map["some-request"].context.span_id),
|
get_span_friendly_name(span_map["some-request"].span_id),
|
||||||
)
|
)
|
||||||
|
|
||||||
# We should see a cross-link in the request trace pointing to the background
|
# We should see a cross-link in the request trace pointing to the background
|
||||||
@ -475,19 +479,21 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
#
|
#
|
||||||
# Make sure `start_bgproc.some-bg-task` is part of the request trace
|
# Make sure `start_bgproc.some-bg-task` is part of the request trace
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
get_span_friendly_name(
|
get_span_friendly_name(span_map["start_bgproc.some-bg-task"].parent_id),
|
||||||
span_map["start_bgproc.some-bg-task"].context.parent_id
|
get_span_friendly_name(span_map["some-request"].span_id),
|
||||||
),
|
|
||||||
get_span_friendly_name(span_map["some-request"].context.span_id),
|
|
||||||
)
|
)
|
||||||
# And has some references to the background process trace
|
# And has some references to the background process trace
|
||||||
self.assertIncludes(
|
self.assertIncludes(
|
||||||
{
|
{
|
||||||
f"{reference.type}:{get_span_friendly_name(reference.referenced_context.span_id)}"
|
f"{reference.type}:{get_span_friendly_name(reference.referenced_context.span_id)}"
|
||||||
for reference in span_map["start_bgproc.some-bg-task"].references
|
if isinstance(reference.referenced_context, jaeger_client.SpanContext)
|
||||||
|
else f"{reference.type}:None"
|
||||||
|
for reference in (
|
||||||
|
span_map["start_bgproc.some-bg-task"].references or []
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
f"follows_from:{get_span_friendly_name(span_map['bgproc.some-bg-task'].context.span_id)}"
|
f"follows_from:{get_span_friendly_name(span_map['bgproc.some-bg-task'].span_id)}"
|
||||||
},
|
},
|
||||||
exact=True,
|
exact=True,
|
||||||
)
|
)
|
||||||
@ -497,19 +503,21 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||||||
#
|
#
|
||||||
# Make sure `start_bgproc.some-bg-task` is part of the request trace
|
# Make sure `start_bgproc.some-bg-task` is part of the request trace
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
get_span_friendly_name(
|
get_span_friendly_name(span_map["bgproc_child.some-bg-task"].parent_id),
|
||||||
span_map["bgproc_child.some-bg-task"].context.parent_id
|
get_span_friendly_name(span_map["bgproc.some-bg-task"].span_id),
|
||||||
),
|
|
||||||
get_span_friendly_name(span_map["bgproc.some-bg-task"].context.span_id),
|
|
||||||
)
|
)
|
||||||
# And has some references to the background process trace
|
# And has some references to the background process trace
|
||||||
self.assertIncludes(
|
self.assertIncludes(
|
||||||
{
|
{
|
||||||
f"{reference.type}:{get_span_friendly_name(reference.referenced_context.span_id)}"
|
f"{reference.type}:{get_span_friendly_name(reference.referenced_context.span_id)}"
|
||||||
for reference in span_map["bgproc_child.some-bg-task"].references
|
if isinstance(reference.referenced_context, jaeger_client.SpanContext)
|
||||||
|
else f"{reference.type}:None"
|
||||||
|
for reference in (
|
||||||
|
span_map["bgproc_child.some-bg-task"].references or []
|
||||||
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
f"follows_from:{get_span_friendly_name(span_map['some-request'].context.span_id)}"
|
f"follows_from:{get_span_friendly_name(span_map['some-request'].span_id)}"
|
||||||
},
|
},
|
||||||
exact=True,
|
exact=True,
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user