github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/metrics/sinks/statsd/etsystatsd_formatter.go (about) 1 // Copyright 2016 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package statsd 16 17 import ( 18 "bytes" 19 "fmt" 20 "github.com/golang/glog" 21 "k8s.io/heapster/metrics/core" 22 "sort" 23 "strings" 24 ) 25 26 type EtsystatsdFormatter struct { 27 delimReplacer *strings.Replacer 28 } 29 30 func (formatter *EtsystatsdFormatter) Format(prefix string, name string, labels map[string]string, customizeLabel CustomizeLabel, metricValue core.MetricValue) (res string, err error) { 31 var metricName string 32 var suffix string 33 if resourceId, ok := labels[core.LabelResourceID.Key]; ok { 34 metricName = fmt.Sprintf("%s.%s", 35 formatter.delimReplacer.Replace(name), 36 formatter.delimReplacer.Replace(resourceId)) 37 } else { 38 metricName = formatter.delimReplacer.Replace(name) 39 } 40 if prefix != "" { 41 prefix = formatter.delimReplacer.Replace(prefix) + "." 42 } 43 userLabelStr := labels[core.LabelLabels.Key] 44 if len(userLabelStr) > 0 { 45 suffix = fmt.Sprintf("%s.%s:%v|g", 46 formatter.formatUserLabels(userLabelStr, customizeLabel), 47 metricName, 48 metricValue.GetValue(), 49 ) 50 } else { 51 suffix = fmt.Sprintf("%s:%v|g", 52 metricName, 53 metricValue.GetValue(), 54 ) 55 } 56 metricType, hasMetricType := labels[core.LabelMetricSetType.Key] 57 if !hasMetricType { 58 return "", fmt.Errorf("Missing LabelMetricSetType in labels, failed to format metrics") 59 } 60 switch metricType { 61 case core.MetricSetTypePodContainer: 62 return fmt.Sprintf("%snode.%s.namespace.%s.pod.%s.container.%s.%s", 63 prefix, 64 formatter.delimReplacer.Replace(labels[core.LabelHostname.Key]), 65 formatter.delimReplacer.Replace(labels[core.LabelNamespaceName.Key]), 66 formatter.delimReplacer.Replace(labels[core.LabelPodName.Key]), 67 formatter.delimReplacer.Replace(labels[core.LabelContainerName.Key]), 68 suffix, 69 ), nil 70 case core.MetricSetTypeSystemContainer: 71 return fmt.Sprintf("%snode.%s.sys-container.%s.%s", 72 prefix, 73 formatter.delimReplacer.Replace(labels[core.LabelHostname.Key]), 74 formatter.delimReplacer.Replace(labels[core.LabelContainerName.Key]), 75 suffix, 76 ), nil 77 case core.MetricSetTypePod: 78 return fmt.Sprintf("%snode.%s.namespace.%s.pod.%s.%s", 79 prefix, 80 formatter.delimReplacer.Replace(labels[core.LabelHostname.Key]), 81 formatter.delimReplacer.Replace(labels[core.LabelNamespaceName.Key]), 82 formatter.delimReplacer.Replace(labels[core.LabelPodName.Key]), 83 suffix, 84 ), nil 85 case core.MetricSetTypeNamespace: 86 return fmt.Sprintf("%snamespace.%s.%s", 87 prefix, 88 formatter.delimReplacer.Replace(labels[core.LabelNamespaceName.Key]), 89 suffix, 90 ), nil 91 case core.MetricSetTypeNode: 92 return fmt.Sprintf("%snode.%s.%s", 93 prefix, 94 formatter.delimReplacer.Replace(labels[core.LabelHostname.Key]), 95 suffix, 96 ), nil 97 case core.MetricSetTypeCluster: 98 return fmt.Sprintf("%scluster.%s", 99 prefix, 100 suffix, 101 ), nil 102 default: 103 err = fmt.Errorf("Unknown metric set type %s", metricType) 104 } 105 return "", err 106 } 107 108 func (formatter *EtsystatsdFormatter) formatUserLabels(appLabel string, customizeLabel CustomizeLabel) string { 109 labelMap := make(map[string]string) 110 kvPairs := strings.Split(appLabel, ",") 111 for _, kvPair := range kvPairs { 112 kv := strings.Split(kvPair, ":") 113 if len(kv) >= 2 { 114 labelMap[kv[0]] = kv[1] 115 } 116 } 117 keys := make([]string, len(labelMap)) 118 for k := range labelMap { 119 keys = append(keys, k) 120 } 121 sort.Strings(keys) 122 var buffer bytes.Buffer 123 for _, k := range keys { 124 v := labelMap[k] 125 if v != "" && buffer.Len() > 0 { 126 buffer.WriteString(fmt.Sprintf(".%s.%s", customizeLabel(formatter.delimReplacer.Replace(k)), formatter.delimReplacer.Replace(v))) 127 } else if v != "" { 128 buffer.WriteString(fmt.Sprintf("%s.%s", customizeLabel(formatter.delimReplacer.Replace(k)), formatter.delimReplacer.Replace(v))) 129 } 130 } 131 return buffer.String() 132 } 133 134 func NewEtsystatsdFormatter() Formatter { 135 glog.V(2).Info("etsystatsd formatter is created") 136 return &EtsystatsdFormatter{ 137 delimReplacer: strings.NewReplacer(".", "_", "=", "_", "|", "_"), 138 } 139 }