2015-10-22 21:50:19 +00:00
|
|
|
package riemann
|
|
|
|
|
|
|
|
import (
|
2017-01-27 22:54:59 +00:00
|
|
|
"fmt"
|
2015-10-22 21:50:19 +00:00
|
|
|
"testing"
|
2017-01-27 22:54:59 +00:00
|
|
|
"time"
|
2015-10-22 21:50:19 +00:00
|
|
|
|
2017-01-27 22:54:59 +00:00
|
|
|
"github.com/amir/raidman"
|
|
|
|
"github.com/influxdata/telegraf"
|
2017-01-27 23:08:21 +00:00
|
|
|
"github.com/influxdata/telegraf/metric"
|
2016-01-20 18:57:35 +00:00
|
|
|
"github.com/influxdata/telegraf/testutil"
|
2015-10-22 21:50:19 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
2017-01-27 22:54:59 +00:00
|
|
|
func TestAttributes(t *testing.T) {
|
|
|
|
tags := map[string]string{"tag1": "value1", "tag2": "value2"}
|
|
|
|
|
|
|
|
r := &Riemann{}
|
|
|
|
require.Equal(t,
|
|
|
|
map[string]string{"tag1": "value1", "tag2": "value2"},
|
|
|
|
r.attributes("test", tags))
|
|
|
|
|
|
|
|
// enable measurement as attribute, should now be included
|
|
|
|
r.MeasurementAsAttribute = true
|
|
|
|
require.Equal(t,
|
|
|
|
map[string]string{"tag1": "value1", "tag2": "value2", "measurement": "test"},
|
|
|
|
r.attributes("test", tags))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestService(t *testing.T) {
|
|
|
|
r := &Riemann{
|
|
|
|
Separator: "/",
|
|
|
|
}
|
|
|
|
require.Equal(t, "test/value", r.service("test", "value"))
|
|
|
|
|
|
|
|
// enable measurement as attribute, should not be part of service name anymore
|
|
|
|
r.MeasurementAsAttribute = true
|
|
|
|
require.Equal(t, "value", r.service("test", "value"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTags(t *testing.T) {
|
|
|
|
tags := map[string]string{"tag1": "value1", "tag2": "value2"}
|
|
|
|
|
|
|
|
// all tag values plus additional tag should be present
|
|
|
|
r := &Riemann{
|
|
|
|
Tags: []string{"test"},
|
|
|
|
}
|
|
|
|
require.Equal(t,
|
|
|
|
[]string{"test", "value1", "value2"},
|
|
|
|
r.tags(tags))
|
|
|
|
|
|
|
|
// only tag2 value plus additional tag should be present
|
|
|
|
r.TagKeys = []string{"tag2"}
|
|
|
|
require.Equal(t,
|
|
|
|
[]string{"test", "value2"},
|
|
|
|
r.tags(tags))
|
|
|
|
|
|
|
|
// only tag1 value should be present
|
|
|
|
r.Tags = nil
|
|
|
|
r.TagKeys = []string{"tag1"}
|
|
|
|
require.Equal(t,
|
|
|
|
[]string{"value1"},
|
|
|
|
r.tags(tags))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMetricEvents(t *testing.T) {
|
|
|
|
r := &Riemann{
|
|
|
|
TTL: 20.0,
|
|
|
|
Separator: "/",
|
|
|
|
MeasurementAsAttribute: false,
|
|
|
|
DescriptionText: "metrics from telegraf",
|
|
|
|
Tags: []string{"telegraf"},
|
|
|
|
}
|
|
|
|
|
|
|
|
// build a single event
|
2017-01-27 23:08:21 +00:00
|
|
|
m, _ := metric.New(
|
2017-01-27 22:54:59 +00:00
|
|
|
"test1",
|
|
|
|
map[string]string{"tag1": "value1", "host": "abc123"},
|
|
|
|
map[string]interface{}{"value": 5.6},
|
|
|
|
time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
|
|
|
|
)
|
|
|
|
|
2017-01-27 23:08:21 +00:00
|
|
|
events := r.buildRiemannEvents(m)
|
2017-01-27 22:54:59 +00:00
|
|
|
require.Len(t, events, 1)
|
|
|
|
|
|
|
|
// is event as expected?
|
|
|
|
expectedEvent := &raidman.Event{
|
|
|
|
Ttl: 20.0,
|
|
|
|
Time: 1257894000,
|
|
|
|
Tags: []string{"telegraf", "value1"},
|
|
|
|
Host: "abc123",
|
|
|
|
State: "",
|
|
|
|
Service: "test1/value",
|
|
|
|
Metric: 5.6,
|
|
|
|
Description: "metrics from telegraf",
|
|
|
|
Attributes: map[string]string{"tag1": "value1"},
|
|
|
|
}
|
|
|
|
require.Equal(t, expectedEvent, events[0])
|
|
|
|
|
|
|
|
// build 2 events
|
2017-01-27 23:08:21 +00:00
|
|
|
m, _ = metric.New(
|
2017-01-27 22:54:59 +00:00
|
|
|
"test2",
|
|
|
|
map[string]string{"host": "xyz987"},
|
|
|
|
map[string]interface{}{"point": 1},
|
|
|
|
time.Date(2012, time.November, 2, 3, 0, 0, 0, time.UTC),
|
|
|
|
)
|
|
|
|
|
2017-01-27 23:08:21 +00:00
|
|
|
events = append(events, r.buildRiemannEvents(m)...)
|
2017-01-27 22:54:59 +00:00
|
|
|
require.Len(t, events, 2)
|
|
|
|
|
|
|
|
// first event should still be the same
|
|
|
|
require.Equal(t, expectedEvent, events[0])
|
|
|
|
|
|
|
|
// second event
|
|
|
|
expectedEvent = &raidman.Event{
|
|
|
|
Ttl: 20.0,
|
|
|
|
Time: 1351825200,
|
|
|
|
Tags: []string{"telegraf"},
|
|
|
|
Host: "xyz987",
|
|
|
|
State: "",
|
|
|
|
Service: "test2/point",
|
|
|
|
Metric: int64(1),
|
|
|
|
Description: "metrics from telegraf",
|
|
|
|
Attributes: map[string]string{},
|
|
|
|
}
|
|
|
|
require.Equal(t, expectedEvent, events[1])
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestStateEvents(t *testing.T) {
|
|
|
|
r := &Riemann{
|
|
|
|
MeasurementAsAttribute: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
// string metrics will be skipped unless explicitly enabled
|
2017-01-27 23:08:21 +00:00
|
|
|
m, _ := metric.New(
|
2017-01-27 22:54:59 +00:00
|
|
|
"test",
|
|
|
|
map[string]string{"host": "host"},
|
|
|
|
map[string]interface{}{"value": "running"},
|
|
|
|
time.Date(2015, time.November, 9, 22, 0, 0, 0, time.UTC),
|
|
|
|
)
|
|
|
|
|
2017-01-27 23:08:21 +00:00
|
|
|
events := r.buildRiemannEvents(m)
|
2017-01-27 22:54:59 +00:00
|
|
|
// no event should be present
|
|
|
|
require.Len(t, events, 0)
|
|
|
|
|
|
|
|
// enable string metrics as event states
|
|
|
|
r.StringAsState = true
|
2017-01-27 23:08:21 +00:00
|
|
|
events = r.buildRiemannEvents(m)
|
2017-01-27 22:54:59 +00:00
|
|
|
require.Len(t, events, 1)
|
|
|
|
|
|
|
|
// is event as expected?
|
|
|
|
expectedEvent := &raidman.Event{
|
|
|
|
Ttl: 0,
|
|
|
|
Time: 1447106400,
|
|
|
|
Tags: nil,
|
|
|
|
Host: "host",
|
|
|
|
State: "running",
|
|
|
|
Service: "value",
|
|
|
|
Metric: nil,
|
|
|
|
Description: "",
|
|
|
|
Attributes: map[string]string{"measurement": "test"},
|
|
|
|
}
|
|
|
|
require.Equal(t, expectedEvent, events[0])
|
|
|
|
}
|
|
|
|
|
2015-10-22 21:50:19 +00:00
|
|
|
func TestConnectAndWrite(t *testing.T) {
|
|
|
|
if testing.Short() {
|
|
|
|
t.Skip("Skipping integration test in short mode")
|
|
|
|
}
|
|
|
|
|
|
|
|
r := &Riemann{
|
2017-01-27 22:54:59 +00:00
|
|
|
URL: fmt.Sprintf("tcp://%s:5555", testutil.GetLocalHost()),
|
|
|
|
TTL: 15.0,
|
|
|
|
Separator: "/",
|
|
|
|
MeasurementAsAttribute: false,
|
|
|
|
StringAsState: true,
|
|
|
|
DescriptionText: "metrics from telegraf",
|
|
|
|
Tags: []string{"docker"},
|
2015-10-22 21:50:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
err := r.Connect()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
2016-01-27 23:15:14 +00:00
|
|
|
err = r.Write(testutil.MockMetrics())
|
2015-10-22 21:50:19 +00:00
|
|
|
require.NoError(t, err)
|
2017-01-27 22:54:59 +00:00
|
|
|
|
|
|
|
metrics := make([]telegraf.Metric, 0)
|
|
|
|
metrics = append(metrics, testutil.TestMetric(2))
|
|
|
|
metrics = append(metrics, testutil.TestMetric(3.456789))
|
|
|
|
metrics = append(metrics, testutil.TestMetric(uint(0)))
|
|
|
|
metrics = append(metrics, testutil.TestMetric("ok"))
|
|
|
|
metrics = append(metrics, testutil.TestMetric("running"))
|
|
|
|
err = r.Write(metrics)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
|
|
|
|
|
|
// are there any "docker" tagged events in Riemann?
|
|
|
|
events, err := r.client.Query(`tagged "docker"`)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.NotZero(t, len(events))
|
|
|
|
|
|
|
|
// get Riemann events with state = "running", should be 1 event
|
|
|
|
events, err = r.client.Query(`state = "running"`)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Len(t, events, 1)
|
|
|
|
|
|
|
|
// is event as expected?
|
|
|
|
require.Equal(t, []string{"docker", "value1"}, events[0].Tags)
|
|
|
|
require.Equal(t, "running", events[0].State)
|
|
|
|
require.Equal(t, "test1/value", events[0].Service)
|
|
|
|
require.Equal(t, "metrics from telegraf", events[0].Description)
|
|
|
|
require.Equal(t, map[string]string{"tag1": "value1"}, events[0].Attributes)
|
2015-10-22 21:50:19 +00:00
|
|
|
}
|