dify/api/extensions/ext_sentry.py

58 lines
2.4 KiB
Python

from configs import dify_config
from dify_app import DifyApp
def init_app(app: DifyApp):
if dify_config.SENTRY_DSN:
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
try:
from langfuse._utils import parse_error
_langfuse_error_response = parse_error.defaultErrorResponse
except (ImportError, AttributeError):
_langfuse_error_response = (
"Unexpected error occurred. Please check your request"
" and contact support: https://langfuse.com/support."
)
def before_send(event, hint):
if "exc_info" in hint:
_, exc_value, _ = hint["exc_info"]
if _langfuse_error_response in str(exc_value):
return None
return event
sentry_sdk.init(
dsn=dify_config.SENTRY_DSN,
integrations=[FlaskIntegration(), CeleryIntegration()],
ignore_errors=[
HTTPException,
ValueError,
FileNotFoundError,
InvokeRateLimitError,
_langfuse_error_response,
],
traces_sample_rate=dify_config.SENTRY_TRACES_SAMPLE_RATE,
profiles_sample_rate=dify_config.SENTRY_PROFILES_SAMPLE_RATE,
environment=dify_config.DEPLOY_ENV,
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")