{
 "action": "Not for automatic application — the patched example does not run on 1.45.1: exit code 1, ImportError: cannot import name 'Event' from 'opentelemetry._logs' (/usr/local/lib/python3.11/site-packages/opentelemetry/_logs/__init__.py). Show this correction to the user as a lead. Review before applying: this fix runs on opentelemetry-api 1.45.1, but its printed output differs from what the original printed on 1.40.0 (observed stdout of one example) — it may do different work. Replace the old line with the new one; the rest of the code can stay.",
 "alternatives": [
  {
   "action": "Not for automatic application — after the patch the example still uses get_event_logger, which the verified example does not: the patch covers part of the change. Show this correction to the user as a lead. Review before applying: this fix runs on opentelemetry-api 1.45.1, but its printed output differs from what the original printed on 1.40.0 (observed stdout of one example) — it may do different work. Replace the old line with the new one; the rest of the code can stay.",
   "applicability": {
    "leftover": [
     "get_event_logger"
    ],
    "line": 3,
    "method": "literal_patch",
    "occurrences": 1,
    "patched_sha": "22f747b128d8",
    "reason": "after the patch the example still uses get_event_logger, which the verified example does not: the patch covers part of the change",
    "run_on": "1.45.1",
    "status": "incomplete"
   },
   "by_notes": true,
   "changelog_ref": {
    "quote": "`opentelemetry-api`, `opentelemetry-sdk`: Removed deprecated Events API/SDK. Use `LogRecord` with the `event_name` field set instead.",
    "url": "https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.43.0"
   },
   "confirmations": 3,
   "detect": [
    "opentelemetry._events"
   ],
   "equivalence": "differs",
   "format": "replace",
   "kind": "behavior_changed",
   "right": "from opentelemetry._logs import LogRecord, get_logger",
   "script_right": "import warnings\n\nfrom opentelemetry._logs import LogRecord, get_logger\n\n# The event API may emit deprecation warnings in newer releases; keep output clean.\nwarnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n\n\ndef main() -> None:\n    # Get an event logger for the \"checkout-service\" component.\n    # Without an SDK configured, this is a no-op logger (nothing is exported),\n    # but the API calls are the same as they would be with a real provider.\n    event_logger = get_logger(\"checkout-service\")\n\n    # Build the event.\n    event = LogRecord(\n        event_name=\"order.placed\",\n        attributes={\n            \"order_id\": \"A123\",\n            \"total\": 42.5,\n        },\n    )\n\n    # Emit the event.\n    event_logger.emit(event)\n\n    # Print what was emitted so it can be verified on stdout.\n    print(f\"Event name: {event.event_name}\")\n    print(f\"Event attributes: {dict(event.attributes)}\")\n\n\nif __name__ == \"__main__\":\n    main()",
   "script_wrong": "import warnings\n\nfrom opentelemetry._events import Event, get_event_logger\n\n# The event API may emit deprecation warnings in newer releases; keep output clean.\nwarnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n\n\ndef main() -> None:\n    # Get an event logger for the \"checkout-service\" component.\n    # Without an SDK configured, this is a no-op logger (nothing is exported),\n    # but the API calls are the same as they would be with a real provider.\n    event_logger = get_event_logger(\"checkout-service\")\n\n    # Build the event.\n    event = Event(\n        name=\"order.placed\",\n        attributes={\n            \"order_id\": \"A123\",\n            \"total\": 42.5,\n        },\n    )\n\n    # Emit the event.\n    event_logger.emit(event)\n\n    # Print what was emitted so it can be verified on stdout.\n    print(f\"Event name: {event.name}\")\n    print(f\"Event attributes: {dict(event.attributes)}\")\n\n\nif __name__ == \"__main__\":\n    main()",
   "seen_in_models": [
    "claude-sonnet-5-5",
    "gemini-3.8-flash"
   ],
   "wrong": "from opentelemetry._events import Event, get_event_logger"
  }
 ],
 "applicability": {
  "exit_code": 1,
  "line": 3,
  "method": "literal_patch",
  "occurrences": 1,
  "patched_sha": "9886ad55405a",
  "reason": "the patched example does not run on 1.45.1: exit code 1, ImportError: cannot import name 'Event' from 'opentelemetry._logs' (/usr/local/lib/python3.11/site-packages/opentelemetry/_logs/__init__.py)",
  "run_on": "1.45.1",
  "status": "fails"
 },
 "by_notes": true,
 "changelog_ref": {
  "quote": "`opentelemetry-api`, `opentelemetry-sdk`: Removed deprecated Events API/SDK. Use `LogRecord` with the `event_name` field set instead.",
  "url": "https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.43.0"
 },
 "confirmations": {
  "failed": 0,
  "worked": 7
 },
 "detect": [
  "opentelemetry._events"
 ],
 "ecosystem": "pypi",
 "equivalence": "differs",
 "error_kind": "missing_module",
 "error_signature": {
  "message": "No module named 'opentelemetry._events'",
  "norm": "missing_module:opentelemetry._events",
  "type": "ModuleNotFoundError"
 },
 "first_seen": "2026-10-20T16:11:13+00:00",
 "format": "replace",
 "format_version": 2,
 "id": "pypi/opentelemetry-api/1.45.1/0002",
 "kind": "behavior_changed",
 "license": "https://creativecommons.org/licenses/by/4.0/",
 "package": "opentelemetry-api",
 "proof": {
  "applicability": {
   "exit_code": 1,
   "line": 3,
   "method": "literal_patch",
   "occurrences": 1,
   "patched_sha": "9886ad55405a",
   "reason": "the patched example does not run on 1.45.1: exit code 1, ImportError: cannot import name 'Event' from 'opentelemetry._logs' (/usr/local/lib/python3.11/site-packages/opentelemetry/_logs/__init__.py)",
   "run_on": "1.45.1",
   "status": "fails"
  },
  "auto_apply": false,
  "auto_apply_reason": "the fix's output differs from the original's; the patch gives fails when applied word for word",
  "auto_apply_rule": "Automatic application is allowed only when proof.equivalent is true and proof.applicability.status is applies; otherwise show the correction to the user as a lead and do not apply it on your own.",
  "equivalence": "differs",
  "equivalent": false,
  "fails_on": "1.45.1",
  "fixed_on": "1.45.1",
  "level": "differential",
  "method": {
   "fix_on": "1.45.1",
   "name": "stdout_match",
   "normalization": "lines stripped, blank lines dropped, runs of whitespace collapsed; memory addresses, timestamps and temporary paths masked",
   "original_on": "1.40.0",
   "scope": "the observable stdout of one example script; return values, files, other inputs and exception types are not compared, so a match is not a proof of equivalent behaviour"
  },
  "script_right": "import json\n\nfrom opentelemetry._logs import (\n    LogRecord,\n    Logger,\n    LoggerProvider,\n    get_logger,\n    set_logger_provider,\n)\n\n\nclass PrintingEventLogger(Logger):\n    \"\"\"Minimal API-only EventLogger that records emitted events and prints them.\"\"\"\n\n    def __init__(self, name, version=None, schema_url=None, attributes=None):\n        super().__init__(name, version, schema_url, attributes)\n        self.emitted = []\n\n    def enabled(self, *args, **kwargs) -> bool:\n        return True\n\n    def emit(self, event: LogRecord) -> None:\n        self.emitted.append(event)\n        event_name = getattr(event, \"name\", None) or getattr(event, \"event_name\", None)\n        event_attrs = dict(event.attributes or {})\n        print(f\"event name: {event_name}\")\n        print(f\"event attributes: {json.dumps(event_attrs, sort_keys=True)}\")\n\n\nclass PrintingEventLoggerProvider(LoggerProvider):\n    def __init__(self):\n        self.loggers = {}\n\n    def get_logger(self, name, version=None, schema_url=None, attributes=None):\n        if name not in self.loggers:\n            self.loggers[name] = PrintingEventLogger(name, version, schema_url, attributes)\n        return self.loggers[name]\n\n\ndef main() -> None:\n    # The API alone only provides no-op implementations, so register a simple\n    # provider that prints events, allowing verification of what was emitted.\n    set_logger_provider(PrintingEventLoggerProvider())\n\n    event_logger = get_logger(\"checkout-service\")\n\n    event = LogRecord(\n        event_name=\"order.placed\",\n        attributes={\"order_id\": \"A123\", \"total\": 42.5},\n    )\n    event_logger.emit(event)\n\n\nif __name__ == \"__main__\":\n    main()",
  "script_wrong": "import json\n\nfrom opentelemetry._events import (\n    Event,\n    EventLogger,\n    EventLoggerProvider,\n    get_event_logger,\n    set_event_logger_provider,\n)\n\n\nclass PrintingEventLogger(EventLogger):\n    \"\"\"Minimal API-only EventLogger that records emitted events and prints them.\"\"\"\n\n    def __init__(self, name, version=None, schema_url=None, attributes=None):\n        super().__init__(name, version, schema_url, attributes)\n        self.emitted = []\n\n    def emit(self, event: Event) -> None:\n        self.emitted.append(event)\n        event_name = getattr(event, \"name\", None) or getattr(event, \"event_name\", None)\n        event_attrs = dict(event.attributes or {})\n        print(f\"event name: {event_name}\")\n        print(f\"event attributes: {json.dumps(event_attrs, sort_keys=True)}\")\n\n\nclass PrintingEventLoggerProvider(EventLoggerProvider):\n    def __init__(self):\n        self.loggers = {}\n\n    def get_event_logger(self, name, version=None, schema_url=None, attributes=None):\n        if name not in self.loggers:\n            self.loggers[name] = PrintingEventLogger(name, version, schema_url, attributes)\n        return self.loggers[name]\n\n\ndef main() -> None:\n    # The API alone only provides no-op implementations, so register a simple\n    # provider that prints events, allowing verification of what was emitted.\n    set_event_logger_provider(PrintingEventLoggerProvider())\n\n    event_logger = get_event_logger(\"checkout-service\")\n\n    event = Event(\n        name=\"order.placed\",\n        attributes={\"order_id\": \"A123\", \"total\": 42.5},\n    )\n    event_logger.emit(event)\n\n\nif __name__ == \"__main__\":\n    main()",
  "works_on": "1.40.0"
 },
 "right": "from opentelemetry._logs import (",
 "seen_in_models": [
  "claude-sonnet-5-5",
  "gemini-3.8-flash",
  "gpt-6.1-sol"
 ],
 "seq": 2,
 "slug": "opentelemetry-events",
 "source": "pipeline",
 "symbol": "opentelemetry._events",
 "updated": "2026-10-27T17:20:00+00:00",
 "url": "https://formachines.ai/errata/pypi/opentelemetry-api/0002-opentelemetry-events/",
 "variant_confirmations": 4,
 "variant_models": [
  "claude-sonnet-5-5",
  "gpt-6.1-sol"
 ],
 "verified": "sandbox",
 "versions": {
  "changed_in": ">1.40.0,<=1.45.1",
  "fails_on": "1.45.1",
  "works_on": "1.40.0"
 },
 "wrong": "from opentelemetry._events import ("
}