mirror of
https://github.com/element-hq/synapse.git
synced 2024-12-14 11:57:44 +00:00
More type hints for synapse.logging
(#13103)
Completes type hints for synapse.logging.scopecontextmanager and (partially) for synapse.logging.opentracing.
This commit is contained in:
parent
9667bad55d
commit
6ad012ef89
5 changed files with 56 additions and 46 deletions
1
changelog.d/13103.misc
Normal file
1
changelog.d/13103.misc
Normal file
|
@ -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]
|
||||
disallow_untyped_defs = False
|
||||
|
||||
[mypy-synapse.logging.scopecontextmanager]
|
||||
disallow_untyped_defs = False
|
||||
|
||||
[mypy-synapse.metrics._reactor_metrics]
|
||||
disallow_untyped_defs = False
|
||||
# This module imports select.epoll. That exists on Linux, but doesn't on macOS.
|
||||
|
|
|
@ -164,6 +164,7 @@ Gotchas
|
|||
with an active span?
|
||||
"""
|
||||
import contextlib
|
||||
import enum
|
||||
import inspect
|
||||
import logging
|
||||
import re
|
||||
|
@ -268,7 +269,7 @@ try:
|
|||
|
||||
_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)
|
||||
|
||||
def report_span(self, span: "opentracing.Span") -> None:
|
||||
|
@ -319,7 +320,11 @@ _homeserver_whitelist: Optional[Pattern[str]] = None
|
|||
|
||||
# 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")
|
||||
|
@ -339,12 +344,12 @@ def only_if_tracing(func: Callable[P, R]) -> Callable[P, Optional[R]]:
|
|||
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.
|
||||
If there is no active span it logs message at the error level.
|
||||
|
||||
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.
|
||||
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=hs.config.tracing.jaeger_config,
|
||||
service_name=f"{hs.config.server.server_name} {hs.get_instance_name()}",
|
||||
scope_manager=LogContextScopeManager(hs.config),
|
||||
scope_manager=LogContextScopeManager(),
|
||||
metrics_factory=PrometheusMetricsFactory(),
|
||||
)
|
||||
|
||||
|
@ -451,15 +456,15 @@ def whitelisted_homeserver(destination: str) -> bool:
|
|||
|
||||
# Could use kwargs but I want these to be explicit
|
||||
def start_active_span(
|
||||
operation_name,
|
||||
child_of=None,
|
||||
references=None,
|
||||
tags=None,
|
||||
start_time=None,
|
||||
ignore_active_span=False,
|
||||
finish_on_close=True,
|
||||
operation_name: str,
|
||||
child_of: Optional[Union["opentracing.Span", "opentracing.SpanContext"]] = None,
|
||||
references: Optional[List["opentracing.Reference"]] = None,
|
||||
tags: Optional[Dict[str, str]] = None,
|
||||
start_time: Optional[float] = None,
|
||||
ignore_active_span: bool = False,
|
||||
finish_on_close: bool = True,
|
||||
*,
|
||||
tracer=None,
|
||||
tracer: Optional["opentracing.Tracer"] = None,
|
||||
):
|
||||
"""Starts an active opentracing span.
|
||||
|
||||
|
@ -493,11 +498,11 @@ def start_active_span(
|
|||
def start_active_span_follows_from(
|
||||
operation_name: str,
|
||||
contexts: Collection,
|
||||
child_of=None,
|
||||
child_of: Optional[Union["opentracing.Span", "opentracing.SpanContext"]] = None,
|
||||
start_time: Optional[float] = None,
|
||||
*,
|
||||
inherit_force_tracing=False,
|
||||
tracer=None,
|
||||
inherit_force_tracing: bool = False,
|
||||
tracer: Optional["opentracing.Tracer"] = None,
|
||||
):
|
||||
"""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],
|
||||
operation_name: str,
|
||||
references: Optional[List["opentracing.Reference"]] = None,
|
||||
tags: Optional[Dict] = None,
|
||||
tags: Optional[Dict[str, str]] = None,
|
||||
start_time: Optional[float] = None,
|
||||
ignore_active_span: bool = False,
|
||||
finish_on_close: bool = True,
|
||||
|
@ -617,23 +622,27 @@ def set_operation_name(operation_name: str) -> None:
|
|||
|
||||
|
||||
@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.
|
||||
|
||||
Args:
|
||||
span: span to force tracing for. By default, the active span.
|
||||
"""
|
||||
if span is Sentinel:
|
||||
span = opentracing.tracer.active_span
|
||||
if span is None:
|
||||
if isinstance(span, _Sentinel):
|
||||
span_to_trace = opentracing.tracer.active_span
|
||||
else:
|
||||
span_to_trace = span
|
||||
if span_to_trace is None:
|
||||
logger.error("No active span in force_tracing")
|
||||
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
|
||||
# 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(
|
||||
|
@ -789,7 +798,7 @@ def extract_text_map(carrier: Dict[str, str]) -> Optional["opentracing.SpanConte
|
|||
# Tracing decorators
|
||||
|
||||
|
||||
def trace(func=None, opname=None):
|
||||
def trace(func=None, opname: Optional[str] = None):
|
||||
"""
|
||||
Decorator to trace a function.
|
||||
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)
|
||||
if isinstance(result, defer.Deferred):
|
||||
|
||||
def call_back(result):
|
||||
def call_back(result: R) -> R:
|
||||
scope.__exit__(None, None, None)
|
||||
return result
|
||||
|
||||
def err_back(result):
|
||||
def err_back(result: R) -> R:
|
||||
scope.__exit__(None, None, None)
|
||||
return result
|
||||
|
||||
|
|
|
@ -16,11 +16,15 @@ import logging
|
|||
from types import TracebackType
|
||||
from typing import Optional, Type
|
||||
|
||||
from opentracing import Scope, ScopeManager
|
||||
from opentracing import Scope, ScopeManager, Span
|
||||
|
||||
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__)
|
||||
|
||||
|
@ -35,11 +39,11 @@ class LogContextScopeManager(ScopeManager):
|
|||
but currently that doesn't work due to https://twistedmatrix.com/trac/ticket/10301.
|
||||
"""
|
||||
|
||||
def __init__(self, config):
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
@property
|
||||
def active(self):
|
||||
def active(self) -> Optional[Scope]:
|
||||
"""
|
||||
Returns the currently active Scope which can be used to access the
|
||||
currently active Scope.span.
|
||||
|
@ -48,19 +52,18 @@ class LogContextScopeManager(ScopeManager):
|
|||
Tracer.start_active_span() time.
|
||||
|
||||
Return:
|
||||
(Scope) : the Scope that is active, or None if not
|
||||
available.
|
||||
The Scope that is active, or None if not available.
|
||||
"""
|
||||
ctx = current_context()
|
||||
return ctx.scope
|
||||
|
||||
def activate(self, span, finish_on_close):
|
||||
def activate(self, span: Span, finish_on_close: bool) -> Scope:
|
||||
"""
|
||||
Makes a Span active.
|
||||
Args
|
||||
span (Span): the span that should become active.
|
||||
finish_on_close (Boolean): whether Span should be automatically
|
||||
finished when Scope.close() is called.
|
||||
span: the span that should become active.
|
||||
finish_on_close: whether Span should be automatically finished when
|
||||
Scope.close() is called.
|
||||
|
||||
Returns:
|
||||
Scope to control the end of the active period for
|
||||
|
@ -112,8 +115,8 @@ class _LogContextScope(Scope):
|
|||
def __init__(
|
||||
self,
|
||||
manager: LogContextScopeManager,
|
||||
span,
|
||||
logcontext,
|
||||
span: Span,
|
||||
logcontext: LoggingContext,
|
||||
enter_logcontext: bool,
|
||||
finish_on_close: bool,
|
||||
):
|
||||
|
@ -121,13 +124,13 @@ class _LogContextScope(Scope):
|
|||
Args:
|
||||
manager:
|
||||
the manager that is responsible for this scope.
|
||||
span (Span):
|
||||
span:
|
||||
the opentracing span which this scope represents the local
|
||||
lifetime for.
|
||||
logcontext (LogContext):
|
||||
the logcontext to which this scope is attached.
|
||||
logcontext:
|
||||
the log context to which this scope is attached.
|
||||
enter_logcontext:
|
||||
if True the logcontext will be exited when the scope is finished
|
||||
if True the log context will be exited when the scope is finished
|
||||
finish_on_close:
|
||||
if True finish the span when the scope is closed
|
||||
"""
|
||||
|
|
|
@ -50,7 +50,7 @@ class LogContextScopeManagerTestCase(TestCase):
|
|||
# global variables that power opentracing. We create our own tracer instance
|
||||
# and test with it.
|
||||
|
||||
scope_manager = LogContextScopeManager({})
|
||||
scope_manager = LogContextScopeManager()
|
||||
config = jaeger_client.config.Config(
|
||||
config={}, service_name="test", scope_manager=scope_manager
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue