PHP 8.2.30
Preview: ariadne.py Size: 5.70 KB
//opt/hc_python/lib/python3.12/site-packages/sentry_sdk/integrations/ariadne.py

from importlib import import_module

import sentry_sdk
from sentry_sdk import get_client, capture_event
from sentry_sdk.integrations import _check_minimum_version, DidNotEnable, Integration
from sentry_sdk.integrations.logging import ignore_logger
from sentry_sdk.integrations._wsgi_common import request_body_within_bounds
from sentry_sdk.scope import should_send_default_pii
from sentry_sdk.utils import (
    capture_internal_exceptions,
    ensure_integration_enabled,
    event_from_exception,
    package_version,
)

try:
    # importing like this is necessary due to name shadowing in ariadne
    # (ariadne.graphql is also a function)
    ariadne_graphql = import_module("ariadne.graphql")
except ImportError:
    raise DidNotEnable("ariadne is not installed")

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing import Any, Dict, List, Optional
    from ariadne.types import GraphQLError, GraphQLResult, GraphQLSchema, QueryParser  # type: ignore
    from graphql.language.ast import DocumentNode
    from sentry_sdk._types import Event, EventProcessor


class AriadneIntegration(Integration):
    identifier = "ariadne"

    @staticmethod
    def setup_once():
        # type: () -> None
        version = package_version("ariadne")
        _check_minimum_version(AriadneIntegration, version)

        ignore_logger("ariadne")

        _patch_graphql()


def _patch_graphql():
    # type: () -> None
    old_parse_query = ariadne_graphql.parse_query
    old_handle_errors = ariadne_graphql.handle_graphql_errors
    old_handle_query_result = ariadne_graphql.handle_query_result

    @ensure_integration_enabled(AriadneIntegration, old_parse_query)
    def _sentry_patched_parse_query(context_value, query_parser, data):
        # type: (Optional[Any], Optional[QueryParser], Any) -> DocumentNode
        event_processor = _make_request_event_processor(data)
        sentry_sdk.get_isolation_scope().add_event_processor(event_processor)

        result = old_parse_query(context_value, query_parser, data)
        return result

    @ensure_integration_enabled(AriadneIntegration, old_handle_errors)
    def _sentry_patched_handle_graphql_errors(errors, *args, **kwargs):
        # type: (List[GraphQLError], Any, Any) -> GraphQLResult
        result = old_handle_errors(errors, *args, **kwargs)

        event_processor = _make_response_event_processor(result[1])
        sentry_sdk.get_isolation_scope().add_event_processor(event_processor)

        client = get_client()
        if client.is_active():
            with capture_internal_exceptions():
                for error in errors:
                    event, hint = event_from_exception(
                        error,
                        client_options=client.options,
                        mechanism={
                            "type": AriadneIntegration.identifier,
                            "handled": False,
                        },
                    )
                    capture_event(event, hint=hint)

        return result

    @ensure_integration_enabled(AriadneIntegration, old_handle_query_result)
    def _sentry_patched_handle_query_result(result, *args, **kwargs):
        # type: (Any, Any, Any) -> GraphQLResult
        query_result = old_handle_query_result(result, *args, **kwargs)

        event_processor = _make_response_event_processor(query_result[1])
        sentry_sdk.get_isolation_scope().add_event_processor(event_processor)

        client = get_client()
        if client.is_active():
            with capture_internal_exceptions():
                for error in result.errors or []:
                    event, hint = event_from_exception(
                        error,
                        client_options=client.options,
                        mechanism={
                            "type": AriadneIntegration.identifier,
                            "handled": False,
                        },
                    )
                    capture_event(event, hint=hint)

        return query_result

    ariadne_graphql.parse_query = _sentry_patched_parse_query  # type: ignore
    ariadne_graphql.handle_graphql_errors = _sentry_patched_handle_graphql_errors  # type: ignore
    ariadne_graphql.handle_query_result = _sentry_patched_handle_query_result  # type: ignore


def _make_request_event_processor(data):
    # type: (GraphQLSchema) -> EventProcessor
    """Add request data and api_target to events."""

    def inner(event, hint):
        # type: (Event, dict[str, Any]) -> Event
        if not isinstance(data, dict):
            return event

        with capture_internal_exceptions():
            try:
                content_length = int(
                    (data.get("headers") or {}).get("Content-Length", 0)
                )
            except (TypeError, ValueError):
                return event

            if should_send_default_pii() and request_body_within_bounds(
                get_client(), content_length
            ):
                request_info = event.setdefault("request", {})
                request_info["api_target"] = "graphql"
                request_info["data"] = data

            elif event.get("request", {}).get("data"):
                del event["request"]["data"]

        return event

    return inner


def _make_response_event_processor(response):
    # type: (Dict[str, Any]) -> EventProcessor
    """Add response data to the event's response context."""

    def inner(event, hint):
        # type: (Event, dict[str, Any]) -> Event
        with capture_internal_exceptions():
            if should_send_default_pii() and response.get("errors"):
                contexts = event.setdefault("contexts", {})
                contexts["response"] = {
                    "data": response,
                }

        return event

    return inner

Directory Contents

Dirs: 10 × Files: 70

Name Size Perms Modified Actions
celery DIR
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
django DIR
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
grpc DIR
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
redis DIR
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
spark DIR
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
- drwxr-xr-x 2025-12-03 08:02:53
Edit Download
12.70 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
14.17 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
911 B lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.70 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.70 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
12.50 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.50 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
6.37 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.61 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
17.65 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.06 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.31 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
6.46 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.59 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.96 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.60 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
9.18 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.93 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.28 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
2.35 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.95 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
9.28 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.48 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
8.54 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
8.26 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
2.75 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.69 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.92 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.94 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.32 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
14.60 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
39.02 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
11.56 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.89 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
9.99 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
11.55 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
13.57 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
6.38 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
19.58 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
820 B lrw-r--r-- 2025-12-03 08:02:53
Edit Download
24.54 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.10 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
3.06 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.50 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
6.23 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.19 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.24 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.20 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
5.18 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
8.87 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
12.66 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.76 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
3.09 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
4.24 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
25.62 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
10.31 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.20 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
8.76 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
13.82 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
2.43 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
6.94 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.04 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.61 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.77 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.03 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
1.71 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
10.56 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
3.11 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
7.38 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download
12.44 KB lrw-r--r-- 2025-12-03 08:02:53
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).