diff --git a/api/extensions/ext_sentry.py b/api/extensions/ext_sentry.py index 69d1f1ab07e..1d4c071d5f5 100644 --- a/api/extensions/ext_sentry.py +++ b/api/extensions/ext_sentry.py @@ -7,6 +7,7 @@ def init_app(app: DifyApp): import sentry_sdk from sentry_sdk.integrations.celery import CeleryIntegration from sentry_sdk.integrations.flask import FlaskIntegration + from sentry_sdk.integrations.logging import ignore_logger from werkzeug.exceptions import HTTPException from graphon.model_runtime.errors.invoke import InvokeRateLimitError @@ -45,3 +46,12 @@ def init_app(app: DifyApp): release=f"dify-{dify_config.project.version}-{dify_config.COMMIT_SHA}", before_send=before_send, ) + + if dify_config.BILLING_ENABLED: + # Cloud only. `opentelemetry.context.detach()` catches its own failures and reports + # them through `logger.exception`, so a double-detach surfaces as an error event + # rather than as a raised exception. Under gevent this can fire about once per + # workflow run, which is enough volume to crowd real errors out of the issue stream. + # Self-hosted deployments rarely see enough of it to be worth silencing, and the + # records still reach the normal logging handlers either way. + ignore_logger("opentelemetry.context")