8604bc66b6
ISSUES CLOSED: #320
88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
"""ASV benchmarks for exception handling overhead.
|
|
|
|
Measures the cost of error classification, redaction,
|
|
and wrapping operations.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from cleveragents.core.error_handling import (
|
|
classify_error,
|
|
format_error_for_cli,
|
|
redact_error_details,
|
|
redact_value,
|
|
wrap_unexpected,
|
|
)
|
|
from cleveragents.core.exceptions import (
|
|
DatabaseError,
|
|
ValidationError,
|
|
)
|
|
|
|
|
|
class ClassifyBench:
|
|
"""Benchmark error classification throughput."""
|
|
|
|
timeout = 60
|
|
|
|
def setup(self) -> None:
|
|
self.validation_err = ValidationError("field invalid")
|
|
self.db_err = DatabaseError("connection lost")
|
|
self.bare_err = Exception("unknown crash")
|
|
|
|
def time_classify_validation(self) -> None:
|
|
"""Benchmark classifying a ValidationError."""
|
|
classify_error(self.validation_err)
|
|
|
|
def time_classify_database(self) -> None:
|
|
"""Benchmark classifying a DatabaseError."""
|
|
classify_error(self.db_err)
|
|
|
|
def time_classify_bare(self) -> None:
|
|
"""Benchmark classifying a bare Exception."""
|
|
classify_error(self.bare_err)
|
|
|
|
def time_format_cli(self) -> None:
|
|
"""Benchmark formatting an error for CLI."""
|
|
info = classify_error(self.validation_err)
|
|
format_error_for_cli(info)
|
|
|
|
|
|
class RedactBench:
|
|
"""Benchmark secret redaction throughput."""
|
|
|
|
timeout = 60
|
|
|
|
def setup(self) -> None:
|
|
self.details_secret = {"api_key": "sk-abc123", "plan_id": "01PLAN"}
|
|
self.details_clean = {"plan_id": "01PLAN", "status": "ok"}
|
|
self.value_with_secret = "token sk-abcdefghijklmnopqrstuvwxyz end"
|
|
|
|
def time_redact_with_secret(self) -> None:
|
|
"""Benchmark redacting details with a secret key."""
|
|
redact_error_details(self.details_secret)
|
|
|
|
def time_redact_clean(self) -> None:
|
|
"""Benchmark redacting details without secrets."""
|
|
redact_error_details(self.details_clean)
|
|
|
|
def time_redact_value(self) -> None:
|
|
"""Benchmark redacting a string value."""
|
|
redact_value(self.value_with_secret)
|
|
|
|
|
|
class WrapBench:
|
|
"""Benchmark exception wrapping throughput."""
|
|
|
|
timeout = 60
|
|
|
|
def setup(self) -> None:
|
|
self.bare_err = Exception("crash")
|
|
|
|
def time_wrap_bare(self) -> None:
|
|
"""Benchmark wrapping a bare Exception."""
|
|
wrap_unexpected(self.bare_err)
|
|
|
|
def time_wrap_with_context(self) -> None:
|
|
"""Benchmark wrapping with context."""
|
|
wrap_unexpected(self.bare_err, context={"plan_id": "01PLAN"})
|