33from typing import Text
44
55from flask import Blueprint , Response , request
6- from prometheus_client import Counter , Histogram , generate_latest
76from 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
4574class 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 )
0 commit comments