diff --git a/.golangci.yml b/.golangci.yml index c284a2b30041..c4358cd36192 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -55,7 +55,7 @@ linters: - goconst - gofmt - goimports - - golint + - revive - gosimple - ineffassign - megacheck @@ -66,7 +66,6 @@ linters: - varcheck - govet - unused # new from here. - - interfacer - typecheck issues: diff --git a/Makefile b/Makefile index 1141623fe60d..6c440637dc1a 100644 --- a/Makefile +++ b/Makefile @@ -263,6 +263,8 @@ publish: dist # Lint # ######## +# To run this efficiently on your workstation, use: +# docker run --rm --tty -i -v $(pwd)/.cache:/go/cache -v $(pwd)/.pkg:/go/pkg -v $(pwd):/src/loki grafana/loki-build-image:0.17.0 lint lint: GO111MODULE=on GOGC=10 golangci-lint run -v $(GOLANGCI_ARG) faillint -paths "sync/atomic=go.uber.org/atomic" ./... diff --git a/clients/cmd/docker-driver/loki.go b/clients/cmd/docker-driver/loki.go index f8538c6b67a2..40649cf3ca3e 100644 --- a/clients/cmd/docker-driver/loki.go +++ b/clients/cmd/docker-driver/loki.go @@ -44,7 +44,7 @@ func New(logCtx logger.Info, logger log.Logger) (logger.Logger, error) { return nil, err } var handler api.EntryHandler = c - var stop func() = func() {} + var stop = func() {} if len(cfg.pipeline.PipelineStages) != 0 { pipeline, err := stages.NewPipeline(logger, cfg.pipeline.PipelineStages, &jobName, prometheus.DefaultRegisterer) if err != nil { diff --git a/clients/pkg/promtail/targets/file/filetarget.go b/clients/pkg/promtail/targets/file/filetarget.go index d3a176b332fd..44e500a8eb06 100644 --- a/clients/pkg/promtail/targets/file/filetarget.go +++ b/clients/pkg/promtail/targets/file/filetarget.go @@ -44,7 +44,7 @@ func (cfg *Config) RegisterFlags(flags *flag.FlagSet) { } // FileTarget describes a particular set of logs. -// nolint:golint +// nolint:revive type FileTarget struct { metrics *Metrics logger log.Logger diff --git a/clients/pkg/promtail/targets/file/filetargetmanager.go b/clients/pkg/promtail/targets/file/filetargetmanager.go index 67eeba4619d8..0643fb5dec63 100644 --- a/clients/pkg/promtail/targets/file/filetargetmanager.go +++ b/clients/pkg/promtail/targets/file/filetargetmanager.go @@ -33,7 +33,7 @@ const ( ) // FileTargetManager manages a set of targets. -// nolint:golint +// nolint:revive type FileTargetManager struct { log log.Logger quit context.CancelFunc diff --git a/clients/pkg/promtail/targets/gcplog/formatter.go b/clients/pkg/promtail/targets/gcplog/formatter.go index 687f6b04378f..bc62cc10fc70 100644 --- a/clients/pkg/promtail/targets/gcplog/formatter.go +++ b/clients/pkg/promtail/targets/gcplog/formatter.go @@ -31,7 +31,7 @@ func init() { // LogEntry that will be written to the pubsub topic. // According to the following spec. // https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry -// nolint: golint +// nolint:revive type GCPLogEntry struct { LogName string `json:"logName"` Resource struct { diff --git a/clients/pkg/promtail/targets/gcplog/target.go b/clients/pkg/promtail/targets/gcplog/target.go index 7dd2ff8a2a81..458b71d94cb0 100644 --- a/clients/pkg/promtail/targets/gcplog/target.go +++ b/clients/pkg/promtail/targets/gcplog/target.go @@ -17,7 +17,7 @@ import ( // GcplogTarget represents the target specific to GCP project. // It collects logs from GCP and push it to Loki. -// nolint:golint +// nolint:revive type GcplogTarget struct { metrics *Metrics logger log.Logger @@ -41,7 +41,7 @@ type GcplogTarget struct { // and push it Loki via given `api.EntryHandler.` // It starts the `run` loop to consume log entries that can be // stopped via `target.Stop()` -// nolint:golint,govet +// nolint:revive,govet func NewGcplogTarget( metrics *Metrics, logger log.Logger, @@ -66,7 +66,7 @@ func NewGcplogTarget( return target, nil } -// nolint: golint +// nolint:revive func newGcplogTarget( metrics *Metrics, logger log.Logger, diff --git a/clients/pkg/promtail/targets/gcplog/targetmanager.go b/clients/pkg/promtail/targets/gcplog/targetmanager.go index 83cc50809d78..c2c520b4ecdc 100644 --- a/clients/pkg/promtail/targets/gcplog/targetmanager.go +++ b/clients/pkg/promtail/targets/gcplog/targetmanager.go @@ -12,7 +12,7 @@ import ( "github.com/grafana/loki/clients/pkg/promtail/targets/target" ) -// nolint: golint +// nolint:revive type GcplogTargetManager struct { logger log.Logger targets map[string]*GcplogTarget diff --git a/clients/pkg/promtail/targets/journal/journaltargetmanager.go b/clients/pkg/promtail/targets/journal/journaltargetmanager.go index 4590066a799c..ff28ebdf5f68 100644 --- a/clients/pkg/promtail/targets/journal/journaltargetmanager.go +++ b/clients/pkg/promtail/targets/journal/journaltargetmanager.go @@ -15,7 +15,7 @@ import ( ) // JournalTargetManager manages a series of JournalTargets. -// nolint:golint +// nolint:revive type JournalTargetManager struct{} // NewJournalTargetManager returns nil as JournalTargets are not supported diff --git a/clients/pkg/promtail/targets/stdin/stdin_target_manager.go b/clients/pkg/promtail/targets/stdin/stdin_target_manager.go index bb43cd6a1b14..d6bd1bf62379 100644 --- a/clients/pkg/promtail/targets/stdin/stdin_target_manager.go +++ b/clients/pkg/promtail/targets/stdin/stdin_target_manager.go @@ -52,7 +52,7 @@ type Shutdownable interface { Shutdown() } -// nolint:golint +// nolint:revive type StdinTargetManager struct { *readerTarget app Shutdownable diff --git a/clients/pkg/promtail/targets/syslog/syslogtarget.go b/clients/pkg/promtail/targets/syslog/syslogtarget.go index 21e36bc312b0..b54ef4418f6b 100644 --- a/clients/pkg/promtail/targets/syslog/syslogtarget.go +++ b/clients/pkg/promtail/targets/syslog/syslogtarget.go @@ -33,7 +33,7 @@ var ( ) // SyslogTarget listens to syslog messages. -// nolint:golint +// nolint:revive type SyslogTarget struct { metrics *Metrics logger log.Logger diff --git a/clients/pkg/promtail/targets/syslog/syslogtargetmanager.go b/clients/pkg/promtail/targets/syslog/syslogtargetmanager.go index 26b43af2ac5c..6e32011c49e7 100644 --- a/clients/pkg/promtail/targets/syslog/syslogtargetmanager.go +++ b/clients/pkg/promtail/targets/syslog/syslogtargetmanager.go @@ -12,7 +12,7 @@ import ( ) // SyslogTargetManager manages a series of SyslogTargets. -// nolint:golint +// nolint:revive type SyslogTargetManager struct { logger log.Logger targets map[string]*SyslogTarget diff --git a/clients/pkg/promtail/targets/target/target.go b/clients/pkg/promtail/targets/target/target.go index 2178b9ee787f..01f1ef03291f 100644 --- a/clients/pkg/promtail/targets/target/target.go +++ b/clients/pkg/promtail/targets/target/target.go @@ -5,7 +5,7 @@ import ( ) // TargetType is the type of target -// nolint:golint +// nolint:revive type TargetType string const ( diff --git a/pkg/querier/queryrange/split_by_interval.go b/pkg/querier/queryrange/split_by_interval.go index 33919ace9ff4..d1fcb77f2a03 100644 --- a/pkg/querier/queryrange/split_by_interval.go +++ b/pkg/querier/queryrange/split_by_interval.go @@ -102,7 +102,7 @@ func (h *splitByInterval) Process( } // don't spawn unnecessary goroutines - var p int = parallelism + var p = parallelism if len(input) < parallelism { p = len(input) } diff --git a/pkg/storage/chunk/aws/dynamodb_table_client.go b/pkg/storage/chunk/aws/dynamodb_table_client.go index 54f56bf6ed5c..180641f7e7e8 100644 --- a/pkg/storage/chunk/aws/dynamodb_table_client.go +++ b/pkg/storage/chunk/aws/dynamodb_table_client.go @@ -199,7 +199,7 @@ func (d dynamoTableClient) CreateTable(ctx context.Context, desc chunk.TableDesc } func (d dynamoTableClient) DeleteTable(ctx context.Context, name string) error { - if err := d.backoffAndRetry(ctx, func(ctx context.Context) error { + return d.backoffAndRetry(ctx, func(ctx context.Context) error { return instrument.CollectedRequest(ctx, "DynamoDB.DeleteTable", d.metrics.dynamoRequestDuration, instrument.ErrorCode, func(ctx context.Context) error { input := &dynamodb.DeleteTableInput{TableName: aws.String(name)} _, err := d.DynamoDB.DeleteTableWithContext(ctx, input) @@ -209,11 +209,7 @@ func (d dynamoTableClient) DeleteTable(ctx context.Context, name string) error { return nil }) - }); err != nil { - return err - } - - return nil + }) } func (d dynamoTableClient) DescribeTable(ctx context.Context, name string) (desc chunk.TableDesc, isActive bool, err error) { diff --git a/pkg/storage/chunk/chunk_store.go b/pkg/storage/chunk/chunk_store.go index 9cd33a468fc5..38fd5ec1c915 100644 --- a/pkg/storage/chunk/chunk_store.go +++ b/pkg/storage/chunk/chunk_store.go @@ -82,10 +82,7 @@ func (cfg *StoreConfig) Validate(logger log.Logger) error { if err := cfg.ChunkCacheConfig.Validate(); err != nil { return err } - if err := cfg.WriteDedupeCacheConfig.Validate(); err != nil { - return err - } - return nil + return cfg.WriteDedupeCacheConfig.Validate() } type baseStore struct { diff --git a/pkg/storage/chunk/gcp/gcs_object_client.go b/pkg/storage/chunk/gcp/gcs_object_client.go index 537aeecb613d..b73c22bd50b4 100644 --- a/pkg/storage/chunk/gcp/gcs_object_client.go +++ b/pkg/storage/chunk/gcp/gcs_object_client.go @@ -112,11 +112,7 @@ func (s *GCSObjectClient) PutObject(ctx context.Context, objectKey string, objec _ = writer.Close() return err } - if err := writer.Close(); err != nil { - return err - } - - return nil + return writer.Close() } // List implements chunk.ObjectClient. diff --git a/pkg/storage/chunk/purger/purger.go b/pkg/storage/chunk/purger/purger.go index 7385775d0d2a..06c5c2a567a7 100644 --- a/pkg/storage/chunk/purger/purger.go +++ b/pkg/storage/chunk/purger/purger.go @@ -357,7 +357,7 @@ func (p *Purger) executePlan(userID, requestID string, planNo int, logger log.Lo return err } - var partiallyDeletedInterval *model.Interval = nil + var partiallyDeletedInterval *model.Interval if chunkDetails.PartiallyDeletedInterval != nil { partiallyDeletedInterval = &model.Interval{ Start: model.Time(chunkDetails.PartiallyDeletedInterval.StartTimestampMs), diff --git a/pkg/storage/stores/shipper/compactor/retention/iterator_test.go b/pkg/storage/stores/shipper/compactor/retention/iterator_test.go index b7454f662614..062b77c513f0 100644 --- a/pkg/storage/stores/shipper/compactor/retention/iterator_test.go +++ b/pkg/storage/stores/shipper/compactor/retention/iterator_test.go @@ -104,10 +104,7 @@ func Test_SeriesCleaner(t *testing.T) { if err := cleaner.Cleanup(entryFromChunk(c2).UserID, c2.Metric); err != nil { return err } - if err := cleaner.Cleanup(entryFromChunk(c1).UserID, c1.Metric); err != nil { - return err - } - return nil + return cleaner.Cleanup(entryFromChunk(c1).UserID, c1.Metric) }) require.NoError(t, err) diff --git a/pkg/storage/stores/shipper/compactor/retention/marker.go b/pkg/storage/stores/shipper/compactor/retention/marker.go index b4b836e21b86..4fc883bd0151 100644 --- a/pkg/storage/stores/shipper/compactor/retention/marker.go +++ b/pkg/storage/stores/shipper/compactor/retention/marker.go @@ -303,7 +303,7 @@ func (r *markerProcessor) processPath(path string, deleteFunc func(ctx context.C } }() } - if err := dbView.View(func(tx *bbolt.Tx) error { + return dbView.View(func(tx *bbolt.Tx) error { b := tx.Bucket(chunkBucket) if b == nil { return nil @@ -323,10 +323,7 @@ func (r *markerProcessor) processPath(path string, deleteFunc func(ctx context.C } return nil - }); err != nil { - return err - } - return nil + }) } func processKey(ctx context.Context, key *keyPair, db *bbolt.DB, deleteFunc func(ctx context.Context, chunkId []byte) error) error {