Skip to content

Commit 5215b5f

Browse files
committed
Add unit tests to remote info
1 parent a436baf commit 5215b5f

File tree

5 files changed

+189
-17
lines changed

5 files changed

+189
-17
lines changed

collector/remote_info.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ func (ri *RemoteInfo) Collect(ch chan<- prometheus.Metric) {
161161
)
162162
return
163163
}
164-
ri.totalScrapes.Inc()
165164
ri.up.Set(1)
166165

167166
// Remote Info

collector/remote_info_test.go

Lines changed: 157 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

fixtures/remote_info/7.15.0.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"cluster_remote_1": {
3+
"seeds": ["192.168.1.100:9300", "192.168.1.101:9300"],
4+
"connected": true,
5+
"num_nodes_connected": 3,
6+
"num_proxy_sockets_connected": 5,
7+
"max_connections_per_cluster": 10,
8+
"initial_connect_timeout": "30s",
9+
"skip_unavailable": false
10+
},
11+
"cluster_remote_2": {
12+
"seeds": ["10.0.0.50:9300"],
13+
"connected": false,
14+
"num_nodes_connected": 0,
15+
"num_proxy_sockets_connected": 0,
16+
"max_connections_per_cluster": 5,
17+
"initial_connect_timeout": "30s",
18+
"skip_unavailable": true
19+
}
20+
}

fixtures/remote_info/8.0.0.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"prod_cluster": {
3+
"seeds": ["prod-es-1:9300", "prod-es-2:9300", "prod-es-3:9300"],
4+
"connected": true,
5+
"num_nodes_connected": 15,
6+
"num_proxy_sockets_connected": 25,
7+
"max_connections_per_cluster": 30,
8+
"initial_connect_timeout": "60s",
9+
"skip_unavailable": false
10+
}
11+
}

fixtures/remote_info/empty.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

0 commit comments

Comments
 (0)