Skip to content

Commit aaeb7e5

Browse files
authored
code for new alerts (#93)
1 parent 64611f2 commit aaeb7e5

File tree

3 files changed

+147
-40
lines changed

3 files changed

+147
-40
lines changed

model.go

+128-35
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,11 @@
1515

1616
package main
1717

18-
import "fmt"
19-
20-
const AlertBody string = `{
21-
"version": "v1",
22-
"alerts": [
23-
{
24-
"message": "server side error occurred",
25-
"name": "Status Alert",
26-
"rule": {
27-
"config": "status_code != 500",
28-
"type": "composite"
29-
},
30-
"targets": [
31-
{
32-
"type": "webhook",
33-
"endpoint": "https://webhook.site/6b184e08-82c4-46dc-b344-5b85414c2a71",
34-
"headers": {},
35-
"skip_tls_check": true,
36-
"repeat": {
37-
"interval": "3m 20s",
38-
"times": 5
39-
}
40-
},
41-
{
42-
"type": "slack",
43-
"endpoint": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
44-
"repeat": {
45-
"interval": "3m",
46-
"times": 2
47-
}
48-
}
49-
]
50-
}
51-
]
52-
}`
18+
import (
19+
"encoding/json"
20+
"fmt"
21+
"io"
22+
)
5323

5424
const SchemaPayload string = `{
5525
"fields":[
@@ -450,3 +420,126 @@ func RoleReader(stream string) string {
450420
func Roleingestor(stream string) string {
451421
return fmt.Sprintf(`[{"privilege": "ingestor", "resource": {"stream": "%s"}}]`, stream)
452422
}
423+
424+
func getAlertBody(stream string) string {
425+
return fmt.Sprintf(`
426+
{
427+
"severity": "medium",
428+
"title": "AlertTitle",
429+
"query": "SELECT * FROM %s",
430+
"alertType": "threshold",
431+
"aggregateConfig": {
432+
"aggregateConditions": [
433+
{
434+
"agg": "count",
435+
"conditionConfig": {
436+
"conditions": [
437+
{
438+
"column": "status",
439+
"operator": ">=",
440+
"value": "200"
441+
}
442+
]
443+
},
444+
"column": "status",
445+
"operator": "<=",
446+
"value": 100
447+
}
448+
]
449+
},
450+
"evalType": {
451+
"rollingWindow": {
452+
"evalStart": "5m",
453+
"evalEnd": "now",
454+
"evalFrequency": 1
455+
}
456+
},
457+
"targets": [
458+
{
459+
"type": "webhook",
460+
"endpoint": "https://webhook.site/ec627445-d52b-44e9-948d-56671df3581e",
461+
"headers": {},
462+
"skip_tls_check": true,
463+
"repeat": {
464+
"interval": "1m",
465+
"times": 1
466+
}
467+
}
468+
]
469+
}`, stream)
470+
}
471+
472+
func getIdStateFromAlertResponse(body io.Reader) (string, string) {
473+
type AlertConfig struct {
474+
Severity string `json:"severity"`
475+
Title string `json:"title"`
476+
Id string `json:"id"`
477+
State string `json:"state"`
478+
Query string `json:"query"`
479+
AlertType string `json:"alert_type"`
480+
AggregateConfig string `json:"aggregate_config"`
481+
EvalType string `json:"eval_type"`
482+
Targets string `json:"targets"`
483+
}
484+
485+
var response []AlertConfig
486+
if err := json.NewDecoder(body).Decode(&response); err != nil {
487+
fmt.Printf("Error decoding: %v\n", err)
488+
}
489+
490+
alert := response[0]
491+
return alert.Id, alert.State
492+
}
493+
494+
func createAlertResponse(id string, state string, stream string) string {
495+
return fmt.Sprintf(`
496+
[{
497+
"version": "v1",
498+
"id": "%s",
499+
"state": "%s",
500+
"severity": "medium",
501+
"title": "AlertTitle",
502+
"query": "SELECT * FROM %s",
503+
"alertType": "threshold",
504+
"aggregateConfig": {
505+
"operator": null,
506+
"aggregateConditions": [
507+
{
508+
"agg": "count",
509+
"conditionConfig": {
510+
"operator": null,
511+
"conditions": [
512+
{
513+
"column": "status",
514+
"operator": ">=",
515+
"value": "200"
516+
}
517+
]
518+
},
519+
"column": "status",
520+
"operator": "<=",
521+
"value": 100
522+
}
523+
]
524+
},
525+
"evalType": {
526+
"rollingWindow": {
527+
"evalStart": "5m",
528+
"evalEnd": "now",
529+
"evalFrequency": 1
530+
}
531+
},
532+
"targets": [
533+
{
534+
"type": "webhook",
535+
"endpoint": "https://webhook.site/ec627445-d52b-44e9-948d-56671df3581e",
536+
"headers": {},
537+
"skip_tls_check": true,
538+
"repeat": {
539+
"interval": "1m",
540+
"times": 1
541+
}
542+
}
543+
]
544+
}]`, id, state, stream)
545+
}

quest_test.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package main
1919
import (
2020
"bytes"
2121
"fmt"
22+
"io"
2223
"os/exec"
2324
"strings"
2425
"testing"
@@ -365,7 +366,8 @@ func TestSmokeSetAlert(t *testing.T) {
365366
CreateStream(t, NewGlob.QueryClient, NewGlob.Stream)
366367
if NewGlob.IngestorUrl.String() == "" {
367368
RunFlog(t, NewGlob.QueryClient, NewGlob.Stream)
368-
req, _ := NewGlob.QueryClient.NewRequest("PUT", "logstream/"+NewGlob.Stream+"/alert", strings.NewReader(AlertBody))
369+
body := getAlertBody(NewGlob.Stream)
370+
req, _ := NewGlob.QueryClient.NewRequest("POST", "/alerts", strings.NewReader(body))
369371
response, err := NewGlob.QueryClient.Do(req)
370372
require.NoErrorf(t, err, "Request failed: %s", err)
371373
require.Equalf(t, 200, response.StatusCode, "Server returned http code: %s and response: %s", response.Status, readAsString(response.Body))
@@ -376,15 +378,20 @@ func TestSmokeSetAlert(t *testing.T) {
376378

377379
func TestSmokeGetAlert(t *testing.T) {
378380
if NewGlob.IngestorUrl.String() == "" {
379-
req, _ := NewGlob.QueryClient.NewRequest("GET", "logstream/"+NewGlob.Stream+"/alert", nil)
381+
req, _ := NewGlob.QueryClient.NewRequest("GET", "/alerts", nil)
380382
response, err := NewGlob.QueryClient.Do(req)
381383
require.NoErrorf(t, err, "Request failed: %s", err)
382-
body := readAsString(response.Body)
384+
body, _ := io.ReadAll(response.Body)
385+
reader1 := bytes.NewReader(body)
386+
reader2 := bytes.NewReader(body)
387+
expected := readAsString(reader1)
388+
id, state := getIdStateFromAlertResponse(reader2)
383389
require.Equalf(t, 200, response.StatusCode, "Server returned http code: %s and response: %s", response.Status, body)
384-
require.JSONEq(t, AlertBody, body, "Get alert response doesn't match with Alert config returned")
390+
res := createAlertResponse(id, state, NewGlob.Stream)
391+
require.JSONEq(t, expected, res, "Get alert response doesn't match with Alert config returned")
392+
DeleteAlert(t, NewGlob.QueryClient, id)
385393
}
386394
DeleteStream(t, NewGlob.QueryClient, NewGlob.Stream)
387-
388395
}
389396

390397
func TestSmokeSetRetention(t *testing.T) {

test_utils.go

+7
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ func DeleteStream(t *testing.T, client HTTPClient, stream string) {
107107
require.Equalf(t, 200, response.StatusCode, "Server returned http code: %s", response.Status)
108108
}
109109

110+
func DeleteAlert(t *testing.T, client HTTPClient, alert_id string) {
111+
req, _ := client.NewRequest("DELETE", "alerts/"+alert_id, nil)
112+
response, err := client.Do(req)
113+
require.NoErrorf(t, err, "Request failed: %s", err)
114+
require.Equalf(t, 200, response.StatusCode, "Server returned http code: %s", response.Status)
115+
}
116+
110117
func RunFlog(t *testing.T, client HTTPClient, stream string) {
111118
cmd := exec.Command("flog", "-f", "json", "-n", "50")
112119
var out strings.Builder

0 commit comments

Comments
 (0)