Skip to content

Commit

Permalink
fix(metrics/script): patch pipe processing
Browse files Browse the repository at this point in the history
  • Loading branch information
jaygridley committed Oct 8, 2024
1 parent a781192 commit 39dc8d8
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 33 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
github.com/aws/aws-sdk-go-v2 v1.26.0
github.com/aws/aws-sdk-go-v2/config v1.27.4
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.1
github.com/go-cmd/cmd v1.4.3
github.com/itchyny/gojq v0.12.14
github.com/jessevdk/go-flags v1.5.0
github.com/prometheus/client_golang v1.18.0
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-cmd/cmd v1.4.3 h1:6y3G+3UqPerXvPcXvj+5QNPHT02BUw7p6PsqRxLNA7Y=
github.com/go-cmd/cmd v1.4.3/go.mod h1:u3hxg/ry+D5kwh8WvUkHLAMe2zQCaXd00t35WfQaOFk=
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
Expand Down
5 changes: 2 additions & 3 deletions internal/scrape/script/metric.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,17 @@ package script
import (
"bufio"
"fmt"
"io"
"regexp"
"strconv"
"strings"
)

const metricRegex = `,`

func ParseStdout(r io.Reader) ([]Data, error) {
func ParseStdout(r []string) ([]Data, error) {
out := make([]Data, 0)
pr := NewParser()
scanner := bufio.NewScanner(r)
scanner := bufio.NewScanner(strings.NewReader(strings.Join(r, "\n")))
for scanner.Scan() {
mt, err := pr.ParseMetric(scanner.Text())
if err != nil {
Expand Down
45 changes: 15 additions & 30 deletions internal/scrape/script/script.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package script

import (
"bytes"
"context"
"fmt"
"io"
"github.com/go-cmd/cmd"
"os"
"os/exec"
"strings"
)

type Data struct {
Expand All @@ -27,37 +24,25 @@ func (d Data) LabelNames() []string {
}

func Run(ctx context.Context, cfg Config) ([]Data, error) {
cmd := exec.CommandContext(ctx, "bash", "-c", cfg.Script)
envs := make([]string, 0)
envs = append(envs, os.Environ()...)
envs = append(envs, cfg.FormatEnvs()...)
cmd.Env = envs
stderr, err := cmd.StderrPipe()
if err != nil {
return nil, err
}
stdout := &bytes.Buffer{}
cmd.Stdout = stdout
err = cmd.Run()
if err != nil {
errString, err := errorString(stderr)
c := cmd.NewCmd("bash", "-c", cfg.Script)
c.Env = append(c.Env, os.Environ()...)
c.Env = append(c.Env, cfg.FormatEnvs()...)

<-c.Start()
select {

Check failure on line 32 in internal/scrape/script/script.go

View workflow job for this annotation

GitHub Actions / Golang CI linter

S1000: should use a simple channel send/receive instead of `select` with a single case (gosimple)
case <-ctx.Done():
err := c.Stop()
if err != nil {
return nil, err
return nil, fmt.Errorf("script error: %w, std err: %s", err, c.Status().Stderr)
}
return nil, fmt.Errorf("script error: %w, std err: %s", err, errString)
}
data, err := ParseStdout(stdout)
err := c.Status().Error
if err != nil {
return nil, fmt.Errorf("unable to parse response from command: %v", cfg.Script)
return nil, fmt.Errorf("script error: %w, std err: %s", err, c.Status().Stderr)
}
return data, nil
}

func errorString(r io.Reader) (string, error) {
b := strings.Builder{}
_, err := io.Copy(&b, r)
data, err := ParseStdout(c.Status().Stdout)
if err != nil {
return "", err
return nil, fmt.Errorf("unable to parse response from command: %v", cfg.Script)
}
return b.String(), nil
return data, nil
}

0 comments on commit 39dc8d8

Please sign in to comment.