之前我们编写了一个 Python 应用程序来发送跟踪,但这次我们将编写一个 Python 中的 Flask Web 应用程序,以便更好地了解集成。Flask 是一个 Python Web 框架,它可以帮助我们轻松地构建简单的面向 Web 的应用程序或 API 应用程序。在这个例子中,我们只展示了一个简化版本,以便我们能够简洁地演示这些技术。
from flask import Flask, request, g from prometheus_client import start_http_server from minio import Minio
from opentelemetry import metrics from opentelemetry.exporter.prometheus import PrometheusMetricReader from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.instrumentation.flask import FlaskInstrumentor
import time # Service name is required for most backends resource = Resource(attributes={ SERVICE_NAME: "minio-service" }) # Start Prometheus client start_http_server(port=8000, addr="0.0.0.0") reader = PrometheusMetricReader() provider = MeterProvider(resource=resource, metric_readers=[reader]) metrics.set_meter_provider(provider) meter = metrics.get_meter(__name__, True) minio_app_visits_counter = meter.create_counter( name="minio_app_visits", description="count the number of visit to various routes", unit="1", ) minio_request_duration = meter.create_histogram( name="minio_request_duration", description="measures the duration of the inbound MinIO App HTTP request", unit="milliseconds") config = { "minio_endpoint": "minio:9000", "minio_username": "minio", "minio_password": "minioadmin", } minio_client = Minio(config["minio_endpoint"], secure=False, access_key=config["minio_username"], secret_key=config["minio_password"] ) app = Flask(__name__) FlaskInstrumentor().instrument_app(app) @app.before_request defbefore_request_func(): g.start_time = round(time.time()*1000) minio_app_visits_counter.add(1, attributes={"request_path": request.path}) @app.after_request defafter_request_func(response): total_request_time = round(time.time()*1000) - g.start_time minio_request_duration.record(total_request_time, {"request_path": request.path}) return response @app.route('/') defhello_world(): return'<h1>Hello World MinIO!</h1>' @app.route('/makebucket/<name>') defmake_bucket(name): ifnot minio_client.bucket_exists(name): minio_client.make_bucket(name) returnf""" <html> <h3>Make Bucket {name} Successful</h3> </html> """ @app.route('/removebucket/<name>') defremove_bucket(name): if minio_client.bucket_exists(name): minio_client.remove_bucket(name) returnf""" <html> <h3>Removed Bucket {name} Successful</h3> </html> """ if __name__ == "__main__": app.run(debug=True)
from opentelemetry import metrics from opentelemetry.exporter.prometheus import PrometheusMetricReader from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.instrumentation.flask import FlaskInstrumentor