Skip to content

Commit b51cbab

Browse files
authored
Revert "Update tests for the snapshot collector (prometheus-community#787)"
This reverts commit 422dfac.
1 parent dbb4460 commit b51cbab

File tree

6 files changed

+69
-188
lines changed

6 files changed

+69
-188
lines changed

collector/snapshots.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ type Snapshots struct {
5757
client *http.Client
5858
url *url.URL
5959

60+
up prometheus.Gauge
61+
totalScrapes, jsonParseFailures prometheus.Counter
62+
6063
snapshotMetrics []*snapshotMetric
6164
repositoryMetrics []*repositoryMetric
6265
}
@@ -68,6 +71,18 @@ func NewSnapshots(logger log.Logger, client *http.Client, url *url.URL) *Snapsho
6871
client: client,
6972
url: url,
7073

74+
up: prometheus.NewGauge(prometheus.GaugeOpts{
75+
Name: prometheus.BuildFQName(namespace, "snapshot_stats", "up"),
76+
Help: "Was the last scrape of the Elasticsearch snapshots endpoint successful.",
77+
}),
78+
totalScrapes: prometheus.NewCounter(prometheus.CounterOpts{
79+
Name: prometheus.BuildFQName(namespace, "snapshot_stats", "total_scrapes"),
80+
Help: "Current total Elasticsearch snapshots scrapes.",
81+
}),
82+
jsonParseFailures: prometheus.NewCounter(prometheus.CounterOpts{
83+
Name: prometheus.BuildFQName(namespace, "snapshot_stats", "json_parse_failures"),
84+
Help: "Number of errors while parsing JSON.",
85+
}),
7186
snapshotMetrics: []*snapshotMetric{
7287
{
7388
Type: prometheus.GaugeValue,
@@ -209,10 +224,9 @@ func (s *Snapshots) Describe(ch chan<- *prometheus.Desc) {
209224
for _, metric := range s.snapshotMetrics {
210225
ch <- metric.Desc
211226
}
212-
for _, metric := range s.repositoryMetrics {
213-
ch <- metric.Desc
214-
}
215-
227+
ch <- s.up.Desc()
228+
ch <- s.totalScrapes.Desc()
229+
ch <- s.jsonParseFailures.Desc()
216230
}
217231

218232
func (s *Snapshots) getAndParseURL(u *url.URL, data interface{}) error {
@@ -238,10 +252,12 @@ func (s *Snapshots) getAndParseURL(u *url.URL, data interface{}) error {
238252

239253
bts, err := io.ReadAll(res.Body)
240254
if err != nil {
255+
s.jsonParseFailures.Inc()
241256
return err
242257
}
243258

244259
if err := json.Unmarshal(bts, data); err != nil {
260+
s.jsonParseFailures.Inc()
245261
return err
246262
}
247263
return nil
@@ -273,16 +289,24 @@ func (s *Snapshots) fetchAndDecodeSnapshotsStats() (map[string]SnapshotStatsResp
273289

274290
// Collect gets Snapshots metric values
275291
func (s *Snapshots) Collect(ch chan<- prometheus.Metric) {
292+
s.totalScrapes.Inc()
293+
defer func() {
294+
ch <- s.up
295+
ch <- s.totalScrapes
296+
ch <- s.jsonParseFailures
297+
}()
276298

277299
// indices
278300
snapshotsStatsResp, err := s.fetchAndDecodeSnapshotsStats()
279301
if err != nil {
302+
s.up.Set(0)
280303
level.Warn(s.logger).Log(
281304
"msg", "failed to fetch and decode snapshot stats",
282305
"err", err,
283306
)
284307
return
285308
}
309+
s.up.Set(1)
286310

287311
// Snapshots stats
288312
for repositoryName, snapshotStats := range snapshotsStatsResp {

collector/snapshots_test.go

Lines changed: 41 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,12 @@ package collector
1515

1616
import (
1717
"fmt"
18-
"io"
1918
"net/http"
2019
"net/http/httptest"
2120
"net/url"
22-
"os"
23-
"strings"
2421
"testing"
2522

2623
"github.com/go-kit/log"
27-
"github.com/prometheus/client_golang/prometheus/testutil"
2824
)
2925

3026
func TestSnapshots(t *testing.T) {
@@ -41,185 +37,50 @@ func TestSnapshots(t *testing.T) {
4137
// curl http://localhost:9200/_snapshot/
4238
// curl http://localhost:9200/_snapshot/test1/_all
4339

44-
tests := []struct {
45-
name string
46-
file string
47-
want string
48-
}{
49-
{
50-
name: "1.7.6",
51-
file: "../fixtures/snapshots/1.7.6.json",
52-
want: `# HELP elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds Timestamp of the latest SUCCESS or PARTIAL snapshot
53-
# TYPE elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds gauge
54-
elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds{repository="test1"} 1.536052142e+09
55-
# HELP elasticsearch_snapshot_stats_number_of_snapshots Number of snapshots in a repository
56-
# TYPE elasticsearch_snapshot_stats_number_of_snapshots gauge
57-
elasticsearch_snapshot_stats_number_of_snapshots{repository="test1"} 1
58-
# HELP elasticsearch_snapshot_stats_oldest_snapshot_timestamp Timestamp of the oldest snapshot
59-
# TYPE elasticsearch_snapshot_stats_oldest_snapshot_timestamp gauge
60-
elasticsearch_snapshot_stats_oldest_snapshot_timestamp{repository="test1"} 1.536052142e+09
61-
# HELP elasticsearch_snapshot_stats_snapshot_end_time_timestamp Last snapshot end timestamp
62-
# TYPE elasticsearch_snapshot_stats_snapshot_end_time_timestamp gauge
63-
elasticsearch_snapshot_stats_snapshot_end_time_timestamp{repository="test1",state="SUCCESS",version="1.7.6"} 1.536052142e+09
64-
# HELP elasticsearch_snapshot_stats_snapshot_failed_shards Last snapshot failed shards
65-
# TYPE elasticsearch_snapshot_stats_snapshot_failed_shards gauge
66-
elasticsearch_snapshot_stats_snapshot_failed_shards{repository="test1",state="SUCCESS",version="1.7.6"} 0
67-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_failures Last snapshot number of failures
68-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_failures gauge
69-
elasticsearch_snapshot_stats_snapshot_number_of_failures{repository="test1",state="SUCCESS",version="1.7.6"} 0
70-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_indices Number of indices in the last snapshot
71-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_indices gauge
72-
elasticsearch_snapshot_stats_snapshot_number_of_indices{repository="test1",state="SUCCESS",version="1.7.6"} 2
73-
# HELP elasticsearch_snapshot_stats_snapshot_start_time_timestamp Last snapshot start timestamp
74-
# TYPE elasticsearch_snapshot_stats_snapshot_start_time_timestamp gauge
75-
elasticsearch_snapshot_stats_snapshot_start_time_timestamp{repository="test1",state="SUCCESS",version="1.7.6"} 1.536052142e+09
76-
# HELP elasticsearch_snapshot_stats_snapshot_successful_shards Last snapshot successful shards
77-
# TYPE elasticsearch_snapshot_stats_snapshot_successful_shards gauge
78-
elasticsearch_snapshot_stats_snapshot_successful_shards{repository="test1",state="SUCCESS",version="1.7.6"} 10
79-
# HELP elasticsearch_snapshot_stats_snapshot_total_shards Last snapshot total shards
80-
# TYPE elasticsearch_snapshot_stats_snapshot_total_shards gauge
81-
elasticsearch_snapshot_stats_snapshot_total_shards{repository="test1",state="SUCCESS",version="1.7.6"} 10
82-
`,
83-
},
84-
{
85-
name: "2.4.5",
86-
file: "../fixtures/snapshots/2.4.5.json",
87-
want: `# HELP elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds Timestamp of the latest SUCCESS or PARTIAL snapshot
88-
# TYPE elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds gauge
89-
elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds{repository="test1"} 1.536053125e+09
90-
# HELP elasticsearch_snapshot_stats_number_of_snapshots Number of snapshots in a repository
91-
# TYPE elasticsearch_snapshot_stats_number_of_snapshots gauge
92-
elasticsearch_snapshot_stats_number_of_snapshots{repository="test1"} 1
93-
# HELP elasticsearch_snapshot_stats_oldest_snapshot_timestamp Timestamp of the oldest snapshot
94-
# TYPE elasticsearch_snapshot_stats_oldest_snapshot_timestamp gauge
95-
elasticsearch_snapshot_stats_oldest_snapshot_timestamp{repository="test1"} 1.536053125e+09
96-
# HELP elasticsearch_snapshot_stats_snapshot_end_time_timestamp Last snapshot end timestamp
97-
# TYPE elasticsearch_snapshot_stats_snapshot_end_time_timestamp gauge
98-
elasticsearch_snapshot_stats_snapshot_end_time_timestamp{repository="test1",state="SUCCESS",version="2.4.5"} 1.536053126e+09
99-
# HELP elasticsearch_snapshot_stats_snapshot_failed_shards Last snapshot failed shards
100-
# TYPE elasticsearch_snapshot_stats_snapshot_failed_shards gauge
101-
elasticsearch_snapshot_stats_snapshot_failed_shards{repository="test1",state="SUCCESS",version="2.4.5"} 0
102-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_failures Last snapshot number of failures
103-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_failures gauge
104-
elasticsearch_snapshot_stats_snapshot_number_of_failures{repository="test1",state="SUCCESS",version="2.4.5"} 0
105-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_indices Number of indices in the last snapshot
106-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_indices gauge
107-
elasticsearch_snapshot_stats_snapshot_number_of_indices{repository="test1",state="SUCCESS",version="2.4.5"} 2
108-
# HELP elasticsearch_snapshot_stats_snapshot_start_time_timestamp Last snapshot start timestamp
109-
# TYPE elasticsearch_snapshot_stats_snapshot_start_time_timestamp gauge
110-
elasticsearch_snapshot_stats_snapshot_start_time_timestamp{repository="test1",state="SUCCESS",version="2.4.5"} 1.536053125e+09
111-
# HELP elasticsearch_snapshot_stats_snapshot_successful_shards Last snapshot successful shards
112-
# TYPE elasticsearch_snapshot_stats_snapshot_successful_shards gauge
113-
elasticsearch_snapshot_stats_snapshot_successful_shards{repository="test1",state="SUCCESS",version="2.4.5"} 10
114-
# HELP elasticsearch_snapshot_stats_snapshot_total_shards Last snapshot total shards
115-
# TYPE elasticsearch_snapshot_stats_snapshot_total_shards gauge
116-
elasticsearch_snapshot_stats_snapshot_total_shards{repository="test1",state="SUCCESS",version="2.4.5"} 10
117-
`,
118-
},
119-
{
120-
name: "5.4.2",
121-
file: "../fixtures/snapshots/5.4.2.json",
122-
want: `# HELP elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds Timestamp of the latest SUCCESS or PARTIAL snapshot
123-
# TYPE elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds gauge
124-
elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds{repository="test1"} 1.536053353e+09
125-
# HELP elasticsearch_snapshot_stats_number_of_snapshots Number of snapshots in a repository
126-
# TYPE elasticsearch_snapshot_stats_number_of_snapshots gauge
127-
elasticsearch_snapshot_stats_number_of_snapshots{repository="test1"} 1
128-
# HELP elasticsearch_snapshot_stats_oldest_snapshot_timestamp Timestamp of the oldest snapshot
129-
# TYPE elasticsearch_snapshot_stats_oldest_snapshot_timestamp gauge
130-
elasticsearch_snapshot_stats_oldest_snapshot_timestamp{repository="test1"} 1.536053353e+09
131-
# HELP elasticsearch_snapshot_stats_snapshot_end_time_timestamp Last snapshot end timestamp
132-
# TYPE elasticsearch_snapshot_stats_snapshot_end_time_timestamp gauge
133-
elasticsearch_snapshot_stats_snapshot_end_time_timestamp{repository="test1",state="SUCCESS",version="5.4.2"} 1.536053354e+09
134-
# HELP elasticsearch_snapshot_stats_snapshot_failed_shards Last snapshot failed shards
135-
# TYPE elasticsearch_snapshot_stats_snapshot_failed_shards gauge
136-
elasticsearch_snapshot_stats_snapshot_failed_shards{repository="test1",state="SUCCESS",version="5.4.2"} 0
137-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_failures Last snapshot number of failures
138-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_failures gauge
139-
elasticsearch_snapshot_stats_snapshot_number_of_failures{repository="test1",state="SUCCESS",version="5.4.2"} 0
140-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_indices Number of indices in the last snapshot
141-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_indices gauge
142-
elasticsearch_snapshot_stats_snapshot_number_of_indices{repository="test1",state="SUCCESS",version="5.4.2"} 2
143-
# HELP elasticsearch_snapshot_stats_snapshot_start_time_timestamp Last snapshot start timestamp
144-
# TYPE elasticsearch_snapshot_stats_snapshot_start_time_timestamp gauge
145-
elasticsearch_snapshot_stats_snapshot_start_time_timestamp{repository="test1",state="SUCCESS",version="5.4.2"} 1.536053353e+09
146-
# HELP elasticsearch_snapshot_stats_snapshot_successful_shards Last snapshot successful shards
147-
# TYPE elasticsearch_snapshot_stats_snapshot_successful_shards gauge
148-
elasticsearch_snapshot_stats_snapshot_successful_shards{repository="test1",state="SUCCESS",version="5.4.2"} 10
149-
# HELP elasticsearch_snapshot_stats_snapshot_total_shards Last snapshot total shards
150-
# TYPE elasticsearch_snapshot_stats_snapshot_total_shards gauge
151-
elasticsearch_snapshot_stats_snapshot_total_shards{repository="test1",state="SUCCESS",version="5.4.2"} 10
152-
`,
153-
},
154-
{
155-
name: "5.4.2-failure",
156-
file: "../fixtures/snapshots/5.4.2-failed.json",
157-
want: `# HELP elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds Timestamp of the latest SUCCESS or PARTIAL snapshot
158-
# TYPE elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds gauge
159-
elasticsearch_snapshot_stats_latest_snapshot_timestamp_seconds{repository="test1"} 1.536053353e+09
160-
# HELP elasticsearch_snapshot_stats_number_of_snapshots Number of snapshots in a repository
161-
# TYPE elasticsearch_snapshot_stats_number_of_snapshots gauge
162-
elasticsearch_snapshot_stats_number_of_snapshots{repository="test1"} 1
163-
# HELP elasticsearch_snapshot_stats_oldest_snapshot_timestamp Timestamp of the oldest snapshot
164-
# TYPE elasticsearch_snapshot_stats_oldest_snapshot_timestamp gauge
165-
elasticsearch_snapshot_stats_oldest_snapshot_timestamp{repository="test1"} 1.536053353e+09
166-
# HELP elasticsearch_snapshot_stats_snapshot_end_time_timestamp Last snapshot end timestamp
167-
# TYPE elasticsearch_snapshot_stats_snapshot_end_time_timestamp gauge
168-
elasticsearch_snapshot_stats_snapshot_end_time_timestamp{repository="test1",state="SUCCESS",version="5.4.2"} 1.536053354e+09
169-
# HELP elasticsearch_snapshot_stats_snapshot_failed_shards Last snapshot failed shards
170-
# TYPE elasticsearch_snapshot_stats_snapshot_failed_shards gauge
171-
elasticsearch_snapshot_stats_snapshot_failed_shards{repository="test1",state="SUCCESS",version="5.4.2"} 1
172-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_failures Last snapshot number of failures
173-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_failures gauge
174-
elasticsearch_snapshot_stats_snapshot_number_of_failures{repository="test1",state="SUCCESS",version="5.4.2"} 1
175-
# HELP elasticsearch_snapshot_stats_snapshot_number_of_indices Number of indices in the last snapshot
176-
# TYPE elasticsearch_snapshot_stats_snapshot_number_of_indices gauge
177-
elasticsearch_snapshot_stats_snapshot_number_of_indices{repository="test1",state="SUCCESS",version="5.4.2"} 2
178-
# HELP elasticsearch_snapshot_stats_snapshot_start_time_timestamp Last snapshot start timestamp
179-
# TYPE elasticsearch_snapshot_stats_snapshot_start_time_timestamp gauge
180-
elasticsearch_snapshot_stats_snapshot_start_time_timestamp{repository="test1",state="SUCCESS",version="5.4.2"} 1.536053353e+09
181-
# HELP elasticsearch_snapshot_stats_snapshot_successful_shards Last snapshot successful shards
182-
# TYPE elasticsearch_snapshot_stats_snapshot_successful_shards gauge
183-
elasticsearch_snapshot_stats_snapshot_successful_shards{repository="test1",state="SUCCESS",version="5.4.2"} 10
184-
# HELP elasticsearch_snapshot_stats_snapshot_total_shards Last snapshot total shards
185-
# TYPE elasticsearch_snapshot_stats_snapshot_total_shards gauge
186-
elasticsearch_snapshot_stats_snapshot_total_shards{repository="test1",state="SUCCESS",version="5.4.2"} 10
187-
`,
188-
},
40+
tcs := map[string][]string{
41+
"1.7.6": {`{"test1":{"type":"fs","settings":{"location":"/tmp/test1"}}}`, `{"snapshots":[{"snapshot":"snapshot_1","version_id":1070699,"version":"1.7.6","indices":["foo_1","foo_2"],"state":"SUCCESS","start_time":"2018-09-04T09:09:02.427Z","start_time_in_millis":1536052142427,"end_time":"2018-09-04T09:09:02.755Z","end_time_in_millis":1536052142755,"duration_in_millis":328,"failures":[],"shards":{"total":10,"failed":0,"successful":10}}]}`},
42+
"2.4.5": {`{"test1":{"type":"fs","settings":{"location":"/tmp/test1"}}}`, `{"snapshots":[{"snapshot":"snapshot_1","version_id":2040599,"version":"2.4.5","indices":["foo_2","foo_1"],"state":"SUCCESS","start_time":"2018-09-04T09:25:25.818Z","start_time_in_millis":1536053125818,"end_time":"2018-09-04T09:25:26.326Z","end_time_in_millis":1536053126326,"duration_in_millis":508,"failures":[],"shards":{"total":10,"failed":0,"successful":10}}]}`},
43+
"5.4.2": {`{"test1":{"type":"fs","settings":{"location":"/tmp/test1"}}}`, `{"snapshots":[{"snapshot":"snapshot_1","uuid":"VZ_c_kKISAW8rpcqiwSg0w","version_id":5040299,"version":"5.4.2","indices":["foo_2","foo_1"],"state":"SUCCESS","start_time":"2018-09-04T09:29:13.971Z","start_time_in_millis":1536053353971,"end_time":"2018-09-04T09:29:14.477Z","end_time_in_millis":1536053354477,"duration_in_millis":506,"failures":[],"shards":{"total":10,"failed":0,"successful":10}}]}`},
44+
"5.4.2-failed": {`{"test1":{"type":"fs","settings":{"location":"/tmp/test1"}}}`, `{"snapshots":[{"snapshot":"snapshot_1","uuid":"VZ_c_kKISAW8rpcqiwSg0w","version_id":5040299,"version":"5.4.2","indices":["foo_2","foo_1"],"state":"SUCCESS","start_time":"2018-09-04T09:29:13.971Z","start_time_in_millis":1536053353971,"end_time":"2018-09-04T09:29:14.477Z","end_time_in_millis":1536053354477,"duration_in_millis":506,"failures":[{"index" : "index_name","index_uuid" : "index_name","shard_id" : 52,"reason" : "IndexShardSnapshotFailedException[error deleting index file [pending-index-5] during cleanup]; nested: NoSuchFileException[Blob [pending-index-5] does not exist]; ","node_id" : "pPm9jafyTjyMk0T5A101xA","status" : "INTERNAL_SERVER_ERROR"}],"shards":{"total":10,"failed":1,"successful":10}}]}`},
18945
}
190-
for _, tt := range tests {
191-
t.Run(tt.name, func(t *testing.T) {
192-
f, err := os.Open(tt.file)
193-
if err != nil {
194-
t.Fatal(err)
46+
for ver, out := range tcs {
47+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
48+
if r.RequestURI == "/_snapshot" {
49+
fmt.Fprint(w, out[0])
50+
return
19551
}
196-
defer f.Close()
52+
fmt.Fprint(w, out[1])
53+
}))
54+
defer ts.Close()
19755

198-
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
199-
if r.RequestURI == "/_snapshot" {
200-
fmt.Fprint(w, `{"test1":{"type":"fs","settings":{"location":"/tmp/test1"}}}`)
201-
return
202-
}
203-
io.Copy(w, f)
204-
}))
205-
defer ts.Close()
56+
u, err := url.Parse(ts.URL)
57+
if err != nil {
58+
t.Fatalf("Failed to parse URL: %s", err)
59+
}
60+
s := NewSnapshots(log.NewNopLogger(), http.DefaultClient, u)
61+
stats, err := s.fetchAndDecodeSnapshotsStats()
62+
if err != nil {
63+
t.Fatalf("Failed to fetch or decode snapshots stats: %s", err)
64+
}
65+
t.Logf("[%s] Snapshots Response: %+v", ver, stats)
66+
repositoryStats := stats["test1"]
67+
snapshotStats := repositoryStats.Snapshots[0]
20668

207-
u, err := url.Parse(ts.URL)
208-
if err != nil {
209-
t.Fatal(err)
210-
}
211-
212-
s := NewSnapshots(log.NewNopLogger(), http.DefaultClient, u)
213-
214-
// TODO: Convert to collector interface
215-
// c, err := NewSnapshots(log.NewNopLogger(), u, http.DefaultClient)
216-
// if err != nil {
217-
// t.Fatal(err)
218-
// }
219-
220-
if err := testutil.CollectAndCompare(s, strings.NewReader(tt.want)); err != nil {
221-
t.Fatal(err)
222-
}
223-
})
69+
if len(snapshotStats.Indices) != 2 {
70+
t.Errorf("Bad number of snapshot indices")
71+
}
72+
if len(snapshotStats.Failures) != int(snapshotStats.Shards.Failed) {
73+
t.Errorf("Bad number of snapshot failures")
74+
}
75+
if snapshotStats.Shards.Total != 10 {
76+
t.Errorf("Bad number of snapshot shards total")
77+
}
78+
if snapshotStats.Shards.Successful != 10 {
79+
t.Errorf("Bad number of snapshot shards successful")
80+
}
81+
if len(repositoryStats.Snapshots) != 1 {
82+
t.Errorf("Bad number of repository snapshots")
83+
}
22484
}
85+
22586
}

fixtures/snapshots/1.7.6.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

fixtures/snapshots/2.4.5.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)