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:
Patrick Cloke 2022-06-30 09:05:06 -04:00 committed by GitHub
parent 9667bad55d
commit 6ad012ef89
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 46 deletions

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

@ -0,0 +1 @@
Add missing type hints to `synapse.logging`.

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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
) )