From 1fa5de4b6395f83de9bbbd4a20d6e211a10ac292 Mon Sep 17 00:00:00 2001
From: Jirka Kremser <jiri.kremser@gmail.com>
Date: Mon, 13 Jan 2025 15:39:57 +0100
Subject: [PATCH] Using float value > 0 as the activation criterium

Signed-off-by: Jirka Kremser <jiri.kremser@gmail.com>
---
 scaler/handlers.go | 63 +++++++++++++++++++++-------------------------
 1 file changed, 28 insertions(+), 35 deletions(-)

diff --git a/scaler/handlers.go b/scaler/handlers.go
index 788bfef..c2e454c 100644
--- a/scaler/handlers.go
+++ b/scaler/handlers.go
@@ -5,7 +5,6 @@ package scaler
 
 import (
 	"context"
-	"errors"
 	"fmt"
 	"math"
 	"time"
@@ -61,27 +60,18 @@ func (e *impl) Ping(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
 }
 
 func (e *impl) IsActive(
-	ctx context.Context,
+	_ context.Context,
 	sor *externalscaler.ScaledObjectRef,
 ) (*externalscaler.IsActiveResponse, error) {
 	lggr := e.lggr.WithName("IsActive")
 
-	gmr, err := e.GetMetrics(ctx, &externalscaler.GetMetricsRequest{
-		ScaledObjectRef: sor,
-	})
+	value, err := e.getMetric(sor)
 	if err != nil {
-		lggr.Error(err, "GetMetrics failed", "scaledObjectRef", sor.String())
-		return nil, err
-	}
-
-	metricValues := gmr.GetMetricValues()
-	if err := errors.New("len(metricValues) != 1"); len(metricValues) != 1 {
-		lggr.Error(err, "invalid GetMetricsResponse", "scaledObjectRef", sor.String(), "getMetricsResponse", gmr.String())
+		lggr.Error(err, "getMetric failed", "scaledObjectRef", sor.String())
 		return nil, err
 	}
-	metricValue := metricValues[0].GetMetricValue()
-	active := metricValue > 0
 
+	active := value > 0
 	return &externalscaler.IsActiveResponse{Result: active}, nil
 }
 
@@ -154,41 +144,44 @@ func (e *impl) GetMetricSpec(
 }
 
 func (e *impl) GetMetrics(
-	ctx context.Context,
+	_ context.Context,
 	metricRequest *externalscaler.GetMetricsRequest,
 ) (*externalscaler.GetMetricsResponse, error) {
-	lggr := e.lggr.WithName("GetMetrics")
 	sor := metricRequest.ScaledObjectRef
-
-	//namespacedName := k8s.NamespacedNameFromScaledObjectRef(sor)
-	//metricName := namespacedName.Name
-
-	scalerMetadata := sor.GetScalerMetadata()
-	metricName, labels, agg, err := util.GetMetricQuery(lggr, scalerMetadata, e.metricParser)
+	value, err := e.getMetric(sor)
 	if err != nil {
 		return nil, err
 	}
 
-	opOverTime := util.GetOperationOvertTime(lggr, scalerMetadata)
-	value, found, err := e.metricStore.Get(metricName, labels, opOverTime, agg)
-	lggr.Info("got metric value: ", "name", metricName, "labels", labels, "value", value, "found", found, "error", err)
-	if !found {
-		return nil, fmt.Errorf("not found")
-	}
-	if err != nil {
-		return nil, err
-	}
-	value = util.ClampValue(lggr, value, scalerMetadata)
-	e.metricsExporter.SetMetricValueClamped(string(metricName), fmt.Sprint(labels), string(opOverTime), string(agg), sor.GetName(), sor.GetNamespace(), value)
-
 	res := &externalscaler.GetMetricsResponse{
 		MetricValues: []*externalscaler.MetricValue{
 			{
 				MetricName:  metricRequest.GetMetricName(),
-				MetricValue: int64(math.Round(value)),
+				MetricValue: int64(math.Ceil(value)),
 			},
 		},
 	}
 
 	return res, nil
 }
+
+func (e *impl) getMetric(sor *externalscaler.ScaledObjectRef) (float64, error) {
+	lggr := e.lggr.WithName("getMetric")
+	metricName, labels, agg, err := util.GetMetricQuery(lggr, sor.GetScalerMetadata(), e.metricParser)
+	if err != nil {
+		return -1, err
+	}
+
+	opOverTime := util.GetOperationOvertTime(lggr, sor.GetScalerMetadata())
+	value, found, err := e.metricStore.Get(metricName, labels, opOverTime, agg)
+	lggr.Info("got metric value: ", "name", metricName, "labels", labels, "value", value, "found", found, "error", err)
+	if !found {
+		return -1, fmt.Errorf("not found")
+	}
+	if err != nil {
+		return -1, err
+	}
+	value = util.ClampValue(lggr, value, sor.GetScalerMetadata())
+	e.metricsExporter.SetMetricValueClamped(string(metricName), fmt.Sprint(labels), string(opOverTime), string(agg), sor.GetName(), sor.GetNamespace(), value)
+	return value, nil
+}