/
main.go
123 lines (110 loc) · 2.56 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"fmt"
"log/slog"
"os"
"github.com/urfave/cli/v2"
"go.uber.org/automaxprocs/maxprocs"
"github.com/cloudflare/pint/internal/config"
)
const (
configFlag = "config"
logLevelFlag = "log-level"
disabledFlag = "disabled"
offlineFlag = "offline"
noColorFlag = "no-color"
workersFlag = "workers"
)
var (
version = "unknown"
commit = "unknown"
)
func newApp() *cli.App {
return &cli.App{
Usage: "Prometheus rule linter/validator.",
Flags: []cli.Flag{
&cli.PathFlag{
Name: configFlag,
Aliases: []string{"c"},
Value: ".pint.hcl",
Usage: "Configuration file to use.",
},
&cli.IntFlag{
Name: workersFlag,
Aliases: []string{"w"},
Value: 10,
Usage: "Number of worker threads for running checks.",
},
&cli.StringFlag{
Name: logLevelFlag,
Aliases: []string{"l"},
Value: slog.LevelInfo.String(),
Usage: "Log level.",
},
&cli.BoolFlag{
Name: noColorFlag,
Aliases: []string{"n"},
Value: false,
Usage: "Disable output colouring.",
},
&cli.StringSliceFlag{
Name: disabledFlag,
Aliases: []string{"d"},
Value: cli.NewStringSlice(),
Usage: "List of checks to disable (example: promql/cost).",
},
&cli.BoolFlag{
Name: offlineFlag,
Aliases: []string{"o"},
Value: false,
Usage: "Disable all check that send live queries to Prometheus servers.",
},
},
Commands: []*cli.Command{
versionCmd,
lintCmd,
ciCmd,
watchCmd,
configCmd,
parseCmd,
},
}
}
type actionMeta struct {
cfg config.Config
isOffline bool
workers int
}
func actionSetup(c *cli.Context) (meta actionMeta, err error) {
err = initLogger(c.String(logLevelFlag), c.Bool(noColorFlag))
if err != nil {
return meta, fmt.Errorf("failed to set log level: %w", err)
}
undo, err := maxprocs.Set()
defer undo()
if err != nil {
slog.Error("failed to set GOMAXPROCS", slog.Any("err", err))
}
meta.workers = c.Int(workersFlag)
if meta.workers < 1 {
return meta, fmt.Errorf("--%s flag must be > 0", workersFlag)
}
meta.cfg, err = config.Load(c.Path(configFlag), c.IsSet(configFlag))
if err != nil {
return meta, fmt.Errorf("failed to load config file %q: %w", c.Path(configFlag), err)
}
meta.cfg.SetDisabledChecks(c.StringSlice(disabledFlag))
if c.Bool(offlineFlag) {
meta.isOffline = true
meta.cfg.DisableOnlineChecks()
}
return meta, nil
}
func main() {
app := newApp()
err := app.Run(os.Args)
if err != nil {
slog.Error("Execution completed with error(s)", slog.Any("err", err))
os.Exit(1)
}
}