diff --git a/.circleci/config.yml b/.circleci/config.yml index e1170c4998d..fa21f4bcae8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -815,7 +815,7 @@ jobs: # To save memory, run in two batches golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E deadcode -E depguard -E dogsled \ -E errcheck -E goconst -E golint -E gosec -E gosimple -E govet -E exportloopref -E whitespace ./pkg/... - golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E ineffassign \ + golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E ineffassign -E gocritic \ -E rowserrcheck -E staticcheck -E structcheck -E typecheck -E unconvert -E unused -E varcheck ./pkg/... ./scripts/go/bin/revive -formatter stylish -config ./scripts/go/configs/revive.toml ./pkg/... ./scripts/go/bin/revive -formatter stylish -config ./scripts/go/configs/revive-strict.toml \ diff --git a/pkg/api/dtos/alerting.go b/pkg/api/dtos/alerting.go index b1b634ea7b9..e67f39e8dc0 100644 --- a/pkg/api/dtos/alerting.go +++ b/pkg/api/dtos/alerting.go @@ -38,7 +38,7 @@ func formatShort(interval time.Duration) string { result += fmt.Sprintf("%dm", mins) } - remaining = remaining - (mins * time.Minute) + remaining -= (mins * time.Minute) seconds := remaining / time.Second if seconds > 0 { result += fmt.Sprintf("%ds", seconds) diff --git a/pkg/api/dtos/models.go b/pkg/api/dtos/models.go index af3d4faafc4..4184dec9b58 100644 --- a/pkg/api/dtos/models.go +++ b/pkg/api/dtos/models.go @@ -12,6 +12,8 @@ import ( "github.com/grafana/grafana/pkg/setting" ) +var regNonAlphaNumeric = regexp.MustCompile("[^a-zA-Z0-9]+") + type AnyId struct { Id int64 `json:"id"` } @@ -73,13 +75,7 @@ func GetGravatarUrlWithDefault(text string, defaultText string) string { return GetGravatarUrl(text) } - reg, err := regexp.Compile("[^a-zA-Z0-9]+") - - if err != nil { - return "" - } - - text = reg.ReplaceAllString(defaultText, "") + "@localhost" + text = regNonAlphaNumeric.ReplaceAllString(defaultText, "") + "@localhost" return GetGravatarUrl(text) } diff --git a/pkg/api/pluginproxy/ds_proxy.go b/pkg/api/pluginproxy/ds_proxy.go index 000fa50b7ba..69fe4a999a1 100644 --- a/pkg/api/pluginproxy/ds_proxy.go +++ b/pkg/api/pluginproxy/ds_proxy.go @@ -159,19 +159,20 @@ func (proxy *DataSourceProxy) getDirector() func(req *http.Request) { reqQueryVals := req.URL.Query() - if proxy.ds.Type == models.DS_INFLUXDB_08 { + switch proxy.ds.Type { + case models.DS_INFLUXDB_08: req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, "db/"+proxy.ds.Database+"/"+proxy.proxyPath) reqQueryVals.Add("u", proxy.ds.User) reqQueryVals.Add("p", proxy.ds.DecryptedPassword()) req.URL.RawQuery = reqQueryVals.Encode() - } else if proxy.ds.Type == models.DS_INFLUXDB { + case models.DS_INFLUXDB: req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, proxy.proxyPath) req.URL.RawQuery = reqQueryVals.Encode() if !proxy.ds.BasicAuth { req.Header.Del("Authorization") req.Header.Add("Authorization", util.GetBasicAuthHeader(proxy.ds.User, proxy.ds.DecryptedPassword())) } - } else { + default: req.URL.Path = util.JoinURLFragments(proxy.targetUrl.Path, proxy.proxyPath) } diff --git a/pkg/api/routing/route_register_test.go b/pkg/api/routing/route_register_test.go index 9b4e4755bcf..e7030d57eab 100644 --- a/pkg/api/routing/route_register_test.go +++ b/pkg/api/routing/route_register_test.go @@ -51,9 +51,7 @@ func TestRouteSimpleRegister(t *testing.T) { } // Setup - rr := NewRouteRegister(func(name string) macaron.Handler { - return emptyHandler(name) - }) + rr := NewRouteRegister(emptyHandler) rr.Delete("/admin", emptyHandler("1")) rr.Get("/down", emptyHandler("1"), emptyHandler("2")) @@ -199,10 +197,7 @@ func TestDuplicateRoutShouldPanic(t *testing.T) { } }() - rr := NewRouteRegister(func(name string) macaron.Handler { - return emptyHandler(name) - }) - + rr := NewRouteRegister(emptyHandler) rr.Get("/api", emptyHandler("1")) rr.Get("/api", emptyHandler("1")) @@ -220,9 +215,7 @@ func TestNamedMiddlewareRouteRegister(t *testing.T) { } // Setup - rr := NewRouteRegister(func(name string) macaron.Handler { - return emptyHandler(name) - }) + rr := NewRouteRegister(emptyHandler) rr.Delete("/admin", emptyHandler("1")) rr.Get("/down", emptyHandler("1"), emptyHandler("2")) diff --git a/pkg/components/dashdiffs/formatter_basic.go b/pkg/components/dashdiffs/formatter_basic.go index 1e89723cc99..0d088fc662e 100644 --- a/pkg/components/dashdiffs/formatter_basic.go +++ b/pkg/components/dashdiffs/formatter_basic.go @@ -212,12 +212,10 @@ func (b *BasicDiff) Basic(lines []*JSONLine) []*BasicBlock { // - if we're not recording a change, then we do nothing, // since the BasicDiff doesn't report on unchanged JSON // values. - } else { - if b.writing { - b.writing = false - b.Summary.LineEnd = line.LineNum - b.Block.Summaries = append(b.Block.Summaries, b.Summary) - } + } else if b.writing { + b.writing = false + b.Summary.LineEnd = line.LineNum + b.Block.Summaries = append(b.Block.Summaries, b.Summary) } } } diff --git a/pkg/components/dashdiffs/formatter_json.go b/pkg/components/dashdiffs/formatter_json.go index cd2bbe15885..d12bf2835f1 100644 --- a/pkg/components/dashdiffs/formatter_json.go +++ b/pkg/components/dashdiffs/formatter_json.go @@ -201,9 +201,8 @@ func (f *JSONFormatter) processArray(array []interface{}, deltas []diff.Delta) e // additional Added for _, delta := range deltas { - switch delta.(type) { - case *diff.Added: - d := delta.(*diff.Added) + d, ok := delta.(*diff.Added) + if ok { // skip items already processed if int(d.Position.(diff.Index)) < len(array) { continue @@ -226,9 +225,9 @@ func (f *JSONFormatter) processObject(object map[string]interface{}, deltas []di // Added for _, delta := range deltas { - switch delta := delta.(type) { - case *diff.Added: - f.printRecursive(delta.Position.String(), delta.Value, ChangeAdded) + d, ok := delta.(*diff.Added) + if ok { + f.printRecursive(d.Position.String(), d.Value, ChangeAdded) } } diff --git a/pkg/components/simplejson/simplejson_go11.go b/pkg/components/simplejson/simplejson_go11.go index 1c479532cf0..fad4cfc540f 100644 --- a/pkg/components/simplejson/simplejson_go11.go +++ b/pkg/components/simplejson/simplejson_go11.go @@ -29,9 +29,9 @@ func NewFromReader(r io.Reader) (*Json, error) { // Float64 coerces into a float64 func (j *Json) Float64() (float64, error) { - switch j.data.(type) { + switch n := j.data.(type) { case json.Number: - return j.data.(json.Number).Float64() + return n.Float64() case float32, float64: return reflect.ValueOf(j.data).Float(), nil case int, int8, int16, int32, int64: @@ -44,10 +44,13 @@ func (j *Json) Float64() (float64, error) { // Int coerces into an int func (j *Json) Int() (int, error) { - switch j.data.(type) { + switch n := j.data.(type) { case json.Number: - i, err := j.data.(json.Number).Int64() - return int(i), err + i, err := n.Int64() + if err != nil { + return 0, err + } + return int(i), nil case float32, float64: return int(reflect.ValueOf(j.data).Float()), nil case int, int8, int16, int32, int64: @@ -60,9 +63,9 @@ func (j *Json) Int() (int, error) { // Int64 coerces into an int64 func (j *Json) Int64() (int64, error) { - switch j.data.(type) { + switch n := j.data.(type) { case json.Number: - return j.data.(json.Number).Int64() + return n.Int64() case float32, float64: return int64(reflect.ValueOf(j.data).Float()), nil case int, int8, int16, int32, int64: @@ -75,9 +78,9 @@ func (j *Json) Int64() (int64, error) { // Uint64 coerces into an uint64 func (j *Json) Uint64() (uint64, error) { - switch j.data.(type) { + switch n := j.data.(type) { case json.Number: - return strconv.ParseUint(j.data.(json.Number).String(), 10, 64) + return strconv.ParseUint(n.String(), 10, 64) case float32, float64: return uint64(reflect.ValueOf(j.data).Float()), nil case int, int8, int16, int32, int64: diff --git a/pkg/infra/usagestats/usage_stats.go b/pkg/infra/usagestats/usage_stats.go index 36f5c4ebe8e..57a4fe021db 100644 --- a/pkg/infra/usagestats/usage_stats.go +++ b/pkg/infra/usagestats/usage_stats.go @@ -70,7 +70,7 @@ func (uss *UsageStatsService) sendUsageStats(oauthProviders map[string]bool) { userCount := statsQuery.Result.Users avgAuthTokensPerUser := statsQuery.Result.AuthTokens if userCount != 0 { - avgAuthTokensPerUser = avgAuthTokensPerUser / userCount + avgAuthTokensPerUser /= userCount } metrics["stats.avg_auth_token_per_user.count"] = avgAuthTokensPerUser diff --git a/pkg/middleware/request_metrics.go b/pkg/middleware/request_metrics.go index 1cd0b82682f..88ab994836e 100644 --- a/pkg/middleware/request_metrics.go +++ b/pkg/middleware/request_metrics.go @@ -43,11 +43,12 @@ func RequestMetrics(handler string) macaron.Handler { duration := time.Since(now).Nanoseconds() / int64(time.Millisecond) metrics.MHttpRequestSummary.WithLabelValues(handler, code, method).Observe(float64(duration)) - if strings.HasPrefix(req.RequestURI, "/api/datasources/proxy") { + switch { + case strings.HasPrefix(req.RequestURI, "/api/datasources/proxy"): countProxyRequests(status) - } else if strings.HasPrefix(req.RequestURI, "/api/") { + case strings.HasPrefix(req.RequestURI, "/api/"): countApiRequests(status) - } else { + default: countPageRequests(status) } } diff --git a/pkg/models/org_user.go b/pkg/models/org_user.go index 4411a7fc8b5..afec8acfaa2 100644 --- a/pkg/models/org_user.go +++ b/pkg/models/org_user.go @@ -48,7 +48,7 @@ func (r *RoleType) UnmarshalJSON(data []byte) error { *r = RoleType(str) - if !(*r).IsValid() { + if !r.IsValid() { if (*r) != "" { return fmt.Errorf("JSON validation error: invalid role value: %s", *r) } diff --git a/pkg/models/user.go b/pkg/models/user.go index 24904a70899..afada014366 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -43,11 +43,11 @@ type User struct { func (u *User) NameOrFallback() string { if u.Name != "" { return u.Name - } else if u.Login != "" { - return u.Login - } else { - return u.Email } + if u.Login != "" { + return u.Login + } + return u.Email } // --------------------- @@ -192,11 +192,11 @@ func (u *SignedInUser) ShouldUpdateLastSeenAt() bool { func (u *SignedInUser) NameOrFallback() string { if u.Name != "" { return u.Name - } else if u.Login != "" { - return u.Login - } else { - return u.Email } + if u.Login != "" { + return u.Login + } + return u.Email } type UpdateUserLastSeenAtCommand struct { diff --git a/pkg/plugins/dashboard_importer.go b/pkg/plugins/dashboard_importer.go index beef921db44..632dbac4e36 100644 --- a/pkg/plugins/dashboard_importer.go +++ b/pkg/plugins/dashboard_importer.go @@ -11,6 +11,8 @@ import ( "github.com/grafana/grafana/pkg/services/dashboards" ) +var varRegex = regexp.MustCompile(`(\$\{.+\})`) + type ImportDashboardCommand struct { Dashboard *simplejson.Json Path string @@ -109,7 +111,6 @@ type DashTemplateEvaluator struct { inputs []ImportDashboardInput variables map[string]string result *simplejson.Json - varRegex *regexp.Regexp } func (this *DashTemplateEvaluator) findInput(varName string, varType string) *ImportDashboardInput { @@ -125,7 +126,6 @@ func (this *DashTemplateEvaluator) findInput(varName string, varType string) *Im func (this *DashTemplateEvaluator) Eval() (*simplejson.Json, error) { this.result = simplejson.New() this.variables = make(map[string]string) - this.varRegex, _ = regexp.Compile(`(\$\{.+\})`) // check that we have all inputs we need for _, inputDef := range this.template.Get("__inputs").MustArray() { @@ -149,7 +149,7 @@ func (this *DashTemplateEvaluator) evalValue(source *simplejson.Json) interface{ switch v := sourceValue.(type) { case string: - interpolated := this.varRegex.ReplaceAllStringFunc(v, func(match string) string { + interpolated := varRegex.ReplaceAllStringFunc(v, func(match string) string { replacement, exists := this.variables[match] if exists { return replacement diff --git a/pkg/services/alerting/conditions/reducer.go b/pkg/services/alerting/conditions/reducer.go index a9b4ce08bfb..4ad28b3056f 100644 --- a/pkg/services/alerting/conditions/reducer.go +++ b/pkg/services/alerting/conditions/reducer.go @@ -36,7 +36,7 @@ func (s *queryReducer) Reduce(series *tsdb.TimeSeries) null.Float { } } if validPointsCount > 0 { - value = value / float64(validPointsCount) + value /= float64(validPointsCount) } case "sum": for _, point := range series.Points { diff --git a/pkg/services/alerting/engine.go b/pkg/services/alerting/engine.go index 5be21b2aed8..76e4bcd8364 100644 --- a/pkg/services/alerting/engine.go +++ b/pkg/services/alerting/engine.go @@ -214,11 +214,12 @@ func (e *AlertEngine) processJob(attemptID int, attemptChan chan int, cancelChan evalContext.Ctx = resultHandleCtx evalContext.Rule.State = evalContext.GetNewState() if err := e.resultHandler.handle(evalContext); err != nil { - if xerrors.Is(err, context.Canceled) { + switch { + case xerrors.Is(err, context.Canceled): e.log.Debug("Result handler returned context.Canceled") - } else if xerrors.Is(err, context.DeadlineExceeded) { + case xerrors.Is(err, context.DeadlineExceeded): e.log.Debug("Result handler returned context.DeadlineExceeded") - } else { + default: e.log.Error("Failed to handle result", "err", err) } } diff --git a/pkg/services/alerting/notifier.go b/pkg/services/alerting/notifier.go index 5f8ea9998d0..533d7866777 100644 --- a/pkg/services/alerting/notifier.go +++ b/pkg/services/alerting/notifier.go @@ -16,6 +16,7 @@ import ( ) // for stubbing in tests +//nolint: gocritic var newImageUploaderProvider = func() (imguploader.ImageUploader, error) { return imguploader.NewImageUploader() } diff --git a/pkg/services/alerting/notifiers/kafka.go b/pkg/services/alerting/notifiers/kafka.go index 7ddc8d40fcd..8783620f6ed 100644 --- a/pkg/services/alerting/notifiers/kafka.go +++ b/pkg/services/alerting/notifiers/kafka.go @@ -85,7 +85,7 @@ func (kn *KafkaNotifier) Notify(evalContext *alerting.EvalContext) error { customData := triggMetrString for _, evt := range evalContext.EvalMatches { - customData = customData + fmt.Sprintf("%s: %v\n", evt.Metric, evt.Value) + customData += fmt.Sprintf("%s: %v\n", evt.Metric, evt.Value) } kn.log.Info("Notifying Kafka", "alert_state", state) diff --git a/pkg/services/alerting/notifiers/line.go b/pkg/services/alerting/notifiers/line.go index 79cc4e0a6c2..e4688c8a6af 100644 --- a/pkg/services/alerting/notifiers/line.go +++ b/pkg/services/alerting/notifiers/line.go @@ -67,13 +67,11 @@ type LineNotifier struct { // Notify send an alert notification to LINE func (ln *LineNotifier) Notify(evalContext *alerting.EvalContext) error { ln.log.Info("Executing line notification", "ruleId", evalContext.Rule.ID, "notification", ln.Name) - - var err error - switch evalContext.Rule.State { - case models.AlertStateAlerting: - err = ln.createAlert(evalContext) + if evalContext.Rule.State == models.AlertStateAlerting { + return ln.createAlert(evalContext) } - return err + + return nil } func (ln *LineNotifier) createAlert(evalContext *alerting.EvalContext) error { diff --git a/pkg/services/alerting/notifiers/opsgenie.go b/pkg/services/alerting/notifiers/opsgenie.go index a5f52a20b5f..177f1c896a9 100644 --- a/pkg/services/alerting/notifiers/opsgenie.go +++ b/pkg/services/alerting/notifiers/opsgenie.go @@ -142,7 +142,7 @@ func (on *OpsGenieNotifier) createAlert(evalContext *alerting.EvalContext) error customData := triggMetrString for _, evt := range evalContext.EvalMatches { - customData = customData + fmt.Sprintf("%s: %v\n", evt.Metric, evt.Value) + customData += fmt.Sprintf("%s: %v\n", evt.Metric, evt.Value) } bodyJSON := simplejson.New() diff --git a/pkg/services/alerting/notifiers/sensu.go b/pkg/services/alerting/notifiers/sensu.go index 4ffa959a97f..b4c9d83a2d2 100644 --- a/pkg/services/alerting/notifiers/sensu.go +++ b/pkg/services/alerting/notifiers/sensu.go @@ -130,11 +130,12 @@ func (sn *SensuNotifier) Notify(evalContext *alerting.EvalContext) error { bodyJSON.Set("output", "Grafana Metric Condition Met") bodyJSON.Set("evalMatches", evalContext.EvalMatches) - if evalContext.Rule.State == "alerting" { + switch evalContext.Rule.State { + case "alerting": bodyJSON.Set("status", 2) - } else if evalContext.Rule.State == "no_data" { + case "no_data": bodyJSON.Set("status", 1) - } else { + default: bodyJSON.Set("status", 0) } diff --git a/pkg/services/alerting/notifiers/telegram.go b/pkg/services/alerting/notifiers/telegram.go index ab7dbdc720e..fdef2464167 100644 --- a/pkg/services/alerting/notifiers/telegram.go +++ b/pkg/services/alerting/notifiers/telegram.go @@ -125,16 +125,16 @@ func (tn *TelegramNotifier) buildMessageLinkedImage(evalContext *alerting.EvalCo ruleURL, err := evalContext.GetRuleURL() if err == nil { - message = message + fmt.Sprintf("URL: %s\n", ruleURL) + message += fmt.Sprintf("URL: %s\n", ruleURL) } if evalContext.ImagePublicURL != "" { - message = message + fmt.Sprintf("Image: %s\n", evalContext.ImagePublicURL) + message += fmt.Sprintf("Image: %s\n", evalContext.ImagePublicURL) } metrics := generateMetricsMessage(evalContext) if metrics != "" { - message = message + fmt.Sprintf("\nMetrics:%s", metrics) + message += fmt.Sprintf("\nMetrics:%s", metrics) } return tn.generateTelegramCmd(message, "text", "sendMessage", func(w *multipart.Writer) { diff --git a/pkg/services/alerting/notifiers/threema.go b/pkg/services/alerting/notifiers/threema.go index 0be9cd695ff..011ed8263ba 100644 --- a/pkg/services/alerting/notifiers/threema.go +++ b/pkg/services/alerting/notifiers/threema.go @@ -177,10 +177,10 @@ func (notifier *ThreemaNotifier) Notify(evalContext *alerting.EvalContext) error evalContext.Rule.Name, evalContext.Rule.Message) ruleURL, err := evalContext.GetRuleURL() if err == nil { - message = message + fmt.Sprintf("*URL:* %s\n", ruleURL) + message += fmt.Sprintf("*URL:* %s\n", ruleURL) } if notifier.NeedsImage() && evalContext.ImagePublicURL != "" { - message = message + fmt.Sprintf("*Image:* %s\n", evalContext.ImagePublicURL) + message += fmt.Sprintf("*Image:* %s\n", evalContext.ImagePublicURL) } data.Set("text", message) diff --git a/pkg/services/alerting/result_handler.go b/pkg/services/alerting/result_handler.go index 1b3af28703d..69067f8a1e3 100644 --- a/pkg/services/alerting/result_handler.go +++ b/pkg/services/alerting/result_handler.go @@ -100,11 +100,12 @@ func (handler *defaultResultHandler) handle(evalContext *EvalContext) error { } if err := handler.notifier.SendIfNeeded(evalContext); err != nil { - if xerrors.Is(err, context.Canceled) { + switch { + case xerrors.Is(err, context.Canceled): handler.log.Debug("handler.notifier.SendIfNeeded returned context.Canceled") - } else if xerrors.Is(err, context.DeadlineExceeded) { + case xerrors.Is(err, context.DeadlineExceeded): handler.log.Debug("handler.notifier.SendIfNeeded returned context.DeadlineExceeded") - } else { + default: handler.log.Error("handler.notifier.SendIfNeeded failed", "err", err) } } diff --git a/pkg/services/alerting/rule.go b/pkg/services/alerting/rule.go index 037e215585e..ac99f53a3d4 100644 --- a/pkg/services/alerting/rule.go +++ b/pkg/services/alerting/rule.go @@ -89,7 +89,7 @@ func getTimeDurationStringToSeconds(str string) (int64, error) { matches := valueFormatRegex.FindAllString(str, 1) - if len(matches) <= 0 { + if len(matches) == 0 { return 0, ErrFrequencyCouldNotBeParsed } diff --git a/pkg/services/guardian/guardian_util_test.go b/pkg/services/guardian/guardian_util_test.go index 11337ba47f4..830ed354a24 100644 --- a/pkg/services/guardian/guardian_util_test.go +++ b/pkg/services/guardian/guardian_util_test.go @@ -190,7 +190,7 @@ func (f permissionFlags) String() string { r = append(r, "") } - return strings.Join(r[:], ", ") + return strings.Join(r, ", ") } func (sc *scenarioContext) reportSuccess() { diff --git a/pkg/services/ldap/ldap.go b/pkg/services/ldap/ldap.go index 9cfae9423c0..88ef898f79b 100644 --- a/pkg/services/ldap/ldap.go +++ b/pkg/services/ldap/ldap.go @@ -173,11 +173,12 @@ func (server *Server) Login(query *models.LoginUserQuery) ( var authAndBind bool // Check if we can use a search user - if server.shouldAdminBind() { + switch { + case server.shouldAdminBind(): if err := server.AdminBind(); err != nil { return nil, err } - } else if server.shouldSingleBind() { + case server.shouldSingleBind(): authAndBind = true err = server.UserBind( server.singleBindDN(query.Username), @@ -186,7 +187,7 @@ func (server *Server) Login(query *models.LoginUserQuery) ( if err != nil { return nil, err } - } else { + default: err := server.Connection.UnauthenticatedBind(server.Config.BindDN) if err != nil { return nil, err @@ -368,7 +369,7 @@ func (server *Server) getSearchRequest( -1, ) - search = search + query + search += query } filter := fmt.Sprintf("(|%s)", search) diff --git a/pkg/services/ldap/ldap_helpers_test.go b/pkg/services/ldap/ldap_helpers_test.go index 65cd25fc041..5062623d546 100644 --- a/pkg/services/ldap/ldap_helpers_test.go +++ b/pkg/services/ldap/ldap_helpers_test.go @@ -54,13 +54,14 @@ func TestLDAPHelpers(t *testing.T) { result := getUsersIteration(logins, func(previous, current int) error { i++ - if i == 1 { + switch i { + case 1: So(previous, ShouldEqual, 0) So(current, ShouldEqual, 500) - } else if i == 2 { + case 2: So(previous, ShouldEqual, 500) So(current, ShouldEqual, 1000) - } else { + default: So(previous, ShouldEqual, 1000) So(current, ShouldEqual, 1500) } diff --git a/pkg/services/multildap/multildap_test.go b/pkg/services/multildap/multildap_test.go index b9660a51bf1..d9f833e460a 100644 --- a/pkg/services/multildap/multildap_test.go +++ b/pkg/services/multildap/multildap_test.go @@ -469,13 +469,13 @@ type mockLDAP struct { // Login test fn func (mock *mockLDAP) Login(*models.LoginUserQuery) (*models.ExternalUserInfo, error) { - mock.loginCalledTimes = mock.loginCalledTimes + 1 + mock.loginCalledTimes++ return mock.loginReturn, mock.loginErrReturn } // Users test fn func (mock *mockLDAP) Users([]string) ([]*models.ExternalUserInfo, error) { - mock.usersCalledTimes = mock.usersCalledTimes + 1 + mock.usersCalledTimes++ if mock.usersCalledTimes == 1 { return mock.usersFirstReturn, mock.usersErrReturn @@ -491,13 +491,13 @@ func (mock *mockLDAP) UserBind(string, string) error { // Dial test fn func (mock *mockLDAP) Dial() error { - mock.dialCalledTimes = mock.dialCalledTimes + 1 + mock.dialCalledTimes++ return mock.dialErrReturn } // Close test fn func (mock *mockLDAP) Close() { - mock.closeCalledTimes = mock.closeCalledTimes + 1 + mock.closeCalledTimes++ } func (mock *mockLDAP) Bind() error { diff --git a/pkg/services/provisioning/datasources/config_reader.go b/pkg/services/provisioning/datasources/config_reader.go index ef0486ad7ea..6c8e8046500 100644 --- a/pkg/services/provisioning/datasources/config_reader.go +++ b/pkg/services/provisioning/datasources/config_reader.go @@ -99,7 +99,7 @@ func validateDefaultUniqueness(datasources []*configs) error { } if ds.IsDefault { - defaultCount[ds.OrgID] = defaultCount[ds.OrgID] + 1 + defaultCount[ds.OrgID]++ if defaultCount[ds.OrgID] > 1 { return ErrInvalidConfigToManyDefault } diff --git a/pkg/services/rendering/rendering.go b/pkg/services/rendering/rendering.go index d42a45ebe85..84e32b16cd3 100644 --- a/pkg/services/rendering/rendering.go +++ b/pkg/services/rendering/rendering.go @@ -59,13 +59,14 @@ func (rs *RenderingService) Init() error { } // set value used for domain attribute of renderKey cookie - if rs.Cfg.RendererUrl != "" { + switch { + case rs.Cfg.RendererUrl != "": // RendererCallbackUrl has already been passed, it won't generate an error. u, _ := url.Parse(rs.Cfg.RendererCallbackUrl) rs.domain = u.Hostname() - } else if setting.HttpAddr != setting.DEFAULT_HTTP_ADDR { + case setting.HttpAddr != setting.DEFAULT_HTTP_ADDR: rs.domain = setting.HttpAddr - } else { + default: rs.domain = "localhost" } @@ -132,19 +133,23 @@ func (rs *RenderingService) renderUnavailableImage() *RenderResult { func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResult, error) { startTime := time.Now() - result, err := rs.render(ctx, opts) elapsedTime := time.Since(startTime).Milliseconds() - if err == ErrTimeout { - metrics.MRenderingRequestTotal.WithLabelValues("timeout").Inc() - metrics.MRenderingSummary.WithLabelValues("timeout").Observe(float64(elapsedTime)) - } else if err != nil { - metrics.MRenderingRequestTotal.WithLabelValues("failure").Inc() - metrics.MRenderingSummary.WithLabelValues("failure").Observe(float64(elapsedTime)) - } else { - metrics.MRenderingRequestTotal.WithLabelValues("success").Inc() - metrics.MRenderingSummary.WithLabelValues("success").Observe(float64(elapsedTime)) + result, err := rs.render(ctx, opts) + if err != nil { + if err == ErrTimeout { + metrics.MRenderingRequestTotal.WithLabelValues("timeout").Inc() + metrics.MRenderingSummary.WithLabelValues("timeout").Observe(float64(elapsedTime)) + } else { + metrics.MRenderingRequestTotal.WithLabelValues("failure").Inc() + metrics.MRenderingSummary.WithLabelValues("failure").Observe(float64(elapsedTime)) + } + + return nil, err } - return result, err + + metrics.MRenderingRequestTotal.WithLabelValues("success").Inc() + metrics.MRenderingSummary.WithLabelValues("success").Observe(float64(elapsedTime)) + return result, nil } func (rs *RenderingService) render(ctx context.Context, opts Opts) (*RenderResult, error) { diff --git a/pkg/services/sqlstore/dashboard_snapshot.go b/pkg/services/sqlstore/dashboard_snapshot.go index 97fe4d7ca0c..cc057f9397b 100644 --- a/pkg/services/sqlstore/dashboard_snapshot.go +++ b/pkg/services/sqlstore/dashboard_snapshot.go @@ -102,11 +102,12 @@ func SearchDashboardSnapshots(query *models.GetDashboardSnapshotsQuery) error { } // admins can see all snapshots, everyone else can only see their own snapshots - if query.SignedInUser.OrgRole == models.ROLE_ADMIN { + switch { + case query.SignedInUser.OrgRole == models.ROLE_ADMIN: sess.Where("org_id = ?", query.OrgId) - } else if !query.SignedInUser.IsAnonymous { + case !query.SignedInUser.IsAnonymous: sess.Where("org_id = ? AND user_id = ?", query.OrgId, query.SignedInUser.UserId) - } else { + default: query.Result = snapshots return nil } diff --git a/pkg/services/sqlstore/quota.go b/pkg/services/sqlstore/quota.go index 5c1671e242e..4451827ef6a 100644 --- a/pkg/services/sqlstore/quota.go +++ b/pkg/services/sqlstore/quota.go @@ -116,7 +116,8 @@ func UpdateOrgQuota(cmd *models.UpdateOrgQuotaCmd) error { } } else { //update existing quota entry in the DB. - if _, err := sess.ID(quota.Id).Update("a); err != nil { + _, err := sess.ID(quota.Id).Update("a) + if err != nil { return err } } @@ -218,7 +219,8 @@ func UpdateUserQuota(cmd *models.UpdateUserQuotaCmd) error { } } else { //update existing quota entry in the DB. - if _, err := sess.ID(quota.Id).Update("a); err != nil { + _, err := sess.ID(quota.Id).Update("a) + if err != nil { return err } } diff --git a/pkg/services/sqlstore/tags.go b/pkg/services/sqlstore/tags.go index ac731cf5126..2903d42fd7e 100644 --- a/pkg/services/sqlstore/tags.go +++ b/pkg/services/sqlstore/tags.go @@ -8,12 +8,15 @@ func EnsureTagsExist(sess *DBSession, tags []*models.Tag) ([]*models.Tag, error) var existingTag models.Tag // check if it exists - if exists, err := sess.Table("tag").Where("`key`=? AND `value`=?", tag.Key, tag.Value).Get(&existingTag); err != nil { + exists, err := sess.Table("tag").Where("`key`=? AND `value`=?", tag.Key, tag.Value).Get(&existingTag) + if err != nil { return nil, err - } else if exists { + } + if exists { tag.Id = existingTag.Id } else { - if _, err := sess.Table("tag").Insert(tag); err != nil { + _, err := sess.Table("tag").Insert(tag) + if err != nil { return nil, err } } diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index a02641b8bbf..52eeb03d303 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -395,11 +395,12 @@ func GetSignedInUser(query *models.GetSignedInUserQuery) error { LEFT OUTER JOIN org on org.id = org_user.org_id ` sess := x.Table("user") - if query.UserId > 0 { + switch { + case query.UserId > 0: sess.SQL(rawSql+"WHERE u.id=?", query.UserId) - } else if query.Login != "" { + case query.Login != "": sess.SQL(rawSql+"WHERE u.login=?", query.Login) - } else if query.Email != "" { + case query.Email != "": sess.SQL(rawSql+"WHERE u.email=?", query.Email) } diff --git a/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go b/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go index 65a30f2fe10..fb18a54e488 100644 --- a/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go +++ b/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go @@ -208,7 +208,6 @@ func TestAppInsightsPluginRoutes(t *testing.T) { }) } } - func TestInsightsDimensionsUnmarshalJSON(t *testing.T) { a := []byte(`"foo"`) b := []byte(`["foo"]`) diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go index 42297e0b10c..6b51b272305 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go @@ -314,16 +314,17 @@ func reverse(s string) string { func interpolateFilterWildcards(value string) string { matches := strings.Count(value, "*") - if matches == 2 && strings.HasSuffix(value, "*") && strings.HasPrefix(value, "*") { + switch { + case matches == 2 && strings.HasSuffix(value, "*") && strings.HasPrefix(value, "*"): value = strings.Replace(value, "*", "", -1) value = fmt.Sprintf(`has_substring("%s")`, value) - } else if matches == 1 && strings.HasPrefix(value, "*") { + case matches == 1 && strings.HasPrefix(value, "*"): value = strings.Replace(value, "*", "", 1) value = fmt.Sprintf(`ends_with("%s")`, value) - } else if matches == 1 && strings.HasSuffix(value, "*") { + case matches == 1 && strings.HasSuffix(value, "*"): value = reverse(strings.Replace(reverse(value), "*", "", 1)) value = fmt.Sprintf(`starts_with("%s")`, value) - } else if matches != 0 { + case matches != 0: value = string(wildcardRegexRe.ReplaceAllFunc([]byte(value), func(in []byte) []byte { return []byte(strings.Replace(string(in), string(in), `\\`+string(in), 1)) })) @@ -339,19 +340,21 @@ func buildFilterString(metricType string, filterParts []string) string { filterString := "" for i, part := range filterParts { mod := i % 4 - if part == "AND" { + switch { + case part == "AND": filterString += " " - } else if mod == 2 { + case mod == 2: operator := filterParts[i-1] - if operator == "=~" || operator == "!=~" { + switch { + case operator == "=~" || operator == "!=~": filterString = reverse(strings.Replace(reverse(filterString), "~", "", 1)) filterString += fmt.Sprintf(`monitoring.regex.full_match("%s")`, part) - } else if strings.Contains(part, "*") { + case strings.Contains(part, "*"): filterString += interpolateFilterWildcards(part) - } else { + default: filterString += fmt.Sprintf(`"%s"`, part) } - } else { + default: filterString += part } } @@ -398,11 +401,12 @@ func calculateAlignmentPeriod(alignmentPeriod string, intervalMs int64, duration if alignmentPeriod == "cloud-monitoring-auto" || alignmentPeriod == "stackdriver-auto" { // legacy alignmentPeriodValue := int(math.Max(float64(durationSeconds), 60.0)) - if alignmentPeriodValue < 60*60*23 { + switch { + case alignmentPeriodValue < 60*60*23: alignmentPeriod = "+60s" - } else if alignmentPeriodValue < 60*60*24*6 { + case alignmentPeriodValue < 60*60*24*6: alignmentPeriod = "+300s" - } else { + default: alignmentPeriod = "+3600s" } } @@ -735,11 +739,12 @@ func calcBucketBound(bucketOptions cloudMonitoringBucketOptions, n int) string { return bucketBound } - if bucketOptions.LinearBuckets != nil { + switch { + case bucketOptions.LinearBuckets != nil: bucketBound = strconv.FormatInt(bucketOptions.LinearBuckets.Offset+(bucketOptions.LinearBuckets.Width*int64(n-1)), 10) - } else if bucketOptions.ExponentialBuckets != nil { + case bucketOptions.ExponentialBuckets != nil: bucketBound = strconv.FormatInt(int64(bucketOptions.ExponentialBuckets.Scale*math.Pow(bucketOptions.ExponentialBuckets.GrowthFactor, float64(n-1))), 10) - } else if bucketOptions.ExplicitBuckets != nil { + case bucketOptions.ExplicitBuckets != nil: bucketBound = fmt.Sprintf("%g", bucketOptions.ExplicitBuckets.Bounds[n]) } return bucketBound diff --git a/pkg/tsdb/cloudwatch/credentials.go b/pkg/tsdb/cloudwatch/credentials.go index 512e9827744..af2d5dd51ca 100644 --- a/pkg/tsdb/cloudwatch/credentials.go +++ b/pkg/tsdb/cloudwatch/credentials.go @@ -29,18 +29,21 @@ var credsCacheLock sync.RWMutex // Session factory. // Stubbable by tests. +//nolint:gocritic var newSession = func(cfgs ...*aws.Config) (*session.Session, error) { return session.NewSession(cfgs...) } // STS service factory. // Stubbable by tests. +//nolint:gocritic var newSTSService = func(p client.ConfigProvider, cfgs ...*aws.Config) stsiface.STSAPI { return sts.New(p, cfgs...) } // EC2Metadata service factory. // Stubbable by tests. +//nolint:gocritic var newEC2Metadata = func(p client.ConfigProvider, cfgs ...*aws.Config) *ec2metadata.EC2Metadata { return ec2metadata.New(p, cfgs...) } diff --git a/pkg/tsdb/elasticsearch/response_parser.go b/pkg/tsdb/elasticsearch/response_parser.go index a5738ab5e45..376421bb4f7 100644 --- a/pkg/tsdb/elasticsearch/response_parser.go +++ b/pkg/tsdb/elasticsearch/response_parser.go @@ -246,11 +246,12 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, bucket := simplejson.NewFromAny(v) key := castToNullFloat(bucket.Get("key")) var value null.Float - if statName == "std_deviation_bounds_upper" { + switch statName { + case "std_deviation_bounds_upper": value = castToNullFloat(bucket.GetPath(metric.ID, "std_deviation_bounds", "upper")) - } else if statName == "std_deviation_bounds_lower" { + case "std_deviation_bounds_lower": value = castToNullFloat(bucket.GetPath(metric.ID, "std_deviation_bounds", "lower")) - } else { + default: value = castToNullFloat(bucket.GetPath(metric.ID, statName)) } newSeries.Points = append(newSeries.Points, tsdb.TimePoint{value, key}) @@ -349,11 +350,12 @@ func (rp *responseParser) processAggregationDocs(esAgg *simplejson.Json, aggDef } var value null.Float - if statName == "std_deviation_bounds_upper" { + switch statName { + case "std_deviation_bounds_upper": value = castToNullFloat(bucket.GetPath(metric.ID, "std_deviation_bounds", "upper")) - } else if statName == "std_deviation_bounds_lower" { + case "std_deviation_bounds_lower": value = castToNullFloat(bucket.GetPath(metric.ID, "std_deviation_bounds", "lower")) - } else { + default: value = castToNullFloat(bucket.GetPath(metric.ID, statName)) } @@ -568,11 +570,12 @@ func getErrorFromElasticResponse(response *es.SearchResponse) *tsdb.QueryResult reason := json.Get("reason").MustString() rootCauseReason := json.Get("root_cause").GetIndex(0).Get("reason").MustString() - if rootCauseReason != "" { + switch { + case rootCauseReason != "": result.ErrorString = rootCauseReason - } else if reason != "" { + case reason != "": result.ErrorString = reason - } else { + default: result.ErrorString = "Unknown elasticsearch error response" } diff --git a/pkg/tsdb/influxdb/influxdb_test.go b/pkg/tsdb/influxdb/influxdb_test.go index a6f4c654aa0..4c2456dc412 100644 --- a/pkg/tsdb/influxdb/influxdb_test.go +++ b/pkg/tsdb/influxdb/influxdb_test.go @@ -57,7 +57,7 @@ func TestInfluxDB(t *testing.T) { testBodyValues := url.Values{} testBodyValues.Add("q", query) testBody := testBodyValues.Encode() - So(string(body[:]), ShouldEqual, testBody) + So(string(body), ShouldEqual, testBody) }) }) diff --git a/pkg/tsdb/influxdb/query.go b/pkg/tsdb/influxdb/query.go index 75610024c2d..396414a0da1 100644 --- a/pkg/tsdb/influxdb/query.go +++ b/pkg/tsdb/influxdb/query.go @@ -63,11 +63,12 @@ func (query *Query) renderTags() []string { // quote value unless regex or number var textValue string - if tag.Operator == "=~" || tag.Operator == "!~" { + switch tag.Operator { + case "=~", "!~": textValue = tag.Value - } else if tag.Operator == "<" || tag.Operator == ">" { + case "<", ">": textValue = tag.Value - } else { + default: textValue = fmt.Sprintf("'%s'", strings.Replace(tag.Value, `\`, `\\`, -1)) } diff --git a/pkg/tsdb/sqleng/sql_engine.go b/pkg/tsdb/sqleng/sql_engine.go index 0d66fc06b32..6271921d2ba 100644 --- a/pkg/tsdb/sqleng/sql_engine.go +++ b/pkg/tsdb/sqleng/sql_engine.go @@ -55,6 +55,8 @@ var engineCache = engineCacheType{ var sqlIntervalCalculator = tsdb.NewIntervalCalculator(nil) +//nolint:gocritic +// NewXormEngine is an xorm.Engine factory, that can be stubbed by tests. var NewXormEngine = func(driverName string, connectionString string) (*xorm.Engine, error) { return xorm.NewEngine(driverName, connectionString) } @@ -481,7 +483,7 @@ func ConvertSqlTimeColumnToEpochMs(values tsdb.RowValues, timeIndex int) { values[timeIndex] = float64(value.UnixNano()) / float64(time.Millisecond) case *time.Time: if value != nil { - values[timeIndex] = float64((*value).UnixNano()) / float64(time.Millisecond) + values[timeIndex] = float64(value.UnixNano()) / float64(time.Millisecond) } case int64: values[timeIndex] = int64(tsdb.EpochPrecisionToMs(float64(value))) diff --git a/pkg/tsdb/testdatasource/scenarios.go b/pkg/tsdb/testdatasource/scenarios.go index 2aef179bae5..2d6cf08fab2 100644 --- a/pkg/tsdb/testdatasource/scenarios.go +++ b/pkg/tsdb/testdatasource/scenarios.go @@ -114,29 +114,22 @@ func init() { }) registerScenario(&Scenario{ - Id: "predictable_pulse", - Name: "Predictable Pulse", - Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult { - return getPredictablePulse(query, context) - }, + Id: "predictable_pulse", + Name: "Predictable Pulse", + Handler: getPredictablePulse, Description: PredictablePulseDesc, }) registerScenario(&Scenario{ - Id: "predictable_csv_wave", - Name: "Predictable CSV Wave", - Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult { - return getPredictableCSVWave(query, context) - }, + Id: "predictable_csv_wave", + Name: "Predictable CSV Wave", + Handler: getPredictableCSVWave, }) registerScenario(&Scenario{ - Id: "random_walk_table", - Name: "Random Walk Table", - - Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult { - return getRandomWalkTable(query, context) - }, + Id: "random_walk_table", + Name: "Random Walk Table", + Handler: getRandomWalkTable, }) registerScenario(&Scenario{ @@ -455,7 +448,7 @@ func getPredictablePulse(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.Query return queryRes } - timeStep = timeStep * 1000 // Seconds to Milliseconds + timeStep *= 1000 // Seconds to Milliseconds onFor := func(mod int64) (null.Float, error) { // How many items in the cycle should get the on value var i int64 for i = 0; i < onCount; i++ { @@ -505,7 +498,7 @@ func getPredictableCSVWave(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.Que values[i] = val } - timeStep = timeStep * 1000 // Seconds to Milliseconds + timeStep *= 1000 // Seconds to Milliseconds valuesLen := int64(len(values)) getValue := func(mod int64) (null.Float, error) { var i int64 diff --git a/scripts/go/configs/.golangci.toml b/scripts/go/configs/.golangci.toml index 84467505b59..0b5b0232329 100644 --- a/scripts/go/configs/.golangci.toml +++ b/scripts/go/configs/.golangci.toml @@ -18,7 +18,7 @@ enable = [ "errcheck", # "gochecknoinits", "goconst", - # "gocritic", + "gocritic", "goimports", "golint", # "goprintffuncname",