package redis import ( "bufio" "fmt" "net" "testing" "github.com/influxdb/tivan/testutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestRedisGeneratesMetrics(t *testing.T) { l, err := net.Listen("tcp", ":0") require.NoError(t, err) defer l.Close() go func() { c, err := l.Accept() if err != nil { return } buf := bufio.NewReader(c) for { line, err := buf.ReadString('\n') if err != nil { return } if line != "info\n" { return } fmt.Fprintf(c, "$%d\n", len(testOutput)) c.Write([]byte(testOutput)) } }() addr := l.Addr().String() r := &Redis{ Address: addr, } var acc testutil.Accumulator err = r.Gather(&acc) require.NoError(t, err) checkInt := []struct { name string value uint64 }{ {"redis_uptime", 238}, {"redis_clients", 1}, {"redis_used_memory", 1003936}, {"redis_used_memory_rss", 811008}, {"redis_used_memory_peak", 1003936}, {"redis_used_memory_lua", 33792}, {"redis_rdb_changes_since_last_save", 0}, {"redis_total_connections_received", 2}, {"redis_total_commands_processed", 1}, {"redis_instantaneous_ops_per_sec", 0}, {"redis_sync_full", 0}, {"redis_sync_partial_ok", 0}, {"redis_sync_partial_err", 0}, {"redis_expired_keys", 0}, {"redis_evicted_keys", 0}, {"redis_keyspace_hits", 0}, {"redis_keyspace_misses", 0}, {"redis_pubsub_channels", 0}, {"redis_pubsub_patterns", 0}, {"redis_latest_fork_usec", 0}, {"redis_connected_slaves", 0}, {"redis_master_repl_offset", 0}, {"redis_repl_backlog_active", 0}, {"redis_repl_backlog_size", 1048576}, {"redis_repl_backlog_histlen", 0}, } for _, c := range checkInt { assert.NoError(t, acc.ValidateValue(c.name, c.value)) } checkFloat := []struct { name string value float64 }{ {"redis_mem_fragmentation_ratio", 0.81}, {"redis_used_cpu_sys", 0.14}, {"redis_used_cpu_user", 0.05}, {"redis_used_cpu_sys_children", 0.00}, {"redis_used_cpu_user_children", 0.00}, } for _, c := range checkFloat { assert.NoError(t, acc.ValidateValue(c.name, c.value)) } } func TestRedisCanPullStatsFromMultipleServers(t *testing.T) { l, err := net.Listen("tcp", ":0") require.NoError(t, err) defer l.Close() go func() { c, err := l.Accept() if err != nil { return } buf := bufio.NewReader(c) for { line, err := buf.ReadString('\n') if err != nil { return } if line != "info\n" { return } fmt.Fprintf(c, "$%d\n", len(testOutput)) c.Write([]byte(testOutput)) } }() addr := l.Addr().String() r := &Redis{ Servers: []string{addr}, } var acc testutil.Accumulator err = r.Gather(&acc) require.NoError(t, err) checkInt := []struct { name string value uint64 }{ {"redis_uptime", 238}, {"redis_clients", 1}, {"redis_used_memory", 1003936}, {"redis_used_memory_rss", 811008}, {"redis_used_memory_peak", 1003936}, {"redis_used_memory_lua", 33792}, {"redis_rdb_changes_since_last_save", 0}, {"redis_total_connections_received", 2}, {"redis_total_commands_processed", 1}, {"redis_instantaneous_ops_per_sec", 0}, {"redis_sync_full", 0}, {"redis_sync_partial_ok", 0}, {"redis_sync_partial_err", 0}, {"redis_expired_keys", 0}, {"redis_evicted_keys", 0}, {"redis_keyspace_hits", 0}, {"redis_keyspace_misses", 0}, {"redis_pubsub_channels", 0}, {"redis_pubsub_patterns", 0}, {"redis_latest_fork_usec", 0}, {"redis_connected_slaves", 0}, {"redis_master_repl_offset", 0}, {"redis_repl_backlog_active", 0}, {"redis_repl_backlog_size", 1048576}, {"redis_repl_backlog_histlen", 0}, } for _, c := range checkInt { assert.NoError(t, acc.ValidateValue(c.name, c.value)) } checkFloat := []struct { name string value float64 }{ {"redis_mem_fragmentation_ratio", 0.81}, {"redis_used_cpu_sys", 0.14}, {"redis_used_cpu_user", 0.05}, {"redis_used_cpu_sys_children", 0.00}, {"redis_used_cpu_user_children", 0.00}, } for _, c := range checkFloat { assert.NoError(t, acc.ValidateValue(c.name, c.value)) } } const testOutput = `# Server redis_version:2.8.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:9ccc8119ea98f6e1 redis_mode:standalone os:Darwin 14.1.0 x86_64 arch_bits:64 multiplexing_api:kqueue gcc_version:4.2.1 process_id:40235 run_id:37d020620aadf0627282c0f3401405d774a82664 tcp_port:6379 uptime_in_seconds:238 uptime_in_days:0 hz:10 lru_clock:2364819 config_file:/usr/local/etc/redis.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:1003936 used_memory_human:980.41K used_memory_rss:811008 used_memory_peak:1003936 used_memory_peak_human:980.41K used_memory_lua:33792 mem_fragmentation_ratio:0.81 mem_allocator:libc # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1428427941 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:-1 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:2 total_commands_processed:1 instantaneous_ops_per_sec:0 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:0.14 used_cpu_user:0.05 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Keyspace `