diff --git a/internal/metricRouter/metricRouter.go b/internal/metricRouter/metricRouter.go index 22d7d4d..7752cc6 100644 --- a/internal/metricRouter/metricRouter.go +++ b/internal/metricRouter/metricRouter.go @@ -37,6 +37,7 @@ type metricRouterConfig struct { NumCacheIntervals int `json:"num_cache_intervals"` // Number of intervals of cached metrics for evaluation MaxForward int `json:"max_forward"` // Number of maximal forwarded metrics at one select NormalizeUnits bool `json:"normalize_units"` // Check unit meta flag and normalize it using cc-units + ChangeUnitPrefix string `json:"change_unit_prefix"` // Add prefix that should be applied to all metrics where possible dropMetrics map[string]bool // Internal map for O(1) lookup } @@ -263,6 +264,55 @@ func (r *metricRouter) Start() { } } } + if len(r.config.ChangeUnitPrefix) > 0 { + prefix := units.NewPrefix(r.config.ChangeUnitPrefix) + if prefix != units.InvalidPrefix { + if in_unit, ok := point.GetMeta("unit"); ok { + u := units.NewUnit(in_unit) + if u.Valid() { + conv, out_unit := units.GetUnitPrefixFactor(u, prefix) + if conv != nil && out_unit.Valid() { + if val, ok := point.GetField("value"); ok { + newval := 0.0 + skip := false + switch v := val.(type) { + case float64: + newval = v + case float32: + newval = float64(v) + case int64: + newval = float64(v) + case int32: + newval = float64(v) + case int: + newval = float64(v) + case string: + skip = true + } + if !skip { + newval = conv(newval) + var x interface{} + switch val.(type) { + case float64: + x = newval + case float32: + x = float32(newval) + case int64: + x = int64(newval) + case int32: + x = int32(newval) + case int: + x = int(newval) + } + point.AddField("value", x) + point.AddMeta("unit", out_unit.Short()) + } + } + } + } + } + } + } r.DoAddTags(point) r.DoDelTags(point)