From d077874127d4979e2292dc43f157ca970ad42247 Mon Sep 17 00:00:00 2001 From: alessandro negrin Date: Tue, 29 Nov 2022 10:33:55 +0100 Subject: [PATCH] scale as unsigned float; tests for values from string or boolean --- pkg/config/config.go | 2 +- pkg/metrics/parser.go | 2 +- pkg/metrics/parser_test.go | 78 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index aea9554..07a27a2 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -135,7 +135,7 @@ type MetricConfig struct { ValueType string `yaml:"type"` ConstantLabels map[string]string `yaml:"const_labels"` StringValueMapping *StringValueMappingConfig `yaml:"string_value_mapping"` - MQTTValueScale uint32 `yaml:"mqtt_value_scale"` + MQTTValueScale float64 `yaml:"mqtt_value_scale"` } // StringValueMappingConfig defines the mapping from string to float diff --git a/pkg/metrics/parser.go b/pkg/metrics/parser.go index a152517..2a59eb0 100644 --- a/pkg/metrics/parser.go +++ b/pkg/metrics/parser.go @@ -96,7 +96,7 @@ func (p *Parser) parseMetric(metricPath string, deviceID string, value interface } if cfg.MQTTValueScale != 0 { - metricValue = metricValue / float64(cfg.MQTTValueScale) + metricValue = metricValue / cfg.MQTTValueScale } return Metric{ diff --git a/pkg/metrics/parser_test.go b/pkg/metrics/parser_test.go index d15bef1..64f5429 100644 --- a/pkg/metrics/parser_test.go +++ b/pkg/metrics/parser_test.go @@ -51,6 +51,32 @@ func TestParser_parseMetric(t *testing.T) { Topic: "", }, }, + { + name: "scaled string value", + fields: fields{ + map[string][]config.MetricConfig{ + "temperature": []config.MetricConfig{ + { + PrometheusName: "temperature", + ValueType: "gauge", + MQTTValueScale: 100, + }, + }, + }, + }, + args: args{ + metricPath: "temperature", + deviceID: "dht22", + value: "12.6", + }, + want: Metric{ + Description: prometheus.NewDesc("temperature", "", []string{"sensor", "topic"}, nil), + ValueType: prometheus.GaugeValue, + Value: 0.126, + IngestTime: testNow(), + Topic: "", + }, + }, { name: "string value failure", fields: fields{ @@ -121,6 +147,32 @@ func TestParser_parseMetric(t *testing.T) { Topic: "", }, }, + { + name: "negative scaled float value", + fields: fields{ + map[string][]config.MetricConfig{ + "humidity": []config.MetricConfig{ + { + PrometheusName: "humidity", + ValueType: "gauge", + MQTTValueScale: -0.5, + }, + }, + }, + }, + args: args{ + metricPath: "humidity", + deviceID: "dht22", + value: 12.6, + }, + want: Metric{ + Description: prometheus.NewDesc("humidity", "", []string{"sensor", "topic"}, nil), + ValueType: prometheus.GaugeValue, + Value: -25.2, + IngestTime: testNow(), + Topic: "", + }, + }, { name: "bool value true", fields: fields{ @@ -146,6 +198,32 @@ func TestParser_parseMetric(t *testing.T) { Topic: "", }, }, + { + name: "scaled bool value", + fields: fields{ + map[string][]config.MetricConfig{ + "enabled": []config.MetricConfig{ + { + PrometheusName: "enabled", + ValueType: "gauge", + MQTTValueScale: 2, + }, + }, + }, + }, + args: args{ + metricPath: "enabled", + deviceID: "dht22", + value: true, + }, + want: Metric{ + Description: prometheus.NewDesc("enabled", "", []string{"sensor", "topic"}, nil), + ValueType: prometheus.GaugeValue, + Value: 0.5, + IngestTime: testNow(), + Topic: "", + }, + }, { name: "bool value false", fields: fields{