@@ -19,38 +19,179 @@ import (
1919 "net/http/httptest"
2020 "net/url"
2121 "os"
22+ "strings"
2223 "testing"
2324
25+ "github.com/prometheus/client_golang/prometheus/testutil"
2426 "github.com/prometheus/common/promslog"
2527)
2628
27- func TestRemoteInfoStats (t * testing.T ) {
29+ func TestRemoteInfo (t * testing.T ) {
2830 // Testcases created using:
2931 // docker run -d -p 9200:9200 elasticsearch:VERSION-alpine
30- // curl http://localhost:9200/_cluster/settings/?include_defaults=true
31- files := []string {"../fixtures/settings-5.4.2.json" , "../fixtures/settings-merge-5.4.2.json" }
32- for _ , filename := range files {
33- f , _ := os .Open (filename )
34- defer f .Close ()
35- for hn , handler := range map [string ]http.Handler {
36- "plain" : http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
32+ // curl http://localhost:9200/_remote/info
33+
34+ tests := []struct {
35+ name string
36+ file string
37+ want string
38+ }{
39+ {
40+ name : "7.15.0" ,
41+ file : "../fixtures/remote_info/7.15.0.json" ,
42+ want : `
43+ # HELP elasticsearch_remote_info_max_connections_per_cluster Max connections per cluster
44+ # TYPE elasticsearch_remote_info_max_connections_per_cluster gauge
45+ elasticsearch_remote_info_max_connections_per_cluster{remote_cluster="cluster_remote_1"} 10
46+ elasticsearch_remote_info_max_connections_per_cluster{remote_cluster="cluster_remote_2"} 5
47+ # HELP elasticsearch_remote_info_num_nodes_connected Number of nodes connected
48+ # TYPE elasticsearch_remote_info_num_nodes_connected gauge
49+ elasticsearch_remote_info_num_nodes_connected{remote_cluster="cluster_remote_1"} 3
50+ elasticsearch_remote_info_num_nodes_connected{remote_cluster="cluster_remote_2"} 0
51+ # HELP elasticsearch_remote_info_num_proxy_sockets_connected Number of proxy sockets connected
52+ # TYPE elasticsearch_remote_info_num_proxy_sockets_connected gauge
53+ elasticsearch_remote_info_num_proxy_sockets_connected{remote_cluster="cluster_remote_1"} 5
54+ elasticsearch_remote_info_num_proxy_sockets_connected{remote_cluster="cluster_remote_2"} 0
55+ # HELP elasticsearch_remote_info_stats_json_parse_failures Number of errors while parsing JSON.
56+ # TYPE elasticsearch_remote_info_stats_json_parse_failures counter
57+ elasticsearch_remote_info_stats_json_parse_failures 0
58+ # HELP elasticsearch_remote_info_stats_total_scrapes Current total ElasticSearch remote info scrapes.
59+ # TYPE elasticsearch_remote_info_stats_total_scrapes counter
60+ elasticsearch_remote_info_stats_total_scrapes 1
61+ # HELP elasticsearch_remote_info_stats_up Was the last scrape of the ElasticSearch remote info endpoint successful.
62+ # TYPE elasticsearch_remote_info_stats_up gauge
63+ elasticsearch_remote_info_stats_up 1
64+ ` ,
65+ },
66+ {
67+ name : "8.0.0" ,
68+ file : "../fixtures/remote_info/8.0.0.json" ,
69+ want : `
70+ # HELP elasticsearch_remote_info_max_connections_per_cluster Max connections per cluster
71+ # TYPE elasticsearch_remote_info_max_connections_per_cluster gauge
72+ elasticsearch_remote_info_max_connections_per_cluster{remote_cluster="prod_cluster"} 30
73+ # HELP elasticsearch_remote_info_num_nodes_connected Number of nodes connected
74+ # TYPE elasticsearch_remote_info_num_nodes_connected gauge
75+ elasticsearch_remote_info_num_nodes_connected{remote_cluster="prod_cluster"} 15
76+ # HELP elasticsearch_remote_info_num_proxy_sockets_connected Number of proxy sockets connected
77+ # TYPE elasticsearch_remote_info_num_proxy_sockets_connected gauge
78+ elasticsearch_remote_info_num_proxy_sockets_connected{remote_cluster="prod_cluster"} 25
79+ # HELP elasticsearch_remote_info_stats_json_parse_failures Number of errors while parsing JSON.
80+ # TYPE elasticsearch_remote_info_stats_json_parse_failures counter
81+ elasticsearch_remote_info_stats_json_parse_failures 0
82+ # HELP elasticsearch_remote_info_stats_total_scrapes Current total ElasticSearch remote info scrapes.
83+ # TYPE elasticsearch_remote_info_stats_total_scrapes counter
84+ elasticsearch_remote_info_stats_total_scrapes 1
85+ # HELP elasticsearch_remote_info_stats_up Was the last scrape of the ElasticSearch remote info endpoint successful.
86+ # TYPE elasticsearch_remote_info_stats_up gauge
87+ elasticsearch_remote_info_stats_up 1
88+ ` ,
89+ },
90+ {
91+ name : "empty" ,
92+ file : "../fixtures/remote_info/empty.json" ,
93+ want : `
94+ # HELP elasticsearch_remote_info_stats_json_parse_failures Number of errors while parsing JSON.
95+ # TYPE elasticsearch_remote_info_stats_json_parse_failures counter
96+ elasticsearch_remote_info_stats_json_parse_failures 0
97+ # HELP elasticsearch_remote_info_stats_total_scrapes Current total ElasticSearch remote info scrapes.
98+ # TYPE elasticsearch_remote_info_stats_total_scrapes counter
99+ elasticsearch_remote_info_stats_total_scrapes 1
100+ # HELP elasticsearch_remote_info_stats_up Was the last scrape of the ElasticSearch remote info endpoint successful.
101+ # TYPE elasticsearch_remote_info_stats_up gauge
102+ elasticsearch_remote_info_stats_up 1
103+ ` ,
104+ },
105+ }
106+
107+ for _ , tt := range tests {
108+ t .Run (tt .name , func (t * testing.T ) {
109+ f , err := os .Open (tt .file )
110+ if err != nil {
111+ t .Fatal (err )
112+ }
113+ defer f .Close ()
114+
115+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
37116 io .Copy (w , f )
38- }),
39- } {
40- ts := httptest .NewServer (handler )
117+ }))
41118 defer ts .Close ()
42119
43120 u , err := url .Parse (ts .URL )
44121 if err != nil {
45- t .Fatalf ( "Failed to parse URL: %s" , err )
122+ t .Fatal ( err )
46123 }
124+
47125 c := NewRemoteInfo (promslog .NewNopLogger (), http .DefaultClient , u )
48- nsr , err := c .fetchAndDecodeRemoteInfoStats ()
49126 if err != nil {
50- t .Fatalf ("Failed to fetch or decode remote info stats: %s" , err )
127+ t .Fatal (err )
128+ }
129+
130+ if err := testutil .CollectAndCompare (c , strings .NewReader (tt .want )); err != nil {
131+ t .Fatal (err )
51132 }
52- t .Logf ("[%s/%s] Remote Info Stats Response: %+v" , hn , filename , nsr )
133+ })
134+ }
135+ }
136+
137+ func TestRemoteInfoError (t * testing.T ) {
138+ // Test error handling when endpoint is unavailable
139+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
140+ http .Error (w , "Internal Server Error" , http .StatusInternalServerError )
141+ }))
142+ defer ts .Close ()
143+
144+ u , err := url .Parse (ts .URL )
145+ if err != nil {
146+ t .Fatal (err )
147+ }
148+
149+ c := NewRemoteInfo (promslog .NewNopLogger (), http .DefaultClient , u )
150+
151+ expected := `
152+ # HELP elasticsearch_remote_info_stats_json_parse_failures Number of errors while parsing JSON.
153+ # TYPE elasticsearch_remote_info_stats_json_parse_failures counter
154+ elasticsearch_remote_info_stats_json_parse_failures 0
155+ # HELP elasticsearch_remote_info_stats_total_scrapes Current total ElasticSearch remote info scrapes.
156+ # TYPE elasticsearch_remote_info_stats_total_scrapes counter
157+ elasticsearch_remote_info_stats_total_scrapes 1
158+ # HELP elasticsearch_remote_info_stats_up Was the last scrape of the ElasticSearch remote info endpoint successful.
159+ # TYPE elasticsearch_remote_info_stats_up gauge
160+ elasticsearch_remote_info_stats_up 0
161+ `
162+
163+ if err := testutil .CollectAndCompare (c , strings .NewReader (expected )); err != nil {
164+ t .Fatal (err )
165+ }
166+ }
167+
168+ func TestRemoteInfoJSONParseError (t * testing.T ) {
169+ // Test JSON parse error handling
170+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
171+ w .Write ([]byte ("invalid json" ))
172+ }))
173+ defer ts .Close ()
174+
175+ u , err := url .Parse (ts .URL )
176+ if err != nil {
177+ t .Fatal (err )
178+ }
179+
180+ c := NewRemoteInfo (promslog .NewNopLogger (), http .DefaultClient , u )
181+
182+ expected := `
183+ # HELP elasticsearch_remote_info_stats_json_parse_failures Number of errors while parsing JSON.
184+ # TYPE elasticsearch_remote_info_stats_json_parse_failures counter
185+ elasticsearch_remote_info_stats_json_parse_failures 1
186+ # HELP elasticsearch_remote_info_stats_total_scrapes Current total ElasticSearch remote info scrapes.
187+ # TYPE elasticsearch_remote_info_stats_total_scrapes counter
188+ elasticsearch_remote_info_stats_total_scrapes 1
189+ # HELP elasticsearch_remote_info_stats_up Was the last scrape of the ElasticSearch remote info endpoint successful.
190+ # TYPE elasticsearch_remote_info_stats_up gauge
191+ elasticsearch_remote_info_stats_up 0
192+ `
53193
54- }
194+ if err := testutil .CollectAndCompare (c , strings .NewReader (expected )); err != nil {
195+ t .Fatal (err )
55196 }
56197}
0 commit comments