Wrap API and registry requests with common metric timings
Record response times, codes, and rollup non-2XX responses.
This commit is contained in:
parent
b04c190ca0
commit
b483209862
4 changed files with 48 additions and 4 deletions
|
@ -1,7 +1,11 @@
|
|||
import logging
|
||||
import time
|
||||
|
||||
from functools import wraps
|
||||
from Queue import Queue, Full
|
||||
|
||||
from flask import g, request
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -16,4 +20,38 @@ class MetricQueue(object):
|
|||
logger.error('Metric queue full')
|
||||
|
||||
def get(self):
|
||||
return self._queue.get()
|
||||
v = self._queue.get()
|
||||
return v
|
||||
|
||||
def time_blueprint(bp, metric_queue):
|
||||
bp.before_request(time_before_request)
|
||||
bp.after_request(time_after_request(bp.name, metric_queue))
|
||||
|
||||
def time_before_request():
|
||||
g._start = time.time()
|
||||
|
||||
def time_after_request(name, metric_queue):
|
||||
def f(r):
|
||||
start = getattr(g, '_start', None)
|
||||
if start is None:
|
||||
return r
|
||||
dur = time.time() - start
|
||||
dims = dimensions={'endpoint': request.endpoint}
|
||||
metric_queue.put('ResponseTime', dur, dimensions=dims, unit='Seconds')
|
||||
metric_queue.put('ResponseCode', r.status_code, dimensions=dims)
|
||||
if r.status_code < 200 or r.status_code >= 300:
|
||||
metric_queue.put('Non200Response', 1, dimensions={'name': name})
|
||||
return r
|
||||
return f
|
||||
|
||||
def time_decorator(name, metric_queue):
|
||||
after = time_after_request(name, metric_queue)
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
time_before_request()
|
||||
rv = func(*args, **kwargs)
|
||||
after(rv)
|
||||
return rv
|
||||
return wrapper
|
||||
return decorator
|
||||
|
|
Reference in a new issue