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  }