github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/metrics/aggregation/type_config.go (about) 1 // Copyright (c) 2017 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package aggregation 22 23 import ( 24 "fmt" 25 26 "github.com/m3db/m3/src/x/instrument" 27 "github.com/m3db/m3/src/x/pool" 28 ) 29 30 // TypesConfiguration contains configuration for aggregation types. 31 type TypesConfiguration struct { 32 // Default aggregation types for counter metrics. 33 DefaultCounterAggregationTypes *Types `yaml:"defaultCounterAggregationTypes"` 34 35 // Default aggregation types for timer metrics. 36 DefaultTimerAggregationTypes *Types `yaml:"defaultTimerAggregationTypes"` 37 38 // Default aggregation types for gauge metrics. 39 DefaultGaugeAggregationTypes *Types `yaml:"defaultGaugeAggregationTypes"` 40 41 // CounterTransformFnType configures the type string transformation function for counters. 42 CounterTransformFnType *TransformFnType `yaml:"counterTransformFnType"` 43 44 // TimerTransformFnType configures the type string transformation function for timers. 45 TimerTransformFnType *TransformFnType `yaml:"timerTransformFnType"` 46 47 // GaugeTransformFnType configures the type string transformation function for gauges. 48 GaugeTransformFnType *TransformFnType `yaml:"gaugeTransformFnType"` 49 50 // Pool of aggregation types. 51 AggregationTypesPool pool.ObjectPoolConfiguration `yaml:"aggregationTypesPool"` 52 53 // Pool of quantile slices. 54 QuantilesPool pool.BucketizedPoolConfiguration `yaml:"quantilesPool"` 55 } 56 57 // NewOptions creates a new Option. 58 func (c TypesConfiguration) NewOptions(instrumentOpts instrument.Options) (TypesOptions, error) { 59 opts := NewTypesOptions() 60 if c.DefaultCounterAggregationTypes != nil { 61 opts = opts.SetDefaultCounterAggregationTypes(*c.DefaultCounterAggregationTypes) 62 } 63 if c.DefaultGaugeAggregationTypes != nil { 64 opts = opts.SetDefaultGaugeAggregationTypes(*c.DefaultGaugeAggregationTypes) 65 } 66 if c.DefaultTimerAggregationTypes != nil { 67 opts = opts.SetDefaultTimerAggregationTypes(*c.DefaultTimerAggregationTypes) 68 } 69 if c.CounterTransformFnType != nil { 70 fn, err := c.CounterTransformFnType.TransformFn() 71 if err != nil { 72 return nil, err 73 } 74 opts = opts.SetCounterTypeStringTransformFn(fn) 75 } 76 if c.TimerTransformFnType != nil { 77 fn, err := c.TimerTransformFnType.TransformFn() 78 if err != nil { 79 return nil, err 80 } 81 opts = opts.SetTimerTypeStringTransformFn(fn) 82 } 83 if c.GaugeTransformFnType != nil { 84 fn, err := c.GaugeTransformFnType.TransformFn() 85 if err != nil { 86 return nil, err 87 } 88 opts = opts.SetGaugeTypeStringTransformFn(fn) 89 } 90 91 // Set aggregation types pool. 92 scope := instrumentOpts.MetricsScope() 93 iOpts := instrumentOpts.SetMetricsScope(scope.SubScope("aggregation-types-pool")) 94 aggTypesPoolOpts := c.AggregationTypesPool.NewObjectPoolOptions(iOpts) 95 aggTypesPool := NewTypesPool(aggTypesPoolOpts) 96 opts = opts.SetTypesPool(aggTypesPool) 97 aggTypesPool.Init(func() Types { 98 return make(Types, 0, len(ValidTypes)) 99 }) 100 101 // Set quantiles pool. 102 iOpts = instrumentOpts.SetMetricsScope(scope.SubScope("quantile-pool")) 103 quantilesPool := pool.NewFloatsPool( 104 c.QuantilesPool.NewBuckets(), 105 c.QuantilesPool.NewObjectPoolOptions(iOpts), 106 ) 107 opts = opts.SetQuantilesPool(quantilesPool) 108 quantilesPool.Init() 109 110 return opts, nil 111 } 112 113 // TransformFnType specifies the type of the aggregation 114 // transform function. 115 type TransformFnType string 116 117 var ( 118 // NoopTransformType is the type for noop transform function. 119 NoopTransformType TransformFnType = "noop" 120 // EmptyTransformType is the type for an empty transform function. 121 EmptyTransformType TransformFnType = "empty" 122 // SuffixTransformType is the type for suffix transform function. 123 SuffixTransformType TransformFnType = "suffix" 124 125 validTypes = []TransformFnType{ 126 NoopTransformType, 127 EmptyTransformType, 128 SuffixTransformType, 129 } 130 ) 131 132 // UnmarshalYAML uses the unmarshal function provided as an argument to set 133 // the current TransformFnType. 134 func (t *TransformFnType) UnmarshalYAML(unmarshal func(interface{}) error) error { 135 var str string 136 if err := unmarshal(&str); err != nil { 137 return err 138 } 139 var validStrings []string 140 for _, validType := range validTypes { 141 validString := string(validType) 142 if validString == str { 143 *t = validType 144 return nil 145 } 146 validStrings = append(validStrings, validString) 147 } 148 149 return fmt.Errorf("invalid transform type %s, valid types are: %v", str, validStrings) 150 } 151 152 // TransformFn returns the transform function. 153 func (t TransformFnType) TransformFn() (TypeStringTransformFn, error) { 154 switch t { 155 case NoopTransformType: 156 return NoOpTransform, nil 157 case EmptyTransformType: 158 return EmptyTransform, nil 159 case SuffixTransformType: 160 return SuffixTransform, nil 161 default: 162 return nil, fmt.Errorf("invalid type string transform function type: %s", string(t)) 163 } 164 }