🛎️

Strawberry GraphQLでキャッチした例外・エラーを Rollbar にスタックトレース付きでレポートする

2024/06/04に公開

Strawberry GraphQL を使ったQuery, Mutation のエラーや例外が Rollbar にレポートされなかったので調べた。公式ドキュメントと、以下のQiitaの記事を参考にしてカスタムスキーマを実装し、オーバライドしたメソッドで rollbar.report_exc_info を実行することでうまくいった。

コード

class CustomSchema(Schema):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def process_errors(
        self,
        errors: List[GraphQLError],
        execution_context: Optional[ExecutionContext] = None,
    ):
        for error in errors:
            StrawberryLogger.error(error, execution_context=execution_context)

            rollbar.report_exc_info(
                exc_info=(
                    error.original_error,
                    error.original_error.__str__(),
                    error.original_error.__traceback__,
                ),
                extra_data={ # 以下はお好みで
                    "original_error": error.original_error,
                    "context": execution_context.context.__dict__,
                    "execution_context": execution_context.__dict__,
                    "result": (
                        execution_context.result.data
                        if execution_context.result
                        else None
                    ),
                },
            )

exc_infoには、sys.exc_info() を渡すことでエラー型やスタックトレースが渡される仕組みだが、process_errorsで補足している時点では正常にエラーが取れなかったため、errors / error がもっている original_error のスタックトレース、エラー情報を sys.exc_info()の戻り値に合わせたタプルにすることでスタックトレース付きでレポートされるようになった。

そのほかは元の参考記事と同じなので割愛。

参考

GitHubで編集を提案

Discussion