github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/promlinter.go (about)

     1  package golinters
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"github.com/yeya24/promlinter"
     8  	"golang.org/x/tools/go/analysis"
     9  
    10  	"github.com/elek/golangci-lint/pkg/golinters/goanalysis"
    11  	"github.com/elek/golangci-lint/pkg/lint/linter"
    12  	"github.com/elek/golangci-lint/pkg/result"
    13  )
    14  
    15  func NewPromlinter() *goanalysis.Linter {
    16  	var mu sync.Mutex
    17  	var resIssues []goanalysis.Issue
    18  
    19  	const linterName = "promlinter"
    20  	analyzer := &analysis.Analyzer{
    21  		Name: linterName,
    22  		Doc:  goanalysis.TheOnlyanalyzerDoc,
    23  	}
    24  	return goanalysis.NewLinter(
    25  		linterName,
    26  		"Check Prometheus metrics naming via promlint",
    27  		[]*analysis.Analyzer{analyzer},
    28  		nil,
    29  	).WithContextSetter(func(lintCtx *linter.Context) {
    30  		strict := lintCtx.Cfg.LintersSettings.Promlinter.Strict
    31  		disabledLinters := lintCtx.Cfg.LintersSettings.Promlinter.DisabledLinters
    32  
    33  		analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
    34  			issues := promlinter.RunLint(pass.Fset, pass.Files, promlinter.Setting{
    35  				Strict:            strict,
    36  				DisabledLintFuncs: disabledLinters,
    37  			})
    38  
    39  			if len(issues) == 0 {
    40  				return nil, nil
    41  			}
    42  
    43  			res := make([]goanalysis.Issue, len(issues))
    44  			for k, i := range issues {
    45  				issue := result.Issue{
    46  					Pos:        i.Pos,
    47  					Text:       fmt.Sprintf("Metric: %s Error: %s", i.Metric, i.Text),
    48  					FromLinter: linterName,
    49  				}
    50  
    51  				res[k] = goanalysis.NewIssue(&issue, pass)
    52  			}
    53  
    54  			mu.Lock()
    55  			resIssues = append(resIssues, res...)
    56  			mu.Unlock()
    57  
    58  			return nil, nil
    59  		}
    60  	}).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    61  		return resIssues
    62  	}).WithLoadMode(goanalysis.LoadModeSyntax)
    63  }