Skip to content

Commit 248142c

Browse files
authored
Metrics fixes (#98)
* Add http status code to latency metrics Also, change some metrics and labels name to make them more standard. * Add tests for adding http method to latency metrics * Add pylint exception It's disabled because the whole point about converting the the two methods in a class is to use self.
1 parent 8cb721e commit 248142c

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

pyms/flask/app/create_app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def init_metrics(self):
196196
self.application.logger,
197197
self.application.config["APP_NAME"]
198198
)
199-
self.metrics.monitor(self.application)
199+
self.metrics.monitor(self.application.config["APP_NAME"], self.application)
200200

201201
def reload_conf(self):
202202
self.delete_services()

pyms/flask/services/metrics.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,32 @@
99
# and https://github.com/korfuri/python-logging-prometheus/
1010

1111
FLASK_REQUEST_LATENCY = Histogram(
12-
"flask_request_latency_seconds", "Flask Request Latency", ["method", "endpoint"]
12+
"http_server_requests_seconds", "Flask Request Latency", ["service", "method", "uri", "status"]
1313
)
1414
FLASK_REQUEST_COUNT = Counter(
15-
"flask_request_count", "Flask Request Count", ["method", "endpoint", "http_status"]
15+
"http_server_requests_count", "Flask Request Count", ["service", "method", "uri", "status"]
1616
)
1717

1818
LOGGER_TOTAL_MESSAGES = Counter(
19-
"python_logging_messages_total",
19+
"logger_messages_total",
2020
"Count of log entries by service and level.",
2121
["service", "level"],
2222
)
2323

2424

25-
def before_request():
26-
request.start_time = time.time()
25+
class FlaskMetricsWrapper():
26+
def __init__(self, app_name):
27+
self.app_name = app_name
2728

29+
def before_request(self): # pylint: disable=R0201
30+
request.start_time = time.time()
2831

29-
def after_request(response):
30-
request_latency = time.time() - request.start_time
31-
FLASK_REQUEST_LATENCY.labels(request.method, request.path).observe(request_latency)
32-
FLASK_REQUEST_COUNT.labels(request.method, request.path, response.status_code).inc()
32+
def after_request(self, response):
33+
request_latency = time.time() - request.start_time
34+
FLASK_REQUEST_LATENCY.labels(self.app_name, request.method, request.path, response.status_code).observe(request_latency)
35+
FLASK_REQUEST_COUNT.labels(self.app_name, request.method, request.path, response.status_code).inc()
3336

34-
return response
37+
return response
3538

3639

3740
class Service(DriverService):
@@ -46,9 +49,10 @@ def __init__(self, *args, **kwargs):
4649
self.serve_metrics()
4750

4851
@staticmethod
49-
def monitor(app):
50-
app.before_request(before_request)
51-
app.after_request(after_request)
52+
def monitor(app_name, app):
53+
metric = FlaskMetricsWrapper(app_name)
54+
app.before_request(metric.before_request)
55+
app.after_request(metric.after_request)
5256

5357
def serve_metrics(self):
5458
@self.metrics_blueprint.route("/metrics", methods=["GET"])

tests/test_metrics.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ def setUp(self):
2020
def test_metrics_latency(self):
2121
self.client.get("/")
2222
self.client.get("/metrics")
23-
generated_latency_root = b'flask_request_latency_seconds_bucket{endpoint="/",le="0.005",method="GET"}'
24-
generated_latency_metrics = b'flask_request_latency_seconds_bucket{endpoint="/metrics",le="0.005",method="GET"}'
23+
generated_latency_root = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice",status="200",uri="/"}'
24+
generated_latency_metrics = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
2525
assert generated_latency_root in generate_latest()
2626
assert generated_latency_metrics in generate_latest()
2727

2828
def test_metrics_count(self):
2929
self.client.get("/")
3030
self.client.get("/metrics")
31-
generated_count_root = b'flask_request_count_total{endpoint="/",http_status="404",method="GET"}'
32-
generated_count_metrics = b'flask_request_count_total{endpoint="/metrics",http_status="200",method="GET"}'
31+
generated_count_root = b'http_server_requests_count_total{method="GET",service="Python Microservice",status="200",uri="/"}'
32+
generated_count_metrics = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
3333
assert generated_count_root in generate_latest()
3434
assert generated_count_metrics in generate_latest()
3535

3636
def test_metrics_logger(self):
3737
self.client.get("/")
3838
self.client.get("/metrics")
39-
generated_logger = b'python_logging_messages_total{level="DEBUG",service="Python Microservice with Jaeger"}'
39+
generated_logger = b'logger_messages_total{level="DEBUG",service="Python Microservice with Jaeger"}'
4040
assert generated_logger in generate_latest()
4141

4242
def test_metrics_jaeger(self):

0 commit comments

Comments
 (0)