2016-06-22 21:24:57 +00:00
|
|
|
package http_listener
|
|
|
|
|
|
|
|
import (
|
2016-10-18 11:22:23 +00:00
|
|
|
"bytes"
|
2016-10-24 15:15:46 +00:00
|
|
|
"io/ioutil"
|
2016-10-18 11:22:23 +00:00
|
|
|
"net/http"
|
2017-04-10 21:33:17 +00:00
|
|
|
"net/url"
|
|
|
|
"strconv"
|
2016-09-06 14:09:37 +00:00
|
|
|
"sync"
|
2016-06-22 21:24:57 +00:00
|
|
|
"testing"
|
2017-04-10 23:39:40 +00:00
|
|
|
"time"
|
2016-06-22 21:24:57 +00:00
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
testMsg = "cpu_load_short,host=server01 value=12.0 1422568543702900257\n"
|
|
|
|
|
2017-01-13 11:43:50 +00:00
|
|
|
testMsgNoNewline = "cpu_load_short,host=server01 value=12.0 1422568543702900257"
|
|
|
|
|
2016-06-22 21:24:57 +00:00
|
|
|
testMsgs = `cpu_load_short,host=server02 value=12.0 1422568543702900257
|
|
|
|
cpu_load_short,host=server03 value=12.0 1422568543702900257
|
|
|
|
cpu_load_short,host=server04 value=12.0 1422568543702900257
|
|
|
|
cpu_load_short,host=server05 value=12.0 1422568543702900257
|
|
|
|
cpu_load_short,host=server06 value=12.0 1422568543702900257
|
|
|
|
`
|
|
|
|
badMsg = "blahblahblah: 42\n"
|
|
|
|
|
|
|
|
emptyMsg = ""
|
|
|
|
)
|
|
|
|
|
2016-10-24 15:15:46 +00:00
|
|
|
func newTestHTTPListener() *HTTPListener {
|
|
|
|
listener := &HTTPListener{
|
2017-04-10 21:33:17 +00:00
|
|
|
ServiceAddress: ":0",
|
2016-06-22 21:24:57 +00:00
|
|
|
}
|
|
|
|
return listener
|
|
|
|
}
|
|
|
|
|
2017-04-10 21:33:17 +00:00
|
|
|
func createURL(listener *HTTPListener, path string, rawquery string) string {
|
|
|
|
u := url.URL{
|
|
|
|
Scheme: "http",
|
|
|
|
Host: "localhost:" + strconv.Itoa(listener.Port),
|
|
|
|
Path: path,
|
|
|
|
RawQuery: rawquery,
|
|
|
|
}
|
|
|
|
return u.String()
|
|
|
|
}
|
|
|
|
|
2016-06-22 21:24:57 +00:00
|
|
|
func TestWriteHTTP(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-06-22 21:24:57 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post single message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(testMsg)))
|
2016-06-22 21:24:57 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(1)
|
2016-06-22 21:24:57 +00:00
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": "server01"},
|
|
|
|
)
|
|
|
|
|
|
|
|
// post multiple message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err = http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(testMsgs)))
|
2016-06-22 21:24:57 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(2)
|
2016-06-22 21:24:57 +00:00
|
|
|
hostTags := []string{"server02", "server03",
|
|
|
|
"server04", "server05", "server06"}
|
|
|
|
for _, hostTag := range hostTags {
|
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": hostTag},
|
|
|
|
)
|
|
|
|
}
|
2016-09-29 11:09:02 +00:00
|
|
|
|
2016-10-18 11:22:23 +00:00
|
|
|
// Post a gigantic metric to the listener and verify that an error is returned:
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err = http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(hugeMetric)))
|
2016-09-29 11:09:02 +00:00
|
|
|
require.NoError(t, err)
|
2016-10-18 11:22:23 +00:00
|
|
|
require.EqualValues(t, 400, resp.StatusCode)
|
2016-09-29 11:09:02 +00:00
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(3)
|
2016-09-29 11:09:02 +00:00
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": "server01"},
|
|
|
|
)
|
2016-06-22 21:24:57 +00:00
|
|
|
}
|
|
|
|
|
2017-01-13 11:43:50 +00:00
|
|
|
// http listener should add a newline at the end of the buffer if it's not there
|
|
|
|
func TestWriteHTTPNoNewline(t *testing.T) {
|
|
|
|
listener := newTestHTTPListener()
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post single message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(testMsgNoNewline)))
|
2017-01-13 11:43:50 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(1)
|
2017-01-13 11:43:50 +00:00
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": "server01"},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2016-10-18 11:22:23 +00:00
|
|
|
func TestWriteHTTPMaxLineSizeIncrease(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := &HTTPListener{
|
2017-04-10 21:33:17 +00:00
|
|
|
ServiceAddress: ":0",
|
2016-10-18 11:22:23 +00:00
|
|
|
MaxLineSize: 128 * 1000,
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
2016-10-24 15:15:46 +00:00
|
|
|
// Post a gigantic metric to the listener and verify that it writes OK this time:
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(hugeMetric)))
|
2016-10-18 11:22:23 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
}
|
|
|
|
|
2016-10-24 15:15:46 +00:00
|
|
|
func TestWriteHTTPVerySmallMaxBody(t *testing.T) {
|
|
|
|
listener := &HTTPListener{
|
2017-04-10 21:33:17 +00:00
|
|
|
ServiceAddress: ":0",
|
2016-10-24 15:15:46 +00:00
|
|
|
MaxBodySize: 4096,
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", ""), "", bytes.NewBuffer([]byte(hugeMetric)))
|
2016-10-24 15:15:46 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 413, resp.StatusCode)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWriteHTTPVerySmallMaxLineSize(t *testing.T) {
|
|
|
|
listener := &HTTPListener{
|
2017-04-10 21:33:17 +00:00
|
|
|
ServiceAddress: ":0",
|
2016-10-24 15:15:46 +00:00
|
|
|
MaxLineSize: 70,
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", ""), "", bytes.NewBuffer([]byte(testMsgs)))
|
2016-10-24 15:15:46 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
|
|
|
hostTags := []string{"server02", "server03",
|
|
|
|
"server04", "server05", "server06"}
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(len(hostTags))
|
2016-10-24 15:15:46 +00:00
|
|
|
for _, hostTag := range hostTags {
|
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": hostTag},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWriteHTTPLargeLinesSkipped(t *testing.T) {
|
|
|
|
listener := &HTTPListener{
|
2017-04-10 21:33:17 +00:00
|
|
|
ServiceAddress: ":0",
|
2016-10-24 15:15:46 +00:00
|
|
|
MaxLineSize: 100,
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", ""), "", bytes.NewBuffer([]byte(hugeMetric+testMsgs)))
|
2016-10-24 15:15:46 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 400, resp.StatusCode)
|
|
|
|
|
|
|
|
hostTags := []string{"server02", "server03",
|
|
|
|
"server04", "server05", "server06"}
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(len(hostTags))
|
2016-10-24 15:15:46 +00:00
|
|
|
for _, hostTag := range hostTags {
|
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": hostTag},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// test that writing gzipped data works
|
|
|
|
func TestWriteHTTPGzippedData(t *testing.T) {
|
2017-04-10 21:33:17 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-10-24 15:15:46 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
data, err := ioutil.ReadFile("./testdata/testmsgs.gz")
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
2017-04-10 21:33:17 +00:00
|
|
|
req, err := http.NewRequest("POST", createURL(listener, "/write", ""), bytes.NewBuffer(data))
|
2016-10-24 15:15:46 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
req.Header.Set("Content-Encoding", "gzip")
|
|
|
|
|
|
|
|
client := &http.Client{}
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
|
|
|
hostTags := []string{"server02", "server03",
|
|
|
|
"server04", "server05", "server06"}
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(len(hostTags))
|
2016-10-24 15:15:46 +00:00
|
|
|
for _, hostTag := range hostTags {
|
|
|
|
acc.AssertContainsTaggedFields(t, "cpu_load_short",
|
|
|
|
map[string]interface{}{"value": float64(12)},
|
|
|
|
map[string]string{"host": hostTag},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-06 14:09:37 +00:00
|
|
|
// writes 25,000 metrics to the listener with 10 different writers
|
|
|
|
func TestWriteHTTPHighTraffic(t *testing.T) {
|
2017-04-10 21:33:17 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-09-06 14:09:37 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post many messages to listener
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
wg.Add(1)
|
2016-09-08 14:22:10 +00:00
|
|
|
go func(innerwg *sync.WaitGroup) {
|
|
|
|
defer innerwg.Done()
|
2016-09-06 14:09:37 +00:00
|
|
|
for i := 0; i < 500; i++ {
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(testMsgs)))
|
2016-09-06 14:09:37 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
}
|
2016-09-08 14:22:10 +00:00
|
|
|
}(&wg)
|
2016-09-06 14:09:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
wg.Wait()
|
|
|
|
listener.Gather(acc)
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(25000)
|
2016-09-06 14:09:37 +00:00
|
|
|
require.Equal(t, int64(25000), int64(acc.NMetrics()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestReceive404ForInvalidEndpoint(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-09-06 14:09:37 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post single message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/foobar", ""), "", bytes.NewBuffer([]byte(testMsg)))
|
2016-09-06 14:09:37 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 404, resp.StatusCode)
|
|
|
|
}
|
|
|
|
|
2016-06-22 21:24:57 +00:00
|
|
|
func TestWriteHTTPInvalid(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-06-22 21:24:57 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post single message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(badMsg)))
|
2016-06-22 21:24:57 +00:00
|
|
|
require.NoError(t, err)
|
2016-09-29 11:09:02 +00:00
|
|
|
require.EqualValues(t, 400, resp.StatusCode)
|
2016-06-22 21:24:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestWriteHTTPEmpty(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-06-22 21:24:57 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post single message to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(createURL(listener, "/write", "db=mydb"), "", bytes.NewBuffer([]byte(emptyMsg)))
|
2016-06-22 21:24:57 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
}
|
|
|
|
|
2016-09-06 14:09:37 +00:00
|
|
|
func TestQueryAndPingHTTP(t *testing.T) {
|
2016-10-24 15:15:46 +00:00
|
|
|
listener := newTestHTTPListener()
|
2016-06-22 21:24:57 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
// post query to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err := http.Post(
|
|
|
|
createURL(listener, "/query", "db=&q=CREATE+DATABASE+IF+NOT+EXISTS+%22mydb%22"), "", nil)
|
2016-06-22 21:24:57 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 200, resp.StatusCode)
|
2016-09-06 14:09:37 +00:00
|
|
|
|
|
|
|
// post ping to listener
|
2017-04-10 21:33:17 +00:00
|
|
|
resp, err = http.Post(createURL(listener, "/ping", ""), "", nil)
|
2016-09-06 14:09:37 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
2016-06-22 21:24:57 +00:00
|
|
|
}
|
2016-09-29 11:09:02 +00:00
|
|
|
|
2017-04-10 23:39:40 +00:00
|
|
|
func TestWriteWithPrecision(t *testing.T) {
|
|
|
|
listener := newTestHTTPListener()
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
require.NoError(t, listener.Start(acc))
|
|
|
|
defer listener.Stop()
|
|
|
|
|
|
|
|
msg := "xyzzy value=42 1422568543\n"
|
|
|
|
resp, err := http.Post(
|
|
|
|
createURL(listener, "/write", "precision=s"), "", bytes.NewBuffer([]byte(msg)))
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, 204, resp.StatusCode)
|
|
|
|
|
|
|
|
acc.Wait(1)
|
|
|
|
require.Equal(t, 1, len(acc.Metrics))
|
|
|
|
require.Equal(t, time.Unix(0, 1422568543000000000), acc.Metrics[0].Time)
|
|
|
|
}
|
|
|
|
|
2016-09-29 11:09:02 +00:00
|
|
|
const hugeMetric = `super_long_metric,foo=bar clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_per_sec=0i,keyspace_hitrate=0,keyspace_hits=0i,keyspace_misses=2i,latest_fork_usec=0i,master_repl_offset=0i,mem_fragmentation_ratio=3.58,pubsub_channels=0i,pubsub_patterns=0i,rdb_changes_since_last_save=0i,repl_backlog_active=0i,repl_backlog_histlen=0i,repl_backlog_size=1048576i,sync_full=0i,sync_partial_err=0i,sync_partial_ok=0i,total_commands_processed=4i,total_connections_received=2i,uptime=869i,used_cpu_sys=0.07,used_cpu_sys_children=0,used_cpu_user=0.1,used_cpu_user_children=0,used_memory=502048i,used_memory_lua=33792i,used_memory_peak=501128i,used_memory_rss=1798144i,clients=1i,connected_slaves=0i,evicted_keys=0i,expired_keys=0i,instantaneous_ops_pe
|
|
|
|
`
|