version: "2"
run:
  issues-exit-code: 1
  tests: true
linters:
  default: none
  enable:
    - asasalint
    - bodyclose
    - depguard
    - errcheck
    - errorlint
    - gocritic
    - godot
    - gosec
    - govet
    - ineffassign
    - misspell
    - modernize
    - perfsprint
    - revive
    - staticcheck
    - testifylint
    - unconvert
    - unparam
    - unused
    - usestdlibvars
    - usetesting
  settings:
    depguard:
      rules:
        auto/sdk:
          files:
            - '!internal/global/trace.go'
            - ~internal/global/trace_test.go
          deny:
            - pkg: go.opentelemetry.io/auto/sdk
              desc: Do not use SDK from automatic instrumentation.
        non-tests:
          files:
            - '!$test'
            - '!**/*test/*.go'
            - '!**/internal/matchers/*.go'
          deny:
            - pkg: testing
            - pkg: github.com/stretchr/testify
            - pkg: crypto/md5
            - pkg: crypto/sha1
            - pkg: crypto/**/pkix
        otel-internal:
          files:
            - '**/sdk/*.go'
            - '**/sdk/**/*.go'
            - '**/exporters/*.go'
            - '**/exporters/**/*.go'
            - '**/schema/*.go'
            - '**/schema/**/*.go'
            - '**/metric/*.go'
            - '**/metric/**/*.go'
            - '**/bridge/*.go'
            - '**/bridge/**/*.go'
            - '**/trace/*.go'
            - '**/trace/**/*.go'
            - '**/log/*.go'
            - '**/log/**/*.go'
          deny:
            - pkg: go.opentelemetry.io/otel/internal$
              desc: Do not use cross-module internal packages.
            - pkg: go.opentelemetry.io/otel/internal/internaltest
              desc: Do not use cross-module internal packages.
        otlp-internal:
          files:
            - '!**/exporters/otlp/internal/**/*.go'
          deny:
            - pkg: go.opentelemetry.io/otel/exporters/otlp/internal
              desc: Do not use cross-module internal packages.
        otlpmetric-internal:
          files:
            - '!**/exporters/otlp/otlpmetric/internal/*.go'
            - '!**/exporters/otlp/otlpmetric/internal/**/*.go'
          deny:
            - pkg: go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal
              desc: Do not use cross-module internal packages.
        otlptrace-internal:
          files:
            - '!**/exporters/otlp/otlptrace/*.go'
            - '!**/exporters/otlp/otlptrace/internal/**.go'
          deny:
            - pkg: go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal
              desc: Do not use cross-module internal packages.
    gocritic:
      disabled-checks:
        - appendAssign
        - commentedOutCode
        - dupArg
        - hugeParam
        - importShadow
        - preferDecodeRune
        - rangeValCopy
        - unnamedResult
        - whyNoLint
      enable-all: true
    godot:
      exclude:
        # Exclude links.
        - '^ *\[[^]]+\]:'
        # Exclude sentence fragments for lists.
        - ^[ ]*[-•]
        # Exclude sentences prefixing a list.
        - :$
    misspell:
      locale: US
      ignore-rules:
        - cancelled
    modernize:
      disable:
        - omitzero
    perfsprint:
      int-conversion: true
      err-error: true
      errorf: true
      sprintf1: true
      strconcat: true
    revive:
      confidence: 0.01
      rules:
        - name: blank-imports
        - name: bool-literal-in-expr
        - name: constant-logical-expr
        - name: context-as-argument
          arguments:
            - allowTypesBefore: '*testing.T'
          disabled: true
        - name: context-keys-type
        - name: deep-exit
        - name: defer
          arguments:
            - - call-chain
              - loop
        - name: dot-imports
        - name: duplicated-imports
        - name: early-return
          arguments:
            - preserveScope
        - name: empty-block
        - name: empty-lines
        - name: error-naming
        - name: error-return
        - name: error-strings
        - name: errorf
        - name: exported
          arguments:
            - sayRepetitiveInsteadOfStutters
        - name: flag-parameter
        - name: identical-branches
        - name: if-return
        - name: import-shadowing
        - name: increment-decrement
        - name: indent-error-flow
          arguments:
            - preserveScope
        - name: package-comments
        - name: range
        - name: range-val-in-closure
        - name: range-val-address
        - name: redefines-builtin-id
        - name: string-format
          arguments:
            - - panic
              - /^[^\n]*$/
              - must not contain line breaks
        - name: struct-tag
        - name: superfluous-else
          arguments:
            - preserveScope
        - name: time-equal
        - name: unconditional-recursion
        - name: unexported-return
        - name: unhandled-error
          arguments:
            - fmt.Fprint
            - fmt.Fprintf
            - fmt.Fprintln
            - fmt.Print
            - fmt.Printf
            - fmt.Println
        - name: unused-parameter
        - name: unused-receiver
        - name: unnecessary-stmt
        - name: use-any
        - name: useless-break
        - name: var-declaration
        - name: var-naming
          arguments:
            - ["ID"] # AllowList
            - ["Otel", "Aws", "Gcp"] # DenyList
        - name: waitgroup-by-value
    testifylint:
      enable-all: true
      disable:
        - float-compare
        - go-require
        - require-error
    usetesting:
      context-background: true
      context-todo: true
  exclusions:
    generated: lax
    presets:
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      - linters:
          - revive
        path: schema/v.*/types/.*
        text: avoid meaningless package names
      # TODO: Having appropriate comments for exported objects helps development,
      # even for objects in internal packages. Appropriate comments for all
      # exported objects should be added and this exclusion removed.
      - linters:
          - revive
        path: .*internal/.*
        text: exported (method|function|type|const) (.+) should have comment or be unexported
      # Yes, they are, but it's okay in a test.
      - linters:
          - revive
        path: _test\.go
        text: exported func.*returns unexported type.*which can be annoying to use
      # Example test functions should be treated like main.
      - linters:
          - revive
        path: example.*_test\.go
        text: calls to (.+) only in main[(][)] or init[(][)] functions
      # It's okay to not run gosec and perfsprint in a test.
      - linters:
          - gosec
          - perfsprint
        path: _test\.go
      # Ignoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand)
      # as we commonly use it in tests and examples.
      - linters:
          - gosec
        text: 'G404:'
      # Ignoring gosec G402: TLS MinVersion too low
      # as the https://pkg.go.dev/crypto/tls#Config handles MinVersion default well.
      - linters:
          - gosec
        text: 'G402: TLS MinVersion too low.'
issues:
  max-issues-per-linter: 0
  max-same-issues: 0
formatters:
  enable:
    - gofumpt
    - goimports
    - golines
  settings:
    gofumpt:
      extra-rules: true
    goimports:
      local-prefixes:
        - go.opentelemetry.io/otel
    golines:
      max-len: 120
  exclusions:
    generated: lax
