@@ -15,16 +15,12 @@ package collector
1515
1616import (
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
3026func 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}
0 commit comments