Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Clean up opentracing configuration options #5712

Merged
merged 3 commits into from
Jul 18, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelog.d/5544.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add support for opentracing.

1 change: 0 additions & 1 deletion changelog.d/5544.misc

This file was deleted.

2 changes: 2 additions & 0 deletions changelog.d/5712.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add support for opentracing.

35 changes: 21 additions & 14 deletions docs/sample_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1409,17 +1409,24 @@ password_config:


## Opentracing ##
# These settings enable opentracing which implements distributed tracing
# This allows you to observe the causal chain of events across servers
# including requests, key lookups etc. across any server running
# synapse or any other other services which supports opentracing.
# (specifically those implemented with jaeger)

#opentracing:
# # Enable / disable tracer
# tracer_enabled: false
# # The list of homeservers we wish to expose our current traces to.
# # The list is a list of regexes which are matched against the
# # servername of the homeserver
# homeserver_whitelist:
# - ".*"

# These settings enable opentracing, which implements distributed tracing.
# This allows you to observe the causal chains of events across servers
# including requests, key lookups etc., across any server running
# synapse or any other other services which supports opentracing
# (specifically those implemented with Jaeger).
#
opentracing:
# tracing is disabled by default. Uncomment the following line to enable it.
#
#enabled: true

# The list of homeservers we wish to expose our current traces to.
# XXX this is unclear
# This a list of regexes which are matched against the server_name of the
# homeserver.
#
# By defult, it is empty, so no servers are matched.
#
#homeserver_whitelist:
# - ".*"
63 changes: 41 additions & 22 deletions synapse/config/tracer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,33 +18,52 @@

class TracerConfig(Config):
def read_config(self, config, **kwargs):
self.tracer_config = config.get("opentracing")
opentracing_config = config.get("opentracing")
if opentracing_config is None:
opentracing_config = {}

self.tracer_config = config.get("opentracing", {"tracer_enabled": False})
self.opentracer_enabled = opentracing_config.get("enabled", False)
if not self.opentracer_enabled:
return

if self.tracer_config.get("tracer_enabled", False):
# The tracer is enabled so sanitize the config
# If no whitelists are given
self.tracer_config.setdefault("homeserver_whitelist", [])
# The tracer is enabled so sanitize the config

if not isinstance(self.tracer_config.get("homeserver_whitelist"), list):
raise ConfigError("Tracer homesererver_whitelist config is malformed")
self.opentracer_whitelist = opentracing_config.get("homeserver_whitelist", [])
if not isinstance(self.opentracer_whitelist, list):
raise ConfigError("Tracer homeserver_whitelist config is malformed")

def generate_config_section(cls, **kwargs):
return """\
## Opentracing ##
# These settings enable opentracing which implements distributed tracing
# This allows you to observe the causal chain of events across servers
# including requests, key lookups etc. across any server running
# synapse or any other other services which supports opentracing.
# (specifically those implemented with jaeger)

#opentracing:
# # Enable / disable tracer
# tracer_enabled: false
# # The list of homeservers we wish to expose our current traces to.
# # The list is a list of regexes which are matched against the
# # servername of the homeserver
# homeserver_whitelist:
# - ".*"

# These settings enable opentracing, which implements distributed tracing.
# This allows you to observe the causal chains of events across servers
# including requests, key lookups etc., across any server running
# synapse or any other other services which supports opentracing
# (specifically those implemented with Jaeger).
#
opentracing:
# tracing is disabled by default. Uncomment the following line to enable it.
#
#enabled: true

# The list of homeservers we wish to send and receive span contexts and span baggage.
#
# Though it's mostly safe to send and receive span contexts to and from
# untrusted users since span contexts are usually opaque ids it can lead to
# two problems, namely:
# - If the span context is marked as sampled by the sending homeserver the receiver will
# sample it. Therefore two homeservers with wildly disparaging sampling policies
# could incur higher sampling counts than intended.
# - Span baggage can be arbitrary data. For safety this has been disabled in synapse
# but that doesn't prevent another server sending you baggage which will be logged
# to opentracing logs.
#
# This a list of regexes which are matched against the server_name of the
# homeserver.
#
# By defult, it is empty, so no servers are matched.
#
#homeserver_whitelist:
# - ".*"
"""
42 changes: 19 additions & 23 deletions synapse/logging/opentracing.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2019 The Matrix.org Foundation C.I.C.d
# Copyright 2019 The Matrix.org Foundation C.I.C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -24,6 +24,15 @@
# this move the methods have work very similarly to opentracing's and it should only
# be a matter of few regexes to move over to opentracing's access patterns proper.

import contextlib
import logging
import re
from functools import wraps

from twisted.internet import defer

from synapse.config import ConfigError

try:
import opentracing
except ImportError:
Expand All @@ -35,12 +44,6 @@
JaegerConfig = None
LogContextScopeManager = None

import contextlib
import logging
import re
from functools import wraps

from twisted.internet import defer

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -91,7 +94,8 @@ def _only_if_tracing_inner(*args, **kwargs):
return _only_if_tracing_inner


# Block everything by default
# A regex which matches the server_names to expose traces for.
# None means 'block everything'.
_homeserver_whitelist = None

tags = _DumTagNames
Expand All @@ -101,31 +105,24 @@ def init_tracer(config):
"""Set the whitelists and initialise the JaegerClient tracer

Args:
config (Config)
The config used by the homeserver. Here it's used to set the service
name to the homeserver's.
config (HomeserverConfig): The config used by the homeserver
"""
global opentracing
if not config.tracer_config.get("tracer_enabled", False):
if not config.opentracer_enabled:
# We don't have a tracer
opentracing = None
return

if not opentracing:
logger.error(
"The server has been configure to use opentracing but opentracing is not installed."
)
raise ModuleNotFoundError("opentracing")

if not JaegerConfig:
logger.error(
"The server has been configure to use opentracing but opentracing is not installed."
if not opentracing or not JaegerConfig:
raise ConfigError(
"The server has been configured to use opentracing but opentracing is not "
"installed."
)

# Include the worker name
name = config.worker_name if config.worker_name else "master"

set_homeserver_whitelist(config.tracer_config["homeserver_whitelist"])
set_homeserver_whitelist(config.opentracer_whitelist)
jaeger_config = JaegerConfig(
config={"sampler": {"type": "const", "param": 1}, "logging": True},
service_name="{} {}".format(config.server_name, name),
Expand Down Expand Up @@ -232,7 +229,6 @@ def whitelisted_homeserver(destination):
"""Checks if a destination matches the whitelist
Args:
destination (String)"""
global _homeserver_whitelist
if _homeserver_whitelist:
return _homeserver_whitelist.match(destination)
return False
Expand Down
4 changes: 1 addition & 3 deletions synapse/logging/scopecontextmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ class LogContextScopeManager(ScopeManager):
"""

def __init__(self, config):
# Set the whitelists
logger.info(config.tracer_config)
self._homeserver_whitelist = config.tracer_config["homeserver_whitelist"]
JorikSchellekens marked this conversation as resolved.
Show resolved Hide resolved
pass

@property
def active(self):
Expand Down