Procházet zdrojové kódy

Add tags for statsd in config

tags/v2.0.0-rc1
9seconds před 5 roky
rodič
revize
46bd617581

+ 5
- 3
config/config.go Zobrazit soubor

45
 	} `json:"network"`
45
 	} `json:"network"`
46
 	Stats struct {
46
 	Stats struct {
47
 		StatsD struct {
47
 		StatsD struct {
48
-			Enabled      bool             `json:"enabled"`
49
-			Address      TypeHostPort     `json:"address"`
50
-			MetricPrefix TypeMetricPrefix `json:"metric-prefix"`
48
+			Enabled      bool                `json:"enabled"`
49
+			Address      TypeHostPort        `json:"address"`
50
+			MetricPrefix TypeMetricPrefix    `json:"metric-prefix"`
51
+			TagFormat    TypeStatsdTagFormat `json:"tag-format"`
51
 		} `json:"statsd"`
52
 		} `json:"statsd"`
52
 		Prometheus struct {
53
 		Prometheus struct {
53
 			Enabled      bool             `json:"enabled"`
54
 			Enabled      bool             `json:"enabled"`
122
 			Enabled      bool   `toml:"enabled" json:"enabled,omitempty"`
123
 			Enabled      bool   `toml:"enabled" json:"enabled,omitempty"`
123
 			Address      string `toml:"address" json:"address,omitempty"`
124
 			Address      string `toml:"address" json:"address,omitempty"`
124
 			MetricPrefix string `toml:"metric-prefix" json:"metric-prefix,omitempty"`
125
 			MetricPrefix string `toml:"metric-prefix" json:"metric-prefix,omitempty"`
126
+			TagFormat    string `toml:"tag-format" json:"tag-format,omitempty"`
125
 		} `toml:"statsd" json:"statsd,omitempty"`
127
 		} `toml:"statsd" json:"statsd,omitempty"`
126
 		Prometheus struct {
128
 		Prometheus struct {
127
 			Enabled      bool   `toml:"enabled" json:"enabled,omitempty"`
129
 			Enabled      bool   `toml:"enabled" json:"enabled,omitempty"`

+ 49
- 0
config/type_statsd_tag_format.go Zobrazit soubor

1
+package config
2
+
3
+import (
4
+	"fmt"
5
+	"strings"
6
+)
7
+
8
+const (
9
+	TypeStatsdTagFormatInfluxdb = "influxdb"
10
+	TypeStatsdTagFormatDatadog  = "datadog"
11
+	TypeStatsdTagFormatGraphite = "graphite"
12
+)
13
+
14
+type TypeStatsdTagFormat struct {
15
+	value string
16
+}
17
+
18
+func (c *TypeStatsdTagFormat) UnmarshalText(data []byte) error {
19
+	if len(data) == 0 {
20
+		return nil
21
+	}
22
+
23
+	text := strings.ToLower(string(data))
24
+
25
+	switch text {
26
+	case TypeStatsdTagFormatInfluxdb, TypeStatsdTagFormatDatadog, TypeStatsdTagFormatGraphite:
27
+		c.value = text
28
+	default:
29
+		return fmt.Errorf("incorrect tag format value: %s", string(data))
30
+	}
31
+
32
+	return nil
33
+}
34
+
35
+func (c TypeStatsdTagFormat) MarshalText() ([]byte, error) {
36
+	return []byte(c.value), nil
37
+}
38
+
39
+func (c *TypeStatsdTagFormat) String() string {
40
+	return c.value
41
+}
42
+
43
+func (c *TypeStatsdTagFormat) Value(defaultValue string) string {
44
+	if c.value == "" {
45
+		return defaultValue
46
+	}
47
+
48
+	return c.value
49
+}

+ 130
- 0
config/type_statsd_tag_format_test.go Zobrazit soubor

1
+package config_test
2
+
3
+import (
4
+	"encoding/json"
5
+	"strings"
6
+	"testing"
7
+
8
+	"github.com/9seconds/mtg/v2/config"
9
+	"github.com/stretchr/testify/assert"
10
+	"github.com/stretchr/testify/suite"
11
+)
12
+
13
+type typeStatsdTagFormatTestStruct struct {
14
+	Value config.TypeStatsdTagFormat `json:"value"`
15
+}
16
+
17
+type TypeStatsdTagFormat struct {
18
+	suite.Suite
19
+}
20
+
21
+func (suite *TypeStatsdTagFormat) TestUnmarshalFail() {
22
+	testData := []string{
23
+		"p",
24
+		"ipv4",
25
+		"onlyipv4",
26
+		"ipv6prefer",
27
+	}
28
+
29
+	for _, v := range testData {
30
+		data, err := json.Marshal(map[string]string{
31
+			"value": v,
32
+		})
33
+		suite.NoError(err)
34
+
35
+		suite.T().Run(v, func(t *testing.T) {
36
+			assert.Error(t, json.Unmarshal(data, &typeStatsdTagFormatTestStruct{}))
37
+		})
38
+	}
39
+}
40
+
41
+func (suite *TypeStatsdTagFormat) TestUnmarshalOk() {
42
+	testData := []string{
43
+		config.TypeStatsdTagFormatDatadog,
44
+		config.TypeStatsdTagFormatInfluxdb,
45
+		config.TypeStatsdTagFormatGraphite,
46
+		strings.ToUpper(config.TypeStatsdTagFormatDatadog),
47
+		strings.ToUpper(config.TypeStatsdTagFormatInfluxdb),
48
+		strings.ToUpper(config.TypeStatsdTagFormatGraphite),
49
+		strings.ToLower(config.TypeStatsdTagFormatDatadog),
50
+		strings.ToLower(config.TypeStatsdTagFormatInfluxdb),
51
+		strings.ToLower(config.TypeStatsdTagFormatGraphite),
52
+	}
53
+
54
+	for _, v := range testData {
55
+		value := v
56
+
57
+		data, err := json.Marshal(map[string]string{
58
+			"value": v,
59
+		})
60
+		suite.NoError(err)
61
+
62
+		suite.T().Run(v, func(t *testing.T) {
63
+			testStruct := &typeStatsdTagFormatTestStruct{}
64
+
65
+			assert.NoError(t, json.Unmarshal(data, testStruct))
66
+			assert.EqualValues(t,
67
+				strings.ToLower(value),
68
+				testStruct.Value.Value(config.TypeStatsdTagFormatDatadog))
69
+		})
70
+	}
71
+}
72
+
73
+func (suite *TypeStatsdTagFormat) TestMarshalOk() {
74
+	testData := []string{
75
+		config.TypeStatsdTagFormatDatadog,
76
+		config.TypeStatsdTagFormatInfluxdb,
77
+		config.TypeStatsdTagFormatGraphite,
78
+		strings.ToUpper(config.TypeStatsdTagFormatDatadog),
79
+		strings.ToUpper(config.TypeStatsdTagFormatInfluxdb),
80
+		strings.ToUpper(config.TypeStatsdTagFormatGraphite),
81
+		strings.ToLower(config.TypeStatsdTagFormatDatadog),
82
+		strings.ToLower(config.TypeStatsdTagFormatInfluxdb),
83
+		strings.ToLower(config.TypeStatsdTagFormatGraphite),
84
+	}
85
+
86
+	for _, v := range testData {
87
+		value := v
88
+
89
+		data, err := json.Marshal(map[string]string{
90
+			"value": v,
91
+		})
92
+		suite.NoError(err)
93
+
94
+		suite.T().Run(v, func(t *testing.T) {
95
+			testStruct := &typeStatsdTagFormatTestStruct{}
96
+
97
+			assert.NoError(t, json.Unmarshal(data, testStruct))
98
+			assert.Equal(t, strings.ToLower(value), testStruct.Value.String())
99
+
100
+			marshalled, err := testStruct.Value.MarshalText()
101
+			assert.NoError(t, err)
102
+			assert.Equal(t, strings.ToLower(value), string(marshalled))
103
+		})
104
+	}
105
+}
106
+
107
+func (suite *TypeStatsdTagFormat) TestValue() {
108
+	testStruct := &typePreferIPTestStruct{}
109
+
110
+	suite.EqualValues(config.TypePreferIPPreferIPv4,
111
+		testStruct.Value.Value(config.TypePreferIPPreferIPv4))
112
+	suite.EqualValues(config.TypePreferIPPreferIPv6,
113
+		testStruct.Value.Value(config.TypePreferIPPreferIPv6))
114
+
115
+	data, err := json.Marshal(map[string]string{
116
+		"value": config.TypePreferOnlyIPv4,
117
+	})
118
+	suite.NoError(err)
119
+	suite.NoError(json.Unmarshal(data, testStruct))
120
+
121
+	suite.EqualValues(config.TypePreferOnlyIPv4,
122
+		testStruct.Value.Value(config.TypePreferOnlyIPv6))
123
+	suite.EqualValues(config.TypePreferOnlyIPv4,
124
+		testStruct.Value.Value(config.TypePreferIPPreferIPv6))
125
+}
126
+
127
+func TestTypeStatsdTagFormat(t *testing.T) {
128
+	t.Parallel()
129
+	suite.Run(t, &TypeStatsdTagFormat{})
130
+}

+ 4
- 0
example.config.toml Zobrazit soubor

174
 address = "127.0.0.1:8888"
174
 address = "127.0.0.1:8888"
175
 # prefix of metric for statsd
175
 # prefix of metric for statsd
176
 metric-prefix = "mtg"
176
 metric-prefix = "mtg"
177
+# tag format to use
178
+# supported values are 'datadog', 'influxdb' and 'graphite'
179
+# default format is graphite.
180
+tag-format = "datadog"
177
 
181
 
178
 # prometheus metrics integration.
182
 # prometheus metrics integration.
179
 [stats.prometheus]
183
 [stats.prometheus]

Načítá se…
Zrušit
Uložit