Browse Source

[Observability] Update counter to include http method and target (#19297)

Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
tags/1.4.0
AichiB7A 5 months ago
parent
commit
c4c20f6ed5
No account linked to committer's email address
1 changed files with 13 additions and 2 deletions
  1. 13
    2
      api/extensions/ext_otel.py

+ 13
- 2
api/extensions/ext_otel.py View File

import sys import sys
from typing import Union from typing import Union


import flask
from celery.signals import worker_init # type: ignore from celery.signals import worker_init # type: ignore
from flask_login import user_loaded_from_request, user_logged_in # type: ignore from flask_login import user_loaded_from_request, user_logged_in # type: ignore






def init_app(app: DifyApp): def init_app(app: DifyApp):
from opentelemetry.semconv.trace import SpanAttributes

def is_celery_worker(): def is_celery_worker():
return "celery" in sys.argv[0].lower() return "celery" in sys.argv[0].lower()


def init_flask_instrumentor(app: DifyApp): def init_flask_instrumentor(app: DifyApp):
meter = get_meter("http_metrics", version=dify_config.CURRENT_VERSION) meter = get_meter("http_metrics", version=dify_config.CURRENT_VERSION)
_http_response_counter = meter.create_counter( _http_response_counter = meter.create_counter(
"http.server.response.count", description="Total number of HTTP responses by status code", unit="{response}"
"http.server.response.count",
description="Total number of HTTP responses by status code, method and target",
unit="{response}",
) )


def response_hook(span: Span, status: str, response_headers: list): def response_hook(span: Span, status: str, response_headers: list):
status = status.split(" ")[0] status = status.split(" ")[0]
status_code = int(status) status_code = int(status)
status_class = f"{status_code // 100}xx" status_class = f"{status_code // 100}xx"
_http_response_counter.add(1, {"status_code": status_code, "status_class": status_class})
attributes: dict[str, str | int] = {"status_code": status_code, "status_class": status_class}
request = flask.request
if request and request.url_rule:
attributes[SpanAttributes.HTTP_TARGET] = str(request.url_rule.rule)
if request and request.method:
attributes[SpanAttributes.HTTP_METHOD] = str(request.method)
_http_response_counter.add(1, attributes)


instrumentor = FlaskInstrumentor() instrumentor = FlaskInstrumentor()
if dify_config.DEBUG: if dify_config.DEBUG:

Loading…
Cancel
Save