Skip to content

Commit fc97172

Browse files
committed
refactor(metrics): migrate from prometheus client to opentelemetry
With OT, it will be easier to switch backends when we want to.
1 parent aefb690 commit fc97172

File tree

2 files changed

+45
-13
lines changed

2 files changed

+45
-13
lines changed

pyms/flask/services/metrics.py

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,44 @@
33
from typing import Text
44

55
from flask import Blueprint, Response, request
6-
from prometheus_client import Counter, Histogram, generate_latest
76
from pyms.flask.services.driver import DriverService
87

8+
from prometheus_client import generate_latest
9+
from opentelemetry import metrics
10+
from opentelemetry.exporter.prometheus import PrometheusMetricsExporter
11+
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
12+
from opentelemetry.sdk.metrics import Counter, ValueRecorder, MeterProvider
13+
914
# Based on https://github.com/sbarratt/flask-prometheus
1015
# and https://github.com/korfuri/python-logging-prometheus/
1116

12-
FLASK_REQUEST_LATENCY = Histogram(
13-
"http_server_requests_seconds", "Flask Request Latency", ["service", "method", "uri", "status"]
17+
metrics.set_meter_provider(MeterProvider())
18+
meter = metrics.get_meter(__name__)
19+
exporter = PrometheusMetricsExporter()
20+
metrics.get_meter_provider().start_pipeline(meter, exporter, 1)
21+
22+
FLASK_REQUEST_LATENCY = meter.create_metric(
23+
"http_server_requests_seconds",
24+
"Flask Request Latency",
25+
"http_server_requests_seconds",
26+
float,
27+
ValueRecorder,
28+
("service", "method", "uri", "status"),
1429
)
15-
FLASK_REQUEST_COUNT = Counter(
16-
"http_server_requests_count", "Flask Request Count", ["service", "method", "uri", "status"]
30+
FLASK_REQUEST_COUNT = meter.create_metric(
31+
"http_server_requests_count",
32+
"Flask Request Count",
33+
"http_server_requests_count",
34+
int,
35+
Counter,
36+
["service", "method", "uri", "status"],
1737
)
18-
19-
LOGGER_TOTAL_MESSAGES = Counter(
38+
LOGGER_TOTAL_MESSAGES = meter.create_metric(
2039
"logger_messages_total",
2140
"Count of log entries by service and level.",
41+
"logger_messages_total",
42+
int,
43+
Counter,
2244
["service", "level"],
2345
)
2446

@@ -36,20 +58,28 @@ def after_request(self, response):
3658
else:
3759
path = request.path
3860
request_latency = time.time() - request.start_time
39-
FLASK_REQUEST_LATENCY.labels(self.app_name, request.method, path, response.status_code).observe(request_latency)
40-
FLASK_REQUEST_COUNT.labels(self.app_name, request.method, path, response.status_code).inc()
61+
labels = {
62+
"service": self.app_name,
63+
"method": str(request.method),
64+
"uri": path,
65+
"status": str(response.status_code),
66+
}
67+
68+
FLASK_REQUEST_LATENCY.record(request_latency, labels)
69+
FLASK_REQUEST_COUNT.add(1, labels)
4170

4271
return response
4372

4473

4574
class Service(DriverService):
4675
"""
47-
Adds [Prometheus](https://prometheus.io/) metrics using the [Prometheus Client Library](https://github.com/prometheus/client_python).
76+
Adds [Prometheus](https://prometheus.io/) metrics using the [Opentelemetry Client Library](https://opentelemetry-python.readthedocs.io/en/latest/exporter/prometheus/prometheus.html).
4877
"""
4978
config_resource: Text = "metrics"
5079

5180
def __init__(self, *args, **kwargs):
5281
super().__init__(*args, **kwargs)
82+
5383
self.metrics_blueprint = Blueprint("metrics", __name__)
5484
self.serve_metrics()
5585

@@ -79,7 +109,8 @@ class MetricsLogHandler(logging.Handler):
79109

80110
def __init__(self, app_name):
81111
super().__init__()
82-
self.app_name = app_name
112+
self.app_name = str(app_name)
83113

84114
def emit(self, record):
85-
LOGGER_TOTAL_MESSAGES.labels(self.app_name, record.levelname).inc()
115+
labels = {"service": self.app_name, "level": record.levelname}
116+
LOGGER_TOTAL_MESSAGES.add(1, labels)

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@
4949
]
5050

5151
install_metrics_requires = [
52-
'prometheus_client>=0.8.0',
52+
'opentelemetry-exporter-prometheus>=0.13b0',
53+
'opentelemetry-sdk>=0.13b0',
5354
]
5455

5556
install_tests_requires = [

0 commit comments

Comments
 (0)