cloudflare/pint

Public

mirrored from https://github.com/cloudflare/pintAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.22.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

internal/promapi/failover.go

124lines · modecode

1package promapi
2
3import (
4 "context"
5 "time"
6)
7
8type FailoverGroupError struct {
9 err error
10 uri string
11 isStrict bool
12}
13
14func (e *FailoverGroupError) Unwrap() error {
15 return e.err
16}
17
18func (e *FailoverGroupError) Error() string {
19 return e.err.Error()
20}
21
22func (e *FailoverGroupError) URI() string {
23 return e.uri
24}
25
26func (e *FailoverGroupError) IsStrict() bool {
27 return e.isStrict
28}
29
30type FailoverGroup struct {
31 name string
32 servers []*Prometheus
33 strictErrors bool
34}
35
36func NewFailoverGroup(name string, servers []*Prometheus, strictErrors bool) *FailoverGroup {
37 return &FailoverGroup{
38 name: name,
39 servers: servers,
40 strictErrors: strictErrors,
41 }
42}
43
44func (fg *FailoverGroup) Name() string {
45 return fg.name
46}
47
48func (fg *FailoverGroup) StartWorkers() {
49 for _, prom := range fg.servers {
50 prom.StartWorkers()
51 }
52}
53
54func (fg *FailoverGroup) ClearCache() {
55 for _, prom := range fg.servers {
56 prom.cache.Purge()
57 }
58}
59
60func (fg *FailoverGroup) Close() {
61 for _, prom := range fg.servers {
62 prom.Close()
63 }
64}
65
66func (fg *FailoverGroup) Config(ctx context.Context) (cfg *ConfigResult, err error) {
67 var uri string
68 for _, prom := range fg.servers {
69 uri = prom.uri
70 cfg, err = prom.Config(ctx)
71 if err == nil {
72 return
73 }
74 if !IsUnavailableError(err) {
75 return cfg, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
76 }
77 }
78 return nil, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
79}
80
81func (fg *FailoverGroup) Query(ctx context.Context, expr string) (qr *QueryResult, err error) {
82 var uri string
83 for _, prom := range fg.servers {
84 uri = prom.uri
85 qr, err = prom.Query(ctx, expr)
86 if err == nil {
87 return
88 }
89 if !IsUnavailableError(err) {
90 return qr, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
91 }
92 }
93 return nil, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
94}
95
96func (fg *FailoverGroup) RangeQuery(ctx context.Context, expr string, start, end time.Time, step time.Duration) (rqr *RangeQueryResult, err error) {
97 var uri string
98 for _, prom := range fg.servers {
99 uri = prom.uri
100 rqr, err = prom.RangeQuery(ctx, expr, start, end, step)
101 if err == nil {
102 return
103 }
104 if !IsUnavailableError(err) {
105 return rqr, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
106 }
107 }
108 return nil, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
109}
110
111func (fg *FailoverGroup) Metadata(ctx context.Context, metric string) (metadata *MetadataResult, err error) {
112 var uri string
113 for _, prom := range fg.servers {
114 uri = prom.uri
115 metadata, err = prom.Metadata(ctx, metric)
116 if err == nil {
117 return
118 }
119 if !IsUnavailableError(err) {
120 return metadata, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
121 }
122 }
123 return nil, &FailoverGroupError{err: err, uri: uri, isStrict: fg.strictErrors}
124}
125