fix(backend): enable more linters in golangci-lint

This commit is contained in:
Łukasz Mierzwa
2021-11-03 16:53:00 +00:00
committed by Łukasz Mierzwa
parent ed57bfe3ac
commit 14ce63f7dc
20 changed files with 144 additions and 148 deletions

View File

@@ -228,7 +228,7 @@ func newSilenceACLFromConfig(cfg config.SilenceACLRule) (*silenceACL, error) {
if filter.NameRegex != "" {
re, err := regex.CompileAnchored(filter.NameRegex)
if err != nil {
return nil, fmt.Errorf("invalid ACL rule, failed to parse name_re %q: %s", filter.NameRegex, err)
return nil, fmt.Errorf("invalid ACL rule, failed to parse name_re %q: %w", filter.NameRegex, err)
}
f.NameRegex = re
}
@@ -236,7 +236,7 @@ func newSilenceACLFromConfig(cfg config.SilenceACLRule) (*silenceACL, error) {
if filter.ValueRegex != "" {
re, err := regex.CompileAnchored(filter.ValueRegex)
if err != nil {
return nil, fmt.Errorf("invalid ACL rule, failed to parse value_re %q: %s", filter.ValueRegex, err)
return nil, fmt.Errorf("invalid ACL rule, failed to parse value_re %q: %w", filter.ValueRegex, err)
}
f.ValueRegex = re
}
@@ -270,7 +270,7 @@ func newSilenceACLFromConfig(cfg config.SilenceACLRule) (*silenceACL, error) {
if matcherConfig.NameRegex != "" {
re, err := regex.CompileAnchored(matcherConfig.NameRegex)
if err != nil {
return nil, fmt.Errorf("invalid ACL rule, failed to parse name_re %q: %s", matcherConfig.NameRegex, err)
return nil, fmt.Errorf("invalid ACL rule, failed to parse name_re %q: %w", matcherConfig.NameRegex, err)
}
m.NameRegex = re
}
@@ -278,7 +278,7 @@ func newSilenceACLFromConfig(cfg config.SilenceACLRule) (*silenceACL, error) {
if matcherConfig.ValueRegex != "" {
re, err := regex.CompileAnchored(matcherConfig.ValueRegex)
if err != nil {
return nil, fmt.Errorf("invalid ACL rule, failed to parse value_re %q: %s", matcherConfig.ValueRegex, err)
return nil, fmt.Errorf("invalid ACL rule, failed to parse value_re %q: %w", matcherConfig.ValueRegex, err)
}
m.ValueRegex = re
}

View File

@@ -261,7 +261,7 @@ func countAlerts(uri string, timeout time.Duration, labels map[string]string) (r
RoundTripper: http.DefaultTransport,
})
if err != nil {
return nil, fmt.Errorf("failed to create Prometheus API client: %v", err)
return nil, fmt.Errorf("failed to create Prometheus API client: %w", err)
}
v1api := v1.NewAPI(client)
@@ -274,7 +274,7 @@ func countAlerts(uri string, timeout time.Duration, labels map[string]string) (r
time.Now().Add(time.Minute*-5),
time.Now())
if err != nil {
return nil, fmt.Errorf("failed to query Prometheus for label names: %s", err)
return nil, fmt.Errorf("failed to query Prometheus for label names: %w", err)
}
r := v1.Range{
@@ -299,7 +299,7 @@ func countAlerts(uri string, timeout time.Duration, labels map[string]string) (r
result, _, err := v1api.QueryRange(ctx, q, r)
if err != nil {
return nil, fmt.Errorf("failed to run a range query Prometheus for alerts: %v", err)
return nil, fmt.Errorf("failed to run a range query Prometheus for alerts: %w", err)
}
if samples, ok := result.(model.Matrix); ok {

View File

@@ -476,7 +476,7 @@ func TestAlertHistory(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
mockConfig()
mockConfig(t.Setenv)
hp := newHistoryPoller(1, time.Second*5)
r := testRouter()

View File

@@ -787,7 +787,7 @@ func TestVerifyAllGroups(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing API using mock files from Alertmanager %s", version)
mockAlerts(version)
@@ -950,7 +950,7 @@ var sortTests = []sortTest{
}
func TestSortOrder(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
config.Config.Grid.Sorting.Order = "label"
config.Config.Grid.Sorting.Label = "cluster"
config.Config.Grid.Sorting.CustomValues.Labels = map[string]map[string]string{}
@@ -1068,7 +1068,7 @@ func TestStripLabels(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing API using mock files from Alertmanager %s", version)
mockAlerts(version)

View File

@@ -62,7 +62,7 @@ func TestCustomizationAssets(t *testing.T) {
},
}
mockConfig()
mockConfig(t.Setenv)
for i, staticFileTest := range customizationAssetsTests {
t.Run(fmt.Sprintf("%d/%s", i, staticFileTest.path), func(t *testing.T) {
config.Config.Custom.CSS = staticFileTest.customCSS
@@ -90,7 +90,7 @@ func TestCustomizationAssets(t *testing.T) {
}
func TestStaticExpires404(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
@@ -103,7 +103,7 @@ func TestStaticExpires404(t *testing.T) {
}
func TestAssetFallbackMIME(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/static/js/App.tsx", nil)
@@ -162,7 +162,7 @@ func TestStaticFiles(t *testing.T) {
},
}
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
for _, staticFileTest := range staticFileTests {
@@ -223,9 +223,9 @@ func TestStaticFilesPrefix(t *testing.T) {
},
}
os.Setenv("LISTEN_PREFIX", "/sub")
t.Setenv("LISTEN_PREFIX", "/sub")
defer os.Unsetenv("LISTEN_PREFIX")
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
for _, staticFileTest := range staticFilePrefixTests {

View File

@@ -79,7 +79,7 @@ var autocompleteTests = []autocompleteTest{
}
func TestLabelAutocomplete(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing labels autocomplete using mock files from Alertmanager %s", version)
mockAlerts(version)

View File

@@ -105,7 +105,7 @@ func BenchmarkCompressionAndDecompression(b *testing.B) {
func BenchmarkPullAlerts(b *testing.B) {
zerolog.SetGlobalLevel(zerolog.FatalLevel)
mockConfig()
mockConfig(b.Setenv)
for _, version := range mock.ListAllMocks() {
version := version
b.Run(version, func(b *testing.B) {
@@ -134,7 +134,7 @@ func BenchmarkAlertsAPIMisses(b *testing.B) {
b.FailNow()
}
mockConfig()
mockConfig(b.Setenv)
for _, version := range mock.ListAllMocks() {
mockAlerts(version)
r := testRouter()
@@ -161,7 +161,7 @@ func BenchmarkAlertsAPIMisses(b *testing.B) {
func BenchmarkAlertsAPIMissesAutoGrid(b *testing.B) {
zerolog.SetGlobalLevel(zerolog.FatalLevel)
mockConfig()
mockConfig(b.Setenv)
for _, version := range mock.ListAllMocks() {
mockAlerts(version)
r := testRouter()
@@ -209,7 +209,7 @@ func BenchmarkAlertsAPIHits(b *testing.B) {
b.FailNow()
}
mockConfig()
mockConfig(b.Setenv)
for _, version := range mock.ListAllMocks() {
mockAlerts(version)
r := testRouter()

View File

@@ -202,7 +202,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': %w", s.Name, uri.SanitizeURI(s.URI), err)
}
}
@@ -233,11 +233,11 @@ func setupUpstreams() error {
alertmanager.WithHealthchecksVisible(s.Healthcheck.Visible),
)
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': %w", 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': %w", s.Name, uri.SanitizeURI(s.URI), err)
}
}
@@ -312,7 +312,7 @@ func loadTemplates() error {
var t *template.Template
t, err := template.ParseFS(ui.StaticFiles, "build/index.html")
if err != nil {
return fmt.Errorf("failed to load template: %s", err)
return fmt.Errorf("failed to load template: %w", err)
}
indexTemplate = t
return nil
@@ -369,7 +369,7 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*chi.Mux, *historyPoller, err
}
re, err := regexp.Compile(rule.Regex)
if err != nil {
return nil, nil, fmt.Errorf("invalid link detect rule '%s': %s", rule.Regex, err)
return nil, nil, fmt.Errorf("invalid link detect rule '%s': %w", rule.Regex, err)
}
linkDetectRules = append(linkDetectRules, models.LinkDetectRule{Regex: re, URITemplate: rule.URITemplate})
}
@@ -398,7 +398,7 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*chi.Mux, *historyPoller, err
for i, cfg := range aclConfig.Rules {
acl, err := newSilenceACLFromConfig(cfg)
if err != nil {
return nil, nil, fmt.Errorf("invalid silence ACL rule at position %d: %s", i, err)
return nil, nil, fmt.Errorf("invalid silence ACL rule at position %d: %w", i, err)
}
silenceACLs = append(silenceACLs, acl)
}
@@ -441,7 +441,7 @@ func writePidFile() error {
pid := os.Getpid()
err := os.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: %w", err)
}
}
return nil
@@ -452,7 +452,7 @@ func removePidFile() error {
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: %w", err)
}
}
return nil
@@ -534,7 +534,7 @@ func serve(errorHandling pflag.ErrorHandling) error {
defer cancel()
if err := httpServer.Shutdown(ctx); err != nil {
_ = removePidFile()
return fmt.Errorf("shutdown error: %s", err)
return fmt.Errorf("shutdown error: %w", err)
}
log.Info().Msg("HTTP server shut down")

View File

@@ -35,7 +35,7 @@ func TestLogConfig(t *testing.T) {
}
func TestMetrics(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/metrics", nil)

View File

@@ -33,10 +33,10 @@ func mimeJSON(w http.ResponseWriter) {
w.Header().Set("Content-Type", "application/json")
}
func badRequestJSON(w http.ResponseWriter, error string) {
func badRequestJSON(w http.ResponseWriter, err string) {
mimeJSON(w)
w.WriteHeader(http.StatusBadRequest)
out, _ := json.Marshal(map[string]string{"error": error})
out, _ := json.Marshal(map[string]string{"error": err})
_, _ = w.Write(out)
}
@@ -72,11 +72,11 @@ func compressResponse(data []byte, gz io.WriteCloser) ([]byte, error) {
_, err := gz.Write(data)
if err != nil {
return nil, fmt.Errorf("failed to compress data: %s", err.Error())
return nil, fmt.Errorf("failed to compress data: %w", err)
}
if err = gz.Close(); err != nil {
return nil, fmt.Errorf("failed to close compression writer: %s", err.Error())
return nil, fmt.Errorf("failed to close compression writer: %w", err)
}
compressed := b.Bytes()
@@ -93,11 +93,11 @@ func compressResponse(data []byte, gz io.WriteCloser) ([]byte, error) {
func decompressCachedResponse(r io.Reader) ([]byte, error) {
z, err := gzip.NewReader(r)
if err != nil {
return nil, fmt.Errorf("failed to created new compression reader: %s", err.Error())
return nil, fmt.Errorf("failed to created new compression reader: %w", err)
}
p, err := io.ReadAll(z)
if err != nil {
return nil, fmt.Errorf("failed to decompress data: %s", err.Error())
return nil, fmt.Errorf("failed to decompress data: %w", err)
}
z.Close()
return p, nil

View File

@@ -35,10 +35,12 @@ import (
var upstreamSetup = false
func mockConfig() {
type setenvFunc func(key, val string)
func mockConfig(setenv setenvFunc) {
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
os.Setenv("ALERTMANAGER_URI", "http://localhost")
os.Setenv("LABELS_COLOR_UNIQUE", "alertname @receiver @alertmanager @cluster")
setenv("ALERTMANAGER_URI", "http://localhost")
setenv("LABELS_COLOR_UNIQUE", "alertname @receiver @alertmanager @cluster")
f := pflag.NewFlagSet(".", pflag.ExitOnError)
config.SetupFlags(f)
@@ -68,7 +70,7 @@ func testRouter() *chi.Mux {
}
func TestHealth(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/health", nil)
@@ -80,7 +82,7 @@ func TestHealth(t *testing.T) {
}
func TestRobots(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/robots.txt", nil)
@@ -92,7 +94,7 @@ func TestRobots(t *testing.T) {
}
func TestVersion(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/version", nil)
@@ -104,9 +106,9 @@ func TestVersion(t *testing.T) {
}
func TestHealthPrefix(t *testing.T) {
os.Setenv("LISTEN_PREFIX", "/prefix")
t.Setenv("LISTEN_PREFIX", "/prefix")
defer os.Unsetenv("LISTEN_PREFIX")
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", "/prefix/health", nil)
@@ -196,9 +198,9 @@ func TestIndex(t *testing.T) {
for _, tc := range testCases {
t.Run(fmt.Sprintf("prefix=%s request=%s status=%d", tc.prefix, tc.request, tc.status), func(t *testing.T) {
os.Setenv("LISTEN_PREFIX", tc.prefix)
t.Setenv("LISTEN_PREFIX", tc.prefix)
defer os.Unsetenv("LISTEN_PREFIX")
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("GET", tc.request, nil)
@@ -254,7 +256,7 @@ func TestAlerts(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing alerts using mock files from Alertmanager %s", version)
mockAlerts(version)
@@ -325,7 +327,7 @@ func TestAlerts(t *testing.T) {
}
func TestAlertsBadRequest(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing alerts using mock files from Alertmanager %s", version)
mockAlerts(version)
@@ -355,7 +357,7 @@ func TestAlertsLimitFallback(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
config.Config.UI.AlertsPerGroup = 1
for _, version := range mock.ListAllMocks() {
t.Logf("Testing alerts using mock files from Alertmanager %s", version)
@@ -542,7 +544,7 @@ func TestGrids(t *testing.T) {
},
}
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
version := version
for _, testCase := range testCases {
@@ -609,7 +611,7 @@ func TestValidateAllAlerts(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Validating alerts.json response using mock files from Alertmanager %s", version)
mockAlerts(version)
@@ -791,7 +793,7 @@ var acTests = []acTestCase{
}
func TestAutocomplete(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
for _, version := range mock.ListAllMocks() {
t.Logf("Testing autocomplete using mock files from Alertmanager %s", version)
mockAlerts(version)
@@ -838,7 +840,7 @@ func TestAutocomplete(t *testing.T) {
}
func TestGzipMiddleware(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
paths := []string{"/", "/alertList.json", "/autocomplete.json", "/metrics"}
@@ -865,7 +867,7 @@ func TestGzipMiddleware(t *testing.T) {
}
func TestGzipMiddlewareWithoutAcceptEncoding(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
paths := []string{"/", "/alertList.json", "/autocomplete.json", "/metrics"}
@@ -1027,7 +1029,7 @@ func TestSilences(t *testing.T) {
},
}
mockConfig()
mockConfig(t.Setenv)
for _, testCase := range silenceTestCases {
for _, version := range mock.ListAllMocks() {
t.Logf("Validating silences.json response using mock files from Alertmanager %s", version)
@@ -1063,7 +1065,7 @@ func TestSilences(t *testing.T) {
}
func TestCORS(t *testing.T) {
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("OPTIONS", "/alerts.json", nil)
@@ -1086,7 +1088,7 @@ func TestEmptySettings(t *testing.T) {
t.FailNow()
}
mockConfig()
mockConfig(t.Setenv)
r := testRouter()
setupRouter(r, nil)
req := httptest.NewRequest("POST", "/alerts.json", bytes.NewReader(payload))
@@ -3241,7 +3243,7 @@ func TestAutoGrid(t *testing.T) {
config.Config.Grid.Auto.Order = []string{}
}()
mockConfig()
mockConfig(t.Setenv)
for _, tc := range testCases {
config.Config.Grid.Auto.Ignore = tc.ignore
config.Config.Grid.Auto.Order = tc.order
@@ -3389,7 +3391,7 @@ func TestGridLimit(t *testing.T) {
config.Config.Grid.GroupLimit = 50
}()
mockConfig()
mockConfig(t.Setenv)
for _, tc := range testCases {
if tc.groupLimit > 0 {
config.Config.Grid.GroupLimit = tc.groupLimit
@@ -3640,7 +3642,7 @@ func TestAlertList(t *testing.T) {
},
}
mockConfig()
mockConfig(t.Setenv)
for _, tc := range testCases {
for _, version := range mock.ListAllMocks() {
t.Run(fmt.Sprintf("%s:%s", version, tc.args), func(t *testing.T) {
@@ -3973,7 +3975,7 @@ func TestLabelSettings(t *testing.T) {
}()
for i, tc := range testCases {
mockConfig()
mockConfig(t.Setenv)
t.Logf("Testing alerts using mock files from Alertmanager %s", version)
mockAlerts(version)
config.Config.Labels.Color.Static = tc.static

22
go.mod
View File

@@ -4,41 +4,30 @@ go 1.17
require (
github.com/Masterminds/semver/v3 v3.1.1
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
github.com/beme/abide v0.0.0-20190723115211-635a09831760
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08
github.com/fvbommel/sortorder v1.0.2
github.com/getsentry/sentry-go v0.11.0
github.com/go-chi/chi/v5 v5.0.5
github.com/go-chi/cors v1.2.0
github.com/go-openapi/analysis v0.21.1 // indirect
github.com/go-openapi/errors v0.20.1
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/runtime v0.21.0
github.com/go-openapi/strfmt v0.21.0
github.com/go-openapi/swag v0.19.15
github.com/go-openapi/validate v0.20.3
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.6
github.com/hashicorp/golang-lru v0.5.4
github.com/jarcoal/httpmock v1.0.8
github.com/knadh/koanf v1.3.2
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mitchellh/mapstructure v1.4.2
github.com/pmezard/go-difflib v1.0.0
github.com/prometheus/client_golang v1.11.0
github.com/prometheus/common v0.32.1
github.com/prometheus/procfs v0.7.3 // indirect
github.com/prymitive/randomcolor v0.0.0-20210705210145-26c3401033a6
github.com/rogpeppe/go-internal v1.8.0
github.com/rs/zerolog v1.26.0
github.com/spf13/pflag v1.0.5
go.mongodb.org/mongo-driver v1.7.3 // indirect
go.uber.org/automaxprocs v1.4.0
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3 // indirect
golang.org/x/sys v0.0.0-20211031064116-611d5d643895 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/go-playground/colors.v1 v1.2.0
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
)
@@ -46,15 +35,20 @@ require (
require (
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
github.com/go-openapi/analysis v0.21.1 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/loads v0.21.0 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
@@ -64,7 +58,13 @@ require (
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/sergi/go-diff v1.0.0 // indirect
go.mongodb.org/mongo-driver v1.7.4 // indirect
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3 // indirect
golang.org/x/sys v0.0.0-20211102192858-4dd72447c267 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/errgo.v2 v2.1.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

14
go.sum
View File

@@ -60,6 +60,7 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:l
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/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg=
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
@@ -158,6 +159,7 @@ github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk=
github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
github.com/go-openapi/analysis v0.20.1 h1:zdVbw8yoD4SWZeq+cWdGgquaB0W4VrsJvDJHJND/Ktc=
github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
github.com/go-openapi/analysis v0.21.1 h1:krcNCEvCttpSUFBPOrfvn7nniejvrOkoNYRlZwQFpEs=
github.com/go-openapi/analysis v0.21.1/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY=
@@ -306,6 +308,7 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
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/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
@@ -435,6 +438,7 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
@@ -531,6 +535,7 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
@@ -617,6 +622,8 @@ go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4S
go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw=
go.mongodb.org/mongo-driver v1.7.3 h1:G4l/eYY9VrQAK/AUgkV0koQKzQnyddnWxrd/Etf0jIs=
go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
go.mongodb.org/mongo-driver v1.7.4 h1:sllcioag8Mec0LYkftYWq+cKNPIR4Kqq3iv9ZXY0g/E=
go.mongodb.org/mongo-driver v1.7.4/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -711,6 +718,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3 h1:VrJZAjbekhoRn7n5FBujY31gboH+iB3pdLxn3gE9FjU=
golang.org/x/net v0.0.0-20211101193420-4a448f8816b3/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -783,9 +791,10 @@ golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211031064116-611d5d643895 h1:iaNpwpnrgL5jzWS0vCNnfa8HqzxveCFpFx3uC/X4Tps=
golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211102192858-4dd72447c267 h1:7zYaz3tjChtpayGDzu6H0hDAUM5zIGA2XW7kRNgQ0jc=
golang.org/x/sys v0.0.0-20211102192858-4dd72447c267/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -935,6 +944,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=

View File

@@ -1,7 +1,6 @@
package alertmanager_test
import (
"os"
"testing"
"github.com/prymitive/karma/internal/alertmanager"
@@ -34,8 +33,8 @@ func BenchmarkDedupAutocomplete(b *testing.B) {
}
func BenchmarkDedupColors(b *testing.B) {
os.Setenv("LABELS_COLOR_UNIQUE", "cluster instance @receiver")
os.Setenv("ALERTMANAGER_URI", "http://localhost")
b.Setenv("LABELS_COLOR_UNIQUE", "cluster instance @receiver")
b.Setenv("ALERTMANAGER_URI", "http://localhost")
f := pflag.NewFlagSet(".", pflag.ExitOnError)
config.SetupFlags(f)

View File

@@ -2,7 +2,6 @@ package alertmanager_test
import (
"fmt"
"os"
"strings"
"testing"
"time"
@@ -96,7 +95,7 @@ func TestDedupAlertsWithoutLabels(t *testing.T) {
}
func TestDedupSilences(t *testing.T) {
os.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
mockConfigRead()
if err := pullAlerts(); err != nil {
t.Error(err)
@@ -129,8 +128,8 @@ func TestDedupAutocomplete(t *testing.T) {
}
func TestDedupColors(t *testing.T) {
os.Setenv("LABELS_COLOR_UNIQUE", "cluster instance @receiver")
os.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("LABELS_COLOR_UNIQUE", "cluster instance @receiver")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
mockConfigRead()
if err := pullAlerts(); err != nil {
t.Error(err)
@@ -143,7 +142,7 @@ func TestDedupColors(t *testing.T) {
}
func TestDedupKnownLabels(t *testing.T) {
os.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
mockConfigRead()
if err := pullAlerts(); err != nil {
t.Error(err)
@@ -156,7 +155,7 @@ func TestDedupKnownLabels(t *testing.T) {
}
func TestDedupKnownLabelValues(t *testing.T) {
os.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
mockConfigRead()
if err := pullAlerts(); err != nil {
t.Error(err)
@@ -169,8 +168,8 @@ func TestDedupKnownLabelValues(t *testing.T) {
}
func TestStripReceivers(t *testing.T) {
os.Setenv("RECEIVERS_STRIP", "by-name by-cluster-service")
os.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("RECEIVERS_STRIP", "by-name by-cluster-service")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
mockConfigRead()
if err := pullAlerts(); err != nil {
t.Error(err)

View File

@@ -51,14 +51,14 @@ func ReadSilenceACLConfig(path string) (*SilencesACLSchema, error) {
f, err := os.Open(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: %w", path, err)
}
d := yaml.NewDecoder(f)
d.KnownFields(true)
err = d.Decode(&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: %w", path, err)
}
return &cfg, nil

View File

@@ -184,7 +184,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: %w", configFile, err)
}
return configFile, nil
}
@@ -291,12 +291,12 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
DecoderConfig: &dConf,
})
if err != nil {
return "", fmt.Errorf("failed to unmarshal configuration: %v", err)
return "", fmt.Errorf("failed to unmarshal configuration: %w", 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: %w", configFileUsed, err)
}
}
@@ -311,7 +311,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
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: %w", err)
}
if config.Authentication.Header.Name == "" {
return "", fmt.Errorf("authentication.header.name is required when authentication.header.value_re is set")
@@ -322,7 +322,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
if config.Authentication.Header.GroupValueRegex != "" {
_, err = regex.CompileAnchored(config.Authentication.Header.GroupValueRegex)
if err != nil {
return "", fmt.Errorf("invalid regex for authentication.header.group_value_re: %s", err.Error())
return "", fmt.Errorf("invalid regex for authentication.header.group_value_re: %w", err)
}
if config.Authentication.Header.GroupName == "" {
return "", fmt.Errorf("authentication.header.group_name is required when authentication.header.group_value_re is set")
@@ -373,7 +373,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
for i, keepRegex := range config.Labels.KeepRegex {
config.Labels.CompiledKeepRegex[i], err = regex.CompileAnchored(keepRegex)
if err != nil {
return "", fmt.Errorf("keep regex rule '%s' is invalid: %s", keepRegex, err)
return "", fmt.Errorf("keep regex rule '%s' is invalid: %w", keepRegex, err)
}
}
@@ -381,7 +381,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
for i, stripRegex := range config.Labels.StripRegex {
config.Labels.CompiledStripRegex[i], err = regex.CompileAnchored(stripRegex)
if err != nil {
return "", fmt.Errorf("strip regex rule '%s' is invalid: %s", stripRegex, err)
return "", fmt.Errorf("strip regex rule '%s' is invalid: %w", stripRegex, err)
}
}
@@ -389,7 +389,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
for i, valueOnlyRegex := range config.Labels.ValueOnlyRegex {
config.Labels.CompiledValueOnlyRegex[i], err = regex.CompileAnchored(valueOnlyRegex)
if err != nil {
return "", fmt.Errorf("valueOnly regex rule '%s' is invalid: %s", valueOnlyRegex, err)
return "", fmt.Errorf("valueOnly regex rule '%s' is invalid: %w", valueOnlyRegex, err)
}
}
@@ -401,7 +401,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
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: %w", customColor.ValueRegex, labelName, err)
}
}
}
@@ -434,7 +434,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) {
for i := 0; i < len(config.History.Rewrite); i++ {
config.History.Rewrite[i].SourceRegex, err = regex.CompileAnchored(config.History.Rewrite[i].Source)
if err != nil {
return "", fmt.Errorf("history.rewrite source regex %q is invalid: %v", config.History.Rewrite[i].Source, err)
return "", fmt.Errorf("history.rewrite source regex %q is invalid: %w", config.History.Rewrite[i].Source, err)
}
}

View File

@@ -3,7 +3,6 @@ package config
import (
"bytes"
"io"
"os"
"regexp"
"testing"
"time"
@@ -18,10 +17,6 @@ import (
yaml "gopkg.in/yaml.v3"
)
func resetEnv() {
os.Clearenv()
}
func testReadConfig(t *testing.T) {
expectedConfig := `authentication:
header:
@@ -200,42 +195,40 @@ func mockConfigRead() (string, error) {
}
func TestReadConfig(t *testing.T) {
resetEnv()
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
os.Setenv("ALERTMANAGER_INTERVAL", "1s")
os.Setenv("ALERTMANAGER_URI", "http://localhost")
os.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://example.com")
os.Setenv("ANNOTATIONS_DEFAULT_HIDDEN", "true")
os.Setenv("ANNOTATIONS_VISIBLE", "summary")
os.Setenv("CUSTOM_CSS", "/custom.css")
os.Setenv("CUSTOM_JS", "/custom.js")
os.Setenv("DEBUG", "true")
os.Setenv("FILTERS_DEFAULT", "@state=active foo=bar")
os.Setenv("KARMA_NAME", "another karma")
os.Setenv("LABELS_COLOR_STATIC", "a bb ccc")
os.Setenv("LABELS_COLOR_UNIQUE", "f gg")
os.Setenv("LABELS_KEEP", "foo bar")
os.Setenv("LABELS_KEEP_RE", "fo+ ba.")
os.Setenv("LABELS_STRIP", "abc def")
os.Setenv("LABELS_STRIP_RE", "g.*")
os.Setenv("LABELS_VALUEONLY_RE", "fo+ .ar")
os.Setenv("LISTEN_ADDRESS", "0.0.0.0")
os.Setenv("LISTEN_PORT", "80")
os.Setenv("SENTRY_PRIVATE", "secret key")
os.Setenv("SENTRY_PUBLIC", "public key")
t.Setenv("ALERTMANAGER_INTERVAL", "1s")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://example.com")
t.Setenv("ANNOTATIONS_DEFAULT_HIDDEN", "true")
t.Setenv("ANNOTATIONS_VISIBLE", "summary")
t.Setenv("CUSTOM_CSS", "/custom.css")
t.Setenv("CUSTOM_JS", "/custom.js")
t.Setenv("DEBUG", "true")
t.Setenv("FILTERS_DEFAULT", "@state=active foo=bar")
t.Setenv("KARMA_NAME", "another karma")
t.Setenv("LABELS_COLOR_STATIC", "a bb ccc")
t.Setenv("LABELS_COLOR_UNIQUE", "f gg")
t.Setenv("LABELS_KEEP", "foo bar")
t.Setenv("LABELS_KEEP_RE", "fo+ ba.")
t.Setenv("LABELS_STRIP", "abc def")
t.Setenv("LABELS_STRIP_RE", "g.*")
t.Setenv("LABELS_VALUEONLY_RE", "fo+ .ar")
t.Setenv("LISTEN_ADDRESS", "0.0.0.0")
t.Setenv("LISTEN_PORT", "80")
t.Setenv("SENTRY_PRIVATE", "secret key")
t.Setenv("SENTRY_PUBLIC", "public key")
_, _ = mockConfigRead()
testReadConfig(t)
}
func TestReadSimpleConfig(t *testing.T) {
resetEnv()
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
os.Setenv("ALERTMANAGER_URI", "http://localhost")
os.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://localhost:9090")
os.Setenv("ALERTMANAGER_NAME", "single")
os.Setenv("ALERTMANAGER_TIMEOUT", "15s")
os.Setenv("ALERTMANAGER_PROXY", "true")
os.Setenv("ALERTMANAGER_INTERVAL", "3m")
t.Setenv("ALERTMANAGER_URI", "http://localhost")
t.Setenv("ALERTMANAGER_EXTERNAL_URI", "http://localhost:9090")
t.Setenv("ALERTMANAGER_NAME", "single")
t.Setenv("ALERTMANAGER_TIMEOUT", "15s")
t.Setenv("ALERTMANAGER_PROXY", "true")
t.Setenv("ALERTMANAGER_INTERVAL", "3m")
_, _ = mockConfigRead()
if len(Config.Alertmanager.Servers) != 1 {
t.Errorf("Expected 1 Alertmanager server, got %d", len(Config.Alertmanager.Servers))
@@ -306,8 +299,7 @@ func TestLogValues(t *testing.T) {
}
func TestInvalidGridSortingOrder(t *testing.T) {
resetEnv()
os.Setenv("GRID_SORTING_ORDER", "foo")
t.Setenv("GRID_SORTING_ORDER", "foo")
_, err := mockConfigRead()
if err == nil {
@@ -316,8 +308,7 @@ func TestInvalidGridSortingOrder(t *testing.T) {
}
func TestInvalidUICollapseGroups(t *testing.T) {
resetEnv()
os.Setenv("UI_COLLAPSEGROUPS", "foo")
t.Setenv("UI_COLLAPSEGROUPS", "foo")
_, err := mockConfigRead()
if err == nil {
@@ -326,8 +317,7 @@ func TestInvalidUICollapseGroups(t *testing.T) {
}
func TestInvalidUITheme(t *testing.T) {
resetEnv()
os.Setenv("UI_THEME", "foo")
t.Setenv("UI_THEME", "foo")
_, err := mockConfigRead()
if err == nil {
@@ -336,8 +326,7 @@ func TestInvalidUITheme(t *testing.T) {
}
func TestInvalidCORSCredentials(t *testing.T) {
resetEnv()
os.Setenv("ALERTMANAGER_CORS_CREDENTIALS", "foo")
t.Setenv("ALERTMANAGER_CORS_CREDENTIALS", "foo")
_, err := mockConfigRead()
if err == nil {
@@ -346,8 +335,7 @@ func TestInvalidCORSCredentials(t *testing.T) {
}
func TestInvalidKeepRegex(t *testing.T) {
resetEnv()
os.Setenv("LABELS_KEEP_RE", "fo**")
t.Setenv("LABELS_KEEP_RE", "fo**")
_, err := mockConfigRead()
if err == nil {
@@ -356,8 +344,7 @@ func TestInvalidKeepRegex(t *testing.T) {
}
func TestInvalidStripRegex(t *testing.T) {
resetEnv()
os.Setenv("LABELS_STRIP_RE", "fo**")
t.Setenv("LABELS_STRIP_RE", "fo**")
_, err := mockConfigRead()
if err == nil {
@@ -366,7 +353,6 @@ func TestInvalidStripRegex(t *testing.T) {
}
func TestDefaultConfig(t *testing.T) {
resetEnv()
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
_, _ = mockConfigRead()

View File

@@ -45,7 +45,7 @@ func (r *HTTPURIReader) Read(uri string, headers map[string]string) (io.ReadClos
case "gzip":
reader, err = gzip.NewReader(resp.Body)
if err != nil {
return nil, fmt.Errorf("failed to decode gzipped content: %s", err.Error())
return nil, fmt.Errorf("failed to decode gzipped content: %w", err)
}
default:
reader = resp.Body

View File

@@ -39,7 +39,7 @@ $(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 --timeout 5m -E staticcheck,misspell,promlinter,revive
$(ENV) golangci-lint run -v --timeout 5m -E staticcheck,misspell,promlinter,revive,tenv,errorlint,exportloopref,predeclared
.PHONY: format-go
format-go: