Merge pull request from JessicaGreben/minor-prom-improvements

Add exit code constants in promtool
This commit is contained in:
Jessica G 2021-12-31 12:07:02 -08:00 committed by GitHub
commit 174a1147d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 38 deletions

View file

@ -56,6 +56,13 @@ import (
"github.com/prometheus/prometheus/scrape" "github.com/prometheus/prometheus/scrape"
) )
const (
successExitCode = 0
failureExitCode = 1
// Exit code 3 is used for "one or more lint issues detected".
lintErrExitCode = 3
)
func main() { func main() {
app := kingpin.New(filepath.Base(os.Args[0]), "Tooling for the Prometheus monitoring system.").UsageWriter(os.Stdout) app := kingpin.New(filepath.Base(os.Args[0]), "Tooling for the Prometheus monitoring system.").UsageWriter(os.Stdout)
app.Version(version.Print("promtool")) app.Version(version.Print("promtool"))
@ -298,9 +305,9 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, files ...string) int {
} }
} }
if failed { if failed {
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
// CheckWebConfig validates web configuration files. // CheckWebConfig validates web configuration files.
@ -316,9 +323,9 @@ func CheckWebConfig(files ...string) int {
fmt.Fprintln(os.Stderr, f, "SUCCESS") fmt.Fprintln(os.Stderr, f, "SUCCESS")
} }
if failed { if failed {
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
func checkFileExists(fn string) error { func checkFileExists(fn string) error {
@ -521,9 +528,9 @@ func CheckRules(files ...string) int {
fmt.Println() fmt.Println()
} }
if failed { if failed {
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
func checkRules(filename string) (int, []error) { func checkRules(filename string) (int, []error) {
@ -531,7 +538,7 @@ func checkRules(filename string) (int, []error) {
rgs, errs := rulefmt.ParseFile(filename) rgs, errs := rulefmt.ParseFile(filename)
if errs != nil { if errs != nil {
return 0, errs return successExitCode, errs
} }
numRules := 0 numRules := 0
@ -627,7 +634,7 @@ func CheckMetrics() int {
problems, err := l.Lint() problems, err := l.Lint()
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error while linting:", err) fmt.Fprintln(os.Stderr, "error while linting:", err)
return 1 return failureExitCode
} }
for _, p := range problems { for _, p := range problems {
@ -635,10 +642,10 @@ func CheckMetrics() int {
} }
if len(problems) > 0 { if len(problems) > 0 {
return 3 return lintErrExitCode
} }
return 0 return successExitCode
} }
// QueryInstant performs an instant query against a Prometheus server. // QueryInstant performs an instant query against a Prometheus server.
@ -654,7 +661,7 @@ func QueryInstant(url *url.URL, query, evalTime string, p printer) int {
c, err := api.NewClient(config) c, err := api.NewClient(config)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error creating API client:", err) fmt.Fprintln(os.Stderr, "error creating API client:", err)
return 1 return failureExitCode
} }
eTime := time.Now() eTime := time.Now()
@ -662,7 +669,7 @@ func QueryInstant(url *url.URL, query, evalTime string, p printer) int {
eTime, err = parseTime(evalTime) eTime, err = parseTime(evalTime)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error parsing evaluation time:", err) fmt.Fprintln(os.Stderr, "error parsing evaluation time:", err)
return 1 return failureExitCode
} }
} }
@ -678,7 +685,7 @@ func QueryInstant(url *url.URL, query, evalTime string, p printer) int {
p.printValue(val) p.printValue(val)
return 0 return successExitCode
} }
// QueryRange performs a range query against a Prometheus server. // QueryRange performs a range query against a Prometheus server.
@ -703,7 +710,7 @@ func QueryRange(url *url.URL, headers map[string]string, query, start, end strin
c, err := api.NewClient(config) c, err := api.NewClient(config)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error creating API client:", err) fmt.Fprintln(os.Stderr, "error creating API client:", err)
return 1 return failureExitCode
} }
var stime, etime time.Time var stime, etime time.Time
@ -714,7 +721,7 @@ func QueryRange(url *url.URL, headers map[string]string, query, start, end strin
etime, err = parseTime(end) etime, err = parseTime(end)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error parsing end time:", err) fmt.Fprintln(os.Stderr, "error parsing end time:", err)
return 1 return failureExitCode
} }
} }
@ -724,13 +731,13 @@ func QueryRange(url *url.URL, headers map[string]string, query, start, end strin
stime, err = parseTime(start) stime, err = parseTime(start)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error parsing start time:", err) fmt.Fprintln(os.Stderr, "error parsing start time:", err)
return 1 return failureExitCode
} }
} }
if !stime.Before(etime) { if !stime.Before(etime) {
fmt.Fprintln(os.Stderr, "start time is not before end time") fmt.Fprintln(os.Stderr, "start time is not before end time")
return 1 return failureExitCode
} }
if step == 0 { if step == 0 {
@ -751,7 +758,7 @@ func QueryRange(url *url.URL, headers map[string]string, query, start, end strin
} }
p.printValue(val) p.printValue(val)
return 0 return successExitCode
} }
// QuerySeries queries for a series against a Prometheus server. // QuerySeries queries for a series against a Prometheus server.
@ -767,13 +774,13 @@ func QuerySeries(url *url.URL, matchers []string, start, end string, p printer)
c, err := api.NewClient(config) c, err := api.NewClient(config)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error creating API client:", err) fmt.Fprintln(os.Stderr, "error creating API client:", err)
return 1 return failureExitCode
} }
stime, etime, err := parseStartTimeAndEndTime(start, end) stime, etime, err := parseStartTimeAndEndTime(start, end)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return 1 return failureExitCode
} }
// Run query against client. // Run query against client.
@ -787,7 +794,7 @@ func QuerySeries(url *url.URL, matchers []string, start, end string, p printer)
} }
p.printSeries(val) p.printSeries(val)
return 0 return successExitCode
} }
// QueryLabels queries for label values against a Prometheus server. // QueryLabels queries for label values against a Prometheus server.
@ -803,13 +810,13 @@ func QueryLabels(url *url.URL, name, start, end string, p printer) int {
c, err := api.NewClient(config) c, err := api.NewClient(config)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "error creating API client:", err) fmt.Fprintln(os.Stderr, "error creating API client:", err)
return 1 return failureExitCode
} }
stime, etime, err := parseStartTimeAndEndTime(start, end) stime, etime, err := parseStartTimeAndEndTime(start, end)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
return 1 return failureExitCode
} }
// Run query against client. // Run query against client.
@ -826,7 +833,7 @@ func QueryLabels(url *url.URL, name, start, end string, p printer) int {
} }
p.printLabelValues(val) p.printLabelValues(val)
return 0 return successExitCode
} }
func handleAPIError(err error) int { func handleAPIError(err error) int {
@ -837,7 +844,7 @@ func handleAPIError(err error) int {
fmt.Fprintln(os.Stderr, "query error:", err) fmt.Fprintln(os.Stderr, "query error:", err)
} }
return 1 return failureExitCode
} }
func parseStartTimeAndEndTime(start, end string) (time.Time, time.Time, error) { func parseStartTimeAndEndTime(start, end string) (time.Time, time.Time, error) {
@ -929,9 +936,9 @@ func debugPprof(url string) int {
endPointGroups: pprofEndpoints, endPointGroups: pprofEndpoints,
}); err != nil { }); err != nil {
fmt.Fprintln(os.Stderr, "error completing debug command:", err) fmt.Fprintln(os.Stderr, "error completing debug command:", err)
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
func debugMetrics(url string) int { func debugMetrics(url string) int {
@ -941,9 +948,9 @@ func debugMetrics(url string) int {
endPointGroups: metricsEndpoints, endPointGroups: metricsEndpoints,
}); err != nil { }); err != nil {
fmt.Fprintln(os.Stderr, "error completing debug command:", err) fmt.Fprintln(os.Stderr, "error completing debug command:", err)
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
func debugAll(url string) int { func debugAll(url string) int {
@ -953,9 +960,9 @@ func debugAll(url string) int {
endPointGroups: allEndpoints, endPointGroups: allEndpoints,
}); err != nil { }); err != nil {
fmt.Fprintln(os.Stderr, "error completing debug command:", err) fmt.Fprintln(os.Stderr, "error completing debug command:", err)
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
type printer interface { type printer interface {

View file

@ -43,7 +43,7 @@ func CheckSD(sdConfigFiles, sdJobName string, sdTimeout time.Duration) int {
cfg, err := config.LoadFile(sdConfigFiles, false, false, logger) cfg, err := config.LoadFile(sdConfigFiles, false, false, logger)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "Cannot load config", err) fmt.Fprintln(os.Stderr, "Cannot load config", err)
return 2 return failureExitCode
} }
var scrapeConfig *config.ScrapeConfig var scrapeConfig *config.ScrapeConfig
@ -63,7 +63,7 @@ func CheckSD(sdConfigFiles, sdJobName string, sdTimeout time.Duration) int {
for _, job := range jobs { for _, job := range jobs {
fmt.Fprintf(os.Stderr, "\t%s\n", job) fmt.Fprintf(os.Stderr, "\t%s\n", job)
} }
return 1 return failureExitCode
} }
targetGroupChan := make(chan []*targetgroup.Group) targetGroupChan := make(chan []*targetgroup.Group)
@ -74,7 +74,7 @@ func CheckSD(sdConfigFiles, sdJobName string, sdTimeout time.Duration) int {
d, err := cfg.NewDiscoverer(discovery.DiscovererOptions{Logger: logger}) d, err := cfg.NewDiscoverer(discovery.DiscovererOptions{Logger: logger})
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "Could not create new discoverer", err) fmt.Fprintln(os.Stderr, "Could not create new discoverer", err)
return 2 return failureExitCode
} }
go d.Run(ctx, targetGroupChan) go d.Run(ctx, targetGroupChan)
} }
@ -100,11 +100,11 @@ outerLoop:
res, err := json.MarshalIndent(results, "", " ") res, err := json.MarshalIndent(results, "", " ")
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Could not marshal result json: %s", err) fmt.Fprintf(os.Stderr, "Could not marshal result json: %s", err)
return 2 return failureExitCode
} }
fmt.Printf("%s", res) fmt.Printf("%s", res)
return 0 return successExitCode
} }
func getSDCheckResult(targetGroups []*targetgroup.Group, scrapeConfig *config.ScrapeConfig) []sdCheckResult { func getSDCheckResult(targetGroups []*targetgroup.Group, scrapeConfig *config.ScrapeConfig) []sdCheckResult {

View file

@ -56,9 +56,9 @@ func RulesUnitTest(queryOpts promql.LazyLoaderOpts, files ...string) int {
fmt.Println() fmt.Println()
} }
if failed { if failed {
return 1 return failureExitCode
} }
return 0 return successExitCode
} }
func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error { func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error {