1 package metrics_test
2
3 import (
4 "context"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
10 "github.com/stretchr/testify/assert"
11 )
12
13 func TestDeaultMetrics(t *testing.T) {
14 fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), "")
15 assert.NoError(t, err)
16
17
18 metricsDefs, err := fmr.GetMetrics()
19 assert.NoError(t, err)
20
21
22 err = fmr.WriteMetrics(metricsDefs)
23 assert.Error(t, err)
24
25
26 err = fmr.DeleteMetric("test")
27 assert.Error(t, err)
28
29
30 err = fmr.UpdateMetric("test", metrics.Metric{})
31 assert.Error(t, err)
32
33
34 err = fmr.DeletePreset("test")
35 assert.Error(t, err)
36
37
38 err = fmr.UpdatePreset("test", metrics.Preset{})
39 assert.Error(t, err)
40 }
41
42 func TestWriteMetricsToFile(t *testing.T) {
43
44 metricDefs := metrics.Metrics{
45 MetricDefs: metrics.MetricDefs{
46 "test_metric": metrics.Metric{
47 SQLs: map[int]string{
48 1: "SELECT 1",
49 },
50 InitSQL: "SELECT 1",
51 NodeStatus: "primary",
52 Gauges: []string{"gauge1", "gauge2"},
53 IsInstanceLevel: true,
54 StorageName: "storage1",
55 Description: "Test metric",
56 },
57 },
58 PresetDefs: metrics.PresetDefs{
59 "test_preset": metrics.Preset{
60 Description: "Test preset",
61 Metrics: map[string]float64{
62 "test_metric": 1.0,
63 },
64 },
65 },
66 }
67
68
69 tempDir := t.TempDir()
70 tempFile := filepath.Join(tempDir, "metrics.yaml")
71
72 fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
73 assert.NoError(t, err)
74
75
76 err = fmr.WriteMetrics(&metricDefs)
77 assert.NoError(t, err)
78
79
80 assert.NoError(t, err)
81 metrics, err := fmr.GetMetrics()
82 assert.NoError(t, err)
83
84
85 assert.Equal(t, metricDefs, *metrics)
86 }
87 func TestMetricsToFile(t *testing.T) {
88
89 metricDefs := metrics.Metrics{
90 MetricDefs: metrics.MetricDefs{
91 "existing_metric": metrics.Metric{
92 SQLs: map[int]string{
93 1: "SELECT 1",
94 },
95 InitSQL: "SELECT 1",
96 NodeStatus: "primary",
97 Gauges: []string{"gauge1", "gauge2"},
98 IsInstanceLevel: true,
99 StorageName: "storage1",
100 Description: "Existing metric",
101 },
102 },
103 PresetDefs: metrics.PresetDefs{
104 "test_preset": metrics.Preset{
105 Description: "Test preset",
106 Metrics: map[string]float64{
107 "existing_metric": 1.0,
108 },
109 },
110 },
111 }
112
113
114 tempDir := t.TempDir()
115 tempFile := filepath.Join(tempDir, "metrics.yaml")
116
117 fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
118 assert.NoError(t, err)
119
120
121 err = fmr.WriteMetrics(&metricDefs)
122 assert.NoError(t, err)
123
124
125 newMetric := metrics.Metric{
126 SQLs: map[int]string{
127 1: "SELECT 2",
128 },
129 InitSQL: "SELECT 2",
130 NodeStatus: "primary",
131 Gauges: []string{"gauge3", "gauge4"},
132 IsInstanceLevel: true,
133 StorageName: "storage2",
134 Description: "New metric",
135 }
136 err = fmr.UpdateMetric("new_metric", newMetric)
137 assert.NoError(t, err)
138
139
140 updatedMetrics, err := fmr.GetMetrics()
141 assert.NoError(t, err)
142
143
144 expectedMetrics := metricDefs
145 expectedMetrics.MetricDefs["new_metric"] = newMetric
146 assert.Equal(t, expectedMetrics, *updatedMetrics)
147
148
149 err = fmr.DeleteMetric("new_metric")
150 assert.NoError(t, err)
151
152
153 updatedMetrics, err = fmr.GetMetrics()
154 assert.NoError(t, err)
155
156
157 assert.Zero(t, updatedMetrics.MetricDefs["new_metric"])
158 }
159
160 func TestPresetsToFile(t *testing.T) {
161
162 presetDefs := metrics.PresetDefs{
163 "existing_preset": metrics.Preset{
164 Description: "Existing preset",
165 Metrics: map[string]float64{
166 "existing_metric": 1.0,
167 },
168 },
169 }
170
171
172 tempDir := t.TempDir()
173 tempFile := filepath.Join(tempDir, "metrics.yaml")
174
175 fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
176 assert.NoError(t, err)
177
178
179 err = fmr.WriteMetrics(&metrics.Metrics{
180 PresetDefs: presetDefs,
181 })
182 assert.NoError(t, err)
183
184
185 newPreset := metrics.Preset{
186 Description: "New preset",
187 Metrics: map[string]float64{
188 "new_metric": 1.0,
189 },
190 }
191 err = fmr.UpdatePreset("new_preset", newPreset)
192 assert.NoError(t, err)
193
194
195 updatedMetrics, err := fmr.GetMetrics()
196 assert.NoError(t, err)
197
198
199 expectedPresets := presetDefs
200 expectedPresets["new_preset"] = newPreset
201 assert.Equal(t, expectedPresets, updatedMetrics.PresetDefs)
202
203
204 err = fmr.DeletePreset("new_preset")
205 assert.NoError(t, err)
206
207
208 updatedMetrics, err = fmr.GetMetrics()
209 assert.NoError(t, err)
210
211
212 assert.Zero(t, updatedMetrics.PresetDefs["new_preset"])
213 }
214
215 func TestErrorHandlingToFile(t *testing.T) {
216 fmr, err := metrics.NewYAMLMetricReaderWriter(context.Background(), "/")
217 assert.NoError(t, err)
218
219
220 err = fmr.WriteMetrics(&metrics.Metrics{})
221 assert.Error(t, err)
222
223
224 _, err = fmr.GetMetrics()
225 assert.Error(t, err)
226
227
228 err = fmr.DeleteMetric("test")
229 assert.Error(t, err)
230
231
232 err = fmr.UpdateMetric("test", metrics.Metric{})
233 assert.Error(t, err)
234
235
236 err = fmr.DeletePreset("test")
237 assert.Error(t, err)
238
239
240 err = fmr.UpdatePreset("test", metrics.Preset{})
241 assert.Error(t, err)
242
243
244 tempDir := t.TempDir()
245 tempFile := filepath.Join(tempDir, "metrics.yaml")
246 file, err := os.Create(tempFile)
247 assert.NoError(t, err)
248 defer file.Close()
249 _, err = file.WriteString("invalid yaml")
250 assert.NoError(t, err)
251
252 fmr, err = metrics.NewYAMLMetricReaderWriter(context.Background(), tempFile)
253 assert.NoError(t, err)
254
255 _, err = fmr.GetMetrics()
256 assert.Error(t, err)
257 }
258