Skip to content

Commit 36f1885

Browse files
committed
changeset
1 parent 79cabc7 commit 36f1885

File tree

5 files changed

+9
-62
lines changed

5 files changed

+9
-62
lines changed

.github/workflows/test.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ jobs:
1919
- path: framework
2020
vm: ubuntu-latest
2121
regex: TestSmoke
22+
- path: framework/prometheus
23+
vm: ubuntu-latest
24+
regex: TestPrometheus
25+
- path: framework/loki
26+
vm: ubuntu-latest
27+
regex: TestLoki
2228
- path: wasp
2329
vm: ubuntu22.04-16cores-64GB # ghv-ignore!
2430
regex: TestSmoke

framework/.changeset/v0.10.8.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- Move Loki client to framework
2+
- Add Prometheus Query/QueryRange client
3+
- Expose base obs URLs as constants

framework/loki/loki_test.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414

1515
// TestLokiClient_QueryLogs tests the Client's ability to query Loki logs
1616
func TestLokiClient_SuccessfulQuery(t *testing.T) {
17-
// Create a mock Loki server using httptest
1817
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1918
assert.Equal(t, "/loki/api/v1/query_range", r.URL.Path)
2019
w.WriteHeader(http.StatusOK)
@@ -34,45 +33,32 @@ func TestLokiClient_SuccessfulQuery(t *testing.T) {
3433
assert.NoError(t, err)
3534
}))
3635
defer mockServer.Close()
37-
38-
// Create a BasicAuth object for testing
3936
auth := BasicAuth{
4037
Login: "test-login",
4138
Password: "test-password",
4239
}
43-
44-
// Set the query parameters
4540
queryParams := QueryParams{
4641
Query: `{namespace="test"}`,
4742
StartTime: time.Now().Add(-1 * time.Hour),
4843
EndTime: time.Now(),
4944
Limit: 100,
5045
}
51-
52-
// Create the Loki client with the mock server URL
5346
lokiClient := NewQueryClient(mockServer.URL, "test-tenant", auth, queryParams)
54-
55-
// Query logs
5647
logEntries, err := lokiClient.QueryRange(context.Background())
5748
assert.NoError(t, err)
5849
assert.Len(t, logEntries, 2)
59-
60-
// Verify the content of the log entries
6150
assert.Equal(t, "1234567890", logEntries[0].Timestamp)
6251
assert.Equal(t, "Log message 1", logEntries[0].Log)
6352
assert.Equal(t, "1234567891", logEntries[1].Timestamp)
6453
assert.Equal(t, "Log message 2", logEntries[1].Log)
6554
}
6655

6756
func TestLokiClient_AuthenticationFailure(t *testing.T) {
68-
// Create a mock Loki server
6957
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
7058
assert.Equal(t, "/loki/api/v1/query_range", r.URL.Path)
7159
w.WriteHeader(http.StatusUnauthorized) // Simulate authentication failure
7260
}))
7361
defer mockServer.Close()
74-
75-
// Create a Loki client with incorrect credentials
7662
auth := BasicAuth{
7763
Login: "wrong-login",
7864
Password: "wrong-password",
@@ -84,8 +70,6 @@ func TestLokiClient_AuthenticationFailure(t *testing.T) {
8470
Limit: 100,
8571
}
8672
lokiClient := NewQueryClient(mockServer.URL, "test-tenant", auth, queryParams)
87-
88-
// Query logs and expect an error
8973
logEntries, err := lokiClient.QueryRange(context.Background())
9074
assert.Nil(t, logEntries)
9175
assert.Error(t, err)
@@ -98,16 +82,13 @@ func TestLokiClient_AuthenticationFailure(t *testing.T) {
9882
}
9983

10084
func TestLokiClient_InternalServerError(t *testing.T) {
101-
// Create a mock Loki server
10285
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
10386
assert.Equal(t, "/loki/api/v1/query_range", r.URL.Path)
10487
w.WriteHeader(http.StatusInternalServerError) // Simulate server error
10588
_, err := w.Write([]byte(`{"message": "internal server error"}`)) // Error message in the response body
10689
assert.NoError(t, err)
10790
}))
10891
defer mockServer.Close()
109-
110-
// Create a Loki client
11192
auth := BasicAuth{
11293
Login: "test-login",
11394
Password: "test-password",
@@ -119,8 +100,6 @@ func TestLokiClient_InternalServerError(t *testing.T) {
119100
Limit: 100,
120101
}
121102
lokiClient := NewQueryClient(mockServer.URL, "test-tenant", auth, queryParams)
122-
123-
// Query logs and expect an error
124103
logEntries, err := lokiClient.QueryRange(context.Background())
125104
assert.Nil(t, logEntries)
126105
assert.Error(t, err)
@@ -133,11 +112,8 @@ func TestLokiClient_InternalServerError(t *testing.T) {
133112
}
134113

135114
func TestLokiClient_DebugMode(t *testing.T) {
136-
// Set the RESTY_DEBUG environment variable
137115
os.Setenv("RESTY_DEBUG", "true")
138116
defer os.Unsetenv("RESTY_DEBUG") // Clean up after the test
139-
140-
// Create a mock Loki server
141117
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
142118
assert.Equal(t, "/loki/api/v1/query_range", r.URL.Path)
143119
w.WriteHeader(http.StatusOK)
@@ -157,8 +133,6 @@ func TestLokiClient_DebugMode(t *testing.T) {
157133
assert.NoError(t, err)
158134
}))
159135
defer mockServer.Close()
160-
161-
// Create a Loki client
162136
auth := BasicAuth{
163137
Login: "test-login",
164138
Password: "test-password",
@@ -170,12 +144,8 @@ func TestLokiClient_DebugMode(t *testing.T) {
170144
Limit: 100,
171145
}
172146
lokiClient := NewQueryClient(mockServer.URL, "test-tenant", auth, queryParams)
173-
174-
// Query logs
175147
logEntries, err := lokiClient.QueryRange(context.Background())
176148
assert.NoError(t, err)
177149
assert.Len(t, logEntries, 2)
178-
179-
// Check if debug mode was enabled
180150
assert.True(t, lokiClient.RestyClient.Debug)
181151
}

framework/prometheus/prometheus.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,23 +66,19 @@ func (p *QueryClient) Query(query string, timestamp time.Time) (*QueryResponse,
6666
"time": formatPrometheusTime(timestamp),
6767
}).
6868
Get(url)
69-
7069
if err != nil {
7170
return nil, fmt.Errorf("failed to execute query: %w", err)
7271
}
7372
if resp.StatusCode() != 200 {
7473
return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode())
7574
}
76-
7775
var result QueryResponse
7876
if err := json.Unmarshal(resp.Body(), &result); err != nil {
7977
return nil, fmt.Errorf("failed to unmarshal response: %w", err)
8078
}
81-
8279
if result.Status != "success" {
8380
return nil, fmt.Errorf("query failed with status: %s", result.Status)
8481
}
85-
8682
return &result, nil
8783
}
8884

@@ -97,39 +93,32 @@ func (p *QueryClient) QueryRange(params QueryRangeParams) (*QueryRangeResponse,
9793
"step": formatDuration(params.Step),
9894
}).
9995
Get(url)
100-
10196
if err != nil {
10297
return nil, fmt.Errorf("failed to execute range query: %w", err)
10398
}
10499
if resp.StatusCode() != 200 {
105100
return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode())
106101
}
107-
108102
var result QueryRangeResponse
109103
if err := json.Unmarshal(resp.Body(), &result); err != nil {
110104
return nil, fmt.Errorf("failed to unmarshal response: %w", err)
111105
}
112-
113106
if result.Status != "success" {
114107
return nil, fmt.Errorf("range query failed with status: %s", result.Status)
115108
}
116-
117109
return &result, nil
118110
}
119111

120112
// ToLabelsMap converts QueryResponse.Data.Result into a map where keys are
121113
// metric labels in "k:v" format and values are slices of all values with that label
122114
func ToLabelsMap(response *QueryResponse) map[string][]interface{} {
123115
resultMap := make(map[string][]interface{})
124-
125116
for _, res := range response.Data.Result {
126-
// Process each metric label
127117
for k, v := range res.Metric {
128118
label := fmt.Sprintf("%s:%s", k, v)
129119
resultMap[label] = append(resultMap[label], res.Value[1]) // Value[1] is the metric value
130120
}
131121
}
132-
133122
return resultMap
134123
}
135124

framework/prometheus/prometheus_test.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,12 @@ func TestPrometheusQueryClient_Query(t *testing.T) {
4949
expectedCount: 2,
5050
validateResult: func(t *testing.T, result *QueryResponse) {
5151
assert.Equal(t, "vector", result.Data.ResultType)
52-
53-
// Check first metric
5452
assert.Equal(t, "go_gc_duration_seconds", result.Data.Result[0].Metric["__name__"])
5553
assert.Equal(t, "cadvisor:8080", result.Data.Result[0].Metric["instance"])
5654
assert.Equal(t, "cadvisor", result.Data.Result[0].Metric["job"])
5755
assert.Equal(t, "0.5", result.Data.Result[0].Metric["quantile"])
5856
assert.Equal(t, 1753701299.664, result.Data.Result[0].Value[0].(float64))
5957
assert.Equal(t, "0.000187874", result.Data.Result[0].Value[1].(string))
60-
61-
// Check second metric
6258
assert.Equal(t, "go_gc_duration_seconds", result.Data.Result[1].Metric["__name__"])
6359
assert.Equal(t, "postgres_exporter:9187", result.Data.Result[1].Metric["instance"])
6460
assert.Equal(t, "postgres", result.Data.Result[1].Metric["job"])
@@ -114,7 +110,6 @@ func TestPrometheusQueryClient_Query(t *testing.T) {
114110

115111
for _, tt := range tests {
116112
t.Run(tt.name, func(t *testing.T) {
117-
// Setup mock server
118113
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
119114
assert.Equal(t, "/api/v1/query", r.URL.Path)
120115
assert.Equal(t, "go_gc_duration_seconds", r.URL.Query().Get("query"))
@@ -124,17 +119,12 @@ func TestPrometheusQueryClient_Query(t *testing.T) {
124119
assert.NoError(t, err)
125120
}))
126121
defer mockServer.Close()
127-
128-
// Create client and make request
129122
client := NewQueryClient(mockServer.URL)
130123
timestamp := time.Unix(1753701299, 664000000)
131124
result, err := client.Query("go_gc_duration_seconds", timestamp)
132-
133-
// Validate response
134125
assert.NoError(t, err)
135126
assert.Equal(t, tt.expectedStatus, result.Status)
136127
assert.Equal(t, tt.expectedCount, len(result.Data.Result))
137-
138128
if tt.validateResult != nil {
139129
tt.validateResult(t, result)
140130
}
@@ -234,7 +224,6 @@ func TestPrometheusQueryClientQueryRange(t *testing.T) {
234224
assert.Equal(t, "http_requests_total", result.Data.Result[0].Metric["__name__"])
235225
assert.Equal(t, "api-server", result.Data.Result[0].Metric["job"])
236226
assert.Equal(t, "200", result.Data.Result[0].Metric["code"])
237-
238227
values := result.Data.Result[0].Values
239228
assert.Len(t, values, 3)
240229
assert.Equal(t, 1435781451.781, values[0][0].(float64))
@@ -271,13 +260,9 @@ func TestPrometheusQueryClientQueryRange(t *testing.T) {
271260
expectedCount: 2,
272261
validateResult: func(t *testing.T, result *QueryRangeResponse) {
273262
assert.Equal(t, "matrix", result.Data.ResultType)
274-
275-
// Check first series
276263
assert.Equal(t, "cpu_usage", result.Data.Result[0].Metric["__name__"])
277264
assert.Equal(t, "server1", result.Data.Result[0].Metric["instance"])
278265
assert.Equal(t, "0.45", result.Data.Result[0].Values[0][1].(string))
279-
280-
// Check second series
281266
assert.Equal(t, "cpu_usage", result.Data.Result[1].Metric["__name__"])
282267
assert.Equal(t, "server2", result.Data.Result[1].Metric["instance"])
283268
assert.Equal(t, "0.62", result.Data.Result[1].Values[0][1].(string))
@@ -287,7 +272,6 @@ func TestPrometheusQueryClientQueryRange(t *testing.T) {
287272

288273
for _, tt := range tests {
289274
t.Run(tt.name, func(t *testing.T) {
290-
// Setup mock server
291275
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
292276
assert.Equal(t, "/api/v1/query_range", r.URL.Path)
293277
assert.Equal(t, "http_requests_total", r.URL.Query().Get("query"))
@@ -300,8 +284,6 @@ func TestPrometheusQueryClientQueryRange(t *testing.T) {
300284
assert.NoError(t, err)
301285
}))
302286
defer mockServer.Close()
303-
304-
// Create client and make request
305287
client := NewQueryClient(mockServer.URL)
306288
params := QueryRangeParams{
307289
Query: "http_requests_total",
@@ -310,12 +292,9 @@ func TestPrometheusQueryClientQueryRange(t *testing.T) {
310292
Step: 15 * time.Second,
311293
}
312294
result, err := client.QueryRange(params)
313-
314-
// Validate response
315295
assert.NoError(t, err)
316296
assert.Equal(t, tt.expectedStatus, result.Status)
317297
assert.Equal(t, tt.expectedCount, len(result.Data.Result))
318-
319298
if tt.validateResult != nil {
320299
tt.validateResult(t, result)
321300
}

0 commit comments

Comments
 (0)