[run] timeout = "20m" concurrency = 10 allow-parallel-runners = true [linters-settings.exhaustive] default-signifies-exhaustive = true [linters-settings.revive] ignore-generated-header = false severity = "warning" confidence = 3 [linters-settings.depguard.rules.main] allow = [] # allow all deny = [ { pkg = "io/ioutil", desc = "Deprecated: As of Go 1.16, the same functionality is now provided by package io or package os, and those implementations should be preferred in new code. See the specific function documentation for details." }, { pkg = "gopkg.in/yaml.v2", desc = "Grafana packages are not allowed to depend on gopkg.in/yaml.v2 as gopkg.in/yaml.v3 is now available" }, { pkg = "github.com/pkg/errors", desc = "Deprecated: Go 1.13 supports the functionality provided by pkg/errors in the standard library." }, { pkg = "github.com/xorcare/pointer", desc = "Use pkg/util.Pointer instead, which is a generic one-liner alternative" }, { pkg = "github.com/gofrs/uuid", desc = "Use github.com/google/uuid instead, which we already depend on." }, { pkg = "github.com/bmizerany/assert", desc = "Use github.com/stretchr/testify/assert instead, which we already depend on." }, ] [linters-settings.depguard.rules.coreplugins] deny = [ { pkg = "github.com/grafana/grafana/pkg/api", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/cmd", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/cuectx", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/extensions", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/kinds", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/middleware", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/modules", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/registry", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/services", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/build", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/codegen", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/events", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/ifaces", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/kindsysreport", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/mocks", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/plugins", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/setting", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/util", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/bus", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/components", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/expr", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/infra", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/login", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/models", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/server", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/tests", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/web", desc = "Core plugins are not allowed to depend on Grafana core packages" }, { pkg = "github.com/grafana/grafana/pkg/tsdb/intervalv2", desc = "Core plugins are not allowed to depend on Grafana core packages" }, ] files = [ "**/pkg/tsdb/grafana-pyroscope-datasource/*", "**/pkg/tsdb/grafana-pyroscope-datasource/**/*", "**/pkg/tsdb/grafana-testdata-datasource/*", "**/pkg/tsdb/grafana-testdata-datasource/**/*", "**/pkg/tsdb/azuremonitor/*", "**/pkg/tsdb/azuremonitor/**/*", "**/pkg/tsdb/cloud-monitoring/*", "**/pkg/tsdb/cloud-monitoring/**/*", "**/pkg/tsdb/mysql/*", "**/pkg/tsdb/mysql/**/*", "**/pkg/tsdb/parca/*", "**/pkg/tsdb/parca/**/*", "**/pkg/tsdb/tempo/*", "**/pkg/tsdb/tempo/**/*", "**/pkg/tsdb/cloudwatch/*", "**/pkg/tsdb/cloudwatch/**/*", ] [linters-settings.depguard.rules.apiserver] list-mode = "lax" allow = [ "github.com/grafana/grafana/pkg/apimachinery", "github.com/grafana/grafana/pkg/apiserver", ] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "apiserver is not allowed to import grafana core" } ] files = [ "**/pkg/apiserver/*", "**/pkg/apiserver/**/*" ] [linters-settings.depguard.rules.apimachinery] list-mode = "lax" allow = [ "github.com/grafana/grafana/pkg/apimachinery", ] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "apimachinery is not allowed to import grafana core" } ] files = [ "**/pkg/apimachinery/*", "**/pkg/apimachinery/**/*" ] [linters-settings.depguard.rules.aggregator] list-mode = "lax" allow = [ "github.com/grafana/grafana/pkg/aggregator", "github.com/grafana/grafana/pkg/semconv", "github.com/grafana/grafana/pkg/apimachinery", ] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "apimachinery is not allowed to import grafana core" } ] files = [ "./pkg/aggregator/*", "./pkg/aggregator/**/*" ] [linters-settings.depguard.rules.promlib] list-mode = "lax" # allow unless explicitely denied deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "promlib is not allowed to import grafana core" } ] allow = [ "github.com/grafana/grafana/pkg/promlib" ] files = [ "**/pkg/promlib/**/*" ] [linters-settings.depguard.rules.storage-unified-resource] list-mode = "lax" allow = [ "github.com/grafana/grafana/pkg/apimachinery", ] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "pkg/storage/unified/resource is not allowed to import grafana core" } ] files = [ "./pkg/storage/unified/resource/*", "./pkg/storage/unified/resource/**/*" ] [linters-settings.depguard.rules.storage-unified-apistore] list-mode = "lax" allow = [ "github.com/grafana/grafana/pkg/apimachinery", "github.com/grafana/grafana/pkg/apiserver", "github.com/grafana/grafana/pkg/unified/resource", ] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "pkg/storage/unified/apistore is not allowed to import grafana core" } ] files = [ "./pkg/storage/unified/apistore/*", "./pkg/storage/unified/apistore/**/*" ] [linters-settings.depguard.rules.apps-playlist] list-mode = "lax" allow = [] deny = [ { pkg = "github.com/grafana/grafana/pkg", desc = "apps/playlist is not allowed to import grafana core" } ] files = [ "./apps/playlist/*", "./apps/playlist/**/*" ] [linters-settings.gocritic] enabled-checks = ["ruleguard"] [linters-settings.gocritic.settings.ruleguard] rules = "pkg/ruleguard.rules.go" [linters-settings.misspell] ignore-words = ["Unknwon", "Creater"] [linters-settings.nakedret] max-func-lines = 60 [linters] disable-all = true # try to keep this list sorted, please enable = [ "asciicheck", "bodyclose", "depguard", "dogsled", "errcheck", "errorlint", "exhaustive", "exportloopref", # "gochecknoinits", # "goconst", # "gocritic", # Temporarily disabled on 2022-09-09, running into weird bug "ruleguard: execution error: used Run() with an empty rule set; forgot to call Load() first?" "gocyclo", "goimports", "goprintffuncname", "gosec", "gosimple", "govet", "ineffassign", "misspell", "nakedret", "prealloc", "revive", "staticcheck", "stylecheck", "unconvert", "unused", "whitespace", ] # Disabled linters (might want them later) # "unparam" # "rowserrcheck" # The linter doesn't detect that both Scan and Close also returns the error message returned by Err. [issues] exclude-use-default = false max-same-issues = 0 # Enable when appropriate # Poorly chosen identifier [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1003" # Enable when appropriate # Dot imports that aren't in external test packages are discouraged. [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1001" # Enable when appropriate # http.CloseNotifier has been deprecated since Go 1.11 and an alternative has been available since Go 1.7: We currently need it in pkg/web/response_writer.go. [[issues.exclude-rules]] linters = ["staticcheck"] text = "SA1019: http.CloseNotifier" # strings.Title has been deprecated since Go 1.18 and an alternative has been available since Go 1.0: The rule Title uses for word boundaries does not handle Unicode punctuation properly. # Use golang.org/x/text/cases instead. [[issues.exclude-rules]] linters = ["staticcheck"] text = "SA1019: strings.Title" # go.opentelemetry.io/otel/exporters/jaeger" is deprecated: This module is no longer supported. OpenTelemetry dropped support for Jaeger exporter in July 2023. # Jaeger officially accepts and recommends using OTLP. # Use [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp] or [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc] instead. [[issues.exclude-rules]] linters = ["staticcheck"] text = "SA1019: \"go.opentelemetry.io/otel/exporters/jaeger\"" [[issues.exclude-rules]] linters = ["staticcheck"] text = "use fake service and real access control evaluator instead" [[issues.exclude-rules]] linters = ["gosec"] text = "G108" [[issues.exclude-rules]] linters = ["gosec"] text = "G110" [[issues.exclude-rules]] linters = ["gosec"] text = "G201" [[issues.exclude-rules]] linters = ["gosec"] text = "G202" [[issues.exclude-rules]] linters = ["gosec"] text = "G306" [[issues.exclude-rules]] linters = ["gosec"] text = "401" [[issues.exclude-rules]] linters = ["gosec"] text = "402" [[issues.exclude-rules]] linters = ["gosec"] text = "501" [[issues.exclude-rules]] linters = ["gosec"] text = "404" [[issues.exclude-rules]] linters = ["errorlint"] text = "non-wrapping format verb for fmt.Errorf" # TODO: Enable [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1000" # TODO: Enable [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1020" # TODO: Enable [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1021" # Remove this when we have go v1.22 in place # https://stackoverflow.com/a/68247837/767660 [[issues.exclude-rules]] linters = ["gosec"] path = '(.+)_test\.go' text = "G601"