Initial SFERA platform baseline
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from enum import Enum
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from sir import SemanticNode, SirSnapshot
|
||||
|
||||
|
||||
class RuntimeSignalKind(str, Enum):
|
||||
EXECUTION = "EXECUTION"
|
||||
ERROR = "ERROR"
|
||||
SLOW_QUERY = "SLOW_QUERY"
|
||||
WRITE = "WRITE"
|
||||
|
||||
|
||||
class RuntimeSignal(BaseModel):
|
||||
signal_id: str
|
||||
lineage_id: str
|
||||
kind: RuntimeSignalKind
|
||||
observed_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
count: int = 1
|
||||
duration_ms: float | None = None
|
||||
message: str | None = None
|
||||
attributes: dict = Field(default_factory=dict)
|
||||
|
||||
|
||||
class RuntimeOverlay(BaseModel):
|
||||
project_id: str
|
||||
signals: list[RuntimeSignal] = Field(default_factory=list)
|
||||
|
||||
|
||||
class NodeRuntimeSummary(BaseModel):
|
||||
node: SemanticNode
|
||||
signal_count: int
|
||||
error_count: int
|
||||
max_duration_ms: float | None = None
|
||||
|
||||
|
||||
def summarize_runtime(snapshot: SirSnapshot, overlay: RuntimeOverlay) -> list[NodeRuntimeSummary]:
|
||||
nodes = {node.lineage_id: node for node in snapshot.nodes}
|
||||
grouped: dict[str, list[RuntimeSignal]] = {}
|
||||
for signal in overlay.signals:
|
||||
if signal.lineage_id in nodes:
|
||||
grouped.setdefault(signal.lineage_id, []).append(signal)
|
||||
|
||||
summaries: list[NodeRuntimeSummary] = []
|
||||
for lineage_id, signals in grouped.items():
|
||||
durations = [signal.duration_ms for signal in signals if signal.duration_ms is not None]
|
||||
summaries.append(
|
||||
NodeRuntimeSummary(
|
||||
node=nodes[lineage_id],
|
||||
signal_count=sum(signal.count for signal in signals),
|
||||
error_count=sum(signal.count for signal in signals if signal.kind == RuntimeSignalKind.ERROR),
|
||||
max_duration_ms=max(durations) if durations else None,
|
||||
)
|
||||
)
|
||||
summaries.sort(key=lambda item: (-item.error_count, -(item.max_duration_ms or 0), item.node.qualified_name))
|
||||
return summaries
|
||||
|
||||
|
||||
__all__ = [
|
||||
"NodeRuntimeSummary",
|
||||
"RuntimeOverlay",
|
||||
"RuntimeSignal",
|
||||
"RuntimeSignalKind",
|
||||
"summarize_runtime",
|
||||
]
|
||||
Reference in New Issue
Block a user