More type hints for `synapse.logging` (#13103)
Completes type hints for synapse.logging.scopecontextmanager and (partially) for synapse.logging.opentracing.pull/13148/head
parent
9667bad55d
commit
6ad012ef89
|
@ -0,0 +1 @@
|
||||||
|
Add missing type hints to `synapse.logging`.
|
3
mypy.ini
3
mypy.ini
|
@ -88,9 +88,6 @@ disallow_untyped_defs = False
|
||||||
[mypy-synapse.logging.opentracing]
|
[mypy-synapse.logging.opentracing]
|
||||||
disallow_untyped_defs = False
|
disallow_untyped_defs = False
|
||||||
|
|
||||||
[mypy-synapse.logging.scopecontextmanager]
|
|
||||||
disallow_untyped_defs = False
|
|
||||||
|
|
||||||
[mypy-synapse.metrics._reactor_metrics]
|
[mypy-synapse.metrics._reactor_metrics]
|
||||||
disallow_untyped_defs = False
|
disallow_untyped_defs = False
|
||||||
# This module imports select.epoll. That exists on Linux, but doesn't on macOS.
|
# This module imports select.epoll. That exists on Linux, but doesn't on macOS.
|
||||||
|
|
|
@ -164,6 +164,7 @@ Gotchas
|
||||||
with an active span?
|
with an active span?
|
||||||
"""
|
"""
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import enum
|
||||||
import inspect
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
@ -268,7 +269,7 @@ try:
|
||||||
|
|
||||||
_reporter: Reporter = attr.Factory(Reporter)
|
_reporter: Reporter = attr.Factory(Reporter)
|
||||||
|
|
||||||
def set_process(self, *args, **kwargs):
|
def set_process(self, *args: Any, **kwargs: Any) -> None:
|
||||||
return self._reporter.set_process(*args, **kwargs)
|
return self._reporter.set_process(*args, **kwargs)
|
||||||
|
|
||||||
def report_span(self, span: "opentracing.Span") -> None:
|
def report_span(self, span: "opentracing.Span") -> None:
|
||||||
|
@ -319,7 +320,11 @@ _homeserver_whitelist: Optional[Pattern[str]] = None
|
||||||
|
|
||||||
# Util methods
|
# Util methods
|
||||||
|
|
||||||
Sentinel = object()
|
|
||||||
|
class _Sentinel(enum.Enum):
|
||||||
|
# defining a sentinel in this way allows mypy to correctly handle the
|
||||||
|
# type of a dictionary lookup.
|
||||||
|
sentinel = object()
|
||||||
|
|
||||||
|
|
||||||
P = ParamSpec("P")
|
P = ParamSpec("P")
|
||||||
|
@ -339,12 +344,12 @@ def only_if_tracing(func: Callable[P, R]) -> Callable[P, Optional[R]]:
|
||||||
return _only_if_tracing_inner
|
return _only_if_tracing_inner
|
||||||
|
|
||||||
|
|
||||||
def ensure_active_span(message, ret=None):
|
def ensure_active_span(message: str, ret=None):
|
||||||
"""Executes the operation only if opentracing is enabled and there is an active span.
|
"""Executes the operation only if opentracing is enabled and there is an active span.
|
||||||
If there is no active span it logs message at the error level.
|
If there is no active span it logs message at the error level.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
message (str): Message which fills in "There was no active span when trying to %s"
|
message: Message which fills in "There was no active span when trying to %s"
|
||||||
in the error log if there is no active span and opentracing is enabled.
|
in the error log if there is no active span and opentracing is enabled.
|
||||||
ret (object): return value if opentracing is None or there is no active span.
|
ret (object): return value if opentracing is None or there is no active span.
|
||||||
|
|
||||||
|
@ -402,7 +407,7 @@ def init_tracer(hs: "HomeServer") -> None:
|
||||||
config = JaegerConfig(
|
config = JaegerConfig(
|
||||||
config=hs.config.tracing.jaeger_config,
|
config=hs.config.tracing.jaeger_config,
|
||||||
service_name=f"{hs.config.server.server_name} {hs.get_instance_name()}",
|
service_name=f"{hs.config.server.server_name} {hs.get_instance_name()}",
|
||||||
scope_manager=LogContextScopeManager(hs.config),
|
scope_manager=LogContextScopeManager(),
|
||||||
metrics_factory=PrometheusMetricsFactory(),
|
metrics_factory=PrometheusMetricsFactory(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -451,15 +456,15 @@ def whitelisted_homeserver(destination: str) -> bool:
|
||||||
|
|
||||||
# Could use kwargs but I want these to be explicit
|
# Could use kwargs but I want these to be explicit
|
||||||
def start_active_span(
|
def start_active_span(
|
||||||
operation_name,
|
operation_name: str,
|
||||||
child_of=None,
|
child_of: Optional[Union["opentracing.Span", "opentracing.SpanContext"]] = None,
|
||||||
references=None,
|
references: Optional[List["opentracing.Reference"]] = None,
|
||||||
tags=None,
|
tags: Optional[Dict[str, str]] = None,
|
||||||
start_time=None,
|
start_time: Optional[float] = None,
|
||||||
ignore_active_span=False,
|
ignore_active_span: bool = False,
|
||||||
finish_on_close=True,
|
finish_on_close: bool = True,
|
||||||
*,
|
*,
|
||||||
tracer=None,
|
tracer: Optional["opentracing.Tracer"] = None,
|
||||||
):
|
):
|
||||||
"""Starts an active opentracing span.
|
"""Starts an active opentracing span.
|
||||||
|
|
||||||
|
@ -493,11 +498,11 @@ def start_active_span(
|
||||||
def start_active_span_follows_from(
|
def start_active_span_follows_from(
|
||||||
operation_name: str,
|
operation_name: str,
|
||||||
contexts: Collection,
|
contexts: Collection,
|
||||||
child_of=None,
|
child_of: Optional[Union["opentracing.Span", "opentracing.SpanContext"]] = None,
|
||||||
start_time: Optional[float] = None,
|
start_time: Optional[float] = None,
|
||||||
*,
|
*,
|
||||||
inherit_force_tracing=False,
|
inherit_force_tracing: bool = False,
|
||||||
tracer=None,
|
tracer: Optional["opentracing.Tracer"] = None,
|
||||||
):
|
):
|
||||||
"""Starts an active opentracing span, with additional references to previous spans
|
"""Starts an active opentracing span, with additional references to previous spans
|
||||||
|
|
||||||
|
@ -540,7 +545,7 @@ def start_active_span_from_edu(
|
||||||
edu_content: Dict[str, Any],
|
edu_content: Dict[str, Any],
|
||||||
operation_name: str,
|
operation_name: str,
|
||||||
references: Optional[List["opentracing.Reference"]] = None,
|
references: Optional[List["opentracing.Reference"]] = None,
|
||||||
tags: Optional[Dict] = None,
|
tags: Optional[Dict[str, str]] = None,
|
||||||
start_time: Optional[float] = None,
|
start_time: Optional[float] = None,
|
||||||
ignore_active_span: bool = False,
|
ignore_active_span: bool = False,
|
||||||
finish_on_close: bool = True,
|
finish_on_close: bool = True,
|
||||||
|
@ -617,23 +622,27 @@ def set_operation_name(operation_name: str) -> None:
|
||||||
|
|
||||||
|
|
||||||
@only_if_tracing
|
@only_if_tracing
|
||||||
def force_tracing(span=Sentinel) -> None:
|
def force_tracing(
|
||||||
|
span: Union["opentracing.Span", _Sentinel] = _Sentinel.sentinel
|
||||||
|
) -> None:
|
||||||
"""Force sampling for the active/given span and its children.
|
"""Force sampling for the active/given span and its children.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
span: span to force tracing for. By default, the active span.
|
span: span to force tracing for. By default, the active span.
|
||||||
"""
|
"""
|
||||||
if span is Sentinel:
|
if isinstance(span, _Sentinel):
|
||||||
span = opentracing.tracer.active_span
|
span_to_trace = opentracing.tracer.active_span
|
||||||
if span is None:
|
else:
|
||||||
|
span_to_trace = span
|
||||||
|
if span_to_trace is None:
|
||||||
logger.error("No active span in force_tracing")
|
logger.error("No active span in force_tracing")
|
||||||
return
|
return
|
||||||
|
|
||||||
span.set_tag(opentracing.tags.SAMPLING_PRIORITY, 1)
|
span_to_trace.set_tag(opentracing.tags.SAMPLING_PRIORITY, 1)
|
||||||
|
|
||||||
# also set a bit of baggage, so that we have a way of figuring out if
|
# also set a bit of baggage, so that we have a way of figuring out if
|
||||||
# it is enabled later
|
# it is enabled later
|
||||||
span.set_baggage_item(SynapseBaggage.FORCE_TRACING, "1")
|
span_to_trace.set_baggage_item(SynapseBaggage.FORCE_TRACING, "1")
|
||||||
|
|
||||||
|
|
||||||
def is_context_forced_tracing(
|
def is_context_forced_tracing(
|
||||||
|
@ -789,7 +798,7 @@ def extract_text_map(carrier: Dict[str, str]) -> Optional["opentracing.SpanConte
|
||||||
# Tracing decorators
|
# Tracing decorators
|
||||||
|
|
||||||
|
|
||||||
def trace(func=None, opname=None):
|
def trace(func=None, opname: Optional[str] = None):
|
||||||
"""
|
"""
|
||||||
Decorator to trace a function.
|
Decorator to trace a function.
|
||||||
Sets the operation name to that of the function's or that given
|
Sets the operation name to that of the function's or that given
|
||||||
|
@ -822,11 +831,11 @@ def trace(func=None, opname=None):
|
||||||
result = func(*args, **kwargs)
|
result = func(*args, **kwargs)
|
||||||
if isinstance(result, defer.Deferred):
|
if isinstance(result, defer.Deferred):
|
||||||
|
|
||||||
def call_back(result):
|
def call_back(result: R) -> R:
|
||||||
scope.__exit__(None, None, None)
|
scope.__exit__(None, None, None)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def err_back(result):
|
def err_back(result: R) -> R:
|
||||||
scope.__exit__(None, None, None)
|
scope.__exit__(None, None, None)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,15 @@ import logging
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
from typing import Optional, Type
|
from typing import Optional, Type
|
||||||
|
|
||||||
from opentracing import Scope, ScopeManager
|
from opentracing import Scope, ScopeManager, Span
|
||||||
|
|
||||||
import twisted
|
import twisted
|
||||||
|
|
||||||
from synapse.logging.context import current_context, nested_logging_context
|
from synapse.logging.context import (
|
||||||
|
LoggingContext,
|
||||||
|
current_context,
|
||||||
|
nested_logging_context,
|
||||||
|
)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -35,11 +39,11 @@ class LogContextScopeManager(ScopeManager):
|
||||||
but currently that doesn't work due to https://twistedmatrix.com/trac/ticket/10301.
|
but currently that doesn't work due to https://twistedmatrix.com/trac/ticket/10301.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active(self):
|
def active(self) -> Optional[Scope]:
|
||||||
"""
|
"""
|
||||||
Returns the currently active Scope which can be used to access the
|
Returns the currently active Scope which can be used to access the
|
||||||
currently active Scope.span.
|
currently active Scope.span.
|
||||||
|
@ -48,19 +52,18 @@ class LogContextScopeManager(ScopeManager):
|
||||||
Tracer.start_active_span() time.
|
Tracer.start_active_span() time.
|
||||||
|
|
||||||
Return:
|
Return:
|
||||||
(Scope) : the Scope that is active, or None if not
|
The Scope that is active, or None if not available.
|
||||||
available.
|
|
||||||
"""
|
"""
|
||||||
ctx = current_context()
|
ctx = current_context()
|
||||||
return ctx.scope
|
return ctx.scope
|
||||||
|
|
||||||
def activate(self, span, finish_on_close):
|
def activate(self, span: Span, finish_on_close: bool) -> Scope:
|
||||||
"""
|
"""
|
||||||
Makes a Span active.
|
Makes a Span active.
|
||||||
Args
|
Args
|
||||||
span (Span): the span that should become active.
|
span: the span that should become active.
|
||||||
finish_on_close (Boolean): whether Span should be automatically
|
finish_on_close: whether Span should be automatically finished when
|
||||||
finished when Scope.close() is called.
|
Scope.close() is called.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Scope to control the end of the active period for
|
Scope to control the end of the active period for
|
||||||
|
@ -112,8 +115,8 @@ class _LogContextScope(Scope):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
manager: LogContextScopeManager,
|
manager: LogContextScopeManager,
|
||||||
span,
|
span: Span,
|
||||||
logcontext,
|
logcontext: LoggingContext,
|
||||||
enter_logcontext: bool,
|
enter_logcontext: bool,
|
||||||
finish_on_close: bool,
|
finish_on_close: bool,
|
||||||
):
|
):
|
||||||
|
@ -121,10 +124,10 @@ class _LogContextScope(Scope):
|
||||||
Args:
|
Args:
|
||||||
manager:
|
manager:
|
||||||
the manager that is responsible for this scope.
|
the manager that is responsible for this scope.
|
||||||
span (Span):
|
span:
|
||||||
the opentracing span which this scope represents the local
|
the opentracing span which this scope represents the local
|
||||||
lifetime for.
|
lifetime for.
|
||||||
logcontext (LogContext):
|
logcontext:
|
||||||
the log context to which this scope is attached.
|
the log context to which this scope is attached.
|
||||||
enter_logcontext:
|
enter_logcontext:
|
||||||
if True the log context will be exited when the scope is finished
|
if True the log context will be exited when the scope is finished
|
||||||
|
|
|
@ -50,7 +50,7 @@ class LogContextScopeManagerTestCase(TestCase):
|
||||||
# global variables that power opentracing. We create our own tracer instance
|
# global variables that power opentracing. We create our own tracer instance
|
||||||
# and test with it.
|
# and test with it.
|
||||||
|
|
||||||
scope_manager = LogContextScopeManager({})
|
scope_manager = LogContextScopeManager()
|
||||||
config = jaeger_client.config.Config(
|
config = jaeger_client.config.Config(
|
||||||
config={}, service_name="test", scope_manager=scope_manager
|
config={}, service_name="test", scope_manager=scope_manager
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue