From 5fe4a83e4be7f307ffcf31827871c33f17e68170 Mon Sep 17 00:00:00 2001 From: Peter Heiss Date: Mon, 28 Oct 2019 17:30:37 +0100 Subject: [PATCH] move dir and fixed 404 bug --- connexion-plus/__init__.py | 0 connexion_plus/Factory.py | 37 ++++++++++++++++++++++ connexion_plus/TracerDecorator.py | 52 +++++++++++++++++++++++++++++++ connexion_plus/__init__.py | 1 + 4 files changed, 90 insertions(+) delete mode 100644 connexion-plus/__init__.py create mode 100644 connexion_plus/Factory.py create mode 100644 connexion_plus/TracerDecorator.py create mode 100644 connexion_plus/__init__.py diff --git a/connexion-plus/__init__.py b/connexion-plus/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/connexion_plus/Factory.py b/connexion_plus/Factory.py new file mode 100644 index 0000000..b3b8576 --- /dev/null +++ b/connexion_plus/Factory.py @@ -0,0 +1,37 @@ +import logging + +logger = logging.getLogger('') + + +class Factory(): + def __init__(self, app, api, tracer=None, metrics=False): + self.app = app + self.api = api + + if tracer is not None: + logger.debug("add tracer") + self.addTracer(tracer) + + if metrics: + logger.debug("add prometheus") + self.addPrometheus() + + def addTracer(self, tracer): + try: + from .TracerDecorator import TracerDecorator + self.api.get_response = TracerDecorator(self.api.get_response, tracer) + logger.debug("Add Tracing for flask") + except ImportError as e: + print(e) + logger.debug("TracerDecorator not found") + + + def addPrometheus(self): + try: + from prometheus_flask_exporter import PrometheusMetrics + logger.debug("Add PrometheusMetrics for flask") + return PrometheusMetrics(self.app.app) + except ImportError as e: + logger.debug("PrometheusMetrics not found") + + diff --git a/connexion_plus/TracerDecorator.py b/connexion_plus/TracerDecorator.py new file mode 100644 index 0000000..098c77a --- /dev/null +++ b/connexion_plus/TracerDecorator.py @@ -0,0 +1,52 @@ +import logging + +logger = logging.getLogger('') + + +def TracerDecorator(func, tracer): + def wrapper(*args): + #don't need to check, because this Decorator will only be executed, if the tracer was configured at startup + + # this check is needed, because api is called outside from class, so sometimes there is a self-argument, and sometimes it doesnt. + if len(args) == 4: + cls = args[0] + response = args[1] + mimetype = args[2] + request = args[3] + else: + response = args[0] + try: + mimetype = args[1] + except IndexError as e: + mimetype = None + try: + request = args[2] + except IndexError as e: + request = None + + from opentracing.ext import tags + from opentracing.propagation import Format + + # extract the context from request header to continue a session + # taken from https://github.com/yurishkuro/opentracing-tutorial/tree/master/python/lesson03#extract-the-span-context-from-the-incoming-request-using-tracerextract + if request is not None: + span_ctx = tracer.extract(Format.HTTP_HEADERS, request.headers) + span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER} + + # remove domain from url, so only the path is in the span + from urllib.parse import urlparse + path = urlparse(request.url).path + + scope = tracer.start_span(request.method + "_" + path, child_of=span_ctx, tags=span_tags) + scope.log_kv({"request": request}) + else: + scope = tracer.start_span("NO_REQUEST_CONTEXT") + + resp = func(response, mimetype, request) + + scope.log_kv({"response": response}) + scope.finish() + + return resp + + return wrapper diff --git a/connexion_plus/__init__.py b/connexion_plus/__init__.py new file mode 100644 index 0000000..c54268d --- /dev/null +++ b/connexion_plus/__init__.py @@ -0,0 +1 @@ +from .Factory import Factory