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