diff --git a/cmd/karma/assets.go b/cmd/karma/assets.go index cc0a10a92..5e2fb7eb0 100644 --- a/cmd/karma/assets.go +++ b/cmd/karma/assets.go @@ -12,7 +12,6 @@ import ( "github.com/gin-gonic/gin" assetfs "github.com/elazarl/go-bindata-assetfs" - log "github.com/sirupsen/logrus" ) type binaryFileSystem struct { @@ -49,10 +48,10 @@ func newBinaryFileSystem(root string) *binaryFileSystem { } // load a template from binary asset resource -func loadTemplate(t *template.Template, path string) *template.Template { +func loadTemplate(t *template.Template, path string) (*template.Template, error) { templateContent, err := Asset(path) if err != nil { - log.Fatal(err) + return nil, err } var tmpl *template.Template @@ -71,11 +70,10 @@ func loadTemplate(t *template.Template, path string) *template.Template { _, err = tmpl.Parse(string(templateContent)) if err != nil { - log.Fatal(err) - return nil + return nil, err } - return t + return t, nil } func serveFileOr404(path string, contentType string, c *gin.Context) { diff --git a/cmd/karma/assets_test.go b/cmd/karma/assets_test.go index aeab20042..61914f7b7 100644 --- a/cmd/karma/assets_test.go +++ b/cmd/karma/assets_test.go @@ -6,10 +6,9 @@ import ( "os" "testing" - "github.com/gin-contrib/static" "github.com/prymitive/karma/internal/config" - log "github.com/sirupsen/logrus" + "github.com/gin-contrib/static" ) type customizationAssetsTest struct { @@ -100,15 +99,21 @@ func TestStaticExpires404(t *testing.T) { func TestLoadTemplateChained(t *testing.T) { var tmpl *template.Template - tmpl = loadTemplate(tmpl, "ui/build/index.html") + tmpl, err := loadTemplate(tmpl, "ui/build/index.html") if tmpl == nil { t.Errorf("loadTemplate returned nil") } + if err != nil { + t.Errorf("loadTemplate returned error: %s", err) + } - tmpl = loadTemplate(tmpl, "ui/build/manifest.json") + tmpl, err = loadTemplate(tmpl, "ui/build/manifest.json") if tmpl == nil { t.Errorf("loadTemplate returned nil") } + if err != nil { + t.Errorf("loadTemplate returned error: %s", err) + } if tmpl.Name() != "ui/build/index.html" { t.Errorf("tmpl.Name() returned %q", tmpl.Name()) @@ -116,28 +121,16 @@ func TestLoadTemplateChained(t *testing.T) { } func TestLoadTemplateMissing(t *testing.T) { - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - loadTemplate(nil, "/this/file/does/not/exist") - - if !wasFatal { - t.Error("loadTemplate() with invalid path didn't cause log.Fatal()") + _, err := loadTemplate(nil, "/this/file/does/not/exist") + if err == nil { + t.Error("loadTemplate() with invalid path didn't return any error") } } func TestLoadTemplateUnparsable(t *testing.T) { - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - loadTemplate(nil, "cmd/karma/tests/bindata/go-test-invalid.html") - - if !wasFatal { - t.Error("loadTemplate() with unparsable file didn't cause log.Fatal()") + _, err := loadTemplate(nil, "cmd/karma/tests/bindata/go-test-invalid.html") + if err == nil { + t.Error("loadTemplate() with unparsable file didn't return any error") } } diff --git a/cmd/karma/autocomplete.go b/cmd/karma/autocomplete.go index 273ab61ac..1ce03cb26 100644 --- a/cmd/karma/autocomplete.go +++ b/cmd/karma/autocomplete.go @@ -9,21 +9,17 @@ import ( "github.com/gin-gonic/gin" "github.com/prymitive/karma/internal/alertmanager" - - log "github.com/sirupsen/logrus" ) // knownLabelNames allows querying known label names func knownLabelNames(c *gin.Context) { noCache(c) - start := time.Now() cacheKey := c.Request.RequestURI data, found := apiCache.Get(cacheKey) if found { c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "HIT", time.Since(start)) return } @@ -50,26 +46,22 @@ func knownLabelNames(c *gin.Context) { apiCache.Set(cacheKey, data, time.Second*15) c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "MIS", time.Since(start)) } func knownLabelValues(c *gin.Context) { noCache(c) - start := time.Now() cacheKey := c.Request.RequestURI data, found := apiCache.Get(cacheKey) if found { c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "HIT", time.Since(start)) return } name, found := c.GetQuery("name") if !found || name == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "missing name= parameter"}) - log.Infof("[%s] <%d> %s %s took %s", c.ClientIP(), http.StatusBadRequest, c.Request.Method, c.Request.RequestURI, time.Since(start)) return } @@ -81,5 +73,4 @@ func knownLabelValues(c *gin.Context) { apiCache.Set(cacheKey, data, time.Second*15) c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "MIS", time.Since(start)) } diff --git a/cmd/karma/main.go b/cmd/karma/main.go index 3e76bba06..a2ee08839 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -31,11 +31,12 @@ import ( "github.com/gin-gonic/contrib/sentry" "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" "github.com/spf13/pflag" raven "github.com/getsentry/raven-go" cache "github.com/patrickmn/go-cache" - log "github.com/sirupsen/logrus" ) var ( @@ -181,7 +182,7 @@ func setupUpstreams() error { for _, s := range config.Config.Alertmanager.Servers { if s.Proxy && s.ReadOnly { - return fmt.Errorf("Failed to create Alertmanager '%s' with URI '%s': cannot use proxy and readonly mode at the same time", s.Name, uri.SanitizeURI(s.URI)) + return fmt.Errorf("failed to create Alertmanager '%s' with URI '%s': cannot use proxy and readonly mode at the same time", s.Name, uri.SanitizeURI(s.URI)) } var httpTransport http.RoundTripper @@ -190,7 +191,7 @@ func setupUpstreams() error { if s.TLS.CA != "" || s.TLS.Cert != "" || s.TLS.InsecureSkipVerify { httpTransport, err = alertmanager.NewHTTPTransport(s.TLS.CA, s.TLS.Cert, s.TLS.Key, s.TLS.InsecureSkipVerify) if err != nil { - return fmt.Errorf("Failed to create HTTP transport for Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) + return fmt.Errorf("failed to create HTTP transport for Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) } } @@ -207,46 +208,73 @@ func setupUpstreams() error { alertmanager.WithCORSCredentials(s.CORS.Credentials), ) if err != nil { - return fmt.Errorf("Failed to create Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) + return fmt.Errorf("failed to create Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) } err = alertmanager.RegisterAlertmanager(am) if err != nil { - return fmt.Errorf("Failed to register Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) + return fmt.Errorf("failed to register Alertmanager '%s' with URI '%s': %s", s.Name, uri.SanitizeURI(s.URI), err) } } return nil } +func msgFormatter(msg interface{}) string { + return fmt.Sprintf("msg=%q", msg) +} +func lvlFormatter(level interface{}) string { + return fmt.Sprintf("level=%s", level) +} + +func initLogger() { + log.Logger = log.Logger.Output(zerolog.ConsoleWriter{ + Out: os.Stderr, + NoColor: true, + FormatLevel: lvlFormatter, + FormatMessage: msgFormatter, + FormatTimestamp: func(interface{}) string { + return "" + }, + }) +} + func setupLogger() error { - switch config.Config.Log.Level { - case "debug": - log.SetLevel(log.DebugLevel) - case "info": - log.SetLevel(log.InfoLevel) - case "warning": - log.SetLevel(log.WarnLevel) - case "error": - log.SetLevel(log.ErrorLevel) - case "fatal": - log.SetLevel(log.FatalLevel) - case "panic": - log.SetLevel(log.PanicLevel) - default: - return fmt.Errorf("Unknown log level '%s'", config.Config.Log.Level) - } + zerolog.DurationFieldUnit = time.Second switch config.Config.Log.Format { case "text": - log.SetFormatter(&log.TextFormatter{ - DisableTimestamp: !config.Config.Log.Timestamp, - }) + if config.Config.Log.Timestamp { + log.Logger = log.Logger.Output(zerolog.ConsoleWriter{ + Out: os.Stderr, + NoColor: true, + FormatLevel: lvlFormatter, + FormatMessage: msgFormatter, + TimeFormat: "15:04:05", + }) + } case "json": - log.SetFormatter(&log.JSONFormatter{ - DisableTimestamp: !config.Config.Log.Timestamp, - }) + if !config.Config.Log.Timestamp { + log.Logger = zerolog.New(os.Stderr).With().Logger() + } default: - return fmt.Errorf("Unknown log format '%s'", config.Config.Log.Format) + return fmt.Errorf("unknown log format '%s'", config.Config.Log.Format) + } + + switch config.Config.Log.Level { + case "debug": + zerolog.SetGlobalLevel(zerolog.DebugLevel) + case "info": + zerolog.SetGlobalLevel(zerolog.InfoLevel) + case "warning": + zerolog.SetGlobalLevel(zerolog.WarnLevel) + case "error": + zerolog.SetGlobalLevel(zerolog.ErrorLevel) + case "fatal": + zerolog.SetGlobalLevel(zerolog.FatalLevel) + case "panic": + zerolog.SetGlobalLevel(zerolog.PanicLevel) + default: + return fmt.Errorf("unknown log level '%s'", config.Config.Log.Level) } return nil @@ -271,6 +299,7 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { configFile, err := config.Config.Read(f) if err != nil { + _ = setupLogger() return nil, err } @@ -280,15 +309,15 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { } if configFile != "" { - log.Infof("Reading configuration file %s", configFile) + log.Info().Str("path", configFile).Msg("Reading configuration file") } // timer duration cannot be zero second or a negative one if config.Config.Alertmanager.Interval <= time.Second*0 { - return nil, fmt.Errorf("Invalid alertmanager.interval value '%v'", config.Config.Alertmanager.Interval) + return nil, fmt.Errorf("invalid alertmanager.interval value '%v'", config.Config.Alertmanager.Interval) } - log.Infof("Version: %s", version) + log.Info().Msgf("Version: %s", version) if config.Config.Log.Config { config.Config.LogValues() } @@ -296,11 +325,11 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { linkDetectRules := []models.LinkDetectRule{} for _, rule := range config.Config.Silences.Comments.LinkDetect.Rules { if rule.Regex == "" || rule.URITemplate == "" { - return nil, fmt.Errorf("Invalid link detect rule, regex '%s' uriTemplate '%s'", rule.Regex, rule.URITemplate) + return nil, fmt.Errorf("invalid link detect rule, regex '%s' uriTemplate '%s'", rule.Regex, rule.URITemplate) } re, err := regexp.Compile(rule.Regex) if err != nil { - return nil, fmt.Errorf("Invalid link detect rule '%s': %s", rule.Regex, err) + return nil, fmt.Errorf("invalid link detect rule '%s': %s", rule.Regex, err) } linkDetectRules = append(linkDetectRules, models.LinkDetectRule{Regex: re, URITemplate: rule.URITemplate}) } @@ -314,11 +343,11 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { } if len(alertmanager.GetAlertmanagers()) == 0 { - return nil, fmt.Errorf("No valid Alertmanager URIs defined") + return nil, fmt.Errorf("no valid Alertmanager URIs defined") } if config.Config.Authorization.ACL.Silences != "" { - log.Infof("Reading silence ACL config file %s", config.Config.Authorization.ACL.Silences) + log.Info().Str("path", config.Config.Authorization.ACL.Silences).Msg("Reading silence ACL config file") aclConfig, err := config.ReadSilenceACLConfig(config.Config.Authorization.ACL.Silences) if err != nil { return nil, err @@ -327,11 +356,11 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { for i, cfg := range aclConfig.Rules { acl, err := newSilenceACLFromConfig(cfg) if err != nil { - return nil, fmt.Errorf("Invalid silence ACL rule at position %d: %s", i, err) + return nil, fmt.Errorf("invalid silence ACL rule at position %d: %s", i, err) } silenceACLs = append(silenceACLs, acl) } - log.Infof("Parsed %d ACL rule(s)", len(silenceACLs)) + log.Info().Int("rules", len(silenceACLs)).Msg("Parsed ACL rules") } switch config.Config.Debug { @@ -344,7 +373,10 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { router := gin.New() var t *template.Template - t = loadTemplate(t, "ui/build/index.html") + t, err = loadTemplate(t, "ui/build/index.html") + if err != nil { + return nil, fmt.Errorf("failed to load template: %s", err) + } router.SetHTMLTemplate(t) setupMetrics(router) @@ -361,16 +393,16 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { setupRouter(router) for _, am := range alertmanager.GetAlertmanagers() { if am.ProxyRequests { - log.Infof("[%s] Setting up proxy endpoints", am.Name) + log.Info().Str("alertmanager", am.Name).Msg("Setting up proxy endpoints") err := setupRouterProxyHandlers(router, am) if err != nil { - return nil, fmt.Errorf("Failed to setup proxy handlers for Alertmanager '%s': %s", am.Name, err) + return nil, fmt.Errorf("failed to setup proxy handlers for Alertmanager '%s': %s", am.Name, err) } } } if *validateConfig { - log.Info("Configuration is valid") + log.Info().Msg("Configuration is valid") return nil, nil } @@ -379,11 +411,11 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { func writePidFile() error { if pidFile != "" { - log.Infof("Writing PID file to %q", pidFile) + log.Info().Str("path", pidFile).Msg("Writing PID file") pid := os.Getpid() err := ioutil.WriteFile(pidFile, []byte(strconv.Itoa(pid)), 0644) if err != nil { - return fmt.Errorf("Failed to write a PID file: %s", err) + return fmt.Errorf("failed to write a PID file: %s", err) } } return nil @@ -391,10 +423,10 @@ func writePidFile() error { func removePidFile() error { if pidFile != "" { - log.Infof("Removing PID file %q", pidFile) + log.Info().Str("path", pidFile).Msg("Removing PID file") err := os.Remove(pidFile) if err != nil { - return fmt.Errorf("Failed to remove PID file: %s", err) + return fmt.Errorf("failed to remove PID file: %s", err) } } return nil @@ -415,9 +447,9 @@ func serve(errorHandling pflag.ErrorHandling) error { } // before we start try to fetch data from Alertmanager - log.Info("Initial Alertmanager query") + log.Info().Msg("Initial Alertmanager collection") pullFromAlertmanager() - log.Info("Done, starting HTTP server") + log.Info().Msg("Done, starting HTTP server") // background loop that will fetch updates from Alertmanager ticker = time.NewTicker(config.Config.Alertmanager.Interval) @@ -428,7 +460,7 @@ func serve(errorHandling pflag.ErrorHandling) error { if err != nil { return err } - log.Infof("Listening on %s", listener.Addr()) + log.Info().Str("address", listener.Addr().String()).Msg("Starting HTTP server") httpServer := &http.Server{ Addr: listen, @@ -441,21 +473,22 @@ func serve(errorHandling pflag.ErrorHandling) error { quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) <-quit - log.Infof("Shutting down HTTP server") + log.Info().Msg("Shutting down HTTP server") ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := httpServer.Shutdown(ctx); err != nil { - return fmt.Errorf("Shutdown failed: %s", err) + return fmt.Errorf("shutdown error: %s", err) } - log.Info("HTTP server shut down") + log.Info().Msg("HTTP server shut down") return removePidFile() } func main() { + initLogger() err := serve(pflag.ExitOnError) if err != nil { - log.Fatal(err) + log.Fatal().Err(err).Msg("Execution failed") } } diff --git a/cmd/karma/main_test.go b/cmd/karma/main_test.go index 61aaf3bc1..b0ab9ba1a 100644 --- a/cmd/karma/main_test.go +++ b/cmd/karma/main_test.go @@ -9,17 +9,17 @@ import ( "github.com/prymitive/karma/internal/config" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog" ) func TestLogConfig(t *testing.T) { - logLevels := map[string]log.Level{ - "debug": log.DebugLevel, - "info": log.InfoLevel, - "warning": log.WarnLevel, - "error": log.ErrorLevel, - "fatal": log.FatalLevel, - "panic": log.PanicLevel, + logLevels := map[string]zerolog.Level{ + "debug": zerolog.DebugLevel, + "info": zerolog.InfoLevel, + "warning": zerolog.WarnLevel, + "error": zerolog.ErrorLevel, + "fatal": zerolog.FatalLevel, + "panic": zerolog.PanicLevel, } for val, level := range logLevels { @@ -28,8 +28,8 @@ func TestLogConfig(t *testing.T) { if err != nil { t.Error(err) } - if log.GetLevel() != level { - t.Errorf("Config.Log.Level=%s resulted in invalid log level %s", val, log.GetLevel()) + if zerolog.GlobalLevel() != level { + t.Errorf("Config.Log.Level=%s resulted in invalid log level %s", val, zerolog.GlobalLevel()) } } } diff --git a/cmd/karma/proxy.go b/cmd/karma/proxy.go index 0b8b00f39..38ffee36d 100644 --- a/cmd/karma/proxy.go +++ b/cmd/karma/proxy.go @@ -14,7 +14,7 @@ import ( "github.com/prymitive/karma/internal/config" "github.com/prymitive/karma/internal/mapper" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) func proxyPathPrefix(name string) string { @@ -63,7 +63,7 @@ func NewAlertmanagerProxy(alertmanager *alertmanager.Alertmanager) (*httputil.Re req.URL.Path = strings.TrimSuffix(upstreamURL.Path, "/") + req.URL.Path } - log.Debugf("[%s] Forwarding request for %s to %s", alertmanager.Name, req.RequestURI, req.URL.String()) + log.Debug().Str("alertmanager", alertmanager.Name).Str("uri", req.RequestURI).Str("forwardedURI", req.URL.String()).Msg("Forwarding request") }, Transport: alertmanager.HTTPTransport, ModifyResponse: func(resp *http.Response) error { @@ -78,12 +78,12 @@ func NewAlertmanagerProxy(alertmanager *alertmanager.Alertmanager) (*httputil.Re func handlePostRequest(alertmanager *alertmanager.Alertmanager, h http.Handler) gin.HandlerFunc { return func(c *gin.Context) { - log.Debugf("[%s] Proxy request %s", alertmanager.Name, c.Request.RequestURI) + log.Debug().Str("alertmanager", alertmanager.Name).Str("uri", c.Request.RequestURI).Msg("Proxy request") body, err := ioutil.ReadAll(c.Request.Body) c.Request.Body.Close() if err != nil { - log.Errorf("[%s] proxy request '%s %s' body close failed: %s", alertmanager.Name, c.Request.Method, c.Request.RequestURI, err) + log.Error().Err(err).Str("alertmanager", alertmanager.Name).Str("method", c.Request.Method).Str("uri", c.Request.RequestURI).Msg("Failed to close proxied request") c.AbortWithStatus(http.StatusInternalServerError) return } @@ -95,14 +95,14 @@ func handlePostRequest(alertmanager *alertmanager.Alertmanager, h http.Handler) m, err := mapper.GetSilenceMapper(ver) if err != nil { - log.Errorf("[%s] proxy request '%s %s' error: %s", alertmanager.Name, c.Request.Method, c.Request.RequestURI, err) + log.Error().Err(err).Str("alertmanager", alertmanager.Name).Str("method", c.Request.Method).Str("uri", c.Request.RequestURI).Msg("Failed to proxy a request") c.AbortWithStatus(http.StatusInternalServerError) return } silence, err := m.Unmarshal(body) if err != nil { - log.Errorf("[%s] proxy request '%s %s' failed to unmarshal silence body: %s", alertmanager.Name, c.Request.Method, c.Request.RequestURI, err) + log.Error().Err(err).Str("alertmanager", alertmanager.Name).Str("method", c.Request.Method).Str("uri", c.Request.RequestURI).Msg("Failed to unmarshal silence body") c.AbortWithStatus(http.StatusInternalServerError) return } @@ -110,9 +110,9 @@ func handlePostRequest(alertmanager *alertmanager.Alertmanager, h http.Handler) for i, acl := range silenceACLs { username := c.GetString(gin.AuthUserKey) isAllowed, err := acl.isAllowed(alertmanager.Name, silence, username) - log.Debugf("ACL %d: isAllowed=%v err=%v", i, isAllowed, err) + log.Debug().Int("index", i).Bool("allowed", isAllowed).Err(err).Msg("ACL rule check") if err != nil { - log.Warningf("[%s] proxy request '%s %s' was blocked by ACL rule: %s", alertmanager.Name, c.Request.Method, c.Request.RequestURI, err) + log.Warn().Err(err).Str("alertmanager", alertmanager.Name).Str("method", c.Request.Method).Str("uri", c.Request.RequestURI).Msg("Proxy request was blocked by ACL rule") c.String(http.StatusBadRequest, err.Error()) return } @@ -125,7 +125,7 @@ func handlePostRequest(alertmanager *alertmanager.Alertmanager, h http.Handler) username := c.MustGet(gin.AuthUserKey).(string) newBody, err := m.RewriteUsername(body, username) if err != nil { - log.Errorf("[%s] proxy request '%s %s' silence body rewrite error: %s", alertmanager.Name, c.Request.Method, c.Request.RequestURI, err) + log.Error().Err(err).Str("alertmanager", alertmanager.Name).Str("method", c.Request.Method).Str("uri", c.Request.RequestURI).Msg("Failed to rewrite silence body") c.String(http.StatusInternalServerError, err.Error()) return } diff --git a/cmd/karma/proxy_test.go b/cmd/karma/proxy_test.go index c35a4697e..8c8b28fd9 100644 --- a/cmd/karma/proxy_test.go +++ b/cmd/karma/proxy_test.go @@ -15,7 +15,7 @@ import ( "github.com/prymitive/karma/internal/alertmanager" "github.com/prymitive/karma/internal/config" "github.com/prymitive/karma/internal/mock" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog" "github.com/jarcoal/httpmock" "github.com/pmezard/go-difflib/difflib" @@ -515,7 +515,7 @@ func TestProxyUserRewrite(t *testing.T) { httpmock.Activate() defer httpmock.DeactivateAndReset() - log.SetLevel(log.FatalLevel) + zerolog.SetGlobalLevel(zerolog.FatalLevel) t.Run(testCase.name, func(t *testing.T) { for _, version := range mock.ListAllMocks() { t.Logf("Testing alerts using mock files from Alertmanager %s", version) @@ -1147,7 +1147,7 @@ func TestProxySilenceACL(t *testing.T) { httpmock.Activate() defer httpmock.DeactivateAndReset() - log.SetLevel(log.FatalLevel) + zerolog.SetGlobalLevel(zerolog.FatalLevel) t.Run(testCase.name, func(t *testing.T) { for _, version := range mock.ListAllMocks() { t.Logf("Testing alerts using mock files from Alertmanager %s", version) diff --git a/cmd/karma/script_test.go b/cmd/karma/script_test.go index 2f636fd97..6cda9d85f 100644 --- a/cmd/karma/script_test.go +++ b/cmd/karma/script_test.go @@ -5,32 +5,26 @@ import ( "testing" "github.com/rogpeppe/go-internal/testscript" + "github.com/rs/zerolog/log" "github.com/spf13/pflag" - - log "github.com/sirupsen/logrus" ) func mainShoulFail() int { + initLogger() err := serve(pflag.ContinueOnError) if err != nil { - log.Error(err) + log.Error().Err(err).Msg("Execution failed") return 0 } - log.Error("No error logged") + log.Error().Msg("No error logged") return 100 } -func mainShoulFailNoTimestamp() int { - log.SetFormatter(&log.TextFormatter{ - DisableTimestamp: true, - }) - return mainShoulFail() -} - func mainShouldWork() int { + initLogger() err := serve(pflag.ContinueOnError) if err != nil { - log.Error(err) + log.Error().Err(err).Msg("Execution failed") return 100 } return 0 @@ -38,14 +32,14 @@ func mainShouldWork() int { func TestMain(m *testing.M) { os.Exit(testscript.RunMain(m, map[string]func() int{ - "karma.bin-should-fail": mainShoulFail, - "karma.bin-should-fail-no-timestamp": mainShoulFailNoTimestamp, - "karma.bin-should-work": mainShouldWork, + "karma.bin-should-fail": mainShoulFail, + "karma.bin-should-work": mainShouldWork, })) } func TestScripts(t *testing.T) { testscript.Run(t, testscript.Params{ - Dir: "tests/testscript", + Dir: "tests/testscript", + UpdateScripts: os.Getenv("UPDATE_SNAPSHOTS") == "1", }) } diff --git a/cmd/karma/tests/testscript/001_acl_example.txt b/cmd/karma/tests/testscript/001_acl_example.txt index 07c4a953f..977e56366 100644 --- a/cmd/karma/tests/testscript/001_acl_example.txt +++ b/cmd/karma/tests/testscript/001_acl_example.txt @@ -1,10 +1,15 @@ # Config is valid with example silence ACL rules -karma.bin-should-work --log.format=text --log.config=false --check-config +karma.bin-should-work --check-config ! stdout . -stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=info msg="Parsed ACL rules" rules=4 +level=info msg="Configuration is valid" -- karma.yaml -- authentication: header: @@ -24,7 +29,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- diff --git a/cmd/karma/tests/testscript/002_acl_invalid_file.txt b/cmd/karma/tests/testscript/002_acl_invalid_file.txt index 15ba3a0fa..ef10ff2cc 100644 --- a/cmd/karma/tests/testscript/002_acl_invalid_file.txt +++ b/cmd/karma/tests/testscript/002_acl_invalid_file.txt @@ -1,10 +1,14 @@ # Raises an error if --authorization.acl points to a file that cannot be parsed -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Failed to parse silence ACL configuration file \\"acl.yaml\\": yaml: unmarshal errors:.*"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="failed to parse silence ACL configuration file \"acl.yaml\": yaml: unmarshal errors:\n line 1: cannot unmarshal !!str `This Is...` into config.silencesACLSchema" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- This Is Not yaml diff --git a/cmd/karma/tests/testscript/003_acl_missing_file.txt b/cmd/karma/tests/testscript/003_acl_missing_file.txt index f8c4b090f..d71ed1058 100644 --- a/cmd/karma/tests/testscript/003_acl_missing_file.txt +++ b/cmd/karma/tests/testscript/003_acl_missing_file.txt @@ -1,10 +1,14 @@ # Raises an error if --authorization.acl points to a missing file -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Failed to load silence ACL configuration file \\"acl.yaml\\": open acl.yaml: no such file or directory"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="failed to load silence ACL configuration file \"acl.yaml\": open acl.yaml: no such file or directory" -- karma.yaml -- authentication: header: @@ -24,4 +28,4 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt b/cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt index 96aa8926b..278b78557 100644 --- a/cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt +++ b/cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses invalid 'action' value -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule requires ''action'' to be one of \[allow block requireMatcher\], got \\"foo\\""' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule requires 'action' to be one of [allow block requireMatcher], got \"foo\"" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt b/cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt index 44db749e6..252abe004 100644 --- a/cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt +++ b/cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses invalid 'alertmanagers' value -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid ACL rule, no alertmanager with name \\"unknown\\" found"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid ACL rule, no alertmanager with name \"unknown\" found" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt b/cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt index 8105f7eca..3178d379d 100644 --- a/cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt +++ b/cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with invalid name_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid ACL rule, failed to parse name_re \\"cluster\*\*\*\\": error parsing regexp: invalid nested repetition operator: `\*\*`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid ACL rule, failed to parse name_re \"cluster***\": error parsing regexp: invalid nested repetition operator: `**`" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt b/cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt index ba8725d88..30bd283ea 100644 --- a/cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt +++ b/cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with invalid value_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid ACL rule, failed to parse value_re \\"prod\*\*\*\\": error parsing regexp: invalid nested repetition operator: `\*\*`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid ACL rule, failed to parse value_re \"prod***\": error parsing regexp: invalid nested repetition operator: `**`" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt b/cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt index 906b9a84b..ccb2acbae 100644 --- a/cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt +++ b/cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses invalid 'groups' value -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid silence ACL rule, no group with name \\"unknown\\" found in authorization.groups configuration"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid silence ACL rule, no group with name \"unknown\" found in authorization.groups configuration" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt b/cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt index f2b9a0fd4..4b4e67794 100644 --- a/cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt +++ b/cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher with invalid name_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid ACL rule, failed to parse name_re \\"cluster.\+\+\+\+\\": error parsing regexp: invalid nested repetition operator: `\+\+`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid ACL rule, failed to parse name_re \"cluster.++++\": error parsing regexp: invalid nested repetition operator: `++`" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt b/cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt index b8acefec3..3978e2c52 100644 --- a/cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt +++ b/cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher with invalid value_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: invalid ACL rule, failed to parse value_re \\".\+\+\+\\": error parsing regexp: invalid nested repetition operator: `\+\+`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: invalid ACL rule, failed to parse value_re \".+++\": error parsing regexp: invalid nested repetition operator: `++`" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt b/cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt index b0fec5a53..e4fb3c3c1 100644 --- a/cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt +++ b/cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher with both name and name_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher can only have ''name'' or ''name_re'' set, not both"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher can only have 'name' or 'name_re' set, not both" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt b/cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt index 13abc9317..3448eb9cc 100644 --- a/cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt +++ b/cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher with both value and value_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher can only have ''value'' or ''value_re'' set, not both"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher can only have 'value' or 'value_re' set, not both" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt b/cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt index 40f30dd4e..44383f9d5 100644 --- a/cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt +++ b/cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with missing name or name_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule filter requires ''name'' or ''name_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule filter requires 'name' or 'name_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt b/cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt index d101c3a32..86a1175bd 100644 --- a/cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt +++ b/cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with missing value or value_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule filter requires ''value'' or ''value_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule filter requires 'value' or 'value_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt b/cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt index e4161a986..591dd388e 100644 --- a/cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt +++ b/cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher without name -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher requires ''name'' or ''name_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher requires 'name' or 'name_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt b/cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt index 2b92fdf6a..6058a4265 100644 --- a/cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt +++ b/cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher without name -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher requires ''name'' or ''name_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher requires 'name' or 'name_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt b/cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt index 8e896ebfb..569b07013 100644 --- a/cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt +++ b/cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher without value -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher requires ''value'' or ''value_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher requires 'value' or 'value_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt b/cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt index 3a9579aa3..e291cc2d9 100644 --- a/cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt +++ b/cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses matcher without value -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule matcher requires ''value'' or ''value_re'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule matcher requires 'value' or 'value_re' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt b/cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt index ebcd15ee7..f4ae8bb51 100644 --- a/cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt +++ b/cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule is missing 'reason' -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule requires ''reason'' to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule requires 'reason' to be set" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt b/cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt index 1bd67757a..54d0ad6a4 100644 --- a/cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt +++ b/cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with both name and name_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule filter can only have ''name'' or ''name_re'' set, not both"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule filter can only have 'name' or 'name_re' set, not both" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt b/cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt index c13363ab5..c40288950 100644 --- a/cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt +++ b/cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt @@ -1,10 +1,14 @@ # Raises an error if silence ACL rule uses filter with both value and value_re -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Invalid silence ACL rule at position 0: silence ACL rule filter can only have ''value'' or ''value_re'' set, not both"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="invalid silence ACL rule at position 0: silence ACL rule filter can only have 'value' or 'value_re' set, not both" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt b/cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt index 5373e5974..60b59da4d 100644 --- a/cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt +++ b/cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt @@ -1,13 +1,15 @@ # Raises an error if basic auth credentials are missing -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="authentication.basicAuth.users require both username and password to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="authentication.basicAuth.users require both username and password to be set" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: basicAuth: users: diff --git a/cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt b/cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt index 65606d776..19ef1da53 100644 --- a/cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt +++ b/cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt @@ -1,13 +1,15 @@ # Raises an error if basic auth password is missing -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="authentication.basicAuth.users require both username and password to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="authentication.basicAuth.users require both username and password to be set" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: basicAuth: users: diff --git a/cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt b/cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt index 0a812456f..aa4fea7f6 100644 --- a/cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt +++ b/cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt @@ -1,13 +1,15 @@ # Raises an error if basic auth username is missing -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="authentication.basicAuth.users require both username and password to be set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="authentication.basicAuth.users require both username and password to be set" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: basicAuth: users: diff --git a/cmd/karma/tests/testscript/025_auth_group_missing_members.txt b/cmd/karma/tests/testscript/025_auth_group_missing_members.txt index d43a0a78c..3c8675b7a 100644 --- a/cmd/karma/tests/testscript/025_auth_group_missing_members.txt +++ b/cmd/karma/tests/testscript/025_auth_group_missing_members.txt @@ -1,8 +1,10 @@ # Raises an error if authorization group is missing name -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -stderr 'msg="''members'' is required for every authorization group"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="'members' is required for every authorization group" -- karma.yaml -- authentication: header: @@ -14,4 +16,4 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/026_auth_group_missing_name.txt b/cmd/karma/tests/testscript/026_auth_group_missing_name.txt index b6c341415..8a734a9d2 100644 --- a/cmd/karma/tests/testscript/026_auth_group_missing_name.txt +++ b/cmd/karma/tests/testscript/026_auth_group_missing_name.txt @@ -1,8 +1,10 @@ # Raises an error if authorization group is missing name -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -stderr 'msg="''name'' is required for every authorization group"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="'name' is required for every authorization group" -- karma.yaml -- authentication: header: @@ -19,4 +21,4 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt b/cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt index ee1d16c85..568a90a7c 100644 --- a/cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt +++ b/cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt @@ -1,13 +1,15 @@ # Raises an error if both header & basic auth authentication is enabled -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: header: name: "foo" diff --git a/cmd/karma/tests/testscript/028_auth_header_no_name.txt b/cmd/karma/tests/testscript/028_auth_header_no_name.txt index b1bdd5e3b..ce4221c08 100644 --- a/cmd/karma/tests/testscript/028_auth_header_no_name.txt +++ b/cmd/karma/tests/testscript/028_auth_header_no_name.txt @@ -1,13 +1,15 @@ # Raises an error if header authentication config is missing name -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="authentication.header.name is required when authentication.header.value_re is set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="authentication.header.name is required when authentication.header.value_re is set" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: header: value_re: ".+" diff --git a/cmd/karma/tests/testscript/029_auth_header_no_regex.txt b/cmd/karma/tests/testscript/029_auth_header_no_regex.txt index dd7d2e737..15e95e315 100644 --- a/cmd/karma/tests/testscript/029_auth_header_no_regex.txt +++ b/cmd/karma/tests/testscript/029_auth_header_no_regex.txt @@ -1,13 +1,15 @@ # Raises an error if header authentication config is missing regex rule -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="authentication.header.value_re is required when authentication.header.name is set"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="authentication.header.value_re is required when authentication.header.name is set" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: header: name: "foo" diff --git a/cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt b/cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt index c7f15f3eb..63794abbf 100644 --- a/cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt +++ b/cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt @@ -1,13 +1,15 @@ # Raises an error if header authentication config contains invalid regex rule -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Invalid regex for authentication.header.value_re: error parsing regexp: invalid nested repetition operator: `\+\+`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="invalid regex for authentication.header.value_re: error parsing regexp: invalid nested repetition operator: `++`" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 authentication: header: name: "foo" diff --git a/cmd/karma/tests/testscript/031_check-config.txt b/cmd/karma/tests/testscript/031_check-config.txt index 167b79b24..c97caac43 100644 --- a/cmd/karma/tests/testscript/031_check-config.txt +++ b/cmd/karma/tests/testscript/031_check-config.txt @@ -1,5 +1,5 @@ # Validates config when --check-config is passed -karma.bin-should-work --log.format=text --log.config=false --check-config --alertmanager.uri=http://localhost +karma.bin-should-work --check-config --alertmanager.uri=http://127.0.0.1 ! stdout . stderr 'msg="Configuration is valid"' ! stderr 'level=error' diff --git a/cmd/karma/tests/testscript/032_config_file_flag_over_env.txt b/cmd/karma/tests/testscript/032_config_file_flag_over_env.txt index 253ba6d15..f9e412f24 100644 --- a/cmd/karma/tests/testscript/032_config_file_flag_over_env.txt +++ b/cmd/karma/tests/testscript/032_config_file_flag_over_env.txt @@ -2,27 +2,27 @@ env CONFIG_FILE=env.yaml karma.bin-should-work --check-config --config.file=flag.yaml ! stdout . -stderr 'msg="Reading configuration file flag.yaml"' -stderr 'msg="Configuration is valid"' -stderr 'msg="\[flag\] Configured Alertmanager source at http://localhost:8080 \(proxied: false\, readonly: false\)"' -! stderr 'level=error' -! stderr 'msg="Reading configuration file karma.yaml"' -! stderr 'msg="Reading configuration file env.yaml"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=flag.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=flag proxy=false readonly=false uri=http://127.0.0.1:8080 +level=info msg="Configuration is valid" -- flag.yaml -- alertmanager: servers: - name: flag - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" -- env.yaml -- alertmanager: servers: - name: env - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" -- karma.yaml -- alertmanager: servers: - name: karma - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" diff --git a/cmd/karma/tests/testscript/033_config_file_from_env.txt b/cmd/karma/tests/testscript/033_config_file_from_env.txt index f5ed35286..ac15c0ae4 100644 --- a/cmd/karma/tests/testscript/033_config_file_from_env.txt +++ b/cmd/karma/tests/testscript/033_config_file_from_env.txt @@ -2,14 +2,17 @@ env CONFIG_FILE=foo.yaml karma.bin-should-work --check-config ! stdout . -stderr 'msg="Reading configuration file foo.yaml"' -stderr 'msg="Configuration is valid"' -stderr 'msg="\[cwd\] Configured Alertmanager source at http://localhost:8080 \(proxied: true\, readonly: false\)"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=foo.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=cwd proxy=true readonly=false uri=http://127.0.0.1:8080 +level=info msg="Setting up proxy endpoints" alertmanager=cwd +level=info msg="Configuration is valid" -- foo.yaml -- alertmanager: servers: - name: cwd - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" proxy: true diff --git a/cmd/karma/tests/testscript/034_config_file_from_flag.txt b/cmd/karma/tests/testscript/034_config_file_from_flag.txt index 906266cc5..8470ef19d 100644 --- a/cmd/karma/tests/testscript/034_config_file_from_flag.txt +++ b/cmd/karma/tests/testscript/034_config_file_from_flag.txt @@ -2,14 +2,17 @@ env CONFIG_FILE=foo.yaml karma.bin-should-work --check-config --config.file foo.yaml ! stdout . -stderr 'msg="Reading configuration file foo.yaml"' -stderr 'msg="Configuration is valid"' -stderr 'msg="\[cwd\] Configured Alertmanager source at http://localhost:8080 \(proxied: true\, readonly: false\)"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=foo.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=cwd proxy=true readonly=false uri=http://127.0.0.1:8080 +level=info msg="Setting up proxy endpoints" alertmanager=cwd +level=info msg="Configuration is valid" -- foo.yaml -- alertmanager: servers: - name: cwd - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" proxy: true diff --git a/cmd/karma/tests/testscript/035_debug.txt b/cmd/karma/tests/testscript/035_debug.txt index 0eacd8bcc..c2d37afa7 100644 --- a/cmd/karma/tests/testscript/035_debug.txt +++ b/cmd/karma/tests/testscript/035_debug.txt @@ -1,7 +1,7 @@ # Passing --debug enables Gin debug mode exec sh -ex ./test.sh & -karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=false --debug --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8035 +karma.bin-should-work --pid-file=karma.pid --debug --alertmanager.uri=http://127.0.0.1 --listen.address=127.0.0.1 --listen.port=8035 stdout '\[GIN-debug\] \[WARNING\] Running in "debug" mode. Switch to "release" mode in production.' -- test.sh -- diff --git a/cmd/karma/tests/testscript/036_default_config_file.txt b/cmd/karma/tests/testscript/036_default_config_file.txt index e6d4c0333..11b3d0161 100644 --- a/cmd/karma/tests/testscript/036_default_config_file.txt +++ b/cmd/karma/tests/testscript/036_default_config_file.txt @@ -1,14 +1,17 @@ # Load 'karma.yaml' from cwd by default karma.bin-should-work --check-config ! stdout . -stderr 'msg="Reading configuration file karma.yaml"' -stderr 'msg="Configuration is valid"' -stderr 'msg="\[cwd\] Configured Alertmanager source at http://localhost:8080 \(proxied: true\, readonly: false\)"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=cwd proxy=true readonly=false uri=http://127.0.0.1:8080 +level=info msg="Setting up proxy endpoints" alertmanager=cwd +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - name: cwd - uri: "http://localhost:8080" + uri: "http://127.0.0.1:8080" proxy: true diff --git a/cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt b/cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt index 1e5be3cab..915628b50 100644 --- a/cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt +++ b/cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt @@ -1,11 +1,16 @@ # Raises an error if we have 2 instances with the same name (one using default name) -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Failed to register Alertmanager ''default'' with URI ''https://localhost:9094'': alertmanager upstream ''default'' already exist"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=error msg="Execution failed" error="failed to register Alertmanager 'default' with URI 'https://127.0.0.1:9094': alertmanager upstream 'default' already exist" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 - - uri: https://localhost:9094 + uri: https://127.0.0.1:9093 + - uri: https://127.0.0.1:9094 diff --git a/cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt b/cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt index 8fad482a4..39fc0730e 100644 --- a/cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt +++ b/cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt @@ -1,12 +1,17 @@ # Raises an error if we have 2 instances with the same name -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Failed to register Alertmanager ''am1'' with URI ''https://localhost:9094'': alertmanager upstream ''am1'' already exist"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=am1 proxy=false readonly=false uri=https://127.0.0.1:9093 +level=error msg="Execution failed" error="failed to register Alertmanager 'am1' with URI 'https://127.0.0.1:9094': alertmanager upstream 'am1' already exist" -- karma.yaml -- alertmanager: servers: - name: am1 - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 - name: am1 - uri: https://localhost:9094 + uri: https://127.0.0.1:9094 diff --git a/cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt b/cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt index 7fb7e84f4..e1e447bae 100644 --- a/cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt +++ b/cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt @@ -1,12 +1,17 @@ # Raises an error if we have 2 instances with the same URI -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file karma.yaml +karma.bin-should-fail --config.file karma.yaml ! stdout . -stderr 'msg="Failed to register Alertmanager ''am2'' with URI ''https://localhost:9093'': alertmanager upstream ''am1'' already collects from ''https://localhost:9093''"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=am1 proxy=false readonly=false uri=https://127.0.0.1:9093 +level=error msg="Execution failed" error="failed to register Alertmanager 'am2' with URI 'https://127.0.0.1:9093': alertmanager upstream 'am1' already collects from 'https://127.0.0.1:9093'" -- karma.yaml -- alertmanager: servers: - name: am1 - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 - name: am2 - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/040_empty_alertmanager_name.txt b/cmd/karma/tests/testscript/040_empty_alertmanager_name.txt index 36fddb036..aacc09822 100644 --- a/cmd/karma/tests/testscript/040_empty_alertmanager_name.txt +++ b/cmd/karma/tests/testscript/040_empty_alertmanager_name.txt @@ -1,10 +1,14 @@ # Uses 'default' as the default alertmanager name -karma.bin-should-work --log.format=text --log.config=false --config.file=karma.yaml --check-config +karma.bin-should-work --config.file=karma.yaml --check-config ! stdout . -stderr 'msg="\[default\] Configured Alertmanager source at http://localhost:9093 \(proxied: false\, readonly: false\)"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://127.0.0.1:9093 +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - - uri: http://localhost:9093 + - uri: http://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt b/cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt index f0b87303a..c25c67940 100644 --- a/cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt +++ b/cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt @@ -1,12 +1,14 @@ # Raises an error if we cors.credentials value is incorrect -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file karma.yaml +karma.bin-should-fail --config.file karma.yaml ! stdout . -stderr 'msg="Invalid cors.credentials value ''foo'' for alertmanager ''am1'', allowed options: omit, inclue, same-origin' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="invalid cors.credentials value 'foo' for alertmanager 'am1', allowed options: omit, inclue, same-origin" -- karma.yaml -- alertmanager: servers: - name: am1 - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 cors: credentials: foo diff --git a/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt b/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt index 3d7cff376..655409203 100644 --- a/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt +++ b/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt @@ -1,11 +1,13 @@ # Raises an error if we pass alertmanager.interval value that doesn't parse -karma.bin-should-fail-no-timestamp --log.format=text --log.config=false --log.level=error --config.file karma.yaml +karma.bin-should-fail --config.file karma.yaml ! stdout . -stderr 'msg=".* invalid duration \\"abc123\\""' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="failed to unmarshal configuration: 1 error(s) decoding:\n\n* error decoding 'Alertmanager.Interval': time: invalid duration \"abc123\"" -- karma.yaml -- alertmanager: interval: abc123 servers: - name: am - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/043_invalid_flag.txt b/cmd/karma/tests/testscript/043_invalid_flag.txt index 16d720cfe..2c1b5857c 100644 --- a/cmd/karma/tests/testscript/043_invalid_flag.txt +++ b/cmd/karma/tests/testscript/043_invalid_flag.txt @@ -2,5 +2,7 @@ env CONFIG_FILE=foo.yaml karma.bin-should-fail --check-config --invalid.flag ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'level=error msg="unknown flag: --invalid.flag"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="unknown flag: --invalid.flag" diff --git a/cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt b/cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt index e4c8d9e45..9600e4deb 100644 --- a/cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt +++ b/cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt @@ -1,4 +1,7 @@ # Raises an error if we pass alertmanager.timeout value that doesn't parse -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --alertmanager.timeout=abc123 --alertmanager.uri=http://localhost +karma.bin-should-fail --alertmanager.timeout=abc123 --alertmanager.uri=http://127.0.0.1 ! stdout . -stderr 'level=error msg="invalid argument \\"abc123\\" for \\"--alertmanager.timeout\\" flag: time: invalid duration \\"abc123\\""' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="invalid argument \"abc123\" for \"--alertmanager.timeout\" flag: time: invalid duration \"abc123\"" diff --git a/cmd/karma/tests/testscript/045_invalid_listen_prefix.txt b/cmd/karma/tests/testscript/045_invalid_listen_prefix.txt index d1b1a46a3..6f7d82328 100644 --- a/cmd/karma/tests/testscript/045_invalid_listen_prefix.txt +++ b/cmd/karma/tests/testscript/045_invalid_listen_prefix.txt @@ -1,4 +1,7 @@ # Raises an error if listen.prefix is invalid -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --alertmanager.uri http://localhost --listen.prefix karma +karma.bin-should-fail --alertmanager.uri http://127.0.0.1 --listen.prefix karma ! stdout . -stderr 'msg="listen.prefix must start with ''\/'', got \\"karma\\"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="listen.prefix must start with '/', got \"karma\"" diff --git a/cmd/karma/tests/testscript/046_invalid_log_format.txt b/cmd/karma/tests/testscript/046_invalid_log_format.txt index 34fe3f9b7..c25cb5447 100644 --- a/cmd/karma/tests/testscript/046_invalid_log_format.txt +++ b/cmd/karma/tests/testscript/046_invalid_log_format.txt @@ -1,4 +1,7 @@ # Raises an error if invalid log format is passed -karma.bin-should-fail --log.format=text --log.config=false --log.format=xml +karma.bin-should-fail --log.format=xml ! stdout . -stderr 'msg="Unknown log format ''xml''"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="unknown log format 'xml'" diff --git a/cmd/karma/tests/testscript/047_invalid_log_level.txt b/cmd/karma/tests/testscript/047_invalid_log_level.txt index 84a9bed92..5d75e1d34 100644 --- a/cmd/karma/tests/testscript/047_invalid_log_level.txt +++ b/cmd/karma/tests/testscript/047_invalid_log_level.txt @@ -1,4 +1,7 @@ # Raises an error if invalid log level is passed -karma.bin-should-fail --log.format=text --log.config=false --log.level=foobar +karma.bin-should-fail --log.timestamp=false --log.level=foobar ! stdout . -stderr 'msg="Unknown log level ''foobar''"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="unknown log level 'foobar'" diff --git a/cmd/karma/tests/testscript/048_invalid_proxy_config.txt b/cmd/karma/tests/testscript/048_invalid_proxy_config.txt index f8af13fae..2d0c471e4 100644 --- a/cmd/karma/tests/testscript/048_invalid_proxy_config.txt +++ b/cmd/karma/tests/testscript/048_invalid_proxy_config.txt @@ -1,11 +1,15 @@ # Raises an error if proxy config is invalid -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Failed to create Alertmanager ''proxied'' with URI ''httpz://localhost'': unsupported URI scheme ''httpz'' in ''httpz://localhost''"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create Alertmanager 'proxied' with URI 'httpz://127.0.0.1': unsupported URI scheme 'httpz' in 'httpz://127.0.0.1'" -- karma.yaml -- alertmanager: servers: - name: proxied - uri: httpz://localhost + uri: httpz://127.0.0.1 proxy: true diff --git a/cmd/karma/tests/testscript/050_invalid_ttl.txt b/cmd/karma/tests/testscript/050_invalid_ttl.txt index 20d3e4163..9e6a39f61 100644 --- a/cmd/karma/tests/testscript/050_invalid_ttl.txt +++ b/cmd/karma/tests/testscript/050_invalid_ttl.txt @@ -1,4 +1,7 @@ # Raises an error if negative refresh interval is passed -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --alertmanager.interval=-4s +karma.bin-should-fail --alertmanager.interval=-4s ! stdout . -stderr 'msg="Invalid alertmanager.interval value ''-4s''"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="invalid alertmanager.interval value '-4s'" diff --git a/cmd/karma/tests/testscript/051_invalid_uri.txt b/cmd/karma/tests/testscript/051_invalid_uri.txt index 02078358d..3b551e6e6 100644 --- a/cmd/karma/tests/testscript/051_invalid_uri.txt +++ b/cmd/karma/tests/testscript/051_invalid_uri.txt @@ -1,4 +1,8 @@ # Raises an error if alertmanager URI is invalid -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --alertmanager.uri httpz://username:secret@localhost +karma.bin-should-fail --alertmanager.uri httpz://username:secret@127.0.0.1 ! stdout . -stderr 'msg="Failed to create Alertmanager ''default'' with URI ''httpz://username:xxx@localhost'': unsupported URI scheme ''httpz'' in ''httpz://username:xxx@localhost''"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create Alertmanager 'default' with URI 'httpz://username:xxx@127.0.0.1': unsupported URI scheme 'httpz' in 'httpz://username:xxx@127.0.0.1'" diff --git a/cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt b/cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt index 2c669a8d9..97681f984 100644 --- a/cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt +++ b/cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt @@ -1,13 +1,15 @@ # Raises an error if label custom color config is using invalid regex rule -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Failed to parse custom color regex rule ''\.\+\+\+\+'' for ''region'' label: error parsing regexp: invalid nested repetition operator: `\+\+`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="failed to parse custom color regex rule '.++++' for 'region' label: error parsing regexp: invalid nested repetition operator: `++`" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 labels: color: custom: diff --git a/cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt b/cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt index 1f0f15e3e..f77c90cdd 100644 --- a/cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt +++ b/cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt @@ -1,13 +1,15 @@ # Raises an error if label custom color config is missing a value -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Custom label color for ''region'' is missing ''value'' or ''value_re''"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="custom label color for 'region' is missing 'value' or 'value_re'" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 labels: color: custom: diff --git a/cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt b/cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt index 709d7bcd4..ea3655fc5 100644 --- a/cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt +++ b/cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt @@ -1,13 +1,17 @@ # Raises an error if linkDetect config is missing regex rule -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Invalid link detect rule ''foo\+\+\+\+\+\+'': error parsing regexp: invalid nested repetition operator: `\+\+`"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="invalid link detect rule 'foo++++++': error parsing regexp: invalid nested repetition operator: `++`" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 silences: comments: linkDetect: diff --git a/cmd/karma/tests/testscript/055_linkDetect_no_regex.txt b/cmd/karma/tests/testscript/055_linkDetect_no_regex.txt index 87623af5b..d5306df95 100644 --- a/cmd/karma/tests/testscript/055_linkDetect_no_regex.txt +++ b/cmd/karma/tests/testscript/055_linkDetect_no_regex.txt @@ -1,13 +1,17 @@ # Raises an error if linkDetect config is missing regex rule -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Invalid link detect rule, regex '''' uriTemplate ''https://jira.example.com/''"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="invalid link detect rule, regex '' uriTemplate 'https://jira.example.com/'" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 silences: comments: linkDetect: diff --git a/cmd/karma/tests/testscript/056_linkDetect_no_uri.txt b/cmd/karma/tests/testscript/056_linkDetect_no_uri.txt index 51a45a186..00c0c0882 100644 --- a/cmd/karma/tests/testscript/056_linkDetect_no_uri.txt +++ b/cmd/karma/tests/testscript/056_linkDetect_no_uri.txt @@ -1,13 +1,17 @@ # Raises an error if linkDetect config is missing uriTemplate -karma.bin-should-fail --log.format=text --log.config=false --log.level=error --config.file=karma.yaml +karma.bin-should-fail --config.file=karma.yaml ! stdout . -stderr 'msg="Invalid link detect rule, regex ''DEVOPS-\[0-9\]\+'' uriTemplate ''''"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="invalid link detect rule, regex 'DEVOPS-[0-9]+' uriTemplate ''" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 silences: comments: linkDetect: diff --git a/cmd/karma/tests/testscript/057_linkDetect_valid_config.txt b/cmd/karma/tests/testscript/057_linkDetect_valid_config.txt index 90b1cc6cb..7c53d7e89 100644 --- a/cmd/karma/tests/testscript/057_linkDetect_valid_config.txt +++ b/cmd/karma/tests/testscript/057_linkDetect_valid_config.txt @@ -1,14 +1,18 @@ # Config is valid with correct linkDetect rules -karma.bin-should-work --log.format=text --log.config=false --config.file=karma.yaml --check-config +karma.bin-should-work --config.file=karma.yaml --check-config ! stdout . -stderr 'msg="Configuration is valid"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 silences: comments: linkDetect: diff --git a/cmd/karma/tests/testscript/058_log_format_json.txt b/cmd/karma/tests/testscript/058_log_format_json.txt index 4eb21a8eb..c7a48b594 100644 --- a/cmd/karma/tests/testscript/058_log_format_json.txt +++ b/cmd/karma/tests/testscript/058_log_format_json.txt @@ -1,4 +1,8 @@ # Logs messages as JSON when log.format=json is passed -karma.bin-should-fail --log.format=json --log.level=error +karma.bin-should-fail --log.format=json --log.timestamp=false ! stdout . -stderr '^{"level":"error","msg":"No valid Alertmanager URIs defined"' +cmp stderr stderr.txt + +-- stderr.txt -- +{"level":"info","message":"Version: dev"} +{"level":"error","error":"no valid Alertmanager URIs defined","message":"Execution failed"} diff --git a/cmd/karma/tests/testscript/059_log_full_config_env.txt b/cmd/karma/tests/testscript/059_log_full_config_env.txt index fb53b823a..e6d6139ba 100644 --- a/cmd/karma/tests/testscript/059_log_full_config_env.txt +++ b/cmd/karma/tests/testscript/059_log_full_config_env.txt @@ -4,8 +4,8 @@ env AUTHENTICATION_HEADER_VALUE_RE='^(.+)$' env ALERTMANAGER_INTERVAL=10s env ALERTMANAGER_NAME=ro -env ALERTMANAGER_URI=http://localhost:9093 -env ALERTMANAGER_EXTERNAL_URI=http://localhost:9093 +env ALERTMANAGER_URI=http://127.0.0.1:9093 +env ALERTMANAGER_EXTERNAL_URI=http://127.0.0.1:9093 env ALERTMANAGER_READONLY=true env ALERTMANAGER_TIMEOUT=10s @@ -39,7 +39,7 @@ env LABELS_COLOR_UNIQUE='@receiver instance cluster' env LABELS_KEEP='keep1 keep2' env LABELS_STRIP='strip1 strip2' -env LISTEN_ADDRESS=localhost +env LISTEN_ADDRESS=127.0.0.1 env LISTEN_PORT=1234 env LISTEN_PREFIX='/prefix/' @@ -69,9 +69,9 @@ env UI_MULTIGRIDSORTREVERSE=true karma.bin-should-work --check-config ! stdout . -cmp stderr expected.stderr +cmp stderr stderr.txt --- expected.stderr -- +-- stderr.txt -- level=info msg="Version: dev" level=info msg="Parsed configuration:" level=info msg="authentication:" @@ -89,8 +89,8 @@ level=info msg=" interval: 10s" level=info msg=" servers:" level=info msg=" - cluster: \"\"" level=info msg=" name: ro" -level=info msg=" uri: http://localhost:9093" -level=info msg=" external_uri: http://localhost:9093" +level=info msg=" uri: http://127.0.0.1:9093" +level=info msg=" external_uri: http://127.0.0.1:9093" level=info msg=" timeout: 10s" level=info msg=" proxy: false" level=info msg=" readonly: true" @@ -157,7 +157,7 @@ level=info msg=" - '@receiver'" level=info msg=" - instance" level=info msg=" - cluster" level=info msg="listen:" -level=info msg=" address: localhost" +level=info msg=" address: 127.0.0.1" level=info msg=" port: 1234" level=info msg=" prefix: /prefix/" level=info msg="log:" @@ -196,5 +196,5 @@ level=info msg=" alertsPerGroup: 2" level=info msg=" collapseGroups: expanded" level=info msg=" multiGridLabel: cluster" level=info msg=" multiGridSortReverse: true" -level=info msg="[ro] Configured Alertmanager source at http://localhost:9093 (proxied: false, readonly: true)" +level=info msg="Configured Alertmanager source" name=ro proxy=false readonly=true uri=http://127.0.0.1:9093 level=info msg="Configuration is valid" diff --git a/cmd/karma/tests/testscript/060_log_full_config_file.txt b/cmd/karma/tests/testscript/060_log_full_config_file.txt index 92dddfed9..29a71151a 100644 --- a/cmd/karma/tests/testscript/060_log_full_config_file.txt +++ b/cmd/karma/tests/testscript/060_log_full_config_file.txt @@ -1,8 +1,214 @@ # Print out and compare logged config set via config file karma.bin-should-work --config.file=custom.yaml --check-config ! stdout . -cmp stderr expected.stderr +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=custom.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users:" +level=info msg=" - username: number" +level=info msg=" password: '***'" +level=info msg=" - username: string" +level=info msg=" password: '***'" +level=info msg="authorization:" +level=info msg=" groups:" +level=info msg=" - name: admins" +level=info msg=" members:" +level=info msg=" - alice" +level=info msg=" - bob" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 10s" +level=info msg=" servers:" +level=info msg=" - cluster: HA" +level=info msg=" name: ha1" +level=info msg=" uri: http://127.0.0.1:9093" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 10s" +level=info msg=" proxy: true" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg=" - cluster: HA" +level=info msg=" name: ha2" +level=info msg=" uri: http://127.0.0.1:9094" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 10s" +level=info msg=" proxy: false" +level=info msg=" readonly: true" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: omit" +level=info msg=" - cluster: \"\"" +level=info msg=" name: local" +level=info msg=" uri: http://foo:xxx@127.0.0.1:9095" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: true" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers:" +level=info msg=" X-Auth-Test: some-token-or-other-string" +level=info msg=" cors:" +level=info msg=" credentials: same-origin" +level=info msg=" - cluster: \"\"" +level=info msg=" name: client-auth" +level=info msg=" uri: https://127.0.0.1:9096" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 10s" +level=info msg=" proxy: false" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: ca.pem" +level=info msg=" cert: cert.pem" +level=info msg=" key: key.pem" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: true" +level=info msg=" duration: 7m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: true" +level=info msg=" hidden:" +level=info msg=" - help" +level=info msg=" - summary" +level=info msg=" visible:" +level=info msg=" - visible" +level=info msg=" keep:" +level=info msg=" - keep" +level=info msg=" strip:" +level=info msg=" - strip1" +level=info msg=" - strip2" +level=info msg=" - strip3" +level=info msg=" order:" +level=info msg=" - summary" +level=info msg=" - help" +level=info msg="custom:" +level=info msg=" css: /custom.css" +level=info msg=" js: /custom.js" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default:" +level=info msg=" - '@receiver=by-cluster-service'" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: label" +level=info msg=" reverse: false" +level=info msg=" label: severity" +level=info msg=" customValues:" +level=info msg=" labels:" +level=info msg=" cluster:" +level=info msg=" DEV: \"3\"" +level=info msg=" Prod: \"1\"" +level=info msg=" staging: \"2\"" +level=info msg=" severity:" +level=info msg=" critical: \"1\"" +level=info msg=" info: \"3\"" +level=info msg=" warning: \"2\"" +level=info msg="karma:" +level=info msg=" name: karma-demo" +level=info msg="labels:" +level=info msg=" keep:" +level=info msg=" - keep1" +level=info msg=" - keep2" +level=info msg=" strip:" +level=info msg=" - strip1" +level=info msg=" - strip2" +level=info msg=" color:" +level=info msg=" custom:" +level=info msg=" region:" +level=info msg=" - value_re: .*" +level=info msg=" color: '#736598'" +level=info msg=" severity:" +level=info msg=" - value: info" +level=info msg=" color: '#87c4e0'" +level=info msg=" - value: warning" +level=info msg=" color: '#ffae42'" +level=info msg=" - value: critical" +level=info msg=" color: '#ff220c'" +level=info msg=" static:" +level=info msg=" - job" +level=info msg=" unique:" +level=info msg=" - cluster" +level=info msg=" - instance" +level=info msg=" - '@receiver'" +level=info msg="listen:" +level=info msg=" address: \"\"" +level=info msg=" port: 8080" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep:" +level=info msg=" - keep1" +level=info msg=" - keep2" +level=info msg=" strip:" +level=info msg=" - strip1" +level=info msg=" - strip2" +level=info msg="sentry:" +level=info msg=" private: abcdef1234567890" +level=info msg=" public: 1234567890abcdef" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules:" +level=info msg=" - regex: (DEVOPS-[0-9]+)" +level=info msg=" uriTemplate: https://jira.example.com/browse/$1" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels:" +level=info msg=" - job" +level=info msg=" - severity" +level=info msg=" - region" +level=info msg="ui:" +level=info msg=" refresh: 10s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: false" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: severity" +level=info msg=" multiGridSortReverse: true" +level=info msg="Configured Alertmanager source" name=ha1 proxy=true readonly=false uri=http://127.0.0.1:9093 +level=info msg="Configured Alertmanager source" name=ha2 proxy=false readonly=true uri=http://127.0.0.1:9094 +level=info msg="Configured Alertmanager source" name=local proxy=true readonly=false uri=http://foo:xxx@127.0.0.1:9095 +level=info msg="Configured Alertmanager source" name=client-auth proxy=false readonly=false uri=https://127.0.0.1:9096 +level=info msg="Setting up proxy endpoints" alertmanager=ha1 +level=info msg="Setting up proxy endpoints" alertmanager=local +level=info msg="Configuration is valid" -- custom.yaml -- authentication: basicAuth: @@ -22,18 +228,18 @@ alertmanager: servers: - cluster: HA name: ha1 - uri: "http://localhost:9093" + uri: "http://127.0.0.1:9093" timeout: 10s proxy: true - cluster: HA name: ha2 - uri: "http://localhost:9094" + uri: "http://127.0.0.1:9094" timeout: 10s readonly: true cors: credentials: omit - name: local - uri: http://foo:bar@localhost:9095 + uri: http://foo:bar@127.0.0.1:9095 proxy: true readonly: false headers: @@ -41,7 +247,7 @@ alertmanager: cors: credentials: same-origin - name: client-auth - uri: https://localhost:9096 + uri: https://127.0.0.1:9096 timeout: 10s tls: ca: ca.pem @@ -243,210 +449,3 @@ N9O29QKBgAcCMRtAXokOSbtqdddbAXWfkbqfH5fy6vwu5UM4QbECjPuF7A9cfj7j A/n4tG7NU941X0nZ0+AkGdtevfp52L1ZKRTrlNPELlT4GHDRjyAEKoEQ1Nvjp4xF FLR1flnW2lx5o5csDzTpi+jgC6nu1zE0DWo1c5ZdpVO289POIpqh -----END RSA PRIVATE KEY----- - --- expected.stderr -- -level=info msg="Reading configuration file custom.yaml" -level=info msg="Version: dev" -level=info msg="Parsed configuration:" -level=info msg="authentication:" -level=info msg=" header:" -level=info msg=" name: \"\"" -level=info msg=" value_re: \"\"" -level=info msg=" basicAuth:" -level=info msg=" users:" -level=info msg=" - username: number" -level=info msg=" password: '***'" -level=info msg=" - username: string" -level=info msg=" password: '***'" -level=info msg="authorization:" -level=info msg=" groups:" -level=info msg=" - name: admins" -level=info msg=" members:" -level=info msg=" - alice" -level=info msg=" - bob" -level=info msg=" acl:" -level=info msg=" silences: \"\"" -level=info msg="alertmanager:" -level=info msg=" interval: 10s" -level=info msg=" servers:" -level=info msg=" - cluster: HA" -level=info msg=" name: ha1" -level=info msg=" uri: http://localhost:9093" -level=info msg=" external_uri: \"\"" -level=info msg=" timeout: 10s" -level=info msg=" proxy: true" -level=info msg=" readonly: false" -level=info msg=" tls:" -level=info msg=" ca: \"\"" -level=info msg=" cert: \"\"" -level=info msg=" key: \"\"" -level=info msg=" insecureSkipVerify: false" -level=info msg=" headers: {}" -level=info msg=" cors:" -level=info msg=" credentials: include" -level=info msg=" - cluster: HA" -level=info msg=" name: ha2" -level=info msg=" uri: http://localhost:9094" -level=info msg=" external_uri: \"\"" -level=info msg=" timeout: 10s" -level=info msg=" proxy: false" -level=info msg=" readonly: true" -level=info msg=" tls:" -level=info msg=" ca: \"\"" -level=info msg=" cert: \"\"" -level=info msg=" key: \"\"" -level=info msg=" insecureSkipVerify: false" -level=info msg=" headers: {}" -level=info msg=" cors:" -level=info msg=" credentials: omit" -level=info msg=" - cluster: \"\"" -level=info msg=" name: local" -level=info msg=" uri: http://foo:xxx@localhost:9095" -level=info msg=" external_uri: \"\"" -level=info msg=" timeout: 40s" -level=info msg=" proxy: true" -level=info msg=" readonly: false" -level=info msg=" tls:" -level=info msg=" ca: \"\"" -level=info msg=" cert: \"\"" -level=info msg=" key: \"\"" -level=info msg=" insecureSkipVerify: false" -level=info msg=" headers:" -level=info msg=" X-Auth-Test: some-token-or-other-string" -level=info msg=" cors:" -level=info msg=" credentials: same-origin" -level=info msg=" - cluster: \"\"" -level=info msg=" name: client-auth" -level=info msg=" uri: https://localhost:9096" -level=info msg=" external_uri: \"\"" -level=info msg=" timeout: 10s" -level=info msg=" proxy: false" -level=info msg=" readonly: false" -level=info msg=" tls:" -level=info msg=" ca: ca.pem" -level=info msg=" cert: cert.pem" -level=info msg=" key: key.pem" -level=info msg=" insecureSkipVerify: false" -level=info msg=" headers: {}" -level=info msg=" cors:" -level=info msg=" credentials: include" -level=info msg="alertAcknowledgement:" -level=info msg=" enabled: true" -level=info msg=" duration: 7m0s" -level=info msg=" author: karma" -level=info msg=" commentPrefix: ACK!" -level=info msg="annotations:" -level=info msg=" default:" -level=info msg=" hidden: true" -level=info msg=" hidden:" -level=info msg=" - help" -level=info msg=" - summary" -level=info msg=" visible:" -level=info msg=" - visible" -level=info msg=" keep:" -level=info msg=" - keep" -level=info msg=" strip:" -level=info msg=" - strip1" -level=info msg=" - strip2" -level=info msg=" - strip3" -level=info msg=" order:" -level=info msg=" - summary" -level=info msg=" - help" -level=info msg="custom:" -level=info msg=" css: /custom.css" -level=info msg=" js: /custom.js" -level=info msg="debug: false" -level=info msg="filters:" -level=info msg=" default:" -level=info msg=" - '@receiver=by-cluster-service'" -level=info msg="grid:" -level=info msg=" sorting:" -level=info msg=" order: label" -level=info msg=" reverse: false" -level=info msg=" label: severity" -level=info msg=" customValues:" -level=info msg=" labels:" -level=info msg=" cluster:" -level=info msg=" DEV: \"3\"" -level=info msg=" Prod: \"1\"" -level=info msg=" staging: \"2\"" -level=info msg=" severity:" -level=info msg=" critical: \"1\"" -level=info msg=" info: \"3\"" -level=info msg=" warning: \"2\"" -level=info msg="karma:" -level=info msg=" name: karma-demo" -level=info msg="labels:" -level=info msg=" keep:" -level=info msg=" - keep1" -level=info msg=" - keep2" -level=info msg=" strip:" -level=info msg=" - strip1" -level=info msg=" - strip2" -level=info msg=" color:" -level=info msg=" custom:" -level=info msg=" region:" -level=info msg=" - value_re: .*" -level=info msg=" color: '#736598'" -level=info msg=" severity:" -level=info msg=" - value: info" -level=info msg=" color: '#87c4e0'" -level=info msg=" - value: warning" -level=info msg=" color: '#ffae42'" -level=info msg=" - value: critical" -level=info msg=" color: '#ff220c'" -level=info msg=" static:" -level=info msg=" - job" -level=info msg=" unique:" -level=info msg=" - cluster" -level=info msg=" - instance" -level=info msg=" - '@receiver'" -level=info msg="listen:" -level=info msg=" address: \"\"" -level=info msg=" port: 8080" -level=info msg=" prefix: /" -level=info msg="log:" -level=info msg=" config: true" -level=info msg=" level: info" -level=info msg=" format: text" -level=info msg=" timestamp: false" -level=info msg="receivers:" -level=info msg=" keep:" -level=info msg=" - keep1" -level=info msg=" - keep2" -level=info msg=" strip:" -level=info msg=" - strip1" -level=info msg=" - strip2" -level=info msg="sentry:" -level=info msg=" private: abcdef1234567890" -level=info msg=" public: 1234567890abcdef" -level=info msg="silences:" -level=info msg=" comments:" -level=info msg=" linkDetect:" -level=info msg=" rules:" -level=info msg=" - regex: (DEVOPS-[0-9]+)" -level=info msg=" uriTemplate: https://jira.example.com/browse/$1" -level=info msg="silenceForm:" -level=info msg=" strip:" -level=info msg=" labels:" -level=info msg=" - job" -level=info msg=" - severity" -level=info msg=" - region" -level=info msg="ui:" -level=info msg=" refresh: 10s" -level=info msg=" hideFiltersWhenIdle: true" -level=info msg=" colorTitlebar: false" -level=info msg=" theme: auto" -level=info msg=" animations: false" -level=info msg=" minimalGroupWidth: 420" -level=info msg=" alertsPerGroup: 5" -level=info msg=" collapseGroups: collapsedOnMobile" -level=info msg=" multiGridLabel: severity" -level=info msg=" multiGridSortReverse: true" -level=info msg="[ha1] Configured Alertmanager source at http://localhost:9093 (proxied: true, readonly: false)" -level=info msg="[ha2] Configured Alertmanager source at http://localhost:9094 (proxied: false, readonly: true)" -level=info msg="[local] Configured Alertmanager source at http://foo:xxx@localhost:9095 (proxied: true, readonly: false)" -level=info msg="[client-auth] Configured Alertmanager source at https://localhost:9096 (proxied: false, readonly: false)" -level=info msg="[ha1] Setting up proxy endpoints" -level=info msg="[local] Setting up proxy endpoints" -level=info msg="Configuration is valid" diff --git a/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt b/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt index f3ca97aaa..b6ffef8ce 100644 --- a/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt +++ b/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt @@ -1,31 +1,33 @@ # Print out and compare logged config set via config file that includes invalid values -karma.bin-should-fail-no-timestamp --config.file=karma.yaml --check-config +karma.bin-should-fail --config.file=karma.yaml --check-config ! stdout . -stderr 'Failed to unmarshal configuration: 13 error\(s\) decoding:' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="failed to unmarshal configuration: 13 error(s) decoding:\n\n* 'Alertmanager.Servers[2].Headers[0]' expected a map, got 'string'\n* cannot parse 'Alertmanager.Servers[0].Proxy' as bool: strconv.ParseBool: parsing \"YEs\": invalid syntax\n* cannot parse 'Annotations.Default.Hidden' as bool: strconv.ParseBool: parsing \"z\": invalid syntax\n* cannot parse 'UI.alertsPerGroup' as int: strconv.ParseInt: parsing \"5a\": invalid syntax\n* cannot parse 'UI.animations' as bool: strconv.ParseBool: parsing \"1a\": invalid syntax\n* cannot parse 'UI.colorTitlebar' as bool: strconv.ParseBool: parsing \"yum\": invalid syntax\n* cannot parse 'UI.hideFiltersWhenIdle' as bool: strconv.ParseBool: parsing \"z\": invalid syntax\n* cannot parse 'UI.minimalGroupWidth' as int: strconv.ParseInt: parsing \"abc4\": invalid syntax\n* cannot parse 'alertAcknowledgement.Enabled' as bool: strconv.ParseBool: parsing \"zzz\": invalid syntax\n* error decoding 'Alertmanager.Interval': time: invalid duration \"jjs88\"\n* error decoding 'Alertmanager.Servers[0].Timeout': time: invalid duration \"bbb\"\n* error decoding 'Alertmanager.Servers[2].Timeout': time: invalid duration \"z\"\n* error decoding 'UI.Refresh': time: unknown unit \"sm\" in duration \"10sm\"" -- karma.yaml -- alertmanager: interval: jjs88 servers: - name: ha1 - uri: "http://localhost:9093" + uri: "http://127.0.0.1:9093" timeout: bbb proxy: YEs cors: credentials: foo - name: ha2 - uri: "http://localhost:9094" + uri: "http://127.0.0.1:9094" timeout: 11 readonly: 1 - name: local - uri: http://localhost:9095 + uri: http://127.0.0.1:9095 timeout: z proxy: true readonly: 0 headers: - X-Auth-Test=some-token-or-other-string - name: client-auth - uri: https://localhost:9096 + uri: https://127.0.0.1:9096 timeout: 10s tls: ca: ca.pem @@ -48,7 +50,6 @@ karma: name: karma-demo log: level: 123 - format: foo ui: refresh: 10sm hideFiltersWhenIdle: z diff --git a/cmd/karma/tests/testscript/062_log_timestamp.txt b/cmd/karma/tests/testscript/062_log_timestamp.txt index aa0f32abb..8317bf4f1 100644 --- a/cmd/karma/tests/testscript/062_log_timestamp.txt +++ b/cmd/karma/tests/testscript/062_log_timestamp.txt @@ -1,4 +1,5 @@ -# Doesn't log any timestamp when log.timestamp is set to false -karma.bin-should-fail --log.format=text --log.level=error --log.timestamp=false +# Logs timestamps when log.timestamp is set to true +karma.bin-should-fail --log.timestamp=true ! stdout . -stderr '^level=error msg="No valid Alertmanager URIs defined"' +stderr '[0-9][0-9]:[0-9][0-9]:[0-9][0-9] level=info msg="Version: dev"' +stderr '[0-9][0-9]:[0-9][0-9]:[0-9][0-9] level=error msg="Execution failed" error="no valid Alertmanager URIs defined"' diff --git a/cmd/karma/tests/testscript/063_missing_config_file.txt b/cmd/karma/tests/testscript/063_missing_config_file.txt index 251cba382..1423aacd0 100644 --- a/cmd/karma/tests/testscript/063_missing_config_file.txt +++ b/cmd/karma/tests/testscript/063_missing_config_file.txt @@ -1,4 +1,7 @@ # Errors when config.file points to missing file karma.bin-should-fail --config.file=404.yaml ! stdout . -stderr 'msg="Failed to load configuration file \\"404.yaml\\": open 404.yaml: no such file or directory' +cmp stderr stderr.txt + +-- stderr.txt -- +level=error msg="Execution failed" error="failed to load configuration file \"404.yaml\": open 404.yaml: no such file or directory" diff --git a/cmd/karma/tests/testscript/064_no_args.txt b/cmd/karma/tests/testscript/064_no_args.txt index d0fdac647..1f4c46ebd 100644 --- a/cmd/karma/tests/testscript/064_no_args.txt +++ b/cmd/karma/tests/testscript/064_no_args.txt @@ -1,4 +1,8 @@ # Raises an error if no alertmanager uri is set -karma.bin-should-fail --log.format=text --log.config=false --log.level=error +karma.bin-should-fail ! stdout . -stderr 'msg="No valid Alertmanager URIs defined"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=info msg="Version: dev" +level=error msg="Execution failed" error="no valid Alertmanager URIs defined" diff --git a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt index 152b104b8..dec922dd3 100644 --- a/cmd/karma/tests/testscript/065_proxy-with-readonly.txt +++ b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt @@ -1,12 +1,113 @@ # Check if proxy mode is set correctly -karma.bin-should-fail --log.format=text --log.config=true --config.file=karma.yaml --check-config +karma.bin-should-fail --log.config=true --config.file=karma.yaml --check-config ! stdout . -stderr 'msg="Failed to create Alertmanager ''failed'' with URI ''http://localhost'': cannot use proxy and readonly mode at the same time"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users: []" +level=info msg="authorization:" +level=info msg=" groups: []" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 1m0s" +level=info msg=" servers:" +level=info msg=" - cluster: \"\"" +level=info msg=" name: failed" +level=info msg=" uri: http://127.0.0.1" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: true" +level=info msg=" readonly: true" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: false" +level=info msg=" duration: 15m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: false" +level=info msg=" hidden: []" +level=info msg=" visible: []" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" order: []" +level=info msg="custom:" +level=info msg=" css: \"\"" +level=info msg=" js: \"\"" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default: []" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: startsAt" +level=info msg=" reverse: true" +level=info msg=" label: alertname" +level=info msg=" customValues:" +level=info msg=" labels: {}" +level=info msg="karma:" +level=info msg=" name: karma" +level=info msg="labels:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" color:" +level=info msg=" custom: {}" +level=info msg=" static: []" +level=info msg=" unique: []" +level=info msg="listen:" +level=info msg=" address: \"\"" +level=info msg=" port: 8080" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg="sentry:" +level=info msg=" private: \"\"" +level=info msg=" public: \"\"" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules: []" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels: []" +level=info msg="ui:" +level=info msg=" refresh: 30s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: true" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: \"\"" +level=info msg=" multiGridSortReverse: false" +level=error msg="Execution failed" error="failed to create Alertmanager 'failed' with URI 'http://127.0.0.1': cannot use proxy and readonly mode at the same time" -- karma.yaml -- alertmanager: servers: - name: failed - uri: http://localhost + uri: http://127.0.0.1 proxy: true readonly: true diff --git a/cmd/karma/tests/testscript/066_proxy.txt b/cmd/karma/tests/testscript/066_proxy.txt index 5f8cf894b..b78930cdd 100644 --- a/cmd/karma/tests/testscript/066_proxy.txt +++ b/cmd/karma/tests/testscript/066_proxy.txt @@ -1,14 +1,114 @@ # Check if proxy mode is set correctly -karma.bin-should-work --log.format=text --log.config=true --config.file=karma.yaml --check-config +karma.bin-should-work --log.config=true --config.file=karma.yaml --check-config ! stdout . -stderr 'msg=" proxy: true"' -stderr 'msg="\[proxied\] Configured Alertmanager source at http://localhost \(proxied: true\, readonly: false\)"' -stderr 'msg="\[proxied\] Setting up proxy endpoints"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users: []" +level=info msg="authorization:" +level=info msg=" groups: []" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 1m0s" +level=info msg=" servers:" +level=info msg=" - cluster: \"\"" +level=info msg=" name: proxied" +level=info msg=" uri: http://127.0.0.1" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: true" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: false" +level=info msg=" duration: 15m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: false" +level=info msg=" hidden: []" +level=info msg=" visible: []" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" order: []" +level=info msg="custom:" +level=info msg=" css: \"\"" +level=info msg=" js: \"\"" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default: []" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: startsAt" +level=info msg=" reverse: true" +level=info msg=" label: alertname" +level=info msg=" customValues:" +level=info msg=" labels: {}" +level=info msg="karma:" +level=info msg=" name: karma" +level=info msg="labels:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" color:" +level=info msg=" custom: {}" +level=info msg=" static: []" +level=info msg=" unique: []" +level=info msg="listen:" +level=info msg=" address: \"\"" +level=info msg=" port: 8080" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg="sentry:" +level=info msg=" private: \"\"" +level=info msg=" public: \"\"" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules: []" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels: []" +level=info msg="ui:" +level=info msg=" refresh: 30s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: true" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: \"\"" +level=info msg=" multiGridSortReverse: false" +level=info msg="Configured Alertmanager source" name=proxied proxy=true readonly=false uri=http://127.0.0.1 +level=info msg="Setting up proxy endpoints" alertmanager=proxied +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - name: proxied - uri: http://localhost + uri: http://127.0.0.1 proxy: true diff --git a/cmd/karma/tests/testscript/067_readonly.txt b/cmd/karma/tests/testscript/067_readonly.txt index 312d104fe..e2199f107 100644 --- a/cmd/karma/tests/testscript/067_readonly.txt +++ b/cmd/karma/tests/testscript/067_readonly.txt @@ -1,11 +1,113 @@ # Check if readonly mode is set correctly -karma.bin-should-work --log.format=text --log.config=true --config.file=karma.yaml --check-config +karma.bin-should-work --log.config=true --config.file=karma.yaml --check-config ! stdout . -stderr 'msg="\[readonly\] Configured Alertmanager source at http://localhost \(proxied: false\, readonly: true\)"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users: []" +level=info msg="authorization:" +level=info msg=" groups: []" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 1m0s" +level=info msg=" servers:" +level=info msg=" - cluster: \"\"" +level=info msg=" name: readonly" +level=info msg=" uri: http://127.0.0.1" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: false" +level=info msg=" readonly: true" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: false" +level=info msg=" duration: 15m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: false" +level=info msg=" hidden: []" +level=info msg=" visible: []" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" order: []" +level=info msg="custom:" +level=info msg=" css: \"\"" +level=info msg=" js: \"\"" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default: []" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: startsAt" +level=info msg=" reverse: true" +level=info msg=" label: alertname" +level=info msg=" customValues:" +level=info msg=" labels: {}" +level=info msg="karma:" +level=info msg=" name: karma" +level=info msg="labels:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" color:" +level=info msg=" custom: {}" +level=info msg=" static: []" +level=info msg=" unique: []" +level=info msg="listen:" +level=info msg=" address: \"\"" +level=info msg=" port: 8080" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg="sentry:" +level=info msg=" private: \"\"" +level=info msg=" public: \"\"" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules: []" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels: []" +level=info msg="ui:" +level=info msg=" refresh: 30s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: true" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: \"\"" +level=info msg=" multiGridSortReverse: false" +level=info msg="Configured Alertmanager source" name=readonly proxy=false readonly=true uri=http://127.0.0.1 +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - name: readonly - uri: http://localhost + uri: http://127.0.0.1 readonly: true diff --git a/cmd/karma/tests/testscript/068_sentry.txt b/cmd/karma/tests/testscript/068_sentry.txt index b216d5065..bb2b7d201 100644 --- a/cmd/karma/tests/testscript/068_sentry.txt +++ b/cmd/karma/tests/testscript/068_sentry.txt @@ -1,16 +1,129 @@ # Configures sentry when enabled exec sh -ex ./test.sh & -karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=true --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8068 +karma.bin-should-work --pid-file=karma.pid --log.config=true --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8068 ! stdout . -stderr 'msg=" private: secret"' -stderr 'msg=" public: \\"123456789\\""' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users: []" +level=info msg="authorization:" +level=info msg=" groups: []" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 1m0s" +level=info msg=" servers:" +level=info msg=" - cluster: \"\"" +level=info msg=" name: default" +level=info msg=" uri: http://127.0.0.1:9093" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: false" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: false" +level=info msg=" duration: 15m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: false" +level=info msg=" hidden: []" +level=info msg=" visible: []" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" order: []" +level=info msg="custom:" +level=info msg=" css: \"\"" +level=info msg=" js: \"\"" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default: []" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: startsAt" +level=info msg=" reverse: true" +level=info msg=" label: alertname" +level=info msg=" customValues:" +level=info msg=" labels: {}" +level=info msg="karma:" +level=info msg=" name: karma" +level=info msg="labels:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" color:" +level=info msg=" custom: {}" +level=info msg=" static: []" +level=info msg=" unique: []" +level=info msg="listen:" +level=info msg=" address: 127.0.0.1" +level=info msg=" port: 8068" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg="sentry:" +level=info msg=" private: secret" +level=info msg=" public: \"123456789\"" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules: []" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels: []" +level=info msg="ui:" +level=info msg=" refresh: 30s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: true" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: \"\"" +level=info msg=" multiGridSortReverse: false" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://127.0.0.1:9093 +level=info msg="Writing PID file" path=karma.pid +level=info msg="Initial Alertmanager collection" +level=info msg="Pulling latest alerts and silences from Alertmanager" +level=info msg="Collecting alerts and silences" alertmanager=default +level=info msg="GET request" timeout=40 uri=http://127.0.0.1:9093/metrics +level=error msg="Request failed" error="Get \"http://127.0.0.1:9093/metrics\": dial tcp 127.0.0.1:9093: connect: connection refused" alertmanager=default uri=http://127.0.0.1:9093 +level=error msg="Collection failed" error="Get \"http://127.0.0.1:9093/api/v2/status\": dial tcp 127.0.0.1:9093: connect: connection refused" alertmanager=default +level=info msg="Collection completed" +level=info msg="Done, starting HTTP server" +level=info msg="Starting HTTP server" address=127.0.0.1:8068 +level=info msg="Shutting down HTTP server" +level=info msg="HTTP server shut down" +level=info msg="Removing PID file" path=karma.pid -- karma.yaml -- alertmanager: servers: - name: default - uri: http://localhost:9093 + uri: http://127.0.0.1:9093 sentry: private: secret public: 123456789 diff --git a/cmd/karma/tests/testscript/069_simple_config.txt b/cmd/karma/tests/testscript/069_simple_config.txt index 9409a3e59..19fa0f9fb 100644 --- a/cmd/karma/tests/testscript/069_simple_config.txt +++ b/cmd/karma/tests/testscript/069_simple_config.txt @@ -1,10 +1,26 @@ # Works in simple mode when single --alertmanager.uri flag is passed exec sh -ex ./test.sh & -karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8069 +karma.bin-should-work --pid-file=karma.pid --alertmanager.uri=http://127.0.0.1 --listen.address=127.0.0.1 --listen.port=8069 ! stdout . -stderr 'msg="\[default\] Configured Alertmanager source at http://localhost \(proxied: false\, readonly: false\)"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://127.0.0.1 +level=info msg="Writing PID file" path=karma.pid +level=info msg="Initial Alertmanager collection" +level=info msg="Pulling latest alerts and silences from Alertmanager" +level=info msg="Collecting alerts and silences" alertmanager=default +level=info msg="GET request" timeout=40 uri=http://127.0.0.1/metrics +level=error msg="Request failed" error="Get \"http://127.0.0.1/metrics\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default uri=http://127.0.0.1 +level=error msg="Collection failed" error="Get \"http://127.0.0.1/api/v2/status\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default +level=info msg="Collection completed" +level=info msg="Done, starting HTTP server" +level=info msg="Starting HTTP server" address=127.0.0.1:8069 +level=info msg="Shutting down HTTP server" +level=info msg="HTTP server shut down" +level=info msg="Removing PID file" path=karma.pid -- test.sh -- #!/bin/sh diff --git a/cmd/karma/tests/testscript/070_upper_case_keys.txt b/cmd/karma/tests/testscript/070_upper_case_keys.txt index 09f6dfbdd..4f25b3902 100644 --- a/cmd/karma/tests/testscript/070_upper_case_keys.txt +++ b/cmd/karma/tests/testscript/070_upper_case_keys.txt @@ -1,28 +1,125 @@ # Validates that case sensitive keys are read correctly from config file -karma.bin-should-work --log.format=text --log.config=true --config.file=karma.yaml --check-config +karma.bin-should-work --log.config=true --config.file=karma.yaml --check-config ! stdout . -stderr 'msg="labels:"' -stderr 'msg=" keep: \[\]"' -stderr 'msg=" strip: \[\]"' -stderr 'msg=" color:"' -stderr 'msg=" custom:"' -stderr 'msg=" region:"' -stderr 'msg=" - value_re: .*"' -stderr 'msg=" color: ''#736598''"' -stderr 'msg=" severity:"' -stderr 'msg=" - value: P3"' -stderr 'msg=" color: ''#87c4e0''"' -stderr 'msg=" - value: P2"' -stderr 'msg=" color: ''#ffae42''"' -stderr 'msg=" - value: P1"' -stderr 'msg=" color: ''#ff220c''"' -! stderr 'level=error' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Parsed configuration:" +level=info msg="authentication:" +level=info msg=" header:" +level=info msg=" name: \"\"" +level=info msg=" value_re: \"\"" +level=info msg=" basicAuth:" +level=info msg=" users: []" +level=info msg="authorization:" +level=info msg=" groups: []" +level=info msg=" acl:" +level=info msg=" silences: \"\"" +level=info msg="alertmanager:" +level=info msg=" interval: 1m0s" +level=info msg=" servers:" +level=info msg=" - cluster: \"\"" +level=info msg=" name: am" +level=info msg=" uri: https://127.0.0.1:9093" +level=info msg=" external_uri: \"\"" +level=info msg=" timeout: 40s" +level=info msg=" proxy: false" +level=info msg=" readonly: false" +level=info msg=" tls:" +level=info msg=" ca: \"\"" +level=info msg=" cert: \"\"" +level=info msg=" key: \"\"" +level=info msg=" insecureSkipVerify: false" +level=info msg=" headers: {}" +level=info msg=" cors:" +level=info msg=" credentials: include" +level=info msg="alertAcknowledgement:" +level=info msg=" enabled: false" +level=info msg=" duration: 15m0s" +level=info msg=" author: karma" +level=info msg=" commentPrefix: ACK!" +level=info msg="annotations:" +level=info msg=" default:" +level=info msg=" hidden: false" +level=info msg=" hidden: []" +level=info msg=" visible: []" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" order: []" +level=info msg="custom:" +level=info msg=" css: \"\"" +level=info msg=" js: \"\"" +level=info msg="debug: false" +level=info msg="filters:" +level=info msg=" default: []" +level=info msg="grid:" +level=info msg=" sorting:" +level=info msg=" order: startsAt" +level=info msg=" reverse: true" +level=info msg=" label: alertname" +level=info msg=" customValues:" +level=info msg=" labels: {}" +level=info msg="karma:" +level=info msg=" name: karma" +level=info msg="labels:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg=" color:" +level=info msg=" custom:" +level=info msg=" region:" +level=info msg=" - value_re: .*" +level=info msg=" color: '#736598'" +level=info msg=" severity:" +level=info msg=" - value: P3" +level=info msg=" color: '#87c4e0'" +level=info msg=" - value: P2" +level=info msg=" color: '#ffae42'" +level=info msg=" - value: P1" +level=info msg=" color: '#ff220c'" +level=info msg=" static: []" +level=info msg=" unique: []" +level=info msg="listen:" +level=info msg=" address: \"\"" +level=info msg=" port: 8080" +level=info msg=" prefix: /" +level=info msg="log:" +level=info msg=" config: true" +level=info msg=" level: info" +level=info msg=" format: text" +level=info msg=" timestamp: false" +level=info msg="receivers:" +level=info msg=" keep: []" +level=info msg=" strip: []" +level=info msg="sentry:" +level=info msg=" private: \"\"" +level=info msg=" public: \"\"" +level=info msg="silences:" +level=info msg=" comments:" +level=info msg=" linkDetect:" +level=info msg=" rules: []" +level=info msg="silenceForm:" +level=info msg=" strip:" +level=info msg=" labels: []" +level=info msg="ui:" +level=info msg=" refresh: 30s" +level=info msg=" hideFiltersWhenIdle: true" +level=info msg=" colorTitlebar: false" +level=info msg=" theme: auto" +level=info msg=" animations: true" +level=info msg=" minimalGroupWidth: 420" +level=info msg=" alertsPerGroup: 5" +level=info msg=" collapseGroups: collapsedOnMobile" +level=info msg=" multiGridLabel: \"\"" +level=info msg=" multiGridSortReverse: false" +level=info msg="Configured Alertmanager source" name=am proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Configuration is valid" -- karma.yaml -- alertmanager: servers: - name: am - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 labels: color: custom: diff --git a/cmd/karma/tests/testscript/072_pid_file_write_error.txt b/cmd/karma/tests/testscript/072_pid_file_write_error.txt index 482e6eefe..1a58d48b1 100644 --- a/cmd/karma/tests/testscript/072_pid_file_write_error.txt +++ b/cmd/karma/tests/testscript/072_pid_file_write_error.txt @@ -1,5 +1,11 @@ # Fails is we cannot write a PID file -karma.bin-should-fail --pid-file=/foo/bar/karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost +karma.bin-should-fail --pid-file=/foo/bar/karma.pid --alertmanager.uri=http://127.0.0.1 ! stdout . -stderr 'msg="Failed to write a PID file:' +cmp stderr stderr.txt + +-- stderr.txt -- +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://127.0.0.1 +level=info msg="Writing PID file" path=/foo/bar/karma.pid +level=error msg="Execution failed" error="failed to write a PID file: open /foo/bar/karma.pid: no such file or directory" diff --git a/cmd/karma/tests/testscript/073_pid_file_remove_error.txt b/cmd/karma/tests/testscript/073_pid_file_remove_error.txt index 890dbc124..8df99b4e1 100644 --- a/cmd/karma/tests/testscript/073_pid_file_remove_error.txt +++ b/cmd/karma/tests/testscript/073_pid_file_remove_error.txt @@ -1,10 +1,27 @@ # Fails is we cannot remove a PID file exec sh -ex ./test.sh & -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8073 +karma.bin-should-fail --pid-file=karma.pid --alertmanager.uri=http://127.0.0.1 --listen.address=127.0.0.1 --listen.port=8073 ! stdout . -stderr 'msg="Failed to remove PID file:' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://127.0.0.1 +level=info msg="Writing PID file" path=karma.pid +level=info msg="Initial Alertmanager collection" +level=info msg="Pulling latest alerts and silences from Alertmanager" +level=info msg="Collecting alerts and silences" alertmanager=default +level=info msg="GET request" timeout=40 uri=http://127.0.0.1/metrics +level=error msg="Request failed" error="Get \"http://127.0.0.1/metrics\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default uri=http://127.0.0.1 +level=error msg="Collection failed" error="Get \"http://127.0.0.1/api/v2/status\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default +level=info msg="Collection completed" +level=info msg="Done, starting HTTP server" +level=info msg="Starting HTTP server" address=127.0.0.1:8073 +level=info msg="Shutting down HTTP server" +level=info msg="HTTP server shut down" +level=info msg="Removing PID file" path=karma.pid +level=error msg="Execution failed" error="failed to remove PID file: remove karma.pid: no such file or directory" -- test.sh -- #!/bin/sh diff --git a/cmd/karma/tests/testscript/074_acl_extra_fileds.txt b/cmd/karma/tests/testscript/074_acl_extra_fileds.txt index e58b90dd3..8393cdc94 100644 --- a/cmd/karma/tests/testscript/074_acl_extra_fileds.txt +++ b/cmd/karma/tests/testscript/074_acl_extra_fileds.txt @@ -1,10 +1,14 @@ # Raises an error if --authorization.acl points to a file that contains unknown keys -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Reading silence ACL config file acl.yaml"' -stderr 'msg="Failed to parse silence ACL configuration file \\"acl.yaml\\": yaml: unmarshal errors:\\n line 6: field nameFoo not found in type config.SilenceFilters"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=https://127.0.0.1:9093 +level=info msg="Reading silence ACL config file" path=acl.yaml +level=error msg="Execution failed" error="failed to parse silence ACL configuration file \"acl.yaml\": yaml: unmarshal errors:\n line 6: field nameFoo not found in type config.SilenceFilters" -- karma.yaml -- authentication: header: @@ -24,7 +28,7 @@ authorization: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 -- acl.yaml -- rules: diff --git a/cmd/karma/tests/testscript/075_config_extra_fileds.txt b/cmd/karma/tests/testscript/075_config_extra_fileds.txt index 3e59596e0..4be09dcb0 100644 --- a/cmd/karma/tests/testscript/075_config_extra_fileds.txt +++ b/cmd/karma/tests/testscript/075_config_extra_fileds.txt @@ -1,9 +1,10 @@ # Raises an error if --config.file points to a file that contains unknown keys -karma.bin-should-fail --log.format=text --log.config=false --check-config +karma.bin-should-fail --check-config ! stdout . -! stderr 'msg="Configuration is valid"' -stderr 'msg="Failed to parse configuration file \\"karma.yaml\\": yaml: unmarshal errors:\\n line 5: field authorizationFoo not found in type config.configSchema"' +cmp stderr stderr.txt +-- stderr.txt -- +level=error msg="Execution failed" error="failed to parse configuration file \"karma.yaml\": yaml: unmarshal errors:\n line 5: field authorizationFoo not found in type config.configSchema" -- karma.yaml -- authentication: header: @@ -23,4 +24,4 @@ authorizationFoo: alertmanager: servers: - name: default - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 diff --git a/cmd/karma/tests/testscript/076_basicAuth_uri.txt b/cmd/karma/tests/testscript/076_basicAuth_uri.txt index 10be61c17..5b9abc681 100644 --- a/cmd/karma/tests/testscript/076_basicAuth_uri.txt +++ b/cmd/karma/tests/testscript/076_basicAuth_uri.txt @@ -1,9 +1,10 @@ # Basic Auth headers are passed to the UI in the API response exec sh -ex ./test.sh & -karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://foo:bar@localhost --listen.address=127.0.0.1 --listen.port=8076 +karma.bin-should-work --pid-file=karma.pid --alertmanager.uri=http://foo:bar@127.0.0.1 --listen.address=127.0.0.1 --listen.port=8076 wait -stdout '"publicURI":"http://foo:bar@localhost"' +stdout '"headers":{"Authorization":"Basic Zm9vOmJhcg=="}' +stdout '"publicURI":"http://foo:bar@127.0.0.1"' -- test.sh -- #!/bin/sh diff --git a/cmd/karma/tests/testscript/077_listen_invalid_port.txt b/cmd/karma/tests/testscript/077_listen_invalid_port.txt index 51f5506b1..e4e2cc775 100644 --- a/cmd/karma/tests/testscript/077_listen_invalid_port.txt +++ b/cmd/karma/tests/testscript/077_listen_invalid_port.txt @@ -1,5 +1,19 @@ # Fails to start when invalid port is set -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://foo:bar@localhost --listen.address=127.0.0.1 --listen.port=9999999 +karma.bin-should-fail --pid-file=karma.pid --alertmanager.uri=http://foo:bar@127.0.0.1 --listen.address=127.0.0.1 --listen.port=9999999 ! stdout . -stderr 'msg="listen tcp: address 9999999: invalid port"' +cmp stderr stderr.txt + +-- stderr.txt -- +level=info msg="Version: dev" +level=info msg="Configured Alertmanager source" name=default proxy=false readonly=false uri=http://foo:xxx@127.0.0.1 +level=info msg="Writing PID file" path=karma.pid +level=info msg="Initial Alertmanager collection" +level=info msg="Pulling latest alerts and silences from Alertmanager" +level=info msg="Collecting alerts and silences" alertmanager=default +level=info msg="GET request" timeout=40 uri=http://foo:xxx@127.0.0.1/metrics +level=error msg="Request failed" error="Get \"http://foo:***@127.0.0.1/metrics\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default uri=http://foo:xxx@127.0.0.1 +level=error msg="Collection failed" error="Get \"http://127.0.0.1/api/v2/status\": dial tcp 127.0.0.1:80: connect: connection refused" alertmanager=default +level=info msg="Collection completed" +level=info msg="Done, starting HTTP server" +level=error msg="Execution failed" error="listen tcp: address 9999999: invalid port" diff --git a/cmd/karma/tests/testscript/078_tls_missing_ca.txt b/cmd/karma/tests/testscript/078_tls_missing_ca.txt index 13cc8326b..e009500e7 100644 --- a/cmd/karma/tests/testscript/078_tls_missing_ca.txt +++ b/cmd/karma/tests/testscript/078_tls_missing_ca.txt @@ -1,14 +1,18 @@ # Raises an error if tls CA cert is missing -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=true --log.level=info --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 +karma.bin-should-fail --pid-file=karma.pid --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 ! stdout . -stderr 'msg="Failed to create HTTP transport for Alertmanager ''client-auth'' with URI ''https:\/\/localhost:9093'': open ca.crt: no such file or directory"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create HTTP transport for Alertmanager 'client-auth' with URI 'https://127.0.0.1:9093': open ca.crt: no such file or directory" -- karma.yaml -- alertmanager: servers: - name: client-auth - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 timeout: 10s tls: ca: ca.crt diff --git a/cmd/karma/tests/testscript/079_tls_missing_client.txt b/cmd/karma/tests/testscript/079_tls_missing_client.txt index b2e0906ac..b1cc7f060 100644 --- a/cmd/karma/tests/testscript/079_tls_missing_client.txt +++ b/cmd/karma/tests/testscript/079_tls_missing_client.txt @@ -1,14 +1,18 @@ # Raises an error if tls CA cert is missing -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=true --log.level=info --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 +karma.bin-should-fail --pid-file=karma.pid --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 ! stdout . -stderr 'msg="Failed to create HTTP transport for Alertmanager ''client-auth'' with URI ''https:\/\/localhost:9093'': open client.pem: no such file or directory"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create HTTP transport for Alertmanager 'client-auth' with URI 'https://127.0.0.1:9093': open client.pem: no such file or directory" -- karma.yaml -- alertmanager: servers: - name: client-auth - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 timeout: 10s tls: cert: client.pem diff --git a/cmd/karma/tests/testscript/080_tls_missing_key.txt b/cmd/karma/tests/testscript/080_tls_missing_key.txt index 3318d6fee..ea7620ccd 100644 --- a/cmd/karma/tests/testscript/080_tls_missing_key.txt +++ b/cmd/karma/tests/testscript/080_tls_missing_key.txt @@ -1,14 +1,18 @@ # Raises an error if tls CA cert is missing -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=true --log.level=info --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 +karma.bin-should-fail --pid-file=karma.pid --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 ! stdout . -stderr 'msg="Failed to create HTTP transport for Alertmanager ''client-auth'' with URI ''https:\/\/localhost:9093'': open client.key: no such file or directory"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create HTTP transport for Alertmanager 'client-auth' with URI 'https://127.0.0.1:9093': open client.key: no such file or directory" -- karma.yaml -- alertmanager: servers: - name: client-auth - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 timeout: 10s tls: cert: client.pem diff --git a/cmd/karma/tests/testscript/081_tls_unparsable_cert.txt b/cmd/karma/tests/testscript/081_tls_unparsable_cert.txt index 7a3245418..4da24edcf 100644 --- a/cmd/karma/tests/testscript/081_tls_unparsable_cert.txt +++ b/cmd/karma/tests/testscript/081_tls_unparsable_cert.txt @@ -1,14 +1,18 @@ # Raises an error if tls CA cert is missing -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=true --log.level=info --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 +karma.bin-should-fail --pid-file=karma.pid --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 ! stdout . -stderr 'msg="Failed to create HTTP transport for Alertmanager ''client-auth'' with URI ''https:\/\/localhost:9093'': tls: failed to find any PEM data in certificate input"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create HTTP transport for Alertmanager 'client-auth' with URI 'https://127.0.0.1:9093': tls: failed to find any PEM data in certificate input" -- karma.yaml -- alertmanager: servers: - name: client-auth - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 timeout: 10s tls: cert: client.pem diff --git a/cmd/karma/tests/testscript/082_tls_unparsable_key.txt b/cmd/karma/tests/testscript/082_tls_unparsable_key.txt index 066d8f4db..c58ce4974 100644 --- a/cmd/karma/tests/testscript/082_tls_unparsable_key.txt +++ b/cmd/karma/tests/testscript/082_tls_unparsable_key.txt @@ -1,14 +1,18 @@ # Raises an error if tls CA cert is missing -karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=true --log.level=info --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 +karma.bin-should-fail --pid-file=karma.pid --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8078 ! stdout . -stderr 'msg="Failed to create HTTP transport for Alertmanager ''client-auth'' with URI ''https:\/\/localhost:9093'': tls: failed to find any PEM data in key input"' +cmp stderr stderr.txt +-- stderr.txt -- +level=info msg="Reading configuration file" path=karma.yaml +level=info msg="Version: dev" +level=error msg="Execution failed" error="failed to create HTTP transport for Alertmanager 'client-auth' with URI 'https://127.0.0.1:9093': tls: failed to find any PEM data in key input" -- karma.yaml -- alertmanager: servers: - name: client-auth - uri: https://localhost:9093 + uri: https://127.0.0.1:9093 timeout: 10s tls: cert: client.pem diff --git a/cmd/karma/timer.go b/cmd/karma/timer.go index fdcd6f829..d7d432f15 100644 --- a/cmd/karma/timer.go +++ b/cmd/karma/timer.go @@ -6,14 +6,14 @@ import ( "github.com/prymitive/karma/internal/alertmanager" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) func pullFromAlertmanager() { // always flush cache once we're done defer apiCache.Flush() - log.Info("Pulling latest alerts and silences from Alertmanager") + log.Info().Msg("Pulling latest alerts and silences from Alertmanager") upstreams := alertmanager.GetAlertmanagers() wg := sync.WaitGroup{} @@ -21,10 +21,10 @@ func pullFromAlertmanager() { for _, upstream := range upstreams { go func(am *alertmanager.Alertmanager) { - log.Infof("[%s] Collecting alerts and silences", am.Name) + log.Info().Str("alertmanager", am.Name).Msg("Collecting alerts and silences") err := am.Pull() if err != nil { - log.Errorf("[%s] %s", am.Name, err) + log.Error().Err(err).Str("alertmanager", am.Name).Msg("Collection failed") } wg.Done() }(upstream) @@ -32,7 +32,7 @@ func pullFromAlertmanager() { wg.Wait() - log.Info("Pull completed") + log.Info().Msg("Collection completed") runtime.GC() } diff --git a/cmd/karma/views.go b/cmd/karma/views.go index 797a0d4f6..77b256bc7 100644 --- a/cmd/karma/views.go +++ b/cmd/karma/views.go @@ -21,7 +21,7 @@ import ( "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) func notFound(c *gin.Context) { @@ -51,7 +51,7 @@ func compressResponse(data []byte) ([]byte, error) { } compressed := b.Bytes() - log.Debugf("Compressed %d bytes to %d bytes (%.2f%%)", len(data), len(compressed), (float64(len(compressed))/float64(len(data)))*100) + log.Debug().Int("original", len(data)).Int("compressed", len(compressed)).Float64("ratio", (float64(len(compressed))/float64(len(data)))*100).Msg("Compressed response") return compressed, nil } @@ -70,20 +70,12 @@ func decompressCachedResponse(data []byte) ([]byte, error) { } func index(c *gin.Context) { - start := time.Now() - noCache(c) - filtersJSON, err := json.Marshal(config.Config.Filters.Default) - if err != nil { - panic(err) - } + filtersJSON, _ := json.Marshal(config.Config.Filters.Default) filtersB64 := base64.StdEncoding.EncodeToString(filtersJSON) - defaults, err := json.Marshal(config.Config.UI) - if err != nil { - panic(err) - } + defaults, _ := json.Marshal(config.Config.UI) defaultsB64 := base64.StdEncoding.EncodeToString(defaults) c.HTML(http.StatusOK, "ui/build/index.html", gin.H{ @@ -93,12 +85,6 @@ func index(c *gin.Context) { "DefaultFilter": filtersB64, "Defaults": defaultsB64, }) - - log.Infof("[%s] %s %s took %s", c.ClientIP(), c.Request.Method, c.Request.RequestURI, time.Since(start)) -} - -func logAlertsView(c *gin.Context, cacheStatus string, duration time.Duration) { - log.Infof("[%s %s] <%d> %s %s took %s", c.ClientIP(), cacheStatus, http.StatusOK, c.Request.Method, c.Request.RequestURI, duration) } func populateAPIFilters(matchFilters []filters.FilterT) []models.Filter { @@ -177,29 +163,15 @@ func alerts(c *gin.Context) { data, found := apiCache.Get(cacheKey) if found { - rawData, err := decompressCachedResponse(data.([]byte)) - if err != nil { - log.Error(err.Error()) - panic(err) - } - + rawData, _ := decompressCachedResponse(data.([]byte)) // need to overwrite settings as they can have user specific data newResp := models.AlertsResponse{} - err = json.Unmarshal(rawData, &newResp) - if err != nil { - log.Error(err.Error()) - panic(err) - } + _ = json.Unmarshal(rawData, &newResp) newResp.Settings = resp.Settings newResp.Timestamp = string(ts) newResp.Authentication = resp.Authentication - newData, err := json.Marshal(&newResp) - if err != nil { - log.Error(err.Error()) - panic(err) - } + newData, _ := json.Marshal(&newResp) c.Data(http.StatusOK, gin.MIMEJSON, newData) - logAlertsView(c, "HIT", time.Since(start)) return } @@ -483,40 +455,28 @@ func alerts(c *gin.Context) { resp.Filters = populateAPIFilters(matchFilters) resp.Receivers = receivers - data, err := json.Marshal(resp) - if err != nil { - log.Error(err.Error()) - panic(err) - } - compressedData, err := compressResponse(data.([]byte)) - if err != nil { - log.Error(err.Error()) - panic(err) - } + data, _ = json.Marshal(resp) + compressedData, _ := compressResponse(data.([]byte)) apiCache.Set(cacheKey, compressedData, -1) c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "MIS", time.Since(start)) } // autocomplete endpoint, json, used for filter autocomplete hints func autocomplete(c *gin.Context) { noCache(c) - start := time.Now() cacheKey := c.Request.RequestURI data, found := apiCache.Get(cacheKey) if found { c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "HIT", time.Since(start)) return } term, found := c.GetQuery("term") if !found || term == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "missing term= parameter"}) - log.Infof("[%s] <%d> %s %s took %s", c.ClientIP(), http.StatusBadRequest, c.Request.Method, c.Request.RequestURI, time.Since(start)) return } @@ -537,28 +497,21 @@ func autocomplete(c *gin.Context) { } sort.Sort(sort.Reverse(acData)) - data, err := json.Marshal(acData) - if err != nil { - log.Error(err.Error()) - panic(err) - } + data, _ = json.Marshal(acData) apiCache.Set(cacheKey, data, time.Second*15) c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "MIS", time.Since(start)) } func silences(c *gin.Context) { noCache(c) - start := time.Now() cacheKey := c.Request.RequestURI data, found := apiCache.Get(cacheKey) if found { c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "HIT", time.Since(start)) return } @@ -665,14 +618,9 @@ func silences(c *gin.Context) { } } - data, err := json.Marshal(dedupedSilences) - if err != nil { - log.Error(err.Error()) - panic(err) - } + data, _ = json.Marshal(dedupedSilences) apiCache.Set(cacheKey, data, time.Second*15) c.Data(http.StatusOK, gin.MIMEJSON, data.([]byte)) - logAlertsView(c, "MIS", time.Since(start)) } diff --git a/cmd/karma/views_test.go b/cmd/karma/views_test.go index af7e3b405..13daade53 100644 --- a/cmd/karma/views_test.go +++ b/cmd/karma/views_test.go @@ -18,9 +18,10 @@ import ( "github.com/prymitive/karma/internal/mock" "github.com/prymitive/karma/internal/models" "github.com/prymitive/karma/internal/slices" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" cache "github.com/patrickmn/go-cache" - log "github.com/sirupsen/logrus" "github.com/gin-gonic/gin" "github.com/google/go-cmp/cmp" @@ -31,7 +32,7 @@ import ( var upstreamSetup = false func mockConfig() { - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) os.Setenv("ALERTMANAGER_URI", "http://localhost") os.Setenv("LABELS_COLOR_UNIQUE", "alertname @receiver @alertmanager @cluster") @@ -39,14 +40,14 @@ func mockConfig() { config.SetupFlags(f) _, err := config.Config.Read(f) if err != nil { - log.Fatal(err) + log.Fatal().Err(err).Msg("Error") } if !upstreamSetup { upstreamSetup = true err := setupUpstreams() if err != nil { - log.Fatal(err) + log.Fatal().Err(err).Msg("Error") } } } @@ -57,7 +58,10 @@ func ginTestEngine() *gin.Engine { setupRouter(r) var t *template.Template - t = loadTemplate(t, "ui/build/index.html") + t, err := loadTemplate(t, "ui/build/index.html") + if err != nil { + panic(err) + } r.SetHTMLTemplate(t) return r @@ -997,7 +1001,7 @@ func TestAuthentication(t *testing.T) { } func TestUpstreamStatus(t *testing.T) { - log.SetLevel(log.FatalLevel) + zerolog.SetGlobalLevel(zerolog.FatalLevel) type mockT struct { uri string @@ -2101,7 +2105,7 @@ func TestUpstreamStatus(t *testing.T) { if err != nil { t.Error(err) } - log.SetLevel(log.FatalLevel) + zerolog.SetGlobalLevel(zerolog.FatalLevel) pullFromAlertmanager() r := ginTestEngine() diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 2b9cb5fda..88c8b3921 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -848,10 +848,10 @@ Defaults: ```YAML log: - config: true + config: false level: info format: text - timestamp: true + timestamp: false ``` ### Silences diff --git a/go.mod b/go.mod index d795129c8..c9f7e7e4b 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/prometheus/client_golang v1.7.1 github.com/prometheus/common v0.14.0 github.com/rogpeppe/go-internal v1.6.2 - github.com/sirupsen/logrus v1.7.0 + github.com/rs/zerolog v1.20.0 github.com/spf13/pflag v1.0.5 go.mongodb.org/mongo-driver v1.3.5 // indirect golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect diff --git a/go.sum b/go.sum index 92d858a06..6d4956318 100644 --- a/go.sum +++ b/go.sum @@ -18,10 +18,8 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= @@ -32,7 +30,6 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= @@ -60,6 +57,7 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -103,7 +101,6 @@ github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e h1:8bZpGwoPxkai github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28e/go.mod h1:VhW/Ch/3FhimwZb8Oj+qJmdMmoB8r7lmJ5auRjm50oQ= github.com/gin-gonic/contrib v0.0.0-20201005132743-ca038bbf2944 h1:CUXsTZuAAdpQinpKgInZqKTOfn/jkIA9DLnozeybVRQ= github.com/gin-gonic/contrib v0.0.0-20201005132743-ca038bbf2944/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg= -github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= @@ -120,16 +117,13 @@ github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpR github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.7 h1:Lcq+o0mSwCLKACMxZhreVHigB9ebghJ/lrmeaqASbjo= github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= @@ -140,9 +134,7 @@ github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm7232 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= @@ -150,14 +142,12 @@ github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0= github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/runtime v0.19.15 h1:2GIefxs9Rx1vCDNghRtypRq+ig8KSLrjHbAYI/gCLCM= github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= github.com/go-openapi/runtime v0.19.22 h1:vtT7gJwxIK96BVTd9Ce5OPNQfIsk+q1j/+0e98NoVXk= @@ -165,10 +155,8 @@ github.com/go-openapi/runtime v0.19.22/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pt github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.9 h1:9z9cbFuZJ7AcvOHKIY+f6Aevb4vObNDkTEyoMfO7rAc= github.com/go-openapi/spec v0.19.9/go.mod h1:vqK/dIdLGCosfvYsQV3WfC7N3TiZSnGY2RZKoFK7X28= @@ -176,40 +164,32 @@ github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pL github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/strfmt v0.19.6 h1:epWc+q5qSgsy7A7+/HYyxLF37vLEYdPSkNB9G8mRqjw= github.com/go-openapi/strfmt v0.19.6/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk= github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-openapi/validate v0.19.11 h1:8lCr0b9lNWKjVjW/hSZZvltUy+bULl7vbnCTsOzlhPo= github.com/go-openapi/validate v0.19.11/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o= github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= @@ -250,15 +230,12 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= @@ -269,9 +246,7 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= @@ -315,7 +290,6 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jarcoal/httpmock v1.0.6 h1:e81vOSexXU3mJuJ4l//geOmKIt+Vkxerk1feQBC8D0g= @@ -325,10 +299,8 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -338,27 +310,21 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0 h1:reN85Pxc5larApoH1keMBiu2GWtPqXQ1nc9gx+jOU+E= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/knadh/koanf v0.13.0 h1:OEjNdmrP/5oAhJkNwTtarioqOC4xe6WxRK8Q5ffW8WU= github.com/knadh/koanf v0.13.0/go.mod h1:7XDF7OJIqSQLUZnaXkjb1HB3CgMEYHyrzmgT8A6xAaE= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -368,7 +334,6 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -377,7 +342,6 @@ github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kN github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -391,11 +355,8 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc35r0TV4= github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -444,7 +405,6 @@ github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -468,7 +428,6 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= @@ -483,10 +442,12 @@ github.com/rhnvrm/simples3 v0.5.0/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8d github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs= +github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= @@ -496,12 +457,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -516,11 +473,9 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -540,10 +495,8 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= @@ -596,9 +549,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= @@ -633,20 +584,16 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 h1:X9xIZ1YU8bLZA3l6gqDUHSFiD0GFI9S548h6C8nDtOY= golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -670,6 +617,7 @@ golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -680,7 +628,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -702,19 +649,15 @@ google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLY google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -723,11 +666,9 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/colors.v1 v1.2.0 h1:SPweMUve+ywPrfwao+UvfD5Ah78aOLUkT5RlJiZn52c= gopkg.in/go-playground/colors.v1 v1.2.0/go.mod h1:AvbqcMpNXVl5gBrM20jBm3VjjKBbH/kI5UnqjU7lxFI= -gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -735,15 +676,12 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/alertmanager/dedup_test.go b/internal/alertmanager/dedup_test.go index dff74fe6c..ecebf05a4 100644 --- a/internal/alertmanager/dedup_test.go +++ b/internal/alertmanager/dedup_test.go @@ -7,25 +7,25 @@ import ( "testing" "time" - "github.com/jarcoal/httpmock" - "github.com/spf13/pflag" - "github.com/prymitive/karma/internal/alertmanager" "github.com/prymitive/karma/internal/config" "github.com/prymitive/karma/internal/mock" - log "github.com/sirupsen/logrus" + "github.com/jarcoal/httpmock" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/spf13/pflag" ) func init() { - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) httpmock.Activate() for _, version := range mock.ListAllMocks() { name := fmt.Sprintf("dedup-mock-%s", version) uri := fmt.Sprintf("http://%s.localhost", version) am, err := alertmanager.NewAlertmanager("cluster", name, uri, alertmanager.WithRequestTimeout(time.Second)) if err != nil { - log.Fatal(err) + log.Fatal().Err(err).Msg("Error") } err = alertmanager.RegisterAlertmanager(am) if err != nil { @@ -182,7 +182,7 @@ func TestStripReceivers(t *testing.T) { } func TestClearData(t *testing.T) { - log.SetLevel(log.PanicLevel) + zerolog.SetGlobalLevel(zerolog.PanicLevel) httpmock.Activate() for _, version := range mock.ListAllMocks() { name := fmt.Sprintf("clear-data-mock-%s", version) diff --git a/internal/alertmanager/models.go b/internal/alertmanager/models.go index 03fa23413..98f4e3109 100644 --- a/internal/alertmanager/models.go +++ b/internal/alertmanager/models.go @@ -19,7 +19,7 @@ import ( "github.com/prymitive/karma/internal/uri" "github.com/prymitive/karma/internal/verprobe" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) const ( @@ -71,13 +71,13 @@ func (am *Alertmanager) probeVersion() string { url, err := uri.JoinURL(am.URI, "metrics") if err != nil { - log.Errorf("Failed to join url '%s' and path 'metrics': %s", am.SanitizedURI(), err) + log.Error().Err(err).Str("uri", am.SanitizedURI()).Msg("Failed to join url with /metrics path") return fakeVersion } source, err := am.reader.Read(url, am.HTTPHeaders) if err != nil { - log.Errorf("[%s] %s request failed: %s", am.Name, uri.SanitizeURI(url), err) + log.Error().Err(err).Str("alertmanager", am.Name).Str("uri", am.SanitizedURI()).Msg("Request failed") return fakeVersion } defer source.Close() @@ -86,7 +86,7 @@ func (am *Alertmanager) probeVersion() string { if err != nil { return fakeVersion } - log.Infof("[%s] Upstream version: %s", am.Name, version) + log.Info().Str("version", version).Str("alertmanager", am.Name).Msg("Upstream version") return version } @@ -140,9 +140,9 @@ func (am *Alertmanager) pullSilences(version string) error { if err != nil { return err } - log.Infof("[%s] Got %d silences(s) in %s", am.Name, len(silences), time.Since(start)) + log.Info().Str("alertmanager", am.Name).Int("silences", len(silences)).Dur("duration", time.Since(start)).Msg("Got silences") - log.Infof("[%s] Detecting ticket links in silences (%d)", am.Name, len(silences)) + log.Info().Str("alertmanager", am.Name).Int("silences", len(silences)).Msg("Detecting ticket links in silences") silenceMap := make(map[string]models.Silence, len(silences)) for _, silence := range silences { silence := silence // scopelint pin @@ -190,15 +190,13 @@ func (am *Alertmanager) pullAlerts(version string) error { var groups []models.AlertGroup start := time.Now() - groups, err = mapper.Collect(am.URI, am.HTTPHeaders, am.RequestTimeout, am.HTTPTransport) if err != nil { return err } + log.Info().Str("alertmanager", am.Name).Int("groups", len(groups)).Dur("duration", time.Since((start))).Msg("Collected alert groups") - log.Infof("[%s] Got %d alert group(s) in %s", am.Name, len(groups), time.Since(start)) - - log.Infof("[%s] Deduplicating alert groups (%d)", am.Name, len(groups)) + log.Info().Str("alertmanager", am.Name).Int("groups", len(groups)).Msg("Deduplicating alert groups") uniqueGroups := map[string]models.AlertGroup{} uniqueAlerts := map[string]map[string]models.Alert{} knownLabelsMap := map[string]bool{} @@ -230,7 +228,7 @@ func (am *Alertmanager) pullAlerts(version string) error { colors := models.LabelsColorMap{} autocompleteMap := map[string]models.Autocomplete{} - log.Infof("[%s] Processing unique alert groups (%d)", am.Name, len(uniqueGroups)) + log.Info().Str("alertmanager", am.Name).Int("groups", len(uniqueGroups)).Msg("Processing deduplicated alert groups") for _, ag := range uniqueGroups { alerts := make(models.AlertList, 0, len(uniqueAlerts[ag.ID])) for _, alert := range uniqueAlerts[ag.ID] { @@ -283,7 +281,7 @@ func (am *Alertmanager) pullAlerts(version string) error { dedupedGroups = append(dedupedGroups, ag) } - log.Infof("[%s] Merging autocomplete data (%d)", am.Name, len(autocompleteMap)) + log.Info().Str("alertmanager", am.Name).Int("hints", len(autocompleteMap)).Msg("Merging autocomplete hints") autocomplete := make([]models.Autocomplete, 0, len(autocompleteMap)) for _, hint := range autocompleteMap { autocomplete = append(autocomplete, hint) @@ -442,7 +440,7 @@ func (am *Alertmanager) Error() string { missing, _ := slices.StringSliceDiff(configPeers, apiPeers) if len(missing) > 0 { - log.Debugf("[%s] cluster peers mismatch, configured: %v, api: %v, missing: %v\n", am.Name, configPeers, apiPeers, missing) + log.Debug().Str("alertmanager", am.Name).Strs("configured", configPeers).Strs("api", apiPeers).Strs("missing", missing).Msg("Cluster peers mismatch") return fmt.Sprintf("missing cluster peers: %s", strings.Join(missing, ", ")) } diff --git a/internal/alertmanager/models_test.go b/internal/alertmanager/models_test.go index b28095da9..f6a118a37 100644 --- a/internal/alertmanager/models_test.go +++ b/internal/alertmanager/models_test.go @@ -5,7 +5,8 @@ import ( "testing" "github.com/prymitive/karma/internal/config" - log "github.com/sirupsen/logrus" + + "github.com/rs/zerolog" ) type uriTest struct { @@ -186,7 +187,7 @@ func TestAlertmanagerSanitizedURI(t *testing.T) { } func TestAlertmanagerPullWithInvalidURI(t *testing.T) { - log.SetLevel(log.PanicLevel) + zerolog.SetGlobalLevel(zerolog.PanicLevel) am, _ := NewAlertmanager("cluster", "test", "%gh&%ij") err := am.Pull() if err == nil { @@ -195,7 +196,7 @@ func TestAlertmanagerPullWithInvalidURI(t *testing.T) { } func TestAlertmanagerPullAlertsWithInvalidVersion(t *testing.T) { - log.SetLevel(log.PanicLevel) + zerolog.SetGlobalLevel(zerolog.PanicLevel) am, _ := NewAlertmanager("cluster", "test", "http://localhost") err := am.pullAlerts("0.0.1") if err == nil { @@ -204,7 +205,7 @@ func TestAlertmanagerPullAlertsWithInvalidVersion(t *testing.T) { } func TestAlertmanagerPullSilencesWithInvalidVersion(t *testing.T) { - log.SetLevel(log.PanicLevel) + zerolog.SetGlobalLevel(zerolog.PanicLevel) am, _ := NewAlertmanager("cluster", "test", "http://localhost") err := am.pullSilences("0.0.1") if err == nil { @@ -213,7 +214,7 @@ func TestAlertmanagerPullSilencesWithInvalidVersion(t *testing.T) { } func TestAlertmanagerFetchStatusWithInvalidVersion(t *testing.T) { - log.SetLevel(log.PanicLevel) + zerolog.SetGlobalLevel(zerolog.PanicLevel) am, _ := NewAlertmanager("cluster", "test", "http://localhost") _, err := am.fetchStatus("0.0.1") if err == nil { diff --git a/internal/alertmanager/tls.go b/internal/alertmanager/tls.go index bb3641783..bdb10b1e9 100644 --- a/internal/alertmanager/tls.go +++ b/internal/alertmanager/tls.go @@ -6,11 +6,11 @@ import ( "io/ioutil" "net/http" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) func configureTLSRootCAs(tlsConfig *tls.Config, caPath string) error { - log.Debugf("Loading TLS CA cert '%s'", caPath) + log.Debug().Str("path", caPath).Msg("Loading TLS CA cert") caCert, err := ioutil.ReadFile(caPath) if err != nil { return err @@ -22,10 +22,10 @@ func configureTLSRootCAs(tlsConfig *tls.Config, caPath string) error { } func configureTLSClientCert(tlsConfig *tls.Config, certPath, keyPath string) error { - log.Debugf("Loading TLS cert '%s' and key '%s'", certPath, keyPath) + log.Debug().Str("cert", certPath).Str("key", keyPath).Msg("Loading TLS cert and key") cert, err := tls.LoadX509KeyPair(certPath, keyPath) if err != nil { - log.Debugf("Failed to load TLS cert and key: %s", err) + log.Debug().Err(err).Msg("Failed to load TLS cert and key") return err } tlsConfig.Certificates = []tls.Certificate{cert} diff --git a/internal/alertmanager/upstream.go b/internal/alertmanager/upstream.go index 576dc3a47..2f4266767 100644 --- a/internal/alertmanager/upstream.go +++ b/internal/alertmanager/upstream.go @@ -11,7 +11,7 @@ import ( "github.com/prymitive/karma/internal/models" "github.com/prymitive/karma/internal/uri" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) // Option allows to pass functional options to NewAlertmanager() @@ -79,7 +79,8 @@ func RegisterAlertmanager(am *Alertmanager) error { } } upstreams[am.Name] = am - log.Infof("[%s] Configured Alertmanager source at %s (proxied: %v, readonly: %v)", am.Name, uri.SanitizeURI(am.URI), am.ProxyRequests, am.ReadOnly) + // am.Name, uri.SanitizeURI(am.URI), am.ProxyRequests, am.ReadOnly + log.Info().Str("name", am.Name).Str("uri", uri.SanitizeURI(am.URI)).Bool("proxy", am.ProxyRequests).Bool("readonly", am.ReadOnly).Msg("Configured Alertmanager source") return nil } diff --git a/internal/config/acl.go b/internal/config/acl.go index dbb5cf344..0bf2710fd 100644 --- a/internal/config/acl.go +++ b/internal/config/acl.go @@ -49,12 +49,12 @@ func ReadSilenceACLConfig(path string) (*silencesACLSchema, error) { f, err := ioutil.ReadFile(path) if err != nil { - return nil, fmt.Errorf("Failed to load silence ACL configuration file %q: %v", path, err) + return nil, fmt.Errorf("failed to load silence ACL configuration file %q: %v", path, err) } err = yaml.UnmarshalStrict(f, &cfg) if err != nil { - return nil, fmt.Errorf("Failed to parse silence ACL configuration file %q: %v", path, err) + return nil, fmt.Errorf("failed to parse silence ACL configuration file %q: %v", path, err) } return &cfg, nil diff --git a/internal/config/config.go b/internal/config/config.go index e39fc5eea..718a9a915 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,9 +20,9 @@ import ( "github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/providers/posflag" "github.com/mitchellh/mapstructure" + "github.com/rs/zerolog/log" "github.com/spf13/pflag" - log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" ) @@ -94,12 +94,12 @@ func SetupFlags(f *pflag.FlagSet) { f.Bool("grid.sorting.reverse", true, "Reverse sort order") f.String("grid.sorting.label", "alertname", "Label name to use when sorting alert grid by label") - f.Bool("log.config", true, "Log used configuration to log on startup") + f.Bool("log.config", false, "Log used configuration to log on startup") f.String("log.level", "info", "Log level, one of: debug, info, warning, error, fatal and panic") f.String("log.format", "text", "Log format, one of: text, json") - f.Bool("log.timestamp", true, "Add timestamps to all log messages") + f.Bool("log.timestamp", false, "Add timestamps to all log messages") f.StringSlice("receivers.keep", []string{}, "List of receivers to keep, all alerts with different receivers will be ignored") @@ -159,7 +159,7 @@ func readConfigFile(k *koanf.Koanf, flags *pflag.FlagSet) (string, error) { } if configFile != "" { if err := k.Load(file.Provider(configFile), yamlParser.Parser()); err != nil { - return "", fmt.Errorf("Failed to load configuration file %q: %v", configFile, err) + return "", fmt.Errorf("failed to load configuration file %q: %v", configFile, err) } return configFile, nil } @@ -255,23 +255,23 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) { } err = k.UnmarshalWithConf("", &config, kConf) if err != nil { - return "", fmt.Errorf("Failed to unmarshal configuration: %v", err) + return "", fmt.Errorf("failed to unmarshal configuration: %v", err) } if configFileUsed != "" { if err := validateConfigFile(configFileUsed); err != nil { - return "", fmt.Errorf("Failed to parse configuration file %q: %v", configFileUsed, err) + return "", fmt.Errorf("failed to parse configuration file %q: %v", configFileUsed, err) } } if config.Authentication.Header.Name != "" && len(config.Authentication.BasicAuth.Users) > 0 { - return "", fmt.Errorf("Both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled") + return "", fmt.Errorf("both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled") } if config.Authentication.Header.ValueRegex != "" { _, err = regex.CompileAnchored(config.Authentication.Header.ValueRegex) if err != nil { - return "", fmt.Errorf("Invalid regex for authentication.header.value_re: %s", err.Error()) + return "", fmt.Errorf("invalid regex for authentication.header.value_re: %s", err.Error()) } if config.Authentication.Header.Name == "" { return "", fmt.Errorf("authentication.header.name is required when authentication.header.value_re is set") @@ -291,7 +291,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) { } if !slices.StringInSlice([]string{"omit", "include", "same-origin"}, config.Alertmanager.CORS.Credentials) { - return "", fmt.Errorf("Invalid alertmanager.cors.credentials value '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.CORS.Credentials) + return "", fmt.Errorf("invalid alertmanager.cors.credentials value '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.CORS.Credentials) } for i, s := range config.Alertmanager.Servers { @@ -305,7 +305,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) { config.Alertmanager.Servers[i].CORS.Credentials = config.Alertmanager.CORS.Credentials } if !slices.StringInSlice([]string{"omit", "include", "same-origin"}, config.Alertmanager.Servers[i].CORS.Credentials) { - return "", fmt.Errorf("Invalid cors.credentials value '%s' for alertmanager '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.Servers[i].CORS.Credentials, s.Name) + return "", fmt.Errorf("invalid cors.credentials value '%s' for alertmanager '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.Servers[i].CORS.Credentials, s.Name) } } @@ -321,27 +321,27 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) { for labelName, customColors := range config.Labels.Color.Custom { for i, customColor := range customColors { if customColor.Value == "" && customColor.ValueRegex == "" { - return "", fmt.Errorf("Custom label color for '%s' is missing 'value' or 'value_re'", labelName) + return "", fmt.Errorf("custom label color for '%s' is missing 'value' or 'value_re'", labelName) } if customColor.ValueRegex != "" { config.Labels.Color.Custom[labelName][i].CompiledRegex, err = regex.CompileAnchored(customColor.ValueRegex) if err != nil { - return "", fmt.Errorf("Failed to parse custom color regex rule '%s' for '%s' label: %s", customColor.ValueRegex, labelName, err) + return "", fmt.Errorf("failed to parse custom color regex rule '%s' for '%s' label: %s", customColor.ValueRegex, labelName, err) } } } } if !slices.StringInSlice([]string{"disabled", "startsAt", "label"}, config.Grid.Sorting.Order) { - return "", fmt.Errorf("Invalid grid.sorting.order value '%s', allowed options: disabled, startsAt, label", config.Grid.Sorting.Order) + return "", fmt.Errorf("invalid grid.sorting.order value '%s', allowed options: disabled, startsAt, label", config.Grid.Sorting.Order) } if !slices.StringInSlice([]string{"expanded", "collapsed", "collapsedOnMobile"}, config.UI.CollapseGroups) { - return "", fmt.Errorf("Invalid ui.collapseGroups value '%s', allowed options: expanded, collapsed, collapsedOnMobile", config.UI.CollapseGroups) + return "", fmt.Errorf("invalid ui.collapseGroups value '%s', allowed options: expanded, collapsed, collapsedOnMobile", config.UI.CollapseGroups) } if !slices.StringInSlice([]string{"light", "dark", "auto"}, config.UI.Theme) { - return "", fmt.Errorf("Invalid ui.theme value '%s', allowed options: light, dark, auto", config.UI.Theme) + return "", fmt.Errorf("invalid ui.theme value '%s', allowed options: light, dark, auto", config.UI.Theme) } if config.Listen.Prefix != "" && !strings.HasPrefix(config.Listen.Prefix, "/") { @@ -409,9 +409,9 @@ func (config *configSchema) LogValues() { } out, _ := yaml.Marshal(cfg) - log.Info("Parsed configuration:") + log.Info().Msg("Parsed configuration:") scanner := bufio.NewScanner(bytes.NewReader(out)) for scanner.Scan() { - log.Info(scanner.Text()) + log.Info().Msg(scanner.Text()) } } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index f8b915660..e3a6e83d6 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -7,11 +7,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/prymitive/karma/internal/uri" + "github.com/rs/zerolog" "github.com/spf13/pflag" "github.com/pmezard/go-difflib/difflib" - log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" ) @@ -100,10 +100,10 @@ listen: port: 80 prefix: / log: - config: true + config: false level: info format: text - timestamp: true + timestamp: false receivers: keep: [] strip: [] @@ -159,7 +159,7 @@ func mockConfigRead() (string, error) { func TestReadConfig(t *testing.T) { resetEnv() - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) os.Setenv("ALERTMANAGER_INTERVAL", "1s") os.Setenv("ALERTMANAGER_URI", "http://localhost") os.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://example.com") @@ -184,7 +184,7 @@ func TestReadConfig(t *testing.T) { func TestReadSimpleConfig(t *testing.T) { resetEnv() - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) os.Setenv("ALERTMANAGER_URI", "http://localhost") os.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://localhost:9090") os.Setenv("ALERTMANAGER_NAME", "single") @@ -302,7 +302,7 @@ func TestInvalidCORSCredentials(t *testing.T) { func TestDefaultConfig(t *testing.T) { resetEnv() - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) _, _ = mockConfigRead() expectedConfig := configSchema{} diff --git a/internal/filters/filter_test.go b/internal/filters/filter_test.go index 296a370e4..214f991ca 100644 --- a/internal/filters/filter_test.go +++ b/internal/filters/filter_test.go @@ -10,7 +10,7 @@ import ( "github.com/prymitive/karma/internal/models" "github.com/prymitive/karma/internal/slices" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog" ) type filterTest struct { @@ -737,7 +737,7 @@ var tests = []filterTest{ } func TestFilters(t *testing.T) { - log.SetLevel(log.ErrorLevel) + zerolog.SetGlobalLevel(zerolog.ErrorLevel) am, err := alertmanager.NewAlertmanager("HA", "test", "http://localhost", alertmanager.WithRequestTimeout(time.Second)) if err != nil { diff --git a/internal/models/alertgroup.go b/internal/models/alertgroup.go index 54a929966..364e9ad58 100644 --- a/internal/models/alertgroup.go +++ b/internal/models/alertgroup.go @@ -7,8 +7,6 @@ import ( "time" "github.com/cnf/structhash" - - log "github.com/sirupsen/logrus" ) // AlertList is flat list of karmaAlert objects @@ -51,17 +49,8 @@ type AlertGroup struct { // it should be unique for each AlertGroup func (ag AlertGroup) LabelsFingerprint() string { agIDHasher := sha1.New() - - _, err := io.WriteString(agIDHasher, ag.Receiver) - if err != nil { - log.Errorf("Failed to write receiver value to alertgroup '%s' fingerprint: %s", ag.ID, err) - } - - _, err = io.WriteString(agIDHasher, fmt.Sprintf("%x", structhash.Sha1(ag.Labels, 1))) - if err != nil { - log.Errorf("Failed to write labels sha1 value to alertgroup '%s' fingerprint: %s", ag.ID, err) - } - + _, _ = io.WriteString(agIDHasher, ag.Receiver) + _, _ = io.WriteString(agIDHasher, fmt.Sprintf("%x", structhash.Sha1(ag.Labels, 1))) return fmt.Sprintf("%x", agIDHasher.Sum(nil)) } @@ -69,10 +58,7 @@ func (ag AlertGroup) LabelsFingerprint() string { func (ag AlertGroup) ContentFingerprint() string { h := sha1.New() for _, alert := range ag.Alerts { - _, err := io.WriteString(h, alert.ContentFingerprint()) - if err != nil { - log.Errorf("Failed to write alert fingerprint value to alertgroup '%s' fingerprint: %s", ag.ID, err) - } + _, _ = io.WriteString(h, alert.ContentFingerprint()) } return fmt.Sprintf("%x", h.Sum(nil)) } diff --git a/internal/transform/colors.go b/internal/transform/colors.go index f11662ddf..e92ddfdff 100644 --- a/internal/transform/colors.go +++ b/internal/transform/colors.go @@ -12,25 +12,16 @@ import ( "github.com/prymitive/karma/internal/slices" "github.com/hansrodtang/randomcolor" + "github.com/rs/zerolog/log" plcolors "gopkg.in/go-playground/colors.v1" - - log "github.com/sirupsen/logrus" ) var lock sync.RWMutex func labelToSeed(key string, val string) int64 { h := sha1.New() - - _, err := io.WriteString(h, key) - if err != nil { - log.Errorf("Failed to write label key '%s' to the seed sha1: %s", key, err) - } - - _, err = io.WriteString(h, val) - if err != nil { - log.Errorf("Failed to write label value '%s' to the seed sha1: %s", val, err) - } + _, _ = io.WriteString(h, key) + _, _ = io.WriteString(h, val) var seed int64 for _, i := range h.Sum(nil) { @@ -53,7 +44,7 @@ func rgbToBrightness(r, g, b uint8) int32 { func parseCustomColor(colorStore models.LabelsColorMap, key, val, customColor string) { color, err := plcolors.Parse(customColor) if err != nil { - log.Warningf("Failed to parse custom color for %s=%s: %s", key, val, err) + log.Warn().Str("key", key).Str("value", val).Err(err).Msg("Failed to parse custom color") return } rgb := color.ToRGB() diff --git a/internal/uri/http.go b/internal/uri/http.go index 38e649743..56b3c7651 100644 --- a/internal/uri/http.go +++ b/internal/uri/http.go @@ -6,7 +6,7 @@ import ( "io" "net/http" - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog/log" ) // HTTPURIReader can read data from http:// and https:// URIs @@ -15,7 +15,8 @@ type HTTPURIReader struct { } func (r *HTTPURIReader) Read(uri string, headers map[string]string) (io.ReadCloser, error) { - log.Infof("GET %s timeout=%s", SanitizeURI(uri), r.client.Timeout) + suri := SanitizeURI(uri) + log.Info().Str("uri", suri).Dur("timeout", r.client.Timeout).Msg("GET request") request, err := http.NewRequest("GET", uri, nil) if err != nil { @@ -33,7 +34,7 @@ func (r *HTTPURIReader) Read(uri string, headers map[string]string) (io.ReadClos } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("request to %s failed with %s", SanitizeURI(uri), resp.Status) + return nil, fmt.Errorf("request to %s failed with %s", suri, resp.Status) } var reader io.ReadCloser diff --git a/internal/uri/uri_test.go b/internal/uri/uri_test.go index c2d50d3d6..5888f7b99 100644 --- a/internal/uri/uri_test.go +++ b/internal/uri/uri_test.go @@ -12,8 +12,7 @@ import ( "time" "github.com/prymitive/karma/internal/uri" - - log "github.com/sirupsen/logrus" + "github.com/rs/zerolog" ) type httpTransportTest struct { @@ -109,7 +108,7 @@ func readAll(source io.ReadCloser) (int64, error) { } func TestHTTPReader(t *testing.T) { - log.SetLevel(log.FatalLevel) + zerolog.SetGlobalLevel(zerolog.FatalLevel) for _, testCase := range httpTransportTests { testCase := testCase t.Run(testCase.name, func(t *testing.T) { diff --git a/make/go.mk b/make/go.mk index 395277810..78424a542 100644 --- a/make/go.mk +++ b/make/go.mk @@ -38,18 +38,24 @@ $(GOBIN)/benchstat: tools/benchstat/go.mod tools/benchstat/go.sum benchmark-compare-go: $(GOBIN)/benchstat @$(GOBIN)/benchstat master.txt new.txt -$(GOBIN)/golangci-lint: tools/golangci-lint/go.mod tools/golangci-lint/go.sum - $(GO) install -modfile=tools/golangci-lint/go.mod github.com/golangci/golangci-lint/cmd/golangci-lint -.PHONY: lint-go -lint-go: $(GOBIN)/golangci-lint lint-go-looppointer - $(ENV) golangci-lint run -v - $(GOBIN)/looppointer: tools/looppointer/go.mod tools/looppointer/go.sum $(GO) install -modfile=tools/looppointer/go.mod github.com/kyoh86/looppointer/cmd/looppointer .PHONY: lint-go-looppointer lint-go-looppointer: $(GOBIN)/looppointer $(ENV) looppointer -c 2 ./... +$(GOBIN)/staticcheck: tools/staticcheck/go.mod tools/staticcheck/go.sum + $(GO) install -modfile=tools/staticcheck/go.mod honnef.co/go/tools/cmd/staticcheck +.PHONY: lint-go-staticcheck +lint-go-staticcheck: $(GOBIN)/staticcheck + $(ENV) staticcheck ./... + +$(GOBIN)/golangci-lint: tools/golangci-lint/go.mod tools/golangci-lint/go.sum + $(GO) install -modfile=tools/golangci-lint/go.mod github.com/golangci/golangci-lint/cmd/golangci-lint +.PHONY: lint-go +lint-go: $(GOBIN)/golangci-lint lint-go-looppointer lint-go-staticcheck + $(ENV) golangci-lint run -v + .PHONY: format-go format-go: gofmt -l -s -w . diff --git a/tools/staticcheck/go.mod b/tools/staticcheck/go.mod new file mode 100644 index 000000000..11cefdebf --- /dev/null +++ b/tools/staticcheck/go.mod @@ -0,0 +1,8 @@ +module _ + +go 1.14 + +require ( + golang.org/x/tools v0.0.0-20200710042808-f1c4188a97a1 // indirect + honnef.co/go/tools v0.0.1-2020.1.6 +) diff --git a/tools/staticcheck/go.sum b/tools/staticcheck/go.sum new file mode 100644 index 000000000..8df45f4ed --- /dev/null +++ b/tools/staticcheck/go.sum @@ -0,0 +1,40 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200710042808-f1c4188a97a1 h1:rD1FcWVsRaMY+l8biE9jbWP5MS/CJJ/90a9TMkMgNrM= +golang.org/x/tools v0.0.0-20200710042808-f1c4188a97a1/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +honnef.co/go/tools v0.0.1-2020.1.6 h1:W18jzjh8mfPez+AwGLxmOImucz/IFjpNlrKVnaj2YVc= +honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= diff --git a/tools/staticcheck/main.go b/tools/staticcheck/main.go new file mode 100644 index 000000000..619846f19 --- /dev/null +++ b/tools/staticcheck/main.go @@ -0,0 +1,7 @@ +// +build tools + +package tools + +import ( + _ "honnef.co/go/tools/cmd/staticcheck" +)