[Observability] Add type check and try-except in otel (#20319)

This commit is contained in:
AichiB7A 2025-05-27 21:17:45 +08:00 committed by GitHub
parent 4c46f04d77
commit 2b81b6673f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -22,16 +22,20 @@ def on_user_loaded(_sender, user: Union["Account", "EndUser"]):
from opentelemetry.trace import get_current_span from opentelemetry.trace import get_current_span
if user: if user:
current_span = get_current_span() try:
if isinstance(user, Account) and user.current_tenant_id: current_span = get_current_span()
tenant_id = user.current_tenant_id if isinstance(user, Account) and user.current_tenant_id:
elif isinstance(user, EndUser): tenant_id = user.current_tenant_id
tenant_id = user.tenant_id elif isinstance(user, EndUser):
else: tenant_id = user.tenant_id
return else:
if current_span: return
current_span.set_attribute("service.tenant.id", tenant_id) if current_span:
current_span.set_attribute("service.user.id", user.id) current_span.set_attribute("service.tenant.id", tenant_id)
current_span.set_attribute("service.user.id", user.id)
except Exception:
logging.exception("Error setting tenant and user attributes")
pass
def init_app(app: DifyApp): def init_app(app: DifyApp):
@ -54,21 +58,25 @@ def init_app(app: DifyApp):
def response_hook(span: Span, status: str, response_headers: list): def response_hook(span: Span, status: str, response_headers: list):
if span and span.is_recording(): if span and span.is_recording():
if status.startswith("2"): try:
span.set_status(StatusCode.OK) if status.startswith("2"):
else: span.set_status(StatusCode.OK)
span.set_status(StatusCode.ERROR, status) else:
span.set_status(StatusCode.ERROR, status)
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"
attributes: dict[str, str | int] = {"status_code": status_code, "status_class": status_class} attributes: dict[str, str | int] = {"status_code": status_code, "status_class": status_class}
request = flask.request request = flask.request
if request and request.url_rule: if request and request.url_rule:
attributes[SpanAttributes.HTTP_TARGET] = str(request.url_rule.rule) attributes[SpanAttributes.HTTP_TARGET] = str(request.url_rule.rule)
if request and request.method: if request and request.method:
attributes[SpanAttributes.HTTP_METHOD] = str(request.method) attributes[SpanAttributes.HTTP_METHOD] = str(request.method)
_http_response_counter.add(1, attributes) _http_response_counter.add(1, attributes)
except Exception:
logging.exception("Error setting status and attributes")
pass
instrumentor = FlaskInstrumentor() instrumentor = FlaskInstrumentor()
if dify_config.DEBUG: if dify_config.DEBUG:
@ -99,7 +107,7 @@ def init_app(app: DifyApp):
class ExceptionLoggingHandler(logging.Handler): class ExceptionLoggingHandler(logging.Handler):
"""Custom logging handler that creates spans for logging.exception() calls""" """Custom logging handler that creates spans for logging.exception() calls"""
def emit(self, record): def emit(self, record: logging.LogRecord):
try: try:
if record.exc_info: if record.exc_info:
tracer = get_tracer_provider().get_tracer("dify.exception.logging") tracer = get_tracer_provider().get_tracer("dify.exception.logging")
@ -114,9 +122,12 @@ def init_app(app: DifyApp):
}, },
) as span: ) as span:
span.set_status(StatusCode.ERROR) span.set_status(StatusCode.ERROR)
span.record_exception(record.exc_info[1]) if record.exc_info[1]:
span.set_attribute("exception.type", record.exc_info[0].__name__) span.record_exception(record.exc_info[1])
span.set_attribute("exception.message", str(record.exc_info[1])) span.set_attribute("exception.message", str(record.exc_info[1]))
if record.exc_info[0]:
span.set_attribute("exception.type", record.exc_info[0].__name__)
except Exception: except Exception:
pass pass