-
Notifications
You must be signed in to change notification settings - Fork 0
/
target.go
113 lines (88 loc) · 2.6 KB
/
target.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
package cmd
import (
"context"
"os"
"regexp"
"github.com/alecthomas/kong"
"github.com/postfinance/promi/internal/prometheus"
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
"github.com/zbindenren/sfmt"
"go.uber.org/zap"
"k8s.io/apimachinery/pkg/labels"
)
type targetCmd struct {
Output string `short:"o" default:"table" enum:"json,yaml,table" help:"Output format (table|json|yaml)."`
Compact bool `short:"c" help:"Do not display labels and last error."`
NoHeaders bool `short:"n" help:"Do not display headers in table output."`
targetFilter `prefix:"filter-"`
}
func (t targetCmd) Run(g *Globals, l *zap.SugaredLogger, app *kong.Context) error {
c, err := g.client()
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), g.Timeout)
defer cancel()
targets, err := c.Targets(ctx, false)
if err != nil {
return err
}
filters, err := t.targetFilter.filters()
if err != nil {
return err
}
targets = targets.Filter(filters...)
targets.Sort()
if t.Compact {
targets.Compact()
}
s := sfmt.SliceWriter{
Writer: os.Stdout,
NoHeaders: t.NoHeaders,
}
format := sfmt.ParseFormat(t.Output)
s.Write(format, targets)
return nil
}
type targetFilter struct {
Name string `short:"N" help:"Filter targets by job name (regular expression)."`
Server string `short:"S" help:"Filter targets by promehteus server name (regular expression)."`
ScrapeURL string `short:"e" help:"Filter targets by scrape endpoint url (regular expression)."`
Health v1.HealthStatus `short:"H" help:"Filter targets by health (up|down)" enum:"up,down,unknown,"`
Selector string `short:"s" help:"Filter services by (k8s style) selector."`
}
func (t targetFilter) filters() ([]prometheus.TargetFilterFunc, error) {
filters := []prometheus.TargetFilterFunc{}
if t.Name != "" {
r, err := regexp.Compile(t.Name)
if err != nil {
return nil, err
}
filters = append(filters, prometheus.TargetByJob(r))
}
if t.ScrapeURL != "" {
r, err := regexp.Compile(t.ScrapeURL)
if err != nil {
return nil, err
}
filters = append(filters, prometheus.TargetByScrapeURL(r))
}
if t.Server != "" {
r, err := regexp.Compile(t.Server)
if err != nil {
return nil, err
}
filters = append(filters, prometheus.TargetByServer(r))
}
if t.Health != "" {
filters = append(filters, prometheus.TargetByHealth(t.Health))
}
if t.Selector != "" {
sel, err := labels.Parse(t.Selector)
if err != nil {
return nil, err
}
filters = append(filters, prometheus.TargetBySelector(sel))
}
return filters, nil
}