From 01b980998deb1f62021e73e98a16bcaf93405228 Mon Sep 17 00:00:00 2001 From: "Doherty, Rory" Date: Mon, 20 Jul 2020 12:04:39 +0100 Subject: [PATCH 1/2] Add support for exporting exitcode of script as metric --- script_exporter.go | 30 ++++++++++++++++++------------ script_exporter_test.go | 11 ++++++++--- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/script_exporter.go b/script_exporter.go index badabcc..a7660dc 100644 --- a/script_exporter.go +++ b/script_exporter.go @@ -11,6 +11,7 @@ import ( "os" "os/exec" "regexp" + "syscall" "time" "github.com/prometheus/client_golang/prometheus" @@ -40,32 +41,35 @@ type Script struct { type Measurement struct { Script *Script Success int + ExitCode int Duration float64 } -func runScript(script *Script) error { +func runScript(script *Script) (err error, rc int) { ctx, cancel := context.WithTimeout(context.Background(), time.Duration(script.Timeout)*time.Second) defer cancel() - bashCmd := exec.CommandContext(ctx, *shell) + cmd := exec.CommandContext(ctx, *shell) - bashIn, err := bashCmd.StdinPipe() + stdin, err := cmd.StdinPipe() if err != nil { - return err + return err, 1 } - if err = bashCmd.Start(); err != nil { - return err + if _, err = stdin.Write([]byte(script.Content)); err != nil { + return err, 1 } + stdin.Close() - if _, err = bashIn.Write([]byte(script.Content)); err != nil { - return err + if err = cmd.Run(); err != nil { + exitError := err.(*exec.ExitError) + rc = exitError.Sys().(syscall.WaitStatus).ExitStatus() + } else { + rc = cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() } - bashIn.Close() - - return bashCmd.Wait() + return err, rc } func runScripts(scripts []*Script) []*Measurement { @@ -77,7 +81,7 @@ func runScripts(scripts []*Script) []*Measurement { go func(script *Script) { start := time.Now() success := 0 - err := runScript(script) + err, rc := runScript(script) duration := time.Since(start).Seconds() if err == nil { @@ -91,6 +95,7 @@ func runScripts(scripts []*Script) []*Measurement { Script: script, Duration: duration, Success: success, + ExitCode: rc, } }(script) } @@ -144,6 +149,7 @@ func scriptRunHandler(w http.ResponseWriter, r *http.Request, config *Config) { for _, measurement := range measurements { fmt.Fprintf(w, "script_duration_seconds{script=\"%s\"} %f\n", measurement.Script.Name, measurement.Duration) fmt.Fprintf(w, "script_success{script=\"%s\"} %d\n", measurement.Script.Name, measurement.Success) + fmt.Fprintf(w, "script_exit_code{script=\"%s\"} %d\n", measurement.Script.Name, measurement.ExitCode) } } diff --git a/script_exporter_test.go b/script_exporter_test.go index 3fa939b..1533911 100644 --- a/script_exporter_test.go +++ b/script_exporter_test.go @@ -18,10 +18,11 @@ func TestRunScripts(t *testing.T) { expectedResults := map[string]struct { success int minDuration float64 + exitCode int }{ - "success": {1, 0}, - "failure": {0, 0}, - "timeout": {0, 2}, + "success": {1, 0, 0}, + "failure": {0, 0, 1}, + "timeout": {0, 2, -1}, } for _, measurement := range measurements { @@ -34,6 +35,10 @@ func TestRunScripts(t *testing.T) { if measurement.Duration < expectedResult.minDuration { t.Errorf("Expected duration %f < %f: %s", measurement.Duration, expectedResult.minDuration, measurement.Script.Name) } + + if measurement.ExitCode != expectedResult.exitCode { + t.Errorf("Expected exit code %d != %d: %s", measurement.ExitCode, expectedResult.exitCode, measurement.Script.Name) + } } } From c7f72d2313f817b33ae241e8a0e6d6231dd62d36 Mon Sep 17 00:00:00 2001 From: "Doherty, Rory" Date: Fri, 16 Apr 2021 10:50:15 +0100 Subject: [PATCH 2/2] fix go.mod module name for go install --- .promu.yml | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.promu.yml b/.promu.yml index e0875f4..40443db 100644 --- a/.promu.yml +++ b/.promu.yml @@ -2,7 +2,7 @@ go: version: 1.14.1 cgo: true repository: - path: github.com/adhocteam/script_exporter + path: github.com/useful-devops-tools/script_exporter build: flags: -a -tags 'netgo static_build' ldflags: | diff --git a/go.mod b/go.mod index 3123e90..7b2968b 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/adhocteam/script_exporter +module github.com/useful-devops-tools/script_exporter go 1.14