Public source validation / validate (push) Failing after 3m8s
67 lines
2.6 KiB
Go
67 lines
2.6 KiB
Go
package workerruntime
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/itworx/pulse/internal/alert"
|
|
"github.com/itworx/pulse/internal/metriccatalog"
|
|
"github.com/itworx/pulse/internal/metricquery"
|
|
"github.com/itworx/pulse/internal/prometheus"
|
|
"github.com/itworx/pulse/internal/queryplan"
|
|
)
|
|
|
|
type workerPrometheusSource struct{ queries int }
|
|
|
|
func (source *workerPrometheusSource) Query(context.Context, string, *time.Time) (prometheus.QueryResult, error) {
|
|
source.queries++
|
|
return prometheus.QueryResult{Status: "success", Data: []byte(`{"resultType":"vector","result":[{"metric":{"instance":"smoke-host"},"value":[1770000000,"95"]}]}`)}, nil
|
|
}
|
|
func (*workerPrometheusSource) QueryRange(context.Context, string, time.Time, time.Time, time.Duration) (prometheus.QueryResult, error) {
|
|
return prometheus.QueryResult{}, nil
|
|
}
|
|
|
|
func TestPrometheusMetricSourceUsesReadOnlyWorkerPrincipal(t *testing.T) {
|
|
registry, err := metriccatalog.DefaultRegistry()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
upstream := &workerPrometheusSource{}
|
|
service := metricquery.NewService(queryplan.NewPlanner(registry, queryplan.Limits{}), upstream, nil)
|
|
source := PrometheusMetricSource{Service: service}
|
|
value, err := source.Value(context.Background(), alert.Rule{Document: alert.Document{
|
|
Condition: alert.Condition{InputType: "metric", Metric: "host.cpu.utilization", Aggregation: "avg"},
|
|
Scope: map[string]any{"serverId": "smoke-host"},
|
|
}})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !value.Known || value.Value != 95 || upstream.queries != 1 {
|
|
t.Fatalf("value=%+v queries=%d", value, upstream.queries)
|
|
}
|
|
}
|
|
|
|
func TestPrometheusMetricSourceDoesNotForwardAlertTargetMetadata(t *testing.T) {
|
|
registry, err := metriccatalog.DefaultRegistry()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
upstream := &workerPrometheusSource{}
|
|
service := metricquery.NewService(queryplan.NewPlanner(registry, queryplan.Limits{}), upstream, nil)
|
|
source := PrometheusMetricSource{Service: service}
|
|
rules := []alert.Rule{
|
|
{Document: alert.Document{Condition: alert.Condition{InputType: "metric", Metric: "storage.disk.temperature.maximum", Aggregation: "max"}, Scope: map[string]any{"entityType": "disk"}}},
|
|
{Document: alert.Document{Condition: alert.Condition{InputType: "metric", Metric: "service.availability.minimum", Aggregation: "min"}, Scope: map[string]any{"entityType": "service", "critical": true}}},
|
|
}
|
|
for _, rule := range rules {
|
|
value, valueErr := source.Value(context.Background(), rule)
|
|
if valueErr != nil || !value.Known {
|
|
t.Fatalf("metric=%s value=%+v err=%v", rule.Condition.Metric, value, valueErr)
|
|
}
|
|
}
|
|
if upstream.queries != len(rules) {
|
|
t.Fatalf("queries=%d want=%d", upstream.queries, len(rules))
|
|
}
|
|
}
|