135 lines
3.2 KiB
Go
135 lines
3.2 KiB
Go
package twemproxy
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
"encoding/json"
|
|
|
|
"github.com/influxdb/telegraf/testutil"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const sampleStatsAddr = "127.0.0.1:22222"
|
|
|
|
const sampleStats = `{
|
|
"total_connections": 276448,
|
|
"uptime": 160657,
|
|
"version": "0.4.1",
|
|
"service": "nutcracker",
|
|
"curr_connections": 1322,
|
|
"source": "server1.website.com",
|
|
"demo": {
|
|
"client_connections": 1305,
|
|
"forward_error": 11684,
|
|
"client_err": 147942,
|
|
"server_ejects": 0,
|
|
"fragments": 0,
|
|
"client_eof": 126813,
|
|
"10.16.29.1:6379": {
|
|
"requests": 43604566,
|
|
"server_eof": 0,
|
|
"out_queue": 0,
|
|
"server_err": 0,
|
|
"out_queue_bytes": 0,
|
|
"in_queue": 0,
|
|
"server_timedout": 24,
|
|
"request_bytes": 2775840400,
|
|
"server_connections": 1,
|
|
"response_bytes": 7663182096,
|
|
"in_queue_bytes": 0,
|
|
"server_ejected_at": 0,
|
|
"responses": 43603900
|
|
},
|
|
"10.16.29.2:6379": {
|
|
"requests": 37870211,
|
|
"server_eof": 0,
|
|
"out_queue": 0,
|
|
"server_err": 0,
|
|
"out_queue_bytes": 0,
|
|
"in_queue": 0,
|
|
"server_timedout": 25,
|
|
"request_bytes": 2412114759,
|
|
"server_connections": 1,
|
|
"response_bytes": 5228980582,
|
|
"in_queue_bytes": 0,
|
|
"server_ejected_at": 0,
|
|
"responses": 37869551
|
|
}
|
|
},
|
|
"timestamp": 1447312436
|
|
}`
|
|
|
|
func mockTwemproxyServer() (net.Listener, error) {
|
|
listener, err := net.Listen("tcp", sampleStatsAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
go func(l net.Listener) {
|
|
for {
|
|
conn, _ := l.Accept()
|
|
conn.Write([]byte(sampleStats))
|
|
conn.Close()
|
|
break
|
|
}
|
|
}(listener)
|
|
|
|
return listener, nil
|
|
}
|
|
|
|
func TestGather(t *testing.T) {
|
|
mockServer, err := mockTwemproxyServer()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer mockServer.Close()
|
|
|
|
twemproxy := &Twemproxy{
|
|
Instances: []TwemproxyInstance{
|
|
TwemproxyInstance{
|
|
StatsAddr: sampleStatsAddr,
|
|
Pools: []string{"demo"},
|
|
},
|
|
},
|
|
}
|
|
|
|
var acc testutil.Accumulator
|
|
err = twemproxy.Instances[0].Gather(&acc)
|
|
require.NoError(t, err)
|
|
|
|
var sourceData map[string]interface{}
|
|
if err := json.Unmarshal([]byte(sampleStats), &sourceData); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
metrics := []string{"total_connections", "curr_connections", "timestamp"}
|
|
tags := map[string]string{
|
|
"twemproxy": sampleStatsAddr,
|
|
"source": sourceData["source"].(string),
|
|
}
|
|
for _, m := range metrics {
|
|
assert.NoError(t, acc.ValidateTaggedValue(m, sourceData[m].(float64), tags))
|
|
}
|
|
|
|
poolName := "demo"
|
|
poolMetrics := []string{
|
|
"client_connections", "forward_error", "client_err", "server_ejects",
|
|
"fragments", "client_eof",
|
|
}
|
|
tags["pool"] = poolName
|
|
poolData := sourceData[poolName].(map[string]interface{})
|
|
for _, m := range poolMetrics {
|
|
measurement := poolName + "_" + m
|
|
assert.NoError(t, acc.ValidateTaggedValue(measurement, poolData[m].(float64), tags))
|
|
}
|
|
poolServers := []string{"10.16.29.1:6379", "10.16.29.2:6379"}
|
|
for _, s := range poolServers {
|
|
tags["server"] = s
|
|
serverData := poolData[s].(map[string]interface{})
|
|
for k, v := range serverData {
|
|
measurement := poolName + "_" + k
|
|
assert.NoError(t, acc.ValidateTaggedValue(measurement, v, tags))
|
|
}
|
|
}
|
|
}
|