72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
"""Pipeline data types for the multi-agent diagnose pipeline."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Literal
|
|
|
|
SeverityLabel = Literal["CRITICAL", "ERROR", "WARN", "INFO", "DEBUG", "UNKNOWN"]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class EventCluster:
|
|
"""A time-correlated group of log entries within the timeline."""
|
|
|
|
cluster_id: str
|
|
entries: tuple[str, ...] # entry_id refs
|
|
start_iso: str | None
|
|
end_iso: str | None
|
|
duration_seconds: float
|
|
source_ids: tuple[str, ...]
|
|
pattern_tags: tuple[str, ...]
|
|
severity: SeverityLabel
|
|
burst: bool
|
|
gap_before_seconds: float
|
|
representative_text: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TimelineResult:
|
|
"""Structured timeline of event clusters built from log entries."""
|
|
|
|
clusters: tuple[EventCluster, ...]
|
|
total_entries: int
|
|
window_start: str | None
|
|
window_end: str | None
|
|
gap_count: int
|
|
burst_count: int
|
|
dominant_sources: tuple[str, ...]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ClassifiedTimeline:
|
|
"""Timeline annotated with ML-assigned severity per cluster."""
|
|
|
|
timeline: TimelineResult
|
|
cluster_severities: dict[str, SeverityLabel]
|
|
classifier_used: Literal["ml", "pattern_tags", "regex"]
|
|
model_id: str | None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Hypothesis:
|
|
"""A root-cause hypothesis generated by Stage 3."""
|
|
|
|
hypothesis_id: str
|
|
title: str
|
|
description: str
|
|
confidence: float
|
|
supporting_cluster_ids: tuple[str, ...]
|
|
runbook_refs: tuple[str, ...]
|
|
severity: SeverityLabel
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RankedHypothesis:
|
|
"""A hypothesis enriched by Stage 4 false-positive suppression."""
|
|
|
|
hypothesis: Hypothesis
|
|
novelty_score: float
|
|
similarity_to_known: float
|
|
suppress: bool
|
|
suppression_reason: str | None
|