|
@@ -171,8 +171,9 @@ import logging
|
|
|
import re
|
|
|
import types
|
|
|
from functools import wraps
|
|
|
-from typing import TYPE_CHECKING, Dict
|
|
|
+from typing import TYPE_CHECKING, Dict, Optional, Type
|
|
|
|
|
|
+import attr
|
|
|
from canonicaljson import json
|
|
|
|
|
|
from twisted.internet import defer
|
|
@@ -232,6 +233,30 @@ except ImportError:
|
|
|
LogContextScopeManager = None # type: ignore
|
|
|
|
|
|
|
|
|
+try:
|
|
|
+ from rust_python_jaeger_reporter import Reporter
|
|
|
+
|
|
|
+ @attr.s(slots=True, frozen=True)
|
|
|
+ class _WrappedRustReporter:
|
|
|
+ """Wrap the reporter to ensure `report_span` never throws.
|
|
|
+ """
|
|
|
+
|
|
|
+ _reporter = attr.ib(type=Reporter, default=attr.Factory(Reporter))
|
|
|
+
|
|
|
+ def set_process(self, *args, **kwargs):
|
|
|
+ return self._reporter.set_process(*args, **kwargs)
|
|
|
+
|
|
|
+ def report_span(self, span):
|
|
|
+ try:
|
|
|
+ return self._reporter.report_span(span)
|
|
|
+ except Exception:
|
|
|
+ logger.exception("Failed to report span")
|
|
|
+
|
|
|
+ RustReporter = _WrappedRustReporter # type: Optional[Type[_WrappedRustReporter]]
|
|
|
+except ImportError:
|
|
|
+ RustReporter = None
|
|
|
+
|
|
|
+
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
@@ -320,11 +345,19 @@ def init_tracer(hs: "HomeServer"):
|
|
|
|
|
|
set_homeserver_whitelist(hs.config.opentracer_whitelist)
|
|
|
|
|
|
- JaegerConfig(
|
|
|
+ config = JaegerConfig(
|
|
|
config=hs.config.jaeger_config,
|
|
|
service_name="{} {}".format(hs.config.server_name, hs.get_instance_name()),
|
|
|
scope_manager=LogContextScopeManager(hs.config),
|
|
|
- ).initialize_tracer()
|
|
|
+ )
|
|
|
+
|
|
|
+ # If we have the rust jaeger reporter available let's use that.
|
|
|
+ if RustReporter:
|
|
|
+ logger.info("Using rust_python_jaeger_reporter library")
|
|
|
+ tracer = config.create_tracer(RustReporter(), config.sampler)
|
|
|
+ opentracing.set_global_tracer(tracer)
|
|
|
+ else:
|
|
|
+ config.initialize_tracer()
|
|
|
|
|
|
|
|
|
# Whitelisting
|