package elasticsearch import ( "context" "reflect" "testing" "time" "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/testutil" "github.com/stretchr/testify/require" ) func TestConnectAndWrite(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } urls := []string{"http://" + testutil.GetLocalHost() + ":9200"} e := &Elasticsearch{ URLs: urls, IndexName: "test-%Y.%m.%d", Timeout: internal.Duration{Duration: time.Second * 5}, ManageTemplate: true, TemplateName: "telegraf", OverwriteTemplate: false, HealthCheckInterval: internal.Duration{Duration: time.Second * 10}, } // Verify that we can connect to Elasticsearch err := e.Connect() require.NoError(t, err) // Verify that we can successfully write data to Elasticsearch err = e.Write(testutil.MockMetrics()) require.NoError(t, err) } func TestTemplateManagementEmptyTemplate(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } urls := []string{"http://" + testutil.GetLocalHost() + ":9200"} ctx := context.Background() e := &Elasticsearch{ URLs: urls, IndexName: "test-%Y.%m.%d", Timeout: internal.Duration{Duration: time.Second * 5}, ManageTemplate: true, TemplateName: "", OverwriteTemplate: true, } err := e.manageTemplate(ctx) require.Error(t, err) } func TestTemplateManagement(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } urls := []string{"http://" + testutil.GetLocalHost() + ":9200"} e := &Elasticsearch{ URLs: urls, IndexName: "test-%Y.%m.%d", Timeout: internal.Duration{Duration: time.Second * 5}, ManageTemplate: true, TemplateName: "telegraf", OverwriteTemplate: true, } ctx, cancel := context.WithTimeout(context.Background(), e.Timeout.Duration) defer cancel() err := e.Connect() require.NoError(t, err) err = e.manageTemplate(ctx) require.NoError(t, err) } func TestTemplateInvalidIndexPattern(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } urls := []string{"http://" + testutil.GetLocalHost() + ":9200"} e := &Elasticsearch{ URLs: urls, IndexName: "{{host}}-%Y.%m.%d", Timeout: internal.Duration{Duration: time.Second * 5}, ManageTemplate: true, TemplateName: "telegraf", OverwriteTemplate: true, } err := e.Connect() require.Error(t, err) } func TestGetTagKeys(t *testing.T) { e := &Elasticsearch{ DefaultTagValue: "none", } var tests = []struct { IndexName string ExpectedIndexName string ExpectedTagKeys []string }{ { "indexname", "indexname", []string{}, }, { "indexname-%Y", "indexname-%Y", []string{}, }, { "indexname-%Y-%m", "indexname-%Y-%m", []string{}, }, { "indexname-%Y-%m-%d", "indexname-%Y-%m-%d", []string{}, }, { "indexname-%Y-%m-%d-%H", "indexname-%Y-%m-%d-%H", []string{}, }, { "indexname-%y-%m", "indexname-%y-%m", []string{}, }, { "indexname-{{tag1}}-%y-%m", "indexname-%s-%y-%m", []string{"tag1"}, }, { "indexname-{{tag1}}-{{tag2}}-%y-%m", "indexname-%s-%s-%y-%m", []string{"tag1", "tag2"}, }, { "indexname-{{tag1}}-{{tag2}}-{{tag3}}-%y-%m", "indexname-%s-%s-%s-%y-%m", []string{"tag1", "tag2", "tag3"}, }, } for _, test := range tests { indexName, tagKeys := e.GetTagKeys(test.IndexName) if indexName != test.ExpectedIndexName { t.Errorf("Expected indexname %s, got %s\n", test.ExpectedIndexName, indexName) } if !reflect.DeepEqual(tagKeys, test.ExpectedTagKeys) { t.Errorf("Expected tagKeys %s, got %s\n", test.ExpectedTagKeys, tagKeys) } } } func TestGetIndexName(t *testing.T) { e := &Elasticsearch{ DefaultTagValue: "none", } var tests = []struct { EventTime time.Time Tags map[string]string TagKeys []string IndexName string Expected string }{ { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname", "indexname", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%Y", "indexname-2014", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%Y-%m", "indexname-2014-12", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%Y-%m-%d", "indexname-2014-12-01", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%Y-%m-%d-%H", "indexname-2014-12-01-23", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%y-%m", "indexname-14-12", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{}, "indexname-%Y-%V", "indexname-2014-49", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{"tag1"}, "indexname-%s-%y-%m", "indexname-value1-14-12", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{"tag1", "tag2"}, "indexname-%s-%s-%y-%m", "indexname-value1-value2-14-12", }, { time.Date(2014, 12, 01, 23, 30, 00, 00, time.UTC), map[string]string{"tag1": "value1", "tag2": "value2"}, []string{"tag1", "tag2", "tag3"}, "indexname-%s-%s-%s-%y-%m", "indexname-value1-value2-none-14-12", }, } for _, test := range tests { indexName := e.GetIndexName(test.IndexName, test.EventTime, test.TagKeys, test.Tags) if indexName != test.Expected { t.Errorf("Expected indexname %s, got %s\n", test.Expected, indexName) } } }