You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.6 KiB
73 lines
1.6 KiB
package simulation |
|
|
|
type MonitoringNode struct { |
|
ID string |
|
Label string |
|
Tool string |
|
AlertMetric string |
|
ThresholdValue int |
|
ThresholdUnit string |
|
Queue []*Request |
|
Alive bool |
|
Targets []string |
|
Metrics map[string]int |
|
Alerts []*Request |
|
} |
|
|
|
func (n *MonitoringNode) GetID() string { return n.ID } |
|
|
|
func (n *MonitoringNode) Type() string { return "monitoring" } |
|
|
|
func (n *MonitoringNode) IsAlive() bool { return n.Alive } |
|
|
|
func (n *MonitoringNode) Receive(req *Request) { |
|
n.Queue = append(n.Queue, req) |
|
} |
|
|
|
func (n *MonitoringNode) Emit() []*Request { |
|
out := append([]*Request(nil), n.Alerts...) |
|
n.Alerts = n.Alerts[:0] |
|
return out |
|
} |
|
|
|
func (n *MonitoringNode) Tick(tick int, currentTimeMs int) { |
|
if !n.Alive { |
|
return |
|
} |
|
|
|
if n.Metrics == nil { |
|
n.Metrics = make(map[string]int) |
|
} |
|
|
|
// Simulate processing requests as metrics |
|
for _, req := range n.Queue { |
|
// For now, pretend all requests are relevant to the AlertMetric |
|
n.Metrics[n.AlertMetric] += 1 |
|
req.LatencyMS += 1 |
|
req.Path = append(req.Path, n.ID) |
|
|
|
if n.Metrics[n.AlertMetric] > n.ThresholdValue { |
|
alert := &Request{ |
|
ID: "alert-" + req.ID, |
|
Timestamp: currentTimeMs, |
|
Origin: n.ID, |
|
Type: "alert", |
|
LatencyMS: 0, |
|
Path: []string{n.ID, "alert"}, |
|
} |
|
n.Alerts = append(n.Alerts, alert) |
|
|
|
// Reset after alert (or you could continue accumulating) |
|
n.Metrics[n.AlertMetric] = 0 |
|
} |
|
} |
|
|
|
n.Queue = nil |
|
} |
|
func (n *MonitoringNode) GetTargets() []string { |
|
return n.Targets |
|
} |
|
|
|
func (n *MonitoringNode) GetQueue() []*Request { |
|
return n.Queue |
|
}
|
|
|