Documentation
¶
Index ¶
- Constants
- func FlattenEvent(evt AgentEvent, excludeFields []string) string
- func StageSequence(events []AgentEvent) string
- func Tokenize(line string) []string
- type AgentEvent
- type AnomalyDetector
- type AnomalyReport
- type Cluster
- type Config
- type Coordinator
- func (c *Coordinator) AllClusters() map[string][]Cluster
- func (c *Coordinator) AnalyzeEvent(evt AgentEvent) (*MatchResult, *AnomalyReport, error)
- func (c *Coordinator) LoadDefaultWeights() error
- func (c *Coordinator) LoadSnapshots(snapshots map[string][]byte) error
- func (c *Coordinator) LoadWeightsJSON(data []byte) error
- func (c *Coordinator) SaveSnapshots() (map[string][]byte, error)
- func (c *Coordinator) SaveWeightsJSON() ([]byte, error)
- func (c *Coordinator) TrainEvent(evt AgentEvent) (*MatchResult, error)
- type MaskRule
- type Masker
- type MatchResult
- type Miner
- type Snapshot
- type SnapshotCluster
Constants ¶
const ( AnomalyWeightNew = 1.0 AnomalyWeightLow = 0.7 AnomalyWeightRare = 0.3 AnomalyMaxScore = 2.0 )
Scoring weights used by Analyze. Exported so tests can reference them directly and stay in sync with production logic at compile time.
Variables ¶
This section is empty.
Functions ¶
func FlattenEvent ¶
func FlattenEvent(evt AgentEvent, excludeFields []string) string
FlattenEvent converts an AgentEvent into a deterministic string suitable for template mining. Field keys are sorted alphabetically; fields listed in excludeFields are omitted. The result looks like:
stage=tool_call key1=val1 key2=val2
func StageSequence ¶
func StageSequence(events []AgentEvent) string
StageSequence converts a slice of AgentEvents into a space-separated string of their stage names, e.g. "plan tool_call tool_result finish".
Types ¶
type AgentEvent ¶
type AgentEvent struct {
// Stage identifies the pipeline stage (e.g., "plan", "tool_call", "finish").
Stage string
// Fields contains the key-value pairs parsed from the log line.
Fields map[string]string
}
AgentEvent is a structured log event emitted by an agent pipeline stage.
type AnomalyDetector ¶
type AnomalyDetector struct {
// contains filtered or unexported fields
}
AnomalyDetector evaluates match results and produces AnomalyReports.
func NewAnomalyDetector ¶
func NewAnomalyDetector(simThreshold float64, rareClusterThreshold int) (*AnomalyDetector, error)
NewAnomalyDetector creates an AnomalyDetector with the given thresholds.
func (*AnomalyDetector) Analyze ¶
func (d *AnomalyDetector) Analyze(result *MatchResult, isNew bool, cluster *Cluster) *AnomalyReport
Analyze produces an AnomalyReport for a match result.
- isNew indicates the line created a brand-new cluster.
- cluster is the cluster that was matched or created.
type AnomalyReport ¶
type AnomalyReport struct {
// IsNewTemplate is true when the log line produced a brand-new log cluster.
IsNewTemplate bool
// LowSimilarity is true when the best match score was below the configured threshold.
LowSimilarity bool
// RareCluster is true when the matched cluster has been seen fewer times than the rare threshold.
RareCluster bool
// AnomalyScore is a weighted composite score in the range [0, 1].
AnomalyScore float64
// Reason is a human-readable description of all anomalies that were detected.
Reason string
}
AnomalyReport describes anomalies detected for a log line.
type Cluster ¶
type Cluster struct {
// ID is the unique cluster identifier.
ID int
// Template is the tokenized log template with wildcards at variable positions.
Template []string
// Size is the number of log lines that have been assigned to this cluster.
Size int
// Stage identifies which agent stage generated this cluster.
Stage string
}
Cluster represents a group of log lines that share the same template.
type Config ¶
type Config struct {
// Depth controls how many levels of the parse tree are used.
Depth int
// SimThreshold is the minimum similarity score (0–1) required to match an existing cluster.
SimThreshold float64
// MaxChildren limits the number of children per internal tree node.
MaxChildren int
// ParamToken is the wildcard string inserted where tokens differ across log lines.
ParamToken string
// RareClusterThreshold marks clusters with size ≤ this value as rare.
RareClusterThreshold int
// MaskRules are applied before tokenization to normalize variable parts of log lines.
MaskRules []MaskRule
// ExcludeFields lists AgentEvent field keys that are omitted when flattening events.
ExcludeFields []string
}
Config holds tuning parameters for the Drain log template miner.
func DefaultConfig ¶
func DefaultConfig() Config
DefaultConfig returns a Config pre-loaded with sensible production defaults.
type Coordinator ¶
type Coordinator struct {
// contains filtered or unexported fields
}
Coordinator manages one Miner per agent pipeline stage.
func NewCoordinator ¶
func NewCoordinator(cfg Config, stages []string) (*Coordinator, error)
NewCoordinator creates a Coordinator with one Miner for each provided stage name.
func (*Coordinator) AllClusters ¶
func (c *Coordinator) AllClusters() map[string][]Cluster
AllClusters returns a map from stage name to the list of clusters in that miner.
func (*Coordinator) AnalyzeEvent ¶
func (c *Coordinator) AnalyzeEvent(evt AgentEvent) (*MatchResult, *AnomalyReport, error)
AnalyzeEvent routes the event to the correct stage miner and returns both the match result and an anomaly report.
func (*Coordinator) LoadDefaultWeights ¶
func (c *Coordinator) LoadDefaultWeights() error
LoadDefaultWeights restores all stage miners from the embedded default weights file (pkg/agentdrain/data/default_weights.json). When the file is empty or contains only an empty JSON object the call is a no-op and returns nil.
Update the default weights by running:
gh aw logs --train --output <dir>
and copying the resulting drain3_weights.json to pkg/agentdrain/data/default_weights.json, then rebuilding the binary.
func (*Coordinator) LoadSnapshots ¶
func (c *Coordinator) LoadSnapshots(snapshots map[string][]byte) error
LoadSnapshots restores each stage miner from the provided JSON bytes map. Stages that are not present in snapshots retain their current state.
func (*Coordinator) LoadWeightsJSON ¶
func (c *Coordinator) LoadWeightsJSON(data []byte) error
LoadWeightsJSON restores all stage miners from a combined JSON blob produced by SaveWeightsJSON.
func (*Coordinator) SaveSnapshots ¶
func (c *Coordinator) SaveSnapshots() (map[string][]byte, error)
SaveSnapshots serializes each stage miner's state and returns a map from stage name to JSON bytes.
func (*Coordinator) SaveWeightsJSON ¶
func (c *Coordinator) SaveWeightsJSON() ([]byte, error)
SaveWeightsJSON serializes all stage snapshots into a single combined JSON blob. The result can be written to pkg/agentdrain/data/default_weights.json and committed to embed it as the default starting weights for future runs.
func (*Coordinator) TrainEvent ¶
func (c *Coordinator) TrainEvent(evt AgentEvent) (*MatchResult, error)
TrainEvent routes the event to the miner responsible for evt.Stage. Returns an error when the stage has no associated miner.
type MaskRule ¶
type MaskRule struct {
// Name is a human-readable identifier for the rule.
Name string
// Pattern is the regular expression to match.
Pattern string
// Replacement is the string substituted for each match.
Replacement string
}
MaskRule describes a regex substitution applied to log lines before processing.
type Masker ¶
type Masker struct {
// contains filtered or unexported fields
}
Masker applies a sequence of regex substitution rules to normalize log lines.
type MatchResult ¶
type MatchResult struct {
// ClusterID is the ID of the matched or newly created cluster.
ClusterID int
// Template is the space-joined template string.
Template string
// Params holds the actual token values at wildcard positions.
Params []string
// Similarity is the fraction of non-wildcard positions that matched exactly.
Similarity float64
// Stage is the agent stage associated with the matched cluster.
Stage string
}
MatchResult is returned after processing a log line through the miner.
type Miner ¶
type Miner struct {
// contains filtered or unexported fields
}
Miner is a concurrent Drain-style log template miner. Use NewMiner to create an instance.
func (*Miner) AnalyzeEvent ¶
func (m *Miner) AnalyzeEvent(evt AgentEvent) (*MatchResult, *AnomalyReport, error)
AnalyzeEvent prepares the event once, then under a single write lock runs inference, updates the miner state directly, and builds an AnomalyReport. The write lock spans the whole operation so the isNew decision cannot become stale relative to the cluster the event is trained into; inference is not taken under a read lock because its result is reused for the mutation. Returns the match result and report.
func (*Miner) LoadJSON ¶
LoadJSON restores miner state from JSON bytes produced by SaveJSON. The existing state is replaced; the parse tree is rebuilt from the snapshot.
func (*Miner) TrainEvent ¶
func (m *Miner) TrainEvent(evt AgentEvent) (*MatchResult, error)
TrainEvent flattens the AgentEvent and updates the miner.
type Snapshot ¶
type Snapshot struct {
Config Config `json:"config"`
Clusters []SnapshotCluster `json:"clusters"`
NextID int `json:"next_id"`
}
Snapshot is the serializable representation of a Miner's state.