95 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| package kafka_consumer
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/Shopify/sarama"
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/plugins/parsers"
 | |
| )
 | |
| 
 | |
| func TestReadsMetricsFromKafka(t *testing.T) {
 | |
| 	if testing.Short() {
 | |
| 		t.Skip("Skipping integration test in short mode")
 | |
| 	}
 | |
| 
 | |
| 	brokerPeers := []string{testutil.GetLocalHost() + ":9092"}
 | |
| 	testTopic := fmt.Sprintf("telegraf_test_topic_%d", time.Now().Unix())
 | |
| 
 | |
| 	// Send a Kafka message to the kafka host
 | |
| 	msg := "cpu_load_short,direction=in,host=server01,region=us-west value=23422.0 1422568543702900257\n"
 | |
| 	producer, err := sarama.NewSyncProducer(brokerPeers, nil)
 | |
| 	require.NoError(t, err)
 | |
| 	_, _, err = producer.SendMessage(
 | |
| 		&sarama.ProducerMessage{
 | |
| 			Topic: testTopic,
 | |
| 			Value: sarama.StringEncoder(msg),
 | |
| 		})
 | |
| 	require.NoError(t, err)
 | |
| 	defer producer.Close()
 | |
| 
 | |
| 	// Start the Kafka Consumer
 | |
| 	k := &Kafka{
 | |
| 		ConsumerGroup: "telegraf_test_consumers",
 | |
| 		Topics:        []string{testTopic},
 | |
| 		Brokers:       brokerPeers,
 | |
| 		Offset:        "oldest",
 | |
| 	}
 | |
| 	p, _ := parsers.NewInfluxParser()
 | |
| 	k.SetParser(p)
 | |
| 
 | |
| 	// Verify that we can now gather the sent message
 | |
| 	var acc testutil.Accumulator
 | |
| 
 | |
| 	// Sanity check
 | |
| 	assert.Equal(t, 0, len(acc.Metrics), "There should not be any points")
 | |
| 	if err := k.Start(&acc); err != nil {
 | |
| 		t.Fatal(err.Error())
 | |
| 	} else {
 | |
| 		defer k.Stop()
 | |
| 	}
 | |
| 
 | |
| 	waitForPoint(&acc, t)
 | |
| 
 | |
| 	// Gather points
 | |
| 	err = acc.GatherError(k.Gather)
 | |
| 	require.NoError(t, err)
 | |
| 	if len(acc.Metrics) == 1 {
 | |
| 		point := acc.Metrics[0]
 | |
| 		assert.Equal(t, "cpu_load_short", point.Measurement)
 | |
| 		assert.Equal(t, map[string]interface{}{"value": 23422.0}, point.Fields)
 | |
| 		assert.Equal(t, map[string]string{
 | |
| 			"host":      "server01",
 | |
| 			"direction": "in",
 | |
| 			"region":    "us-west",
 | |
| 		}, point.Tags)
 | |
| 		assert.Equal(t, time.Unix(0, 1422568543702900257).Unix(), point.Time.Unix())
 | |
| 	} else {
 | |
| 		t.Errorf("No points found in accumulator, expected 1")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Waits for the metric that was sent to the kafka broker to arrive at the kafka
 | |
| // consumer
 | |
| func waitForPoint(acc *testutil.Accumulator, t *testing.T) {
 | |
| 	// Give the kafka container up to 2 seconds to get the point to the consumer
 | |
| 	ticker := time.NewTicker(5 * time.Millisecond)
 | |
| 	counter := 0
 | |
| 	for {
 | |
| 		select {
 | |
| 		case <-ticker.C:
 | |
| 			counter++
 | |
| 			if counter > 1000 {
 | |
| 				t.Fatal("Waited for 5s, point never arrived to consumer")
 | |
| 			} else if acc.NFields() == 1 {
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |