184 lines
3.8 KiB
Go
184 lines
3.8 KiB
Go
package kapacitor
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/influxdata/chronograf"
|
|
)
|
|
|
|
func TestVarsCritStringEqual(t *testing.T) {
|
|
alert := chronograf.AlertRule{
|
|
Name: "name",
|
|
Trigger: "threshold",
|
|
TriggerValues: chronograf.TriggerValues{
|
|
Operator: "equal to",
|
|
Value: "DOWN",
|
|
},
|
|
Every: "30s",
|
|
Query: &chronograf.QueryConfig{
|
|
Database: "telegraf",
|
|
Measurement: "haproxy",
|
|
RetentionPolicy: "autogen",
|
|
Fields: []chronograf.Field{
|
|
{
|
|
Value: "status",
|
|
Type: "field",
|
|
},
|
|
},
|
|
GroupBy: chronograf.GroupBy{
|
|
Time: "10m",
|
|
Tags: []string{"pxname"},
|
|
},
|
|
AreTagsAccepted: true,
|
|
},
|
|
}
|
|
|
|
raw, err := Vars(alert)
|
|
if err != nil {
|
|
fmt.Printf("%s", raw)
|
|
t.Fatalf("Error generating alert: %v %s", err, raw)
|
|
}
|
|
|
|
tick, err := formatTick(raw)
|
|
if err != nil {
|
|
t.Errorf("Error formatting alert: %v %s", err, raw)
|
|
}
|
|
|
|
if err := validateTick(tick); err != nil {
|
|
t.Errorf("Error validating alert: %v %s", err, tick)
|
|
}
|
|
}
|
|
|
|
func Test_formatValue(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
value string
|
|
want string
|
|
}{
|
|
{
|
|
name: "parses floats",
|
|
value: "3.14",
|
|
want: "3.14",
|
|
},
|
|
{
|
|
name: "parses booleans",
|
|
value: "TRUE",
|
|
want: "TRUE",
|
|
},
|
|
{
|
|
name: "single quotes for strings",
|
|
value: "up",
|
|
want: "'up'",
|
|
},
|
|
{
|
|
name: "handles escaping of single quotes",
|
|
value: "down's",
|
|
want: "'down\\'s'",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := formatValue(tt.value); got != tt.want {
|
|
t.Errorf("formatValue() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestVarsWhereFilter(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
queryConfig chronograf.QueryConfig
|
|
whereValue string
|
|
}{
|
|
{
|
|
name: "simple",
|
|
queryConfig: chronograf.QueryConfig{
|
|
Database: "telegraf",
|
|
Measurement: "haproxy",
|
|
RetentionPolicy: "autogen",
|
|
Fields: []chronograf.Field{
|
|
{
|
|
Value: "status",
|
|
Type: "field",
|
|
},
|
|
},
|
|
GroupBy: chronograf.GroupBy{
|
|
Time: "10m",
|
|
Tags: []string{"pxname"},
|
|
},
|
|
AreTagsAccepted: true,
|
|
},
|
|
whereValue: `lambda: isPresent("status")`,
|
|
},
|
|
{
|
|
name: "accepted tags",
|
|
queryConfig: chronograf.QueryConfig{
|
|
Database: "telegraf",
|
|
Measurement: "haproxy",
|
|
RetentionPolicy: "autogen",
|
|
Fields: []chronograf.Field{
|
|
{
|
|
Value: "status",
|
|
Type: "field",
|
|
},
|
|
},
|
|
GroupBy: chronograf.GroupBy{
|
|
Time: "10m",
|
|
Tags: []string{"pxname"},
|
|
},
|
|
Tags: map[string][]string{
|
|
"cpu": {
|
|
"cpu_total",
|
|
},
|
|
"host": {
|
|
"acc-0eabc309-eu-west-1-data-3",
|
|
"prod",
|
|
},
|
|
},
|
|
AreTagsAccepted: true,
|
|
},
|
|
whereValue: `lambda: ("cpu" == 'cpu_total') AND ("host" == 'acc-0eabc309-eu-west-1-data-3' OR "host" == 'prod') AND isPresent("status")`,
|
|
},
|
|
{
|
|
name: "rejected tags",
|
|
queryConfig: chronograf.QueryConfig{
|
|
Database: "telegraf",
|
|
Measurement: "haproxy",
|
|
RetentionPolicy: "autogen",
|
|
Fields: []chronograf.Field{
|
|
{
|
|
Value: "status",
|
|
Type: "field",
|
|
},
|
|
},
|
|
GroupBy: chronograf.GroupBy{
|
|
Time: "10m",
|
|
Tags: []string{"pxname"},
|
|
},
|
|
Tags: map[string][]string{
|
|
"cpu": {
|
|
"cpu_total",
|
|
},
|
|
"host": {
|
|
"acc-0eabc309-eu-west-1-data-3",
|
|
"prod",
|
|
},
|
|
},
|
|
AreTagsAccepted: false,
|
|
},
|
|
whereValue: `lambda: ("cpu" != 'cpu_total') AND ("host" != 'acc-0eabc309-eu-west-1-data-3' AND "host" != 'prod') AND isPresent("status")`,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := whereFilter(&tt.queryConfig)
|
|
if !cmp.Equal(result, tt.whereValue) {
|
|
t.Errorf("Reverse() = QueryConfig not equal %s", cmp.Diff(result, tt.whereValue))
|
|
}
|
|
})
|
|
}
|
|
}
|