diff --git a/pkg/collector/scheduled_task/scheduled_task.go b/pkg/collector/scheduled_task/scheduled_task.go index c1ef1799..c54f5bec 100644 --- a/pkg/collector/scheduled_task/scheduled_task.go +++ b/pkg/collector/scheduled_task/scheduled_task.go @@ -51,7 +51,11 @@ const ( TASK_STATE_QUEUED TASK_STATE_READY TASK_STATE_RUNNING - TASK_RESULT_SUCCESS TaskResult = 0x0 +) + +const ( + SCHED_S_SUCCESS TaskResult = 0x0 + SCHED_S_TASK_HAS_NOT_RUN TaskResult = 0x00041303 ) type ScheduledTask struct { @@ -102,19 +106,19 @@ func NewWithFlags(app *kingpin.Application) *Collector { app.Flag( "collector.scheduled_task.include", "Regexp of tasks to include. Task path must both match include and not match exclude to be included.", - ).Default(c.config.TaskExclude.String()).StringVar(&taskInclude) + ).Default(c.config.TaskInclude.String()).StringVar(&taskInclude) app.Action(func(*kingpin.ParseContext) error { var err error c.config.TaskExclude, err = regexp.Compile(fmt.Sprintf("^(?:%s)$", taskExclude)) if err != nil { - return fmt.Errorf("collector.physical_disk.disk-exclude: %w", err) + return fmt.Errorf("collector.scheduled_task.exclude: %w", err) } c.config.TaskInclude, err = regexp.Compile(fmt.Sprintf("^(?:%s)$", taskInclude)) if err != nil { - return fmt.Errorf("collector.physical_disk.disk-include: %w", err) + return fmt.Errorf("collector.scheduled_task.include: %w", err) } return nil @@ -187,8 +191,28 @@ func (c *Collector) collect(ch chan<- prometheus.Metric) error { continue } + for _, state := range TASK_STATES { + var stateValue float64 + + if strings.ToLower(task.State.String()) == state { + stateValue = 1.0 + } + + ch <- prometheus.MustNewConstMetric( + c.state, + prometheus.GaugeValue, + stateValue, + task.Path, + state, + ) + } + + if task.LastTaskResult == SCHED_S_TASK_HAS_NOT_RUN { + continue + } + lastResult := 0.0 - if task.LastTaskResult == TASK_RESULT_SUCCESS { + if task.LastTaskResult == SCHED_S_SUCCESS { lastResult = 1.0 } @@ -205,22 +229,6 @@ func (c *Collector) collect(ch chan<- prometheus.Metric) error { task.MissedRunsCount, task.Path, ) - - for _, state := range TASK_STATES { - var stateValue float64 - - if strings.ToLower(task.State.String()) == state { - stateValue = 1.0 - } - - ch <- prometheus.MustNewConstMetric( - c.state, - prometheus.GaugeValue, - stateValue, - task.Path, - state, - ) - } } return nil diff --git a/pkg/types/regexp.go b/pkg/types/regexp.go index 5ba91308..e2b75cf6 100644 --- a/pkg/types/regexp.go +++ b/pkg/types/regexp.go @@ -4,5 +4,5 @@ import "regexp" var ( RegExpAny = regexp.MustCompile(".+") - RegExpEmpty = regexp.MustCompile("^$") + RegExpEmpty = regexp.MustCompile("") ) diff --git a/tools/e2e-output.txt b/tools/e2e-output.txt index f870b1d7..61f441d9 100644 --- a/tools/e2e-output.txt +++ b/tools/e2e-output.txt @@ -43,6 +43,7 @@ windows_exporter_collector_success{collector="logical_disk"} 1 windows_exporter_collector_success{collector="physical_disk"} 1 windows_exporter_collector_success{collector="net"} 1 windows_exporter_collector_success{collector="os"} 1 +windows_exporter_collector_success{collector="scheduled_task"} 1 windows_exporter_collector_success{collector="service"} 1 windows_exporter_collector_success{collector="system"} 1 windows_exporter_collector_success{collector="textfile"} 1 @@ -54,6 +55,7 @@ windows_exporter_collector_timeout{collector="logical_disk"} 0 windows_exporter_collector_timeout{collector="physical_disk"} 0 windows_exporter_collector_timeout{collector="net"} 0 windows_exporter_collector_timeout{collector="os"} 0 +windows_exporter_collector_timeout{collector="scheduled_task"} 0 windows_exporter_collector_timeout{collector="service"} 0 windows_exporter_collector_timeout{collector="system"} 0 windows_exporter_collector_timeout{collector="textfile"} 0 @@ -169,6 +171,13 @@ windows_exporter_collector_timeout{collector="textfile"} 0 # TYPE windows_os_virtual_memory_free_bytes gauge # HELP windows_os_visible_memory_bytes OperatingSystem.TotalVisibleMemorySize # TYPE windows_os_visible_memory_bytes gauge +# HELP windows_scheduled_task_state The current state of a scheduled task +# TYPE windows_scheduled_task_state gauge +windows_scheduled_task_state{state="disabled",task="/Microsoft/Windows/Maintenance/WinSAT"} 1 +windows_scheduled_task_state{state="queued",task="/Microsoft/Windows/Maintenance/WinSAT"} 0 +windows_scheduled_task_state{state="ready",task="/Microsoft/Windows/Maintenance/WinSAT"} 0 +windows_scheduled_task_state{state="running",task="/Microsoft/Windows/Maintenance/WinSAT"} 0 +windows_scheduled_task_state{state="unknown",task="/Microsoft/Windows/Maintenance/WinSAT"} 0 # HELP windows_service_info A metric with a constant '1' value labeled with service information # TYPE windows_service_info gauge # HELP windows_service_start_mode The start mode of the service (StartMode) diff --git a/tools/end-to-end-test.ps1 b/tools/end-to-end-test.ps1 index ca16b8a0..fd9a3fb1 100644 --- a/tools/end-to-end-test.ps1 +++ b/tools/end-to-end-test.ps1 @@ -25,7 +25,7 @@ $skip_re = "^(go_|windows_exporter_build_info|windows_exporter_collector_duratio $exporter_proc = Start-Process ` -PassThru ` -FilePath ..\windows_exporter.exe ` - -ArgumentList "--log.level=debug --web.disable-exporter-metrics --collectors.enabled=[defaults],textfile --collector.textfile.directories=$($textfile_dir)" ` + -ArgumentList "--log.level=debug --web.disable-exporter-metrics --collectors.enabled=[defaults],textfile,scheduled_task --collector.scheduled_task.include=.*WinSAT --collector.textfile.directories=$($textfile_dir)" ` -WindowStyle Hidden ` -RedirectStandardOutput "$($temp_dir)/windows_exporter.log" ` -RedirectStandardError "$($temp_dir)/windows_exporter_error.log" @@ -36,7 +36,7 @@ for ($i=1; $i -le 5; $i++) { $netstat_output = netstat -anp tcp | Select-String 'listening' if ($netstat_output -like '*:9182*') { - break + break } Write-Host "Waiting for exporter to start" } @@ -64,5 +64,6 @@ if (-not ($null -eq $output_diff)) { Get-Content "$($temp_dir)/windows_exporter.log" Write-Host "STDERR" Get-Content "$($temp_dir)/windows_exporter_error.log" + exit 1 }