Black is the new black
parent
ce21e41359
commit
98c8038bcf
|
@ -13,26 +13,28 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from ._base import Config
|
import logging
|
||||||
|
|
||||||
from jaeger_client import Config as JaegerConfig
|
from jaeger_client import Config as JaegerConfig
|
||||||
|
|
||||||
from synapse.util.scopecontextmanager import LogContextScopeManager
|
from synapse.util.scopecontextmanager import LogContextScopeManager
|
||||||
|
|
||||||
import logging
|
from ._base import Config
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class TracerConfig(Config):
|
class TracerConfig(Config):
|
||||||
def read_config(self, config):
|
def read_config(self, config):
|
||||||
self.tracer_config = config.get("tracer")
|
self.tracer_config = config.get("tracer")
|
||||||
|
|
||||||
if self.tracer_config is None:
|
if self.tracer_config is None:
|
||||||
# If the tracer is not configured we assume it is disabled
|
# If the tracer is not configured we assume it is disabled
|
||||||
self.tracer_config = {
|
self.tracer_config = {"tracer_enabled": False}
|
||||||
"tracer_enabled": False,
|
|
||||||
}
|
|
||||||
|
|
||||||
if self.tracer_config.get("tracer_enabled", False):
|
if self.tracer_config.get("tracer_enabled", False):
|
||||||
# The tracer is enabled so sanitize the config
|
# The tracer is enabled so sanitize the config
|
||||||
# If no whitelists are given
|
# If no whitelists are given
|
||||||
self.tracer_config.setdefault("user_whitelist", ["*"])
|
self.tracer_config.setdefault("user_whitelist", ["*"])
|
||||||
self.tracer_config.setdefault("homeserver_whitelist", ["*"])
|
self.tracer_config.setdefault("homeserver_whitelist", ["*"])
|
||||||
|
|
||||||
|
@ -58,6 +60,7 @@ class TracerConfig(Config):
|
||||||
- "*"
|
- "*"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def init_tracing(config):
|
def init_tracing(config):
|
||||||
"""Initialise the JaegerClient tracer
|
"""Initialise the JaegerClient tracer
|
||||||
|
|
||||||
|
@ -69,25 +72,14 @@ def init_tracing(config):
|
||||||
|
|
||||||
if config.tracer_config.get("tracer_enabled", False):
|
if config.tracer_config.get("tracer_enabled", False):
|
||||||
jaeger_config = JaegerConfig(
|
jaeger_config = JaegerConfig(
|
||||||
config={
|
config={"sampler": {"type": "const", "param": 1}, "logging": True},
|
||||||
'sampler': {
|
|
||||||
'type': 'const',
|
|
||||||
'param': 1,
|
|
||||||
},
|
|
||||||
'logging': True,
|
|
||||||
},
|
|
||||||
service_name=config.server_name,
|
service_name=config.server_name,
|
||||||
scope_manager=LogContextScopeManager(config),
|
scope_manager=LogContextScopeManager(config),
|
||||||
)
|
)
|
||||||
else: # The tracer is not configured so we instantiate a noop tracer
|
else: # The tracer is not configured so we instantiate a noop tracer
|
||||||
jaeger_config = JaegerConfig(
|
jaeger_config = JaegerConfig(
|
||||||
config={
|
config={"sampler": {"type": "const", "param": 0}},
|
||||||
'sampler': {
|
service_name=config.server_name,
|
||||||
'type': 'const',
|
|
||||||
'param': 0,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
service_name=config.server_name
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return jaeger_config.initialize_tracer()
|
return jaeger_config.initialize_tracer()
|
||||||
|
|
|
@ -23,8 +23,10 @@ from six import PY3, raise_from, string_types
|
||||||
from six.moves import urllib
|
from six.moves import urllib
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
|
import opentracing
|
||||||
import treq
|
import treq
|
||||||
from canonicaljson import encode_canonical_json
|
from canonicaljson import encode_canonical_json
|
||||||
|
from opentracing.propagation import Format
|
||||||
from prometheus_client import Counter
|
from prometheus_client import Counter
|
||||||
from signedjson.sign import sign_json
|
from signedjson.sign import sign_json
|
||||||
from zope.interface import implementer
|
from zope.interface import implementer
|
||||||
|
@ -52,9 +54,6 @@ from synapse.util.async_helpers import timeout_deferred
|
||||||
from synapse.util.logcontext import make_deferred_yieldable
|
from synapse.util.logcontext import make_deferred_yieldable
|
||||||
from synapse.util.metrics import Measure
|
from synapse.util.metrics import Measure
|
||||||
|
|
||||||
import opentracing
|
|
||||||
from opentracing.propagation import Format
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
outgoing_requests_counter = Counter(
|
outgoing_requests_counter = Counter(
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
import contextlib
|
import contextlib
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import opentracing
|
import opentracing
|
||||||
|
|
||||||
from twisted.web.server import Request, Site
|
from twisted.web.server import Request, Site
|
||||||
|
@ -21,7 +22,7 @@ from twisted.web.server import Request, Site
|
||||||
from synapse.http import redact_uri
|
from synapse.http import redact_uri
|
||||||
from synapse.http.request_metrics import RequestMetrics, requests_counter
|
from synapse.http.request_metrics import RequestMetrics, requests_counter
|
||||||
from synapse.util.logcontext import LoggingContext, PreserveLoggingContext
|
from synapse.util.logcontext import LoggingContext, PreserveLoggingContext
|
||||||
from synapse.util.tracerutils import extract_span_context
|
from synapse.util.tracerutils import extract_span_context
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -247,7 +248,7 @@ class SynapseRequest(Request):
|
||||||
"http.url": self.get_redacted_uri(),
|
"http.url": self.get_redacted_uri(),
|
||||||
"peer.ipv6": self.getClientIP(),
|
"peer.ipv6": self.getClientIP(),
|
||||||
},
|
},
|
||||||
child_of=span_context
|
child_of=span_context,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _finished_processing(self):
|
def _finished_processing(self):
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
from .logcontext import LoggingContext, nested_logging_context
|
|
||||||
from opentracing import ScopeManager, Scope
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from opentracing import Scope, ScopeManager
|
||||||
|
|
||||||
|
from .logcontext import LoggingContext, nested_logging_context
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LogContextScopeManager(ScopeManager):
|
class LogContextScopeManager(ScopeManager):
|
||||||
|
|
||||||
_homeserver_whitelist = ["*"]
|
_homeserver_whitelist = ["*"]
|
||||||
|
@ -71,6 +74,7 @@ class LogContextScopeManager(ScopeManager):
|
||||||
def user_whitelisted(self, request):
|
def user_whitelisted(self, request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class _LogContextScope(Scope):
|
class _LogContextScope(Scope):
|
||||||
def __init__(self, manager, span, logcontext, enter_logcontext, finish_on_close):
|
def __init__(self, manager, span, logcontext, enter_logcontext, finish_on_close):
|
||||||
super(_LogContextScope, self).__init__(manager, span)
|
super(_LogContextScope, self).__init__(manager, span)
|
||||||
|
@ -86,7 +90,7 @@ class _LogContextScope(Scope):
|
||||||
super(_LogContextScope, self).__exit__(type, value, traceback)
|
super(_LogContextScope, self).__exit__(type, value, traceback)
|
||||||
if self._enter_logcontext:
|
if self._enter_logcontext:
|
||||||
self.logcontext.__exit__(type, value, traceback)
|
self.logcontext.__exit__(type, value, traceback)
|
||||||
else: # the logcontext existed before the creation of the scope
|
else: # the logcontext existed before the creation of the scope
|
||||||
self.logcontext.scope = None
|
self.logcontext.scope = None
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
@ -95,4 +99,4 @@ class _LogContextScope(Scope):
|
||||||
return
|
return
|
||||||
|
|
||||||
if self._finish_on_close:
|
if self._finish_on_close:
|
||||||
self.span.finish()
|
self.span.finish()
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
from opentracing.propagation import Format
|
|
||||||
import opentracing
|
import opentracing
|
||||||
|
from opentracing.propagation import Format
|
||||||
|
|
||||||
from .logcontext import LoggingContext
|
from .logcontext import LoggingContext
|
||||||
|
|
||||||
|
|
||||||
def extract_span_context(headers):
|
def extract_span_context(headers):
|
||||||
"""
|
"""
|
||||||
Extracts a span context from Twisted Headers.
|
Extracts a span context from Twisted Headers.
|
||||||
|
@ -13,10 +14,10 @@ def extract_span_context(headers):
|
||||||
"""
|
"""
|
||||||
# Twisted encodes the values as lists whereas opentracing doesn't.
|
# Twisted encodes the values as lists whereas opentracing doesn't.
|
||||||
# So, we take the first item in the list.
|
# So, we take the first item in the list.
|
||||||
# Also, twisted uses byte arrays while opentracing expects strings.
|
# Also, twisted uses byte arrays while opentracing expects strings.
|
||||||
header_dict = {k.decode(): v[0].decode() for k, v in headers.getAllRawHeaders()}
|
header_dict = {k.decode(): v[0].decode() for k, v in headers.getAllRawHeaders()}
|
||||||
return opentracing.tracer.extract(Format.HTTP_HEADERS, header_dict)
|
return opentracing.tracer.extract(Format.HTTP_HEADERS, header_dict)
|
||||||
|
|
||||||
|
|
||||||
def inject_span_context(headers, span):
|
def inject_span_context(headers, span):
|
||||||
"""
|
"""
|
||||||
|
@ -34,14 +35,16 @@ def inject_span_context(headers, span):
|
||||||
"""
|
"""
|
||||||
carrier = {}
|
carrier = {}
|
||||||
carrier = opentracing.tracer.inject(span, Format.HTTP_HEADERS, {})
|
carrier = opentracing.tracer.inject(span, Format.HTTP_HEADERS, {})
|
||||||
|
|
||||||
for key, value in carrier:
|
for key, value in carrier:
|
||||||
headers.addRawHeaders(key, value)
|
headers.addRawHeaders(key, value)
|
||||||
|
|
||||||
|
|
||||||
# TODO: Implement whitelisting
|
# TODO: Implement whitelisting
|
||||||
def request_from_whitelisted_homeserver(request):
|
def request_from_whitelisted_homeserver(request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# TODO: Implement whitelisting
|
# TODO: Implement whitelisting
|
||||||
def user_whitelisted(request):
|
def user_whitelisted(request):
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in New Issue