1
1
// Copyright The OpenTelemetry Authors
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
- package ottlfuncs // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs"
4
+ package metrics // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/ottlfuncs"
5
5
6
6
import (
7
7
"context"
@@ -11,60 +11,52 @@ import (
11
11
"go.opentelemetry.io/collector/pdata/pmetric"
12
12
13
13
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl"
14
+ "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlmetric"
14
15
)
15
16
16
- type ScaleArguments [K any ] struct {
17
- Value ottl.GetSetter [K ]
17
+ type ScaleArguments struct {
18
18
Multiplier float64
19
+ Unit string
19
20
}
20
21
21
- func NewScaleFactory [ K any ] () ottl.Factory [K ] {
22
- return ottl .NewFactory ("scale_metric" , & ScaleArguments [ K ] {}, createScaleFunction [ K ] )
22
+ func newScaleMetricFactory () ottl.Factory [ottlmetric. TransformContext ] {
23
+ return ottl .NewFactory ("scale_metric" , & ScaleArguments {}, createScaleFunction )
23
24
}
24
25
25
- func createScaleFunction [ K any ] (_ ottl.FunctionContext , oArgs ottl.Arguments ) (ottl.ExprFunc [K ], error ) {
26
- args , ok := oArgs .(* ScaleArguments [ K ] )
26
+ func createScaleFunction (_ ottl.FunctionContext , oArgs ottl.Arguments ) (ottl.ExprFunc [ottlmetric. TransformContext ], error ) {
27
+ args , ok := oArgs .(* ScaleArguments )
27
28
28
29
if ! ok {
29
30
return nil , fmt .Errorf ("ScaleFactory args must be of type *ScaleArguments[K]" )
30
31
}
31
32
32
- return Scale (args . Value , args . Multiplier )
33
+ return Scale (* args )
33
34
}
34
35
35
- func Scale [K any ](getSetter ottl.GetSetter [K ], multiplier float64 ) (ottl.ExprFunc [K ], error ) {
36
- return func (ctx context.Context , tCtx K ) (any , error ) {
37
- got , err := getSetter .Get (ctx , tCtx )
38
- if err != nil {
39
- return nil , err
40
- }
41
-
42
- switch value := got .(type ) {
43
- case pmetric.NumberDataPointSlice :
44
- scaleMetric (value , multiplier )
45
- return nil , nil
46
- case pmetric.HistogramDataPointSlice :
47
- scaleHistogram (value , multiplier )
48
- return nil , nil
49
- case pmetric.SummaryDataPointValueAtQuantileSlice :
50
- scaleSummaryDataPointValueAtQuantileSlice (value , multiplier )
51
- return nil , nil
52
- case pmetric.ExemplarSlice :
53
- scaleExemplarSlice (value , multiplier )
54
- return nil , nil
55
- case pmetric.ExponentialHistogramDataPointSlice :
36
+ func Scale (args ScaleArguments ) (ottl.ExprFunc [ottlmetric.TransformContext ], error ) {
37
+ return func (ctx context.Context , tCtx ottlmetric.TransformContext ) (any , error ) {
38
+ metric := tCtx .GetMetric ()
39
+
40
+ switch metric .Type () {
41
+ case pmetric .MetricTypeGauge :
42
+ scaleMetric (metric .Gauge ().DataPoints (), args .Multiplier )
43
+ case pmetric .MetricTypeHistogram :
44
+ scaleHistogram (metric .Histogram ().DataPoints (), args .Multiplier )
45
+ case pmetric .MetricTypeSummary :
46
+ scaleSummarySlice (metric .Summary ().DataPoints (), args .Multiplier )
47
+ case pmetric .MetricTypeSum :
48
+ scaleMetric (metric .Sum ().DataPoints (), args .Multiplier )
49
+ case pmetric .MetricTypeExponentialHistogram :
56
50
return nil , errors .New ("exponential histograms are not supported by the 'scale_metric' function" )
57
51
default :
58
- return nil , fmt .Errorf ("unsupported data type: '%T '" , value )
52
+ return nil , fmt .Errorf ("unsupported metric type: '%v '" , metric . Type () )
59
53
}
60
- }, nil
61
- }
62
54
63
- func scaleExemplarSlice ( values pmetric. ExemplarSlice , multiplier float64 ) {
64
- for i := 0 ; i < values . Len (); i ++ {
65
- ex := values . At ( i )
66
- scaleExemplar ( & ex , multiplier )
67
- }
55
+ if args . Unit != "" {
56
+ metric . SetUnit ( args . Unit )
57
+ }
58
+ return nil , nil
59
+ }, nil
68
60
}
69
61
70
62
func scaleExemplar (ex * pmetric.Exemplar , multiplier float64 ) {
@@ -76,11 +68,16 @@ func scaleExemplar(ex *pmetric.Exemplar, multiplier float64) {
76
68
}
77
69
}
78
70
79
- func scaleSummaryDataPointValueAtQuantileSlice (values pmetric.SummaryDataPointValueAtQuantileSlice , multiplier float64 ) {
71
+ func scaleSummarySlice (values pmetric.SummaryDataPointSlice , multiplier float64 ) {
80
72
for i := 0 ; i < values .Len (); i ++ {
81
73
dp := values .At (i )
82
74
83
- dp .SetValue (dp .Value () * multiplier )
75
+ dp .SetSum (dp .Sum () * multiplier )
76
+
77
+ for i := 0 ; i < dp .QuantileValues ().Len (); i ++ {
78
+ qv := dp .QuantileValues ().At (i )
79
+ qv .SetValue (qv .Value () * multiplier )
80
+ }
84
81
}
85
82
}
86
83
0 commit comments