File: slm_test.go

package info (click to toggle)
prometheus-elasticsearch-exporter 1.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,664 kB
  • sloc: sh: 63; makefile: 37
file content (138 lines) | stat: -rw-r--r-- 6,117 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2022 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package collector

import (
	"io"
	"net/http"
	"net/http/httptest"
	"net/url"
	"os"
	"path"
	"strings"
	"testing"

	"github.com/prometheus/client_golang/prometheus/testutil"
	"github.com/prometheus/common/promslog"
)

func TestSLM(t *testing.T) {
	// Testcases created using:

	//  docker run -d -p 9200:9200 -e discovery.type=single-node -e path.repo=/tmp/backups docker.elastic.co/elasticsearch/elasticsearch:7.15.0-arm64
	//  curl -XPUT http://127.0.0.1:9200/_snapshot/my_repository -H 'Content-Type: application/json' -d '{"type":"url","settings":{"url":"file:/tmp/backups"}}'
	//  curl -XPUT http://127.0.0.1:9200/_slm/policy/everything -H 'Content-Type: application/json' -d '{"schedule":"0 */15 * * * ?","name":"<everything-{now/d}>","repository":"my_repository","config":{"indices":".*","include_global_state":true,"ignore_unavailable":true},"retention":{"expire_after":"7d"}}'
	//  curl http://127.0.0.1:9200/_slm/stats (Numbers manually tweaked)

	tests := []struct {
		name string
		file string
		want string
	}{
		{
			name: "7.15.0",
			file: "7.15.0.json",
			want: `# HELP elasticsearch_slm_stats_operation_mode Operating status of SLM
            # TYPE elasticsearch_slm_stats_operation_mode gauge
            elasticsearch_slm_stats_operation_mode{operation_mode="RUNNING"} 0
            elasticsearch_slm_stats_operation_mode{operation_mode="STOPPED"} 0
            elasticsearch_slm_stats_operation_mode{operation_mode="STOPPING"} 0
            # HELP elasticsearch_slm_stats_retention_deletion_time_seconds Retention run deletion time
            # TYPE elasticsearch_slm_stats_retention_deletion_time_seconds gauge
            elasticsearch_slm_stats_retention_deletion_time_seconds 72.491
            # HELP elasticsearch_slm_stats_retention_failed_total Total failed retention runs
            # TYPE elasticsearch_slm_stats_retention_failed_total counter
            elasticsearch_slm_stats_retention_failed_total 0
            # HELP elasticsearch_slm_stats_retention_runs_total Total retention runs
            # TYPE elasticsearch_slm_stats_retention_runs_total counter
            elasticsearch_slm_stats_retention_runs_total 9
            # HELP elasticsearch_slm_stats_retention_timed_out_total Total timed out retention runs
            # TYPE elasticsearch_slm_stats_retention_timed_out_total counter
            elasticsearch_slm_stats_retention_timed_out_total 0
            # HELP elasticsearch_slm_stats_snapshot_deletion_failures_total Total snapshot deletion failures
            # TYPE elasticsearch_slm_stats_snapshot_deletion_failures_total counter
            elasticsearch_slm_stats_snapshot_deletion_failures_total{policy="everything"} 0
            # HELP elasticsearch_slm_stats_snapshots_deleted_total Total snapshots deleted
            # TYPE elasticsearch_slm_stats_snapshots_deleted_total counter
            elasticsearch_slm_stats_snapshots_deleted_total{policy="everything"} 20
            # HELP elasticsearch_slm_stats_snapshots_failed_total Total snapshots failed
            # TYPE elasticsearch_slm_stats_snapshots_failed_total counter
            elasticsearch_slm_stats_snapshots_failed_total{policy="everything"} 2
            # HELP elasticsearch_slm_stats_snapshots_taken_total Total snapshots taken
            # TYPE elasticsearch_slm_stats_snapshots_taken_total counter
            elasticsearch_slm_stats_snapshots_taken_total{policy="everything"} 50
            # HELP elasticsearch_slm_stats_total_snapshot_deletion_failures_total Total snapshot deletion failures
            # TYPE elasticsearch_slm_stats_total_snapshot_deletion_failures_total counter
            elasticsearch_slm_stats_total_snapshot_deletion_failures_total 0
            # HELP elasticsearch_slm_stats_total_snapshots_deleted_total Total snapshots deleted
            # TYPE elasticsearch_slm_stats_total_snapshots_deleted_total counter
            elasticsearch_slm_stats_total_snapshots_deleted_total 20
            # HELP elasticsearch_slm_stats_total_snapshots_failed_total Total snapshots failed
            # TYPE elasticsearch_slm_stats_total_snapshots_failed_total counter
            elasticsearch_slm_stats_total_snapshots_failed_total 2
            # HELP elasticsearch_slm_stats_total_snapshots_taken_total Total snapshots taken
            # TYPE elasticsearch_slm_stats_total_snapshots_taken_total counter
            elasticsearch_slm_stats_total_snapshots_taken_total 103
						`,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			fStatsPath := path.Join("../fixtures/slm/stats/", tt.file)
			fStats, err := os.Open(fStatsPath)
			if err != nil {
				t.Fatal(err)
			}
			defer fStats.Close()

			fStatusPath := path.Join("../fixtures/slm/status/", tt.file)
			fStatus, err := os.Open(fStatusPath)
			if err != nil {
				t.Fatal(err)
			}
			defer fStatus.Close()

			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
				switch r.RequestURI {
				case "/_slm/stats":
					io.Copy(w, fStats)
					return
				case "/_slm/status":
					io.Copy(w, fStatus)
					return
				}

				http.Error(w, "Not Found", http.StatusNotFound)
			}))
			defer ts.Close()

			u, err := url.Parse(ts.URL)
			if err != nil {
				t.Fatalf("Failed to parse URL: %s", err)
			}

			s, err := NewSLM(promslog.NewNopLogger(), u, http.DefaultClient)
			if err != nil {
				t.Fatal(err)
			}

			if err := testutil.CollectAndCompare(wrapCollector{s}, strings.NewReader(tt.want)); err != nil {
				t.Fatal(err)
			}
		})

	}

}