mirror of
https://github.com/openfaas/faas.git
synced 2025-06-08 16:26:47 +00:00
The histogram for gateway_functions_seconds excluded the status code that gives important information for setting up SLOs. Fixes: #1725 Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alex@openfaas.com>
93 lines
2.8 KiB
Go
93 lines
2.8 KiB
Go
package metrics
|
|
|
|
import (
|
|
"testing"
|
|
|
|
types "github.com/openfaas/faas-provider/types"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
dto "github.com/prometheus/client_model/go"
|
|
)
|
|
|
|
type metricResult struct {
|
|
value float64
|
|
labels map[string]string
|
|
}
|
|
|
|
func labels2Map(labels []*dto.LabelPair) map[string]string {
|
|
res := map[string]string{}
|
|
for _, l := range labels {
|
|
res[l.GetName()] = l.GetValue()
|
|
}
|
|
return res
|
|
}
|
|
|
|
func readGauge(g prometheus.Metric) metricResult {
|
|
m := &dto.Metric{}
|
|
g.Write(m)
|
|
|
|
return metricResult{
|
|
value: m.GetGauge().GetValue(),
|
|
labels: labels2Map(m.GetLabel()),
|
|
}
|
|
}
|
|
|
|
func Test_Describe_DescribesThePrometheusMetrics(t *testing.T) {
|
|
metricsOptions := BuildMetricsOptions()
|
|
exporter := NewExporter(metricsOptions, nil, "openfaas-fn")
|
|
|
|
ch := make(chan *prometheus.Desc)
|
|
// defer close(ch)
|
|
|
|
go exporter.Describe(ch)
|
|
|
|
d := <-ch
|
|
expectedGatewayFunctionInvocationDesc := `Desc{fqName: "gateway_function_invocation_total", help: "Function metrics", constLabels: {}, variableLabels: [function_name code]}`
|
|
actualGatewayFunctionInvocationDesc := d.String()
|
|
if expectedGatewayFunctionInvocationDesc != actualGatewayFunctionInvocationDesc {
|
|
t.Errorf("Want\n%s\ngot\n%s", expectedGatewayFunctionInvocationDesc, actualGatewayFunctionInvocationDesc)
|
|
}
|
|
|
|
d = <-ch
|
|
expectedGatewayFunctionsHistogramDesc := `Desc{fqName: "gateway_functions_seconds", help: "Function time taken", constLabels: {}, variableLabels: [function_name code]}`
|
|
actualGatewayFunctionsHistogramDesc := d.String()
|
|
if expectedGatewayFunctionsHistogramDesc != actualGatewayFunctionsHistogramDesc {
|
|
t.Errorf("Want\n%s\ngot\n%s", expectedGatewayFunctionsHistogramDesc, actualGatewayFunctionsHistogramDesc)
|
|
}
|
|
|
|
d = <-ch
|
|
expectedServiceReplicasGaugeDesc := `Desc{fqName: "gateway_service_count", help: "Current count of replicas for function", constLabels: {}, variableLabels: [function_name]}`
|
|
actualServiceReplicasGaugeDesc := d.String()
|
|
if expectedServiceReplicasGaugeDesc != actualServiceReplicasGaugeDesc {
|
|
t.Errorf("Want\n%s\ngot\n%s", expectedServiceReplicasGaugeDesc, actualServiceReplicasGaugeDesc)
|
|
}
|
|
|
|
}
|
|
|
|
func Test_Collect_CollectsTheNumberOfReplicasOfAService(t *testing.T) {
|
|
metricsOptions := BuildMetricsOptions()
|
|
exporter := NewExporter(metricsOptions, nil, "openfaas-fn")
|
|
|
|
expectedService := types.FunctionStatus{
|
|
Name: "function_with_two_replica",
|
|
Replicas: 2,
|
|
}
|
|
|
|
exporter.services = []types.FunctionStatus{expectedService}
|
|
|
|
ch := make(chan prometheus.Metric)
|
|
|
|
go exporter.Collect(ch)
|
|
|
|
g := (<-ch).(prometheus.Gauge)
|
|
result := readGauge(g)
|
|
if expectedService.Name != result.labels["function_name"] {
|
|
t.Errorf("Want %s, got %s", expectedService.Name, result.labels["function_name"])
|
|
}
|
|
expectedReplicas := float64(expectedService.Replicas)
|
|
if expectedReplicas != result.value {
|
|
t.Errorf("Want %f, got %f", expectedReplicas, result.value)
|
|
}
|
|
ch = nil
|
|
|
|
}
|