From e5ad7e093e8dd268d00a36259393cf4496a3d92a Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Sat, 27 Apr 2019 22:01:33 +0200 Subject: [PATCH] log warnings when response status != 200 --- inventory_provider/__init__.py | 3 +++ .../logging_default_config.json | 2 +- inventory_provider/routes/classifier.py | 5 ++++ inventory_provider/routes/common.py | 26 +++++++++++++++++++ inventory_provider/routes/data.py | 5 ++++ inventory_provider/routes/default.py | 5 ++++ inventory_provider/routes/jobs.py | 5 ++++ inventory_provider/routes/poller.py | 5 ++++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py index 024fac84..069799fe 100644 --- a/inventory_provider/__init__.py +++ b/inventory_provider/__init__.py @@ -5,6 +5,7 @@ import logging import os from flask import Flask +from inventory_provider import environment def create_app(): """ @@ -21,6 +22,8 @@ def create_app(): app = Flask(__name__) app.secret_key = "super secret session key" + environment.setup_logging() + from inventory_provider.routes import default app.register_blueprint(default.routes, url_prefix='/') diff --git a/inventory_provider/logging_default_config.json b/inventory_provider/logging_default_config.json index ba3f1eb3..38f4e61c 100644 --- a/inventory_provider/logging_default_config.json +++ b/inventory_provider/logging_default_config.json @@ -56,7 +56,7 @@ }, "root": { - "level": "WARNING", + "level": "DEBUG", "handlers": ["console", "syslog_handler"] } } \ No newline at end of file diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 90b8d9da..ccf3a016 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -38,6 +38,11 @@ def handle_request_error(error): status=error.status_code) +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + def base_interface_name(interface): m = re.match(r'(.*?)(\.\d+)?$', interface) assert m # sanity: anything should match diff --git a/inventory_provider/routes/common.py b/inventory_provider/routes/common.py index c51ac117..9e99eb34 100644 --- a/inventory_provider/routes/common.py +++ b/inventory_provider/routes/common.py @@ -1,8 +1,11 @@ import functools +import logging from flask import request, Response, current_app, g import redis +logger = logging.getLogger(__name__) + def get_redis(): if 'redis_db' not in g: @@ -31,3 +34,26 @@ def require_accepts_json(f): mimetype="text/html") return f(*args, **kwargs) return decorated_function + + +def after_request(response): + """ + generic function to do additional logging of requests & responses + :param response: + :return: + """ + if response.status_code != 200: + + try: + data = response.data.decode('utf-8') + except Exception: + # never expected to happen, but we don't want any failures here + logging.exception('INTERNAL DECODING ERROR') + data = 'decoding error (see logs)' + + logger.warning('"%s %s" "%s" %s' % ( + request.method, + request.path, + data, + str(response.status_code))) + return response diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py index 258f05ea..905b2cde 100644 --- a/inventory_provider/routes/data.py +++ b/inventory_provider/routes/data.py @@ -10,6 +10,11 @@ from inventory_provider.db import opsdb routes = Blueprint("inventory-data-query-routes", __name__) +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + @routes.route("/routers", methods=['GET', 'POST']) @common.require_accepts_json def routers(): diff --git a/inventory_provider/routes/default.py b/inventory_provider/routes/default.py index fd480bac..5b4c6b92 100644 --- a/inventory_provider/routes/default.py +++ b/inventory_provider/routes/default.py @@ -8,6 +8,11 @@ routes = Blueprint("inventory-data-default-routes", __name__) API_VERSION = '0.1' +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + @routes.route("/version", methods=['GET', 'POST']) @common.require_accepts_json def version(): diff --git a/inventory_provider/routes/jobs.py b/inventory_provider/routes/jobs.py index a02ddea1..dc90269f 100644 --- a/inventory_provider/routes/jobs.py +++ b/inventory_provider/routes/jobs.py @@ -5,6 +5,11 @@ from inventory_provider.routes import common routes = Blueprint("inventory-data-job-routes", __name__) +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + @routes.route("/update", methods=['GET', 'POST']) @common.require_accepts_json def update(): diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py index d644272f..93179717 100644 --- a/inventory_provider/routes/poller.py +++ b/inventory_provider/routes/poller.py @@ -8,6 +8,11 @@ from inventory_provider.routes import common routes = Blueprint('poller-support-routes', __name__) +@routes.after_request +def after_request(resp): + return common.after_request(resp) + + @routes.route('/interfaces/<hostname>', methods=['GET', 'POST']) @common.require_accepts_json def poller_interface_oids(hostname): -- GitLab