Pulse/internal/monitoring/monitor_polling_schedule.go
2026-03-18 16:06:30 +00:00

92 lines
2 KiB
Go

package monitoring
import (
"sort"
"time"
)
func (m *Monitor) describeInstancesForScheduler() []InstanceDescriptor {
providers := m.pollProviderSnapshotWithBuiltins()
if len(providers) == 0 {
return nil
}
total := 0
for _, provider := range providers {
if provider == nil {
continue
}
total += len(provider.ListInstances(m))
}
if total == 0 {
return nil
}
descriptors := make([]InstanceDescriptor, 0, total)
for _, provider := range providers {
if provider == nil {
continue
}
names := append([]string(nil), provider.ListInstances(m)...)
if len(names) == 0 {
continue
}
sort.Strings(names)
providerType := provider.Type()
for _, name := range names {
desc := InstanceDescriptor{
Name: name,
Type: providerType,
}
if m.scheduler != nil {
if last, ok := m.scheduler.LastScheduled(providerType, name); ok {
desc.LastScheduled = last.NextRun
desc.LastInterval = last.Interval
}
}
if m.stalenessTracker != nil {
if snap, ok := m.stalenessTracker.snapshot(providerType, name); ok {
desc.LastSuccess = snap.LastSuccess
desc.LastFailure = snap.LastError
desc.Metadata = TaskMetadata{ChangeHash: snap.ChangeHash}
}
}
descriptors = append(descriptors, desc)
}
}
return descriptors
}
func (m *Monitor) buildScheduledTasks(now time.Time) []ScheduledTask {
descriptors := m.describeInstancesForScheduler()
if len(descriptors) == 0 {
return nil
}
queueDepth := 0
if m.taskQueue != nil {
queueDepth = m.taskQueue.Size()
}
if m.scheduler == nil {
tasks := make([]ScheduledTask, 0, len(descriptors))
for _, desc := range descriptors {
interval := m.baseIntervalForInstanceType(desc.Type)
if interval <= 0 {
interval = DefaultSchedulerConfig().BaseInterval
}
tasks = append(tasks, ScheduledTask{
InstanceName: desc.Name,
InstanceType: desc.Type,
NextRun: now,
Interval: interval,
})
}
return tasks
}
return m.scheduler.BuildPlan(now, descriptors, queueDepth)
}