diff --git a/internal/k6runner/k6runner.go b/internal/k6runner/k6runner.go index 6da6aac7..5afd869f 100644 --- a/internal/k6runner/k6runner.go +++ b/internal/k6runner/k6runner.go @@ -181,12 +181,23 @@ func k6LogsToLogger(logs []byte, logger logger.Logger) error { // labels. dec := logfmt.NewDecoder(bytes.NewBuffer(logs)) +NEXT_RECORD: for dec.ScanRecord() { var line []interface{} + var source, level string for dec.ScanKeyval() { - key := dec.Key() - value := dec.Value() - line = append(line, string(key), string(value)) + key := string(dec.Key()) + value := string(dec.Value()) + switch key { + case "source": + source = value + case "level": + level = value + } + line = append(line, key, value) + } + if level == "debug" && source == "" { // if there's no source, it's probably coming from k6 + continue NEXT_RECORD } _ = logger.Log(line...) } diff --git a/internal/prober/multihttp/script_test.go b/internal/prober/multihttp/script_test.go index f10eaa78..ca9a7748 100644 --- a/internal/prober/multihttp/script_test.go +++ b/internal/prober/multihttp/script_test.go @@ -4,10 +4,12 @@ import ( "bytes" "context" "net/http/httptest" + "path/filepath" "strings" "testing" kitlog "github.com/go-kit/kit/log" //nolint:staticcheck // TODO(mem): replace in BBE + "github.com/go-kit/log/level" "github.com/grafana/synthetic-monitoring-agent/internal/k6runner" "github.com/grafana/synthetic-monitoring-agent/internal/testhelper" sm "github.com/grafana/synthetic-monitoring-agent/pkg/pb/synthetic_monitoring" @@ -755,6 +757,8 @@ func TestSettingsToScript(t *testing.T) { require.NotEmpty(t, actual) check := sm.Check{ + Target: settings.Entries[0].Request.Url, + Job: "test", Settings: sm.CheckSettings{ Multihttp: settings, }, @@ -762,16 +766,25 @@ func TestSettingsToScript(t *testing.T) { ctx, cancel := testhelper.Context(context.Background(), t) t.Cleanup(cancel) - logger := zerolog.New(zerolog.NewTestWriter(t)) - runner := k6runner.New("k6") + // logger := zerolog.New(zerolog.NewTestWriter(t)) + logger := zerolog.Nop() + k6path := filepath.Join(testhelper.ModuleDir(t), "dist", "k6") + runner := k6runner.New(k6path) prober, err := NewProber(ctx, check, logger, runner) require.NoError(t, err) reg := prometheus.NewPedanticRegistry() + require.NotNil(t, reg) + var buf bytes.Buffer - plogger := kitlog.NewLogfmtLogger(&buf) - prober.Probe(ctx, "foo", reg, plogger) + userLogger := level.NewFilter(kitlog.NewLogfmtLogger(&buf), level.AllowInfo(), level.SquelchNoLevel(false)) + require.NotNil(t, userLogger) + + success := prober.Probe(ctx, check.Target, reg, userLogger) + require.True(t, success) + + t.Log(buf.String()) } func TestReplaceVariablesInString(t *testing.T) { diff --git a/internal/testhelper/testhelper.go b/internal/testhelper/testhelper.go index 3bb57e9d..c49307f6 100644 --- a/internal/testhelper/testhelper.go +++ b/internal/testhelper/testhelper.go @@ -3,6 +3,8 @@ package testhelper import ( "context" "os" + "path/filepath" + "runtime" "testing" "time" @@ -27,3 +29,29 @@ func MustReadFile(t *testing.T, filename string) []byte { return data } + +func ModuleDir(t *testing.T) string { + t.Helper() + + _, filename, _, ok := runtime.Caller(1) + if !ok { + // uh? + return "" + } + dir := filepath.Dir(filename) + for dir != "/" { + gomod := filepath.Join(dir, "go.mod") + _, err := os.Stat(gomod) + switch { + case err == nil: + return dir + case os.IsNotExist(err): + dir = filepath.Join(dir, "..") + continue + default: + panic(err) + } + } + + return dir +} diff --git a/xk6/sm/output.go b/xk6/sm/output.go index 5441d66f..b1ef954e 100644 --- a/xk6/sm/output.go +++ b/xk6/sm/output.go @@ -15,8 +15,10 @@ import ( "go.k6.io/k6/output" ) +const ExtensionName = "sm" + func init() { - output.RegisterExtension("sm", New) + output.RegisterExtension(ExtensionName, New) } // Output is a k6 output plugin that writes metrics to an io.Writer in @@ -118,6 +120,7 @@ func (o *Output) Stop() error { // might end up with invalid label values. This is probably a job for Loki, // meaning we need an structured way of storing this information in logs. fields := logrus.Fields{ + "source": ExtensionName, "metric": metricName, "scenario": scenario, "value": value,