45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import uuid
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
|
||
|
|
from yuxi.channel.domain.model.message.unified_message import UnifiedMessage
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class Span:
|
||
|
|
middleware_name: str
|
||
|
|
started_at: float = 0.0
|
||
|
|
finished_at: float = 0.0
|
||
|
|
duration_ms: float = 0.0
|
||
|
|
aborted: bool = False
|
||
|
|
skipped: bool = False
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class MessageContext:
|
||
|
|
message: UnifiedMessage
|
||
|
|
channel_type: str = ""
|
||
|
|
trace_id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
||
|
|
spans: list[Span] = field(default_factory=list)
|
||
|
|
aborted: bool = field(default=False, init=False, repr=False)
|
||
|
|
skipped: bool = field(default=False, init=False, repr=False)
|
||
|
|
abort_reason: str = field(default="", init=False, repr=False)
|
||
|
|
abort_code: str = field(default="", init=False, repr=False)
|
||
|
|
|
||
|
|
@property
|
||
|
|
def is_aborted(self) -> bool:
|
||
|
|
return self.aborted
|
||
|
|
|
||
|
|
@property
|
||
|
|
def is_skipped(self) -> bool:
|
||
|
|
return self.skipped
|
||
|
|
|
||
|
|
def abort(self, reason: str, code: str = "") -> None:
|
||
|
|
self.aborted = True
|
||
|
|
self.abort_reason = reason
|
||
|
|
self.abort_code = code
|
||
|
|
|
||
|
|
def skip(self) -> None:
|
||
|
|
self.skipped = True
|