Skip to content

Commit a30c132

Browse files
committed
feat: implemented avg for getting single value from the metric.
Signed-off-by: Sudipto Baral <sudiptobaral.me@gmail.com>
1 parent b04da55 commit a30c132

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

metrics-operator/controllers/common/providers/datadog/datadog.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,28 @@ func (d *KeptnDataDogProvider) EvaluateQuery(ctx context.Context, metric metrics
7474
}
7575

7676
points := (result.Series)[0].Pointlist
77-
value := strconv.FormatFloat(*points[len(points)-1][1], 'g', 5, 64)
77+
if len(points) == 0 {
78+
d.Log.Info("No metric points in query result")
79+
return "", nil, fmt.Errorf("no metric points in query result")
80+
}
81+
82+
r := d.getSingleValue(points)
83+
value := strconv.FormatFloat(r, 'g', 5, 64)
7884
return value, b, nil
7985
}
86+
87+
func (d *KeptnDataDogProvider) getSingleValue(points [][]*float64) float64 {
88+
var sum float64 = 0
89+
var count uint64 = 0
90+
for _, point := range points {
91+
if point[1] != nil {
92+
sum += *point[1]
93+
count++
94+
}
95+
}
96+
if count < 1 {
97+
// cannot dive by zero
98+
return 0
99+
}
100+
return sum / float64(count)
101+
}

metrics-operator/controllers/common/providers/datadog/datadog_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package datadog
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"net/http"
78
"net/http/httptest"
89
"strings"
910
"testing"
1011

12+
"github.com/DataDog/datadog-api-client-go/v2/api/datadogV1"
1113
metricsapi "github.com/keptn/lifecycle-toolkit/metrics-operator/api/v1alpha2"
1214
"github.com/keptn/lifecycle-toolkit/metrics-operator/controllers/common/fake"
1315
"github.com/stretchr/testify/require"
@@ -69,7 +71,7 @@ func TestEvaluateQuery_HappyPath(t *testing.T) {
6971
r, raw, e := kdd.EvaluateQuery(context.TODO(), metric, p)
7072
require.Nil(t, e)
7173
require.Equal(t, []byte(ddPayload), raw)
72-
require.Equal(t, fmt.Sprintf("%.3f", 84.782), r)
74+
require.Equal(t, fmt.Sprintf("%.3f", 89.116), r)
7375
}
7476
func TestEvaluateQuery_WrongPayloadHandling(t *testing.T) {
7577
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -285,3 +287,30 @@ func TestEvaluateQuery_EmptyPayload(t *testing.T) {
285287
require.True(t, strings.Contains(e.Error(), "no values in query result"))
286288

287289
}
290+
func TestGetSingleValue_EmptyPoints(t *testing.T) {
291+
fakeClient := fake.NewClient()
292+
kdd := KeptnDataDogProvider{
293+
HttpClient: http.Client{},
294+
Log: ctrl.Log.WithName("testytest"),
295+
K8sClient: fakeClient,
296+
}
297+
var points [][]*float64
298+
value := kdd.getSingleValue(points)
299+
300+
require.Zero(t, value)
301+
}
302+
func TestGetSingleValue_HappyPath(t *testing.T) {
303+
fakeClient := fake.NewClient()
304+
kdd := KeptnDataDogProvider{
305+
HttpClient: http.Client{},
306+
Log: ctrl.Log.WithName("testytest"),
307+
K8sClient: fakeClient,
308+
}
309+
result := datadogV1.MetricsQueryResponse{}
310+
_ = json.Unmarshal([]byte(ddPayload), &result)
311+
points := (result.Series)[0].Pointlist
312+
value := kdd.getSingleValue(points)
313+
314+
require.NotZero(t, value)
315+
require.Equal(t, 89.11554133097331, value)
316+
}

0 commit comments

Comments
 (0)