From 6e8616c3783d6d25d93e7243db373f9dac9c9228 Mon Sep 17 00:00:00 2001 From: John Clark Date: Sun, 9 Oct 2022 22:34:08 +0100 Subject: [PATCH 01/14] Add functions for snake case Signed-off-by: John Clark --- processor/metricstransformprocessor/config.go | 2 + .../metrics_transform_processor.go | 1 + .../metrics_transform_processor_otlp.go | 7 ++ .../operation_convert_snake_case.go | 70 +++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 processor/metricstransformprocessor/operation_convert_snake_case.go diff --git a/processor/metricstransformprocessor/config.go b/processor/metricstransformprocessor/config.go index 6316c893e631f..8360e535e223b 100644 --- a/processor/metricstransformprocessor/config.go +++ b/processor/metricstransformprocessor/config.go @@ -170,6 +170,8 @@ const ( // Group groups mutiple metrics matching the predicate into multiple ResourceMetrics messages Group ConfigAction = "group" + + ConvertSnakeCase ConfigAction = "convert_snake_case" ) var actions = []ConfigAction{Insert, Update, Combine, Group} diff --git a/processor/metricstransformprocessor/metrics_transform_processor.go b/processor/metricstransformprocessor/metrics_transform_processor.go index a5bb0137c551e..99644c71239cd 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor.go +++ b/processor/metricstransformprocessor/metrics_transform_processor.go @@ -33,6 +33,7 @@ type internalTransform struct { MetricIncludeFilter internalFilter Action ConfigAction NewName string + ConvertSnakeCase bool GroupResourceLabels map[string]string AggregationType AggregationType SubmatchCase SubmatchCase diff --git a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go index 924b51e9c6080..c469cff2439e8 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go @@ -293,7 +293,14 @@ func (mtp *metricsTransformProcessor) processMetrics(_ context.Context, md pmetr // Drop the metric if all the data points were dropped after transformations. return !transformMetric(metric, transform) }) + case ConvertSnakeCase: + mLen := metrics.Len() + for i := 0; i < mLen; i++ { + metric := metrics.At(i) + ToSnakeCase(metric) + } } + } return metrics.Len() == 0 diff --git a/processor/metricstransformprocessor/operation_convert_snake_case.go b/processor/metricstransformprocessor/operation_convert_snake_case.go new file mode 100644 index 0000000000000..6ef490e293b54 --- /dev/null +++ b/processor/metricstransformprocessor/operation_convert_snake_case.go @@ -0,0 +1,70 @@ +package metricstransformprocessor // import "github.com/open-telemetry/opentelemetry-collector-contrib/processor/metricstransformprocessor" + +import ( + "strings" + "unicode" + + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func ToSnakeCase(metric pmetric.Metric) { + + s := metric.Name() + + if s == "" { + return + } + if len(s) == 1 { + metric.SetName(strings.ToLower(s)) + return + } + source := []rune(s) + dist := strings.Builder{} + dist.Grow(len(s) + len(s)/3) // avoid reallocation memory, 33% ~ 50% is recommended + skipNext := false + for i := 0; i < len(source); i++ { + cur := source[i] + switch cur { + case '-', '_': + dist.WriteRune('_') + skipNext = true + continue + } + if unicode.IsLower(cur) || unicode.IsDigit(cur) { + dist.WriteRune(cur) + continue + } + + if i == 0 { + dist.WriteRune(unicode.ToLower(cur)) + continue + } + + last := source[i-1] + if (!unicode.IsLetter(last)) || unicode.IsLower(last) { + if skipNext { + skipNext = false + } else { + dist.WriteRune('_') + } + dist.WriteRune(unicode.ToLower(cur)) + continue + } + // last is upper case + if i < len(source)-1 { + next := source[i+1] + if unicode.IsLower(next) { + if skipNext { + skipNext = false + } else { + dist.WriteRune('_') + } + dist.WriteRune(unicode.ToLower(cur)) + continue + } + } + dist.WriteRune(unicode.ToLower(cur)) + } + + metric.SetName(dist.String()) +} From 2c90eb380e78498c097aaf4e89748b13e25883ec Mon Sep 17 00:00:00 2001 From: John Clark Date: Sun, 9 Oct 2022 22:34:14 +0100 Subject: [PATCH 02/14] Add basic test cases Signed-off-by: John Clark --- ...rics_transform_processor_testcases_test.go | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go index 5e8c922800cb0..0cba26bc4d527 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go @@ -2106,5 +2106,41 @@ var ( }, out: []*metricspb.Metric{}, }, + { + name: "simple_convert_to_snake_case", + spipOCTest: true, + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterStrict{include: "metric"}, + Action: ConvertSnakeCase, + }, + }, + in: []*metricspb.Metric{ + metricBuilder().setName("metricTest"). + setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + }, + out: []*metricspb.Metric{ + metricBuilder().setName("metric_test"). + setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + }, + }, + { + name: "complex_convert_to_snake_case", + spipOCTest: true, + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterStrict{include: "metric"}, + Action: ConvertSnakeCase, + }, + }, + in: []*metricspb.Metric{ + metricBuilder().setName("Base_MetricTest"). + setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + }, + out: []*metricspb.Metric{ + metricBuilder().setName("base_metric_test"). + setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + }, + }, } ) From 9649c74188fbf11cdee521879f108e4dc7b2cc24 Mon Sep 17 00:00:00 2001 From: John Clark Date: Thu, 20 Oct 2022 22:15:35 +0100 Subject: [PATCH 03/14] Update tests Signed-off-by: John Clark --- ...rics_transform_processor_testcases_test.go | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go index c524462dd01e3..7f7e880e1d5f2 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go @@ -1611,39 +1611,78 @@ var ( out: []pmetric.Metric{}, }, { - name: "simple_convert_to_snake_case", - spipOCTest: true, + name: "simple_convert_to_snake_case", transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, Action: ConvertSnakeCase, }, }, - in: []*metricspb.Metric{ - metricBuilder().setName("metricTest"). - setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "metricTest").build(), + }, + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "metric_test").build(), + }, + }, + { + name: "complex_convert_to_snake_case", + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterStrict{include: "metric"}, + Action: ConvertSnakeCase, + }, + }, + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "Base_MetricTest").build(), + }, + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "base_metric_test").build(), + }, + }, + { + name: "no_change_convert_to_snake_case", + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterStrict{include: "metric"}, + Action: ConvertSnakeCase, + }, + }, + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), + }, + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), + }, + }, + { + name: "multiple_uppercase_convert_to_snake_case", + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterStrict{include: "metric"}, + Action: ConvertSnakeCase, + }, }, - out: []*metricspb.Metric{ - metricBuilder().setName("metric_test"). - setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "HTTPMetric").build(), + }, + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "http_metric").build(), }, }, { - name: "complex_convert_to_snake_case", - spipOCTest: true, + name: "dash_replacement_convert_to_snake_case", transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, Action: ConvertSnakeCase, }, }, - in: []*metricspb.Metric{ - metricBuilder().setName("Base_MetricTest"). - setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "simple-metric").build(), }, - out: []*metricspb.Metric{ - metricBuilder().setName("base_metric_test"). - setDataType(metricspb.MetricDescriptor_GAUGE_INT64).build(), + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), }, }, } From 3e18c7646fe88dd4f1a810b6246ddd1130da14f1 Mon Sep 17 00:00:00 2001 From: John Clark Date: Thu, 20 Oct 2022 22:15:44 +0100 Subject: [PATCH 04/14] Reference gist Signed-off-by: John Clark --- .../metricstransformprocessor/operation_convert_snake_case.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/processor/metricstransformprocessor/operation_convert_snake_case.go b/processor/metricstransformprocessor/operation_convert_snake_case.go index 6ef490e293b54..27f0c416a873f 100644 --- a/processor/metricstransformprocessor/operation_convert_snake_case.go +++ b/processor/metricstransformprocessor/operation_convert_snake_case.go @@ -9,6 +9,8 @@ import ( func ToSnakeCase(metric pmetric.Metric) { + // https://gist.github.com/hxsf/7f5392c0153d3a8607c42eefed02b8cd + s := metric.Name() if s == "" { @@ -20,7 +22,7 @@ func ToSnakeCase(metric pmetric.Metric) { } source := []rune(s) dist := strings.Builder{} - dist.Grow(len(s) + len(s)/3) // avoid reallocation memory, 33% ~ 50% is recommended + dist.Grow(len(s) + len(s)/3) skipNext := false for i := 0; i < len(source); i++ { cur := source[i] From 100d3b92c08d1420091071638d122cce6c559507 Mon Sep 17 00:00:00 2001 From: John Clark Date: Thu, 20 Oct 2022 22:19:12 +0100 Subject: [PATCH 05/14] Update test Signed-off-by: John Clark --- .../metrics_transform_processor_testcases_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go index 7f7e880e1d5f2..cf551aec0b04e 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go @@ -1664,10 +1664,10 @@ var ( }, }, in: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "HTTPMetric").build(), + metricBuilder(pmetric.MetricTypeGauge, "CPUUtilizationMetric").build(), }, out: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "http_metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "cpu_utilization_metric").build(), }, }, { From 089329d82d9c4771020fa9419cc46a50f051ef6b Mon Sep 17 00:00:00 2001 From: John Clark Date: Fri, 21 Oct 2022 11:09:42 +0100 Subject: [PATCH 06/14] Rename stuff Signed-off-by: John Clark --- processor/metricstransformprocessor/config.go | 4 ++-- .../metrics_transform_processor.go | 2 +- .../metrics_transform_processor_otlp.go | 2 +- .../metrics_transform_processor_testcases_test.go | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/processor/metricstransformprocessor/config.go b/processor/metricstransformprocessor/config.go index 8360e535e223b..81bd851433e59 100644 --- a/processor/metricstransformprocessor/config.go +++ b/processor/metricstransformprocessor/config.go @@ -171,10 +171,10 @@ const ( // Group groups mutiple metrics matching the predicate into multiple ResourceMetrics messages Group ConfigAction = "group" - ConvertSnakeCase ConfigAction = "convert_snake_case" + CaseConvert ConfigAction = "case_convert" ) -var actions = []ConfigAction{Insert, Update, Combine, Group} +var actions = []ConfigAction{Insert, Update, Combine, Group, CaseConvert} func (ca ConfigAction) isValid() bool { for _, configAction := range actions { diff --git a/processor/metricstransformprocessor/metrics_transform_processor.go b/processor/metricstransformprocessor/metrics_transform_processor.go index 99644c71239cd..4e42dfbb47624 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor.go +++ b/processor/metricstransformprocessor/metrics_transform_processor.go @@ -33,7 +33,7 @@ type internalTransform struct { MetricIncludeFilter internalFilter Action ConfigAction NewName string - ConvertSnakeCase bool + CaseConvert bool GroupResourceLabels map[string]string AggregationType AggregationType SubmatchCase SubmatchCase diff --git a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go index b83aabb01f66d..5ec498e2b5a2b 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go @@ -293,7 +293,7 @@ func (mtp *metricsTransformProcessor) processMetrics(_ context.Context, md pmetr // Drop the metric if all the data points were dropped after transformations. return !transformMetric(metric, transform) }) - case ConvertSnakeCase: + case CaseConvert: mLen := metrics.Len() for i := 0; i < mLen; i++ { metric := metrics.At(i) diff --git a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go index cf551aec0b04e..f786a7258a2b2 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go @@ -1615,7 +1615,7 @@ var ( transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: ConvertSnakeCase, + Action: CaseConvert, }, }, in: []pmetric.Metric{ @@ -1630,7 +1630,7 @@ var ( transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: ConvertSnakeCase, + Action: CaseConvert, }, }, in: []pmetric.Metric{ @@ -1645,7 +1645,7 @@ var ( transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: ConvertSnakeCase, + Action: CaseConvert, }, }, in: []pmetric.Metric{ @@ -1660,7 +1660,7 @@ var ( transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: ConvertSnakeCase, + Action: CaseConvert, }, }, in: []pmetric.Metric{ @@ -1675,7 +1675,7 @@ var ( transforms: []internalTransform{ { MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: ConvertSnakeCase, + Action: CaseConvert, }, }, in: []pmetric.Metric{ From b6d719c7cd328514691d7b10dbba6c0e1f07be77 Mon Sep 17 00:00:00 2001 From: John Clark Date: Fri, 21 Oct 2022 13:28:09 +0100 Subject: [PATCH 07/14] Change from configAction to operationAction Signed-off-by: John Clark --- processor/metricstransformprocessor/config.go | 9 +++++---- .../metrics_transform_processor_otlp.go | 10 ++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/processor/metricstransformprocessor/config.go b/processor/metricstransformprocessor/config.go index 81bd851433e59..ee18766a911fc 100644 --- a/processor/metricstransformprocessor/config.go +++ b/processor/metricstransformprocessor/config.go @@ -170,11 +170,9 @@ const ( // Group groups mutiple metrics matching the predicate into multiple ResourceMetrics messages Group ConfigAction = "group" - - CaseConvert ConfigAction = "case_convert" ) -var actions = []ConfigAction{Insert, Update, Combine, Group, CaseConvert} +var actions = []ConfigAction{Insert, Update, Combine, Group} func (ca ConfigAction) isValid() bool { for _, configAction := range actions { @@ -220,9 +218,12 @@ const ( // Metric has to match the FilterConfig with all its data points if used with Update ConfigAction, // otherwise the operation will be ignored. AggregateLabelValues OperationAction = "aggregate_label_values" + + // CaseConvert changes camel case metrics to snake case metrics + CaseConvert OperationAction = "case_convert" ) -var operationActions = []OperationAction{AddLabel, UpdateLabel, DeleteLabelValue, ToggleScalarDataType, ScaleValue, AggregateLabels, AggregateLabelValues} +var operationActions = []OperationAction{AddLabel, UpdateLabel, DeleteLabelValue, ToggleScalarDataType, ScaleValue, AggregateLabels, AggregateLabelValues, CaseConvert} func (oa OperationAction) isValid() bool { for _, operationAction := range operationActions { diff --git a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go index 5ec498e2b5a2b..1378f87432ea9 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_otlp.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_otlp.go @@ -293,12 +293,6 @@ func (mtp *metricsTransformProcessor) processMetrics(_ context.Context, md pmetr // Drop the metric if all the data points were dropped after transformations. return !transformMetric(metric, transform) }) - case CaseConvert: - mLen := metrics.Len() - for i := 0; i < mLen; i++ { - metric := metrics.At(i) - ToSnakeCase(metric) - } } } @@ -572,6 +566,10 @@ func transformMetric(metric pmetric.Metric, transform internalTransform) bool { if canChangeMetric { deleteLabelValueOp(metric, op) } + case CaseConvert: + if canChangeMetric { + ToSnakeCase(metric) + } } } From 9a6a7cd4795a5d950d8e48acbfab70c52d1b26a0 Mon Sep 17 00:00:00 2001 From: John Clark Date: Fri, 21 Oct 2022 15:15:16 +0100 Subject: [PATCH 08/14] Update tests to new operationAction style Signed-off-by: John Clark --- ...rics_transform_processor_testcases_test.go | 96 +++++++++++++++---- 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go index f786a7258a2b2..8f3fbd44f5b14 100644 --- a/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go +++ b/processor/metricstransformprocessor/metrics_transform_processor_testcases_test.go @@ -1611,11 +1611,18 @@ var ( out: []pmetric.Metric{}, }, { - name: "simple_convert_to_snake_case", + name: "strict_convert_to_snake_case", transforms: []internalTransform{ { - MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: CaseConvert, + MetricIncludeFilter: internalFilterStrict{include: "metricTest"}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, }, }, in: []pmetric.Metric{ @@ -1626,41 +1633,87 @@ var ( }, }, { - name: "complex_convert_to_snake_case", + name: "regexp_convert_to_snake_case", transforms: []internalTransform{ { - MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: CaseConvert, + MetricIncludeFilter: internalFilterRegexp{include: regexp.MustCompile(".*")}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, + }, + }, + in: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "metricTest").build(), + }, + out: []pmetric.Metric{ + metricBuilder(pmetric.MetricTypeGauge, "metric_test").build(), + }, + }, + // Only convert to snake case metrics starting with test + { + name: "complex_regexp_convert_to_snake_case", + transforms: []internalTransform{ + { + MetricIncludeFilter: internalFilterRegexp{include: regexp.MustCompile("test.*[A-Z]")}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, }, }, in: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "Base_MetricTest").build(), + metricBuilder(pmetric.MetricTypeGauge, "testMetric").build(), + metricBuilder(pmetric.MetricTypeGauge, "Metric").build(), }, out: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "base_metric_test").build(), + metricBuilder(pmetric.MetricTypeGauge, "test_metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "Metric").build(), }, }, { name: "no_change_convert_to_snake_case", transforms: []internalTransform{ { - MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: CaseConvert, + MetricIncludeFilter: internalFilterRegexp{include: regexp.MustCompile(".*")}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, }, }, in: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "metric_test").build(), }, out: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "metric_test").build(), }, }, { name: "multiple_uppercase_convert_to_snake_case", transforms: []internalTransform{ { - MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: CaseConvert, + MetricIncludeFilter: internalFilterRegexp{include: regexp.MustCompile(".*")}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, }, }, in: []pmetric.Metric{ @@ -1674,15 +1727,22 @@ var ( name: "dash_replacement_convert_to_snake_case", transforms: []internalTransform{ { - MetricIncludeFilter: internalFilterStrict{include: "metric"}, - Action: CaseConvert, + MetricIncludeFilter: internalFilterRegexp{include: regexp.MustCompile(".*")}, + Action: Update, + Operations: []internalOperation{ + { + configOperation: Operation{ + Action: CaseConvert, + }, + }, + }, }, }, in: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "simple-metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "metric-test").build(), }, out: []pmetric.Metric{ - metricBuilder(pmetric.MetricTypeGauge, "simple_metric").build(), + metricBuilder(pmetric.MetricTypeGauge, "metric_test").build(), }, }, } From 675abef6c9a1581cd13d829308970b5d960d1985 Mon Sep 17 00:00:00 2001 From: John Clark Date: Fri, 21 Oct 2022 15:46:17 +0100 Subject: [PATCH 09/14] Add config tests Signed-off-by: John Clark --- processor/metricstransformprocessor/config_test.go | 3 +++ processor/metricstransformprocessor/testdata/config_full.yaml | 1 + 2 files changed, 4 insertions(+) diff --git a/processor/metricstransformprocessor/config_test.go b/processor/metricstransformprocessor/config_test.go index 6f3dc29d113df..227a7ff33105f 100644 --- a/processor/metricstransformprocessor/config_test.go +++ b/processor/metricstransformprocessor/config_test.go @@ -117,6 +117,9 @@ func TestLoadConfig(t *testing.T) { AggregatedValues: []string{"value1", "value2"}, NewValue: "new_value", }, + { + Action: "case_convert", + }, }, }, { diff --git a/processor/metricstransformprocessor/testdata/config_full.yaml b/processor/metricstransformprocessor/testdata/config_full.yaml index ae4fb00a8b8f3..0c30fd24e4e72 100644 --- a/processor/metricstransformprocessor/testdata/config_full.yaml +++ b/processor/metricstransformprocessor/testdata/config_full.yaml @@ -44,6 +44,7 @@ metricstransform/multiple: aggregated_values: [value1, value2] new_value: new_value aggregation_type: sum + - action: case_convert - include: name3 match_type: strict From 9312ca87751dc47040e7e26ab2e7ef862783f377 Mon Sep 17 00:00:00 2001 From: John Clark Date: Fri, 21 Oct 2022 15:48:36 +0100 Subject: [PATCH 10/14] Update README Signed-off-by: John Clark --- processor/metricstransformprocessor/README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/processor/metricstransformprocessor/README.md b/processor/metricstransformprocessor/README.md index 9ac237e92bfb0..21f81cefd342d 100644 --- a/processor/metricstransformprocessor/README.md +++ b/processor/metricstransformprocessor/README.md @@ -31,6 +31,7 @@ or clients). | Scale value | Multiply values by 1000 to convert from seconds to milliseconds | | Aggregate across label sets | Retain only the label `state`, average all points with the same value for this label | | Aggregate across label values | For label `state`, sum points where the value is `user` or `system` into `used = user + system` | +| Convert camel to snake case | For example `systemCPUUsage`, rename to `system.cpu.usage` | In addition to the above: @@ -73,7 +74,7 @@ processors: # SPECIFY THE ACTION TO TAKE ON THE MATCHED METRIC(S) - # action specifies if the operations (specified below) are performed on metrics in place (update), on an inserted clone (insert), or on a new combined metric (combine) + # action specifies if the operations (specified below) are performed on metrics in place (update), on an inserted clone (insert), on a new combined metric (combine) action: {update, insert, combine} # SPECIFY HOW TO TRANSFORM THE METRIC GENERATED AS A RESULT OF APPLYING THE ABOVE ACTION @@ -87,7 +88,7 @@ processors: # operations contain a list of operations that will be performed on the resulting metric(s) operations: # action defines the type of operation that will be performed, see examples below for more details - - action: {add_label, update_label, delete_label_value, toggle_scalar_data_type, experimental_scale_value, aggregate_labels, aggregate_label_values} + - action: {add_label, update_label, delete_label_value, toggle_scalar_data_type, experimental_scale_value, aggregate_labels, aggregate_label_values, convert_case} # label specifies the label to operate on label: