telegraf/plugins/outputs/dynatrace/dynatrace_test.go

382 lines
9.8 KiB
Go
Raw Normal View History

2020-08-12 23:51:53 +08:00
package dynatrace
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
2021-06-09 05:27:39 +08:00
"regexp"
2020-08-12 23:51:53 +08:00
"testing"
"time"
2021-06-09 05:27:39 +08:00
"github.com/dynatrace-oss/dynatrace-metric-utils-go/metric/apiconstants"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/metric"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require"
2020-08-12 23:51:53 +08:00
)
func TestNilMetrics(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
2021-06-09 05:27:39 +08:00
err := json.NewEncoder(w).Encode(`{"linesOk":10,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{
Timeout: config.Duration(time.Second * 5),
2020-08-12 23:51:53 +08:00
}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
err = d.Write(nil)
require.NoError(t, err)
}
func TestEmptyMetricsSlice(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
2021-06-09 05:27:39 +08:00
err := json.NewEncoder(w).Encode(`{"linesOk":10,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
empty := []telegraf.Metric{}
err = d.Write(empty)
require.NoError(t, err)
}
func TestMockURL(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
2021-06-09 05:27:39 +08:00
err := json.NewEncoder(w).Encode(`{"linesOk":10,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
err = d.Write(testutil.MockMetrics())
require.NoError(t, err)
}
func TestMissingURL(t *testing.T) {
d := &Dynatrace{}
d.Log = testutil.Logger{}
err := d.Init()
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
require.Equal(t, apiconstants.GetDefaultOneAgentEndpoint(), d.URL)
2020-08-12 23:51:53 +08:00
err = d.Connect()
2021-06-09 05:27:39 +08:00
require.Equal(t, apiconstants.GetDefaultOneAgentEndpoint(), d.URL)
2020-08-12 23:51:53 +08:00
require.NoError(t, err)
}
func TestMissingAPITokenMissingURL(t *testing.T) {
d := &Dynatrace{}
d.Log = testutil.Logger{}
err := d.Init()
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
require.Equal(t, apiconstants.GetDefaultOneAgentEndpoint(), d.URL)
2020-08-12 23:51:53 +08:00
err = d.Connect()
2021-06-09 05:27:39 +08:00
require.Equal(t, apiconstants.GetDefaultOneAgentEndpoint(), d.URL)
2020-08-12 23:51:53 +08:00
require.NoError(t, err)
}
func TestMissingAPIToken(t *testing.T) {
d := &Dynatrace{}
d.URL = "test"
d.Log = testutil.Logger{}
err := d.Init()
require.Error(t, err)
}
func TestSendMetric(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
bodyString := string(bodyBytes)
2021-06-09 05:27:39 +08:00
expected := "mymeasurement.myfield,host=192.168.0.1 gauge,3.14\nmymeasurement.value,host=192.168.0.2 count,3.14"
2020-08-12 23:51:53 +08:00
if bodyString != expected {
2021-06-09 05:27:39 +08:00
t.Errorf("Metric encoding failed. expected: %#v but got: %#v", expected, bodyString)
2020-08-12 23:51:53 +08:00
}
w.WriteHeader(http.StatusOK)
2021-06-09 05:27:39 +08:00
err = json.NewEncoder(w).Encode(`{"linesOk":10,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
2021-06-09 05:27:39 +08:00
map[string]string{"host": "192.168.0.1"},
2020-08-12 23:51:53 +08:00
map[string]interface{}{"myfield": float64(3.14)},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
m2 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
2021-06-09 05:27:39 +08:00
map[string]string{"host": "192.168.0.2"},
2020-08-12 23:51:53 +08:00
map[string]interface{}{"value": float64(3.14)},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
2021-06-09 05:27:39 +08:00
telegraf.Counter,
2020-08-12 23:51:53 +08:00
)
metrics := []telegraf.Metric{m1, m2}
err = d.Write(metrics)
require.NoError(t, err)
}
func TestSendSingleMetricWithUnorderedTags(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
bodyString := string(bodyBytes)
2021-06-09 05:27:39 +08:00
require.Regexp(t, regexp.MustCompile(`^mymeasurement\.myfield`), bodyString)
require.Regexp(t, regexp.MustCompile(`a=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`b=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`c=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`gauge,3.14$`), bodyString)
2020-08-12 23:51:53 +08:00
w.WriteHeader(http.StatusOK)
2021-06-09 05:27:39 +08:00
err = json.NewEncoder(w).Encode(`{"linesOk":1,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
map[string]string{"a": "test", "c": "test", "b": "test"},
map[string]interface{}{"myfield": float64(3.14)},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
metrics := []telegraf.Metric{m1}
err = d.Write(metrics)
require.NoError(t, err)
}
func TestSendMetricWithoutTags(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
bodyString := string(bodyBytes)
2021-06-09 05:27:39 +08:00
expected := "mymeasurement.myfield gauge,3.14"
2020-08-12 23:51:53 +08:00
if bodyString != expected {
2021-06-09 05:27:39 +08:00
t.Errorf("Metric encoding failed. expected: %#v but got: %#v", expected, bodyString)
2020-08-12 23:51:53 +08:00
}
2021-06-09 05:27:39 +08:00
err = json.NewEncoder(w).Encode(`{"linesOk":1,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
map[string]string{},
map[string]interface{}{"myfield": float64(3.14)},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
metrics := []telegraf.Metric{m1}
err = d.Write(metrics)
require.NoError(t, err)
}
func TestSendMetricWithUpperCaseTagKeys(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
bodyString := string(bodyBytes)
2021-06-09 05:27:39 +08:00
// expected := "mymeasurement.myfield,b_b=test,ccc=test,aaa=test gauge,3.14"
// use regex because dimension order isn't guaranteed
require.Regexp(t, regexp.MustCompile(`^mymeasurement\.myfield`), bodyString)
require.Regexp(t, regexp.MustCompile(`aaa=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`b_b=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`ccc=test`), bodyString)
require.Regexp(t, regexp.MustCompile(`gauge,3.14$`), bodyString)
err = json.NewEncoder(w).Encode(`{"linesOk":1,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
map[string]string{"AAA": "test", "CcC": "test", "B B": "test"},
map[string]interface{}{"myfield": float64(3.14)},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
metrics := []telegraf.Metric{m1}
err = d.Write(metrics)
require.NoError(t, err)
}
func TestSendBooleanMetricWithoutTags(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
2021-06-09 05:27:39 +08:00
require.NoError(t, err)
bodyString := string(bodyBytes)
// use regex because field order isn't guaranteed
require.Contains(t, bodyString, "mymeasurement.yes gauge,1")
require.Contains(t, bodyString, "mymeasurement.no gauge,0")
err = json.NewEncoder(w).Encode(`{"linesOk":1,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
"mymeasurement",
map[string]string{},
map[string]interface{}{"yes": true, "no": false},
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
metrics := []telegraf.Metric{m1}
err = d.Write(metrics)
require.NoError(t, err)
}
func TestSendCounterMetricWithoutTags(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
// check the encoded result
bodyBytes, err := ioutil.ReadAll(r.Body)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
bodyString := string(bodyBytes)
2021-06-09 05:27:39 +08:00
expected := "mymeasurement.value gauge,32"
2020-08-12 23:51:53 +08:00
if bodyString != expected {
2021-06-09 05:27:39 +08:00
t.Errorf("Metric encoding failed. expected: %#v but got: %#v", expected, bodyString)
2020-08-12 23:51:53 +08:00
}
2021-06-09 05:27:39 +08:00
err = json.NewEncoder(w).Encode(`{"linesOk":1,"linesInvalid":0,"error":null}`)
require.NoError(t, err)
2020-08-12 23:51:53 +08:00
}))
defer ts.Close()
d := &Dynatrace{}
d.URL = ts.URL
d.APIToken = "123"
d.Log = testutil.Logger{}
err := d.Init()
require.NoError(t, err)
err = d.Connect()
require.NoError(t, err)
// Init metrics
m1 := metric.New(
2020-08-12 23:51:53 +08:00
"mymeasurement",
map[string]string{},
2021-06-09 05:27:39 +08:00
map[string]interface{}{"value": 32},
2020-08-12 23:51:53 +08:00
time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
)
metrics := []telegraf.Metric{m1}
err = d.Write(metrics)
require.NoError(t, err)
}