Documentation
¶
Index ¶
- 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
- func (m *Miner) AnalyzeEvent(evt AgentEvent) (*MatchResult, *AnomalyReport, error)
- func (m *Miner) ClusterCount() int
- func (m *Miner) Clusters() []Cluster
- func (m *Miner) LoadJSON(data []byte) error
- func (m *Miner) Match(line string) (*MatchResult, bool, error)
- func (m *Miner) SaveJSON() ([]byte, error)
- func (m *Miner) Train(line string) (*MatchResult, error)
- func (m *Miner) TrainEvent(evt AgentEvent) (*MatchResult, error)
- type Snapshot
- type SnapshotCluster
Constants ¶
This section is empty.
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
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 created a new 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
// NewClusterCreated is true when this event produced a brand-new cluster.
NewClusterCreated 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 LoadMinerJSON ¶
LoadMinerJSON creates a new Miner by restoring state from JSON bytes.
func (*Miner) AnalyzeEvent ¶
func (m *Miner) AnalyzeEvent(evt AgentEvent) (*MatchResult, *AnomalyReport, error)
AnalyzeEvent performs inference on the event, builds an AnomalyReport, and then calls TrainEvent to update the miner. Returns the match result and report.
func (*Miner) ClusterCount ¶
ClusterCount returns the number of known clusters.
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) Match ¶
func (m *Miner) Match(line string) (*MatchResult, bool, error)
Match performs inference only: it finds the best matching cluster but does not mutate any state. Returns (result, true) when a match is found. It is safe to call from multiple goroutines.
func (*Miner) Train ¶
func (m *Miner) Train(line string) (*MatchResult, error)
Train processes a raw log line, updates the miner state, and returns the match result. It is safe to call from multiple goroutines.
func (*Miner) TrainEvent ¶
func (m *Miner) TrainEvent(evt AgentEvent) (*MatchResult, error)
TrainEvent flattens the AgentEvent and calls Train.
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.