github.com/blend/go-sdk@v1.20220411.3/stats/tag.go (about)

     1  /*
     2  
     3  Copyright (c) 2022 - Present. Blend Labs, Inc. All rights reserved
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file.
     5  
     6  */
     7  
     8  package stats
     9  
    10  import (
    11  	"strings"
    12  	"unicode"
    13  )
    14  
    15  // Tag formats a tag with a given key and value.
    16  // For tags in the form `key` use an empty string for the value.
    17  func Tag(key, value string) string {
    18  	key = cleanTagElement(key)
    19  	value = cleanTagElement(value)
    20  	return key + ":" + value
    21  }
    22  
    23  // SplitTag splits a given tag in a key and a value
    24  func SplitTag(tag string) (key, value string) {
    25  	parts := strings.SplitN(tag, ":", 2)
    26  	if len(parts) > 0 {
    27  		key = parts[0]
    28  	}
    29  	if len(parts) > 1 {
    30  		value = parts[1]
    31  	}
    32  	return
    33  }
    34  
    35  // cleansTagElement cleans up tag elements as best as it can
    36  // per the spec at https://docs.datadoghq.com/tagging/
    37  func cleanTagElement(value string) string {
    38  	valueRunes := []rune(value)
    39  	var r rune
    40  	for x := 0; x < len(valueRunes); x++ {
    41  		r = valueRunes[x]
    42  		// letters
    43  		if unicode.IsLetter(r) {
    44  			continue
    45  		}
    46  		// digits
    47  		if unicode.IsDigit(r) {
    48  			continue
    49  		}
    50  		// allowed symbols
    51  		switch r {
    52  		case '-', ':', '_', '.', '/', '\\':
    53  			continue
    54  		default:
    55  		}
    56  		// everything else
    57  		valueRunes[x] = '_'
    58  		continue
    59  	}
    60  	return string(valueRunes)
    61  }