From de750a67ec651c179ea394195b09030f2ff0db30 Mon Sep 17 00:00:00 2001 From: AichiB7A Date: Tue, 22 Apr 2025 13:19:22 +0800 Subject: [PATCH] [Observability] feat: add metrics of http response (#18499) --- api/extensions/ext_otel.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/api/extensions/ext_otel.py b/api/extensions/ext_otel.py index 59ec0d0686..a2edd832ec 100644 --- a/api/extensions/ext_otel.py +++ b/api/extensions/ext_otel.py @@ -14,7 +14,7 @@ from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExport from opentelemetry.instrumentation.celery import CeleryInstrumentor from opentelemetry.instrumentation.flask import FlaskInstrumentor from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor -from opentelemetry.metrics import get_meter_provider, set_meter_provider +from opentelemetry.metrics import get_meter, get_meter_provider, set_meter_provider from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.b3 import B3Format from opentelemetry.propagators.composite import CompositePropagator @@ -112,6 +112,11 @@ def is_celery_worker(): def init_flask_instrumentor(app: DifyApp): + meter = get_meter("http_metrics", version=dify_config.CURRENT_VERSION) + _http_response_counter = meter.create_counter( + "http.server.response.count", description="Total number of HTTP responses by status code", unit="{response}" + ) + def response_hook(span: Span, status: str, response_headers: list): if span and span.is_recording(): if status.startswith("2"): @@ -119,6 +124,11 @@ def init_flask_instrumentor(app: DifyApp): else: span.set_status(StatusCode.ERROR, status) + status = status.split(" ")[0] + status_code = int(status) + status_class = f"{status_code // 100}xx" + _http_response_counter.add(1, {"status_code": status_code, "status_class": status_class}) + instrumentor = FlaskInstrumentor() if dify_config.DEBUG: logging.info("Initializing Flask instrumentor")