200 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
package rabbitmq
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"io/ioutil"
 | 
						|
 | 
						|
	"github.com/influxdata/telegraf/testutil"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
)
 | 
						|
 | 
						|
func TestRabbitMQGeneratesMetrics(t *testing.T) {
 | 
						|
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		var jsonFilePath string
 | 
						|
 | 
						|
		switch r.URL.Path {
 | 
						|
		case "/api/overview":
 | 
						|
			jsonFilePath = "testdata/overview.json"
 | 
						|
		case "/api/nodes":
 | 
						|
			jsonFilePath = "testdata/nodes.json"
 | 
						|
		case "/api/queues":
 | 
						|
			jsonFilePath = "testdata/queues.json"
 | 
						|
		case "/api/exchanges":
 | 
						|
			jsonFilePath = "testdata/exchanges.json"
 | 
						|
		case "/api/healthchecks/node/rabbit@vagrant-ubuntu-trusty-64":
 | 
						|
			jsonFilePath = "testdata/healthchecks.json"
 | 
						|
		case "/api/federation-links":
 | 
						|
			jsonFilePath = "testdata/federation-links.json"
 | 
						|
		case "/api/nodes/rabbit@vagrant-ubuntu-trusty-64/memory":
 | 
						|
			jsonFilePath = "testdata/memory.json"
 | 
						|
		default:
 | 
						|
			panic("Cannot handle request")
 | 
						|
		}
 | 
						|
 | 
						|
		data, err := ioutil.ReadFile(jsonFilePath)
 | 
						|
 | 
						|
		if err != nil {
 | 
						|
			panic(fmt.Sprintf("could not read from data file %s", jsonFilePath))
 | 
						|
		}
 | 
						|
 | 
						|
		w.Write(data)
 | 
						|
	}))
 | 
						|
	defer ts.Close()
 | 
						|
 | 
						|
	r := &RabbitMQ{
 | 
						|
		URL: ts.URL,
 | 
						|
	}
 | 
						|
 | 
						|
	acc := &testutil.Accumulator{}
 | 
						|
 | 
						|
	err := acc.GatherError(r.Gather)
 | 
						|
	require.NoError(t, err)
 | 
						|
 | 
						|
	overviewMetrics := map[string]interface{}{
 | 
						|
		"messages":               5,
 | 
						|
		"messages_ready":         32,
 | 
						|
		"messages_unacked":       27,
 | 
						|
		"messages_acked":         5246,
 | 
						|
		"messages_delivered":     5234,
 | 
						|
		"messages_delivered_get": 3333,
 | 
						|
		"messages_published":     5258,
 | 
						|
		"channels":               44,
 | 
						|
		"connections":            44,
 | 
						|
		"consumers":              65,
 | 
						|
		"exchanges":              43,
 | 
						|
		"queues":                 62,
 | 
						|
		"clustering_listeners":   2,
 | 
						|
		"amqp_listeners":         2,
 | 
						|
		"return_unroutable":      10,
 | 
						|
		"return_unroutable_rate": 3.3,
 | 
						|
	}
 | 
						|
	compareMetrics(t, overviewMetrics, acc, "rabbitmq_overview")
 | 
						|
 | 
						|
	queuesMetrics := map[string]interface{}{
 | 
						|
		"consumers":                 3,
 | 
						|
		"consumer_utilisation":      1.0,
 | 
						|
		"memory":                    143776,
 | 
						|
		"message_bytes":             3,
 | 
						|
		"message_bytes_ready":       4,
 | 
						|
		"message_bytes_unacked":     5,
 | 
						|
		"message_bytes_ram":         6,
 | 
						|
		"message_bytes_persist":     7,
 | 
						|
		"messages":                  44,
 | 
						|
		"messages_ready":            32,
 | 
						|
		"messages_unack":            44,
 | 
						|
		"messages_ack":              3457,
 | 
						|
		"messages_ack_rate":         9.9,
 | 
						|
		"messages_deliver":          22222,
 | 
						|
		"messages_deliver_rate":     333.4,
 | 
						|
		"messages_deliver_get":      3457,
 | 
						|
		"messages_deliver_get_rate": 0.2,
 | 
						|
		"messages_publish":          3457,
 | 
						|
		"messages_publish_rate":     11.2,
 | 
						|
		"messages_redeliver":        33,
 | 
						|
		"messages_redeliver_rate":   2.5,
 | 
						|
		"idle_since":                "2015-11-01 8:22:14",
 | 
						|
	}
 | 
						|
	compareMetrics(t, queuesMetrics, acc, "rabbitmq_queue")
 | 
						|
 | 
						|
	nodeMetrics := map[string]interface{}{
 | 
						|
		"disk_free":                 3776,
 | 
						|
		"disk_free_limit":           50000000,
 | 
						|
		"disk_free_alarm":           0,
 | 
						|
		"fd_total":                  1024,
 | 
						|
		"fd_used":                   63,
 | 
						|
		"mem_limit":                 2503,
 | 
						|
		"mem_used":                  159707080,
 | 
						|
		"mem_alarm":                 1,
 | 
						|
		"proc_total":                1048576,
 | 
						|
		"proc_used":                 783,
 | 
						|
		"run_queue":                 0,
 | 
						|
		"sockets_total":             829,
 | 
						|
		"sockets_used":              45,
 | 
						|
		"uptime":                    7464827,
 | 
						|
		"running":                   1,
 | 
						|
		"health_check_status":       1,
 | 
						|
		"mnesia_disk_tx_count":      16,
 | 
						|
		"mnesia_ram_tx_count":       296,
 | 
						|
		"mnesia_disk_tx_count_rate": 1.1,
 | 
						|
		"mnesia_ram_tx_count_rate":  2.2,
 | 
						|
		"gc_num":                    57280132,
 | 
						|
		"gc_bytes_reclaimed":        2533,
 | 
						|
		"gc_num_rate":               274.2,
 | 
						|
		"gc_bytes_reclaimed_rate":   16490856.3,
 | 
						|
		"io_read_avg_time":          983,
 | 
						|
		"io_read_avg_time_rate":     88.77,
 | 
						|
		"io_read_bytes":             1111,
 | 
						|
		"io_read_bytes_rate":        99.99,
 | 
						|
		"io_write_avg_time":         134,
 | 
						|
		"io_write_avg_time_rate":    4.32,
 | 
						|
		"io_write_bytes":            823,
 | 
						|
		"io_write_bytes_rate":       32.8,
 | 
						|
		"mem_connection_readers":    1234,
 | 
						|
		"mem_connection_writers":    5678,
 | 
						|
		"mem_connection_channels":   1133,
 | 
						|
		"mem_connection_other":      2840,
 | 
						|
		"mem_queue_procs":           2840,
 | 
						|
		"mem_queue_slave_procs":     0,
 | 
						|
		"mem_plugins":               1755976,
 | 
						|
		"mem_other_proc":            23056584,
 | 
						|
		"mem_metrics":               196536,
 | 
						|
		"mem_mgmt_db":               491272,
 | 
						|
		"mem_mnesia":                115600,
 | 
						|
		"mem_other_ets":             2121872,
 | 
						|
		"mem_binary":                418848,
 | 
						|
		"mem_msg_index":             42848,
 | 
						|
		"mem_code":                  25179322,
 | 
						|
		"mem_atom":                  1041593,
 | 
						|
		"mem_other_system":          14741981,
 | 
						|
		"mem_allocated_unused":      38208528,
 | 
						|
		"mem_reserved_unallocated":  0,
 | 
						|
		"mem_total":                 83025920,
 | 
						|
	}
 | 
						|
	compareMetrics(t, nodeMetrics, acc, "rabbitmq_node")
 | 
						|
 | 
						|
	exchangeMetrics := map[string]interface{}{
 | 
						|
		"messages_publish_in":       3678,
 | 
						|
		"messages_publish_in_rate":  3.2,
 | 
						|
		"messages_publish_out":      3677,
 | 
						|
		"messages_publish_out_rate": 5.1,
 | 
						|
	}
 | 
						|
	compareMetrics(t, exchangeMetrics, acc, "rabbitmq_exchange")
 | 
						|
 | 
						|
	federationLinkMetrics := map[string]interface{}{
 | 
						|
		"acks_uncommitted":           1,
 | 
						|
		"consumers":                  2,
 | 
						|
		"messages_unacknowledged":    3,
 | 
						|
		"messages_uncommitted":       4,
 | 
						|
		"messages_unconfirmed":       5,
 | 
						|
		"messages_confirm":           67,
 | 
						|
		"messages_publish":           890,
 | 
						|
		"messages_return_unroutable": 1,
 | 
						|
	}
 | 
						|
	compareMetrics(t, federationLinkMetrics, acc, "rabbitmq_federation")
 | 
						|
}
 | 
						|
 | 
						|
func compareMetrics(t *testing.T, expectedMetrics map[string]interface{},
 | 
						|
	accumulator *testutil.Accumulator, measurementKey string) {
 | 
						|
	measurement, exist := accumulator.Get(measurementKey)
 | 
						|
 | 
						|
	assert.True(t, exist, "There is measurement %s", measurementKey)
 | 
						|
	assert.Equal(t, len(expectedMetrics), len(measurement.Fields))
 | 
						|
 | 
						|
	for metricName, metricValue := range expectedMetrics {
 | 
						|
		actualMetricValue := measurement.Fields[metricName]
 | 
						|
 | 
						|
		if accumulator.HasStringField(measurementKey, metricName) {
 | 
						|
			assert.Equal(t, metricValue, actualMetricValue,
 | 
						|
				"Metric name: %s", metricName)
 | 
						|
		} else {
 | 
						|
			assert.InDelta(t, metricValue, actualMetricValue, 0e5,
 | 
						|
				"Metric name: %s", metricName)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |