func TestExec(t *testing.T) { runner := newRunnerMock([]byte(validJson), nil) command := Command{Command: "testcommand arg1", Name: "mycollector"} e := &Exec{runner: runner, Commands: []*Command{&command}} var acc testutil.Accumulator err := e.Gather(&acc) require.NoError(t, err) checkFloat := []struct { name string value float64 }{ {"mycollector_num_processes", 82}, {"mycollector_cpu_used", 8234}, {"mycollector_cpu_free", 32}, {"mycollector_percent", 0.81}, } for _, c := range checkFloat { assert.True(t, acc.CheckValue(c.name, c.value)) } assert.Equal(t, len(acc.Points), 4, "non-numeric measurements should be ignored") }
func TestAddTableStats(t *testing.T) { var acc testutil.Accumulator err := server.addTableStats(&acc) require.NoError(t, err) for _, metric := range TableTracking { assert.True(t, acc.HasIntValue(metric)) } keys := []string{ "cache_bytes_in_use", "disk_read_bytes_per_sec", "disk_read_bytes_total", "disk_written_bytes_per_sec", "disk_written_bytes_total", "disk_usage_data_bytes", "disk_usage_garbage_bytes", "disk_usage_metadata_bytes", "disk_usage_preallocated_bytes", } for _, metric := range keys { assert.True(t, acc.HasIntValue(metric)) } }
// Test that the proper values are ignored or collected func TestHttpJson200(t *testing.T) { httpjson := genMockHttpJson(validJSON, 200) var acc testutil.Accumulator err := httpjson.Gather(&acc) require.NoError(t, err) assert.Equal(t, 8, len(acc.Points)) for _, service := range httpjson.Services { for _, srv := range service.Servers { require.NoError(t, acc.ValidateTaggedValue( fmt.Sprintf("%s_parent_child", service.Name), 3.0, map[string]string{"server": srv}, ), ) require.NoError(t, acc.ValidateTaggedValue( fmt.Sprintf("%s_integer", service.Name), 4.0, map[string]string{"server": srv}, ), ) } } }
func TestPostgresqlTagsMetricsWithDatabaseName(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } p := &Postgresql{ Servers: []*Server{ { Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()), Databases: []string{"postgres"}, }, }, } var acc testutil.Accumulator err := p.Gather(&acc) require.NoError(t, err) point, ok := acc.Get("xact_commit") require.True(t, ok) assert.Equal(t, "postgres", point.Tags["db"]) }
func TestPrometheusGeneratesMetrics(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, sampleTextFormat) })) defer ts.Close() p := &Prometheus{ Urls: []string{ts.URL}, } var acc testutil.Accumulator err := p.Gather(&acc) require.NoError(t, err) expected := []struct { name string value float64 tags map[string]string }{ {"go_gc_duration_seconds_count", 7, map[string]string{}}, {"go_goroutines", 15, map[string]string{}}, } for _, e := range expected { assert.NoError(t, acc.ValidateValue(e.name, e.value)) } }
func testMain(t *testing.T, code string, endpoint string, serverType ServerType) { // Build the fake snmpwalk for test src := makeFakeSNMPSrc(code) defer os.Remove(src) buildFakeSNMPCmd(src) defer os.Remove("./snmpwalk") envPathOrigin := os.Getenv("PATH") // Refer to the fake snmpwalk os.Setenv("PATH", ".") defer os.Setenv("PATH", envPathOrigin) l := &LeoFS{ Servers: []string{endpoint}, } var acc testutil.Accumulator err := l.Gather(&acc) require.NoError(t, err) floatMetrics := KeyMapping[serverType] for _, metric := range floatMetrics { assert.True(t, acc.HasFloatValue(metric), metric) } }
func TestAddEngineStatsPartial(t *testing.T) { engine := &Engine{ ClientConns: 0, ClientActive: 0, QueriesPerSec: 0, ReadsPerSec: 0, WritesPerSec: 0, } var acc testutil.Accumulator keys := []string{ "active_clients", "clients", "queries_per_sec", "read_docs_per_sec", "written_docs_per_sec", } missing_keys := []string{ "total_queries", "total_reads", "total_writes", } engine.AddEngineStats(keys, &acc, tags) for _, metric := range missing_keys { assert.False(t, acc.HasIntValue(metric)) } }
func TestAddMemberStats(t *testing.T) { var acc testutil.Accumulator err := server.addMemberStats(&acc) require.NoError(t, err) for _, metric := range MemberTracking { assert.True(t, acc.HasIntValue(metric)) } }
func TestMysqlGeneratesMetrics(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } m := &Mysql{ Servers: []string{fmt.Sprintf("root@tcp(%s:3306)/", testutil.GetLocalHost())}, } var acc testutil.Accumulator err := m.Gather(&acc) require.NoError(t, err) prefixes := []struct { prefix string count int }{ {"commands", 141}, {"handler", 18}, {"bytes", 2}, {"innodb", 51}, {"threads", 4}, {"aborted", 2}, {"created", 3}, {"key", 7}, {"open", 7}, {"opened", 3}, {"qcache", 8}, {"table", 5}, } intMetrics := []string{ "queries", "slow_queries", } for _, prefix := range prefixes { var count int for _, p := range acc.Points { if strings.HasPrefix(p.Measurement, prefix.prefix) { count++ } } assert.Equal(t, prefix.count, count) } for _, metric := range intMetrics { assert.True(t, acc.HasIntValue(metric)) } }
func TestPostgresqlGeneratesMetrics(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } p := &Postgresql{ Servers: []*Server{ { Address: fmt.Sprintf("host=%s user=postgres sslmode=disable", testutil.GetLocalHost()), Databases: []string{"postgres"}, }, }, } var acc testutil.Accumulator err := p.Gather(&acc) require.NoError(t, err) intMetrics := []string{ "xact_commit", "xact_rollback", "blks_read", "blks_hit", "tup_returned", "tup_fetched", "tup_inserted", "tup_updated", "tup_deleted", "conflicts", "temp_files", "temp_bytes", "deadlocks", } floatMetrics := []string{ "blk_read_time", "blk_write_time", } for _, metric := range intMetrics { assert.True(t, acc.HasIntValue(metric)) } for _, metric := range floatMetrics { assert.True(t, acc.HasFloatValue(metric)) } }
func TestNginxGeneratesMetrics(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var rsp string if r.URL.Path == "/stub_status" { rsp = sampleResponse } else { panic("Cannot handle request") } fmt.Fprintln(w, rsp) })) defer ts.Close() n := &Nginx{ Urls: []string{fmt.Sprintf("%s/stub_status", ts.URL)}, } var acc testutil.Accumulator err := n.Gather(&acc) require.NoError(t, err) metrics := []struct { name string value uint64 }{ {"active", 585}, {"accepts", 85340}, {"handled", 85340}, {"requests", 35085}, {"reading", 4}, {"writing", 135}, {"waiting", 446}, } addr, err := url.Parse(ts.URL) if err != nil { panic(err) } host, _, _ := net.SplitHostPort(addr.Host) tags := map[string]string{"server": host} for _, m := range metrics { assert.NoError(t, acc.ValidateTaggedValue(m.name, m.value, tags)) } }
// Test that Gather works on a ping with no transmitted packets, even though the // command returns an error func TestBadPingGather(t *testing.T) { var acc testutil.Accumulator p := Ping{ Urls: []string{"www.amazon.com"}, pingHost: mockErrorHostPinger, } p.Gather(&acc) tags := map[string]string{"url": "www.amazon.com"} assert.NoError(t, acc.ValidateTaggedValue("packets_transmitted", 2, tags)) assert.NoError(t, acc.ValidateTaggedValue("packets_received", 0, tags)) assert.NoError(t, acc.ValidateTaggedValue("percent_packet_loss", 100.0, tags)) assert.NoError(t, acc.ValidateTaggedValue("average_response_ms", 0.0, tags)) }
// Test that Gather works on a ping with lossy packets func TestLossyPingGather(t *testing.T) { var acc testutil.Accumulator p := Ping{ Urls: []string{"www.google.com"}, pingHost: mockLossyHostPinger, } p.Gather(&acc) tags := map[string]string{"url": "www.google.com"} assert.NoError(t, acc.ValidateTaggedValue("packets_transmitted", 5, tags)) assert.NoError(t, acc.ValidateTaggedValue("packets_received", 3, tags)) assert.NoError(t, acc.ValidateTaggedValue("percent_packet_loss", 40.0, tags)) assert.NoError(t, acc.ValidateTaggedValue("average_response_ms", 44.033, tags)) }
func TestHaproxyGeneratesMetricsWithoutAuthentication(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, csvOutputSample) })) defer ts.Close() r := &haproxy{ Servers: []string{ts.URL}, } var acc testutil.Accumulator err := r.Gather(&acc) require.NoError(t, err) tags := map[string]string{ "proxy": "be_app", "host": ts.Listener.Addr().String(), "sv": "host0", } assert.NoError(t, acc.ValidateTaggedValue("stot", uint64(171014), tags)) assert.NoError(t, acc.ValidateTaggedValue("scur", uint64(1), tags)) assert.NoError(t, acc.ValidateTaggedValue("rate", uint64(3), tags)) assert.Equal(t, true, acc.CheckValue("bin", uint64(5557055817))) }
func TestMemcachedGeneratesMetrics(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } m := &Memcached{ Servers: []string{testutil.GetLocalHost()}, } var acc testutil.Accumulator err := m.Gather(&acc) require.NoError(t, err) intMetrics := []string{"get_hits", "get_misses", "evictions", "limit_maxbytes", "bytes"} for _, metric := range intMetrics { assert.True(t, acc.HasIntValue(metric), metric) } }
// Test that a fatal ping command does not gather any statistics. func TestFatalPingGather(t *testing.T) { var acc testutil.Accumulator p := Ping{ Urls: []string{"www.amazon.com"}, pingHost: mockFatalHostPinger, } p.Gather(&acc) assert.False(t, acc.HasMeasurement("packets_transmitted"), "Fatal ping should not have packet measurements") assert.False(t, acc.HasMeasurement("packets_received"), "Fatal ping should not have packet measurements") assert.False(t, acc.HasMeasurement("percent_packet_loss"), "Fatal ping should not have packet measurements") assert.False(t, acc.HasMeasurement("average_response_ms"), "Fatal ping should not have packet measurements") }
func TestAddStorageStats(t *testing.T) { storage := &Storage{ Cache: Cache{ BytesInUse: 0, }, Disk: Disk{ ReadBytesPerSec: 0, ReadBytesTotal: 0, WriteBytesPerSec: 0, WriteBytesTotal: 0, SpaceUsage: SpaceUsage{ Data: 0, Garbage: 0, Metadata: 0, Prealloc: 0, }, }, } var acc testutil.Accumulator keys := []string{ "cache_bytes_in_use", "disk_read_bytes_per_sec", "disk_read_bytes_total", "disk_written_bytes_per_sec", "disk_written_bytes_total", "disk_usage_data_bytes", "disk_usage_garbage_bytes", "disk_usage_metadata_bytes", "disk_usage_preallocated_bytes", } storage.AddStats(&acc, tags) for _, metric := range keys { assert.True(t, acc.HasIntValue(metric)) } }
func TestElasticsearch(t *testing.T) { es := NewElasticsearch() es.Servers = []string{"http://example.com:9200"} es.client.Transport = newTransportMock(http.StatusOK, statsResponse) var acc testutil.Accumulator if err := es.Gather(&acc); err != nil { t.Fatal(err) } tags := map[string]string{ "cluster_name": "es-testcluster", "node_attribute_master": "true", "node_id": "SDFsfSDFsdfFSDSDfSFDSDF", "node_name": "test.host.com", "node_host": "test", } testTables := []map[string]float64{ indicesExpected, osExpected, processExpected, jvmExpected, threadPoolExpected, networkExpected, fsExpected, transportExpected, httpExpected, breakersExpected, } for _, testTable := range testTables { for k, v := range testTable { assert.NoError(t, acc.ValidateTaggedValue(k, v, tags)) } } }
func TestSystemStats_GenerateStats(t *testing.T) { var mps MockPS defer mps.AssertExpectations(t) var acc testutil.Accumulator cts := cpu.CPUTimesStat{ CPU: "cpu0", User: 3.1, System: 8.2, Idle: 80.1, Nice: 1.3, Iowait: 0.2, Irq: 0.1, Softirq: 0.11, Steal: 0.0001, Guest: 8.1, GuestNice: 0.324, Stolen: 0.051, } cts2 := cpu.CPUTimesStat{ CPU: "cpu0", User: 11.4, // increased by 8.3 System: 10.9, // increased by 2.7 Idle: 158.8699, // increased by 78.7699 (for total increase of 100) Nice: 2.5, // increased by 1.2 Iowait: 0.7, // increased by 0.5 Irq: 1.2, // increased by 1.1 Softirq: 0.31, // increased by 0.2 Steal: 0.0002, // increased by 0.0001 Guest: 12.9, // increased by 4.8 GuestNice: 2.524, // increased by 2.2 Stolen: 0.281, // increased by 0.23 } mps.On("CPUTimes").Return([]cpu.CPUTimesStat{cts}, nil) du := &disk.DiskUsageStat{ Path: "/", Fstype: "ext4", Total: 128, Free: 23, InodesTotal: 1234, InodesFree: 234, } mps.On("DiskUsage").Return([]*disk.DiskUsageStat{du}, nil) diskio := disk.DiskIOCountersStat{ ReadCount: 888, WriteCount: 5341, ReadBytes: 100000, WriteBytes: 200000, ReadTime: 7123, WriteTime: 9087, Name: "sda1", IoTime: 123552, SerialNumber: "ab-123-ad", } mps.On("DiskIO").Return(map[string]disk.DiskIOCountersStat{"sda1": diskio}, nil) netio := net.NetIOCountersStat{ Name: "eth0", BytesSent: 1123, BytesRecv: 8734422, PacketsSent: 781, PacketsRecv: 23456, Errin: 832, Errout: 8, Dropin: 7, Dropout: 1, } mps.On("NetIO").Return([]net.NetIOCountersStat{netio}, nil) vms := &mem.VirtualMemoryStat{ Total: 12400, Available: 7600, Used: 5000, UsedPercent: 47.1, Free: 1235, Active: 8134, Inactive: 1124, Buffers: 771, Cached: 4312, Wired: 134, Shared: 2142, } mps.On("VMStat").Return(vms, nil) sms := &mem.SwapMemoryStat{ Total: 8123, Used: 1232, Free: 6412, UsedPercent: 12.2, Sin: 7, Sout: 830, } mps.On("SwapStat").Return(sms, nil) cs := NewCPUStats(&mps) cputags := map[string]string{ "cpu": "cpu0", } preCPUPoints := len(acc.Points) err := cs.Gather(&acc) require.NoError(t, err) numCPUPoints := len(acc.Points) - preCPUPoints expectedCPUPoints := 12 assert.Equal(t, numCPUPoints, expectedCPUPoints) // Computed values are checked with delta > 0 becasue of floating point arithmatic // imprecision assertContainsTaggedFloat(t, acc, "user", 3.1, 0, cputags) assertContainsTaggedFloat(t, acc, "system", 8.2, 0, cputags) assertContainsTaggedFloat(t, acc, "idle", 80.1, 0, cputags) assertContainsTaggedFloat(t, acc, "nice", 1.3, 0, cputags) assertContainsTaggedFloat(t, acc, "iowait", 0.2, 0, cputags) assertContainsTaggedFloat(t, acc, "irq", 0.1, 0, cputags) assertContainsTaggedFloat(t, acc, "softirq", 0.11, 0, cputags) assertContainsTaggedFloat(t, acc, "steal", 0.0001, 0, cputags) assertContainsTaggedFloat(t, acc, "guest", 8.1, 0, cputags) assertContainsTaggedFloat(t, acc, "guestNice", 0.324, 0, cputags) assertContainsTaggedFloat(t, acc, "stolen", 0.051, 0, cputags) assertContainsTaggedFloat(t, acc, "busy", 21.4851, 0.0005, cputags) mps2 := MockPS{} mps2.On("CPUTimes").Return([]cpu.CPUTimesStat{cts2}, nil) cs.ps = &mps2 // Should have added cpu percentages too err = cs.Gather(&acc) require.NoError(t, err) numCPUPoints = len(acc.Points) - (preCPUPoints + numCPUPoints) expectedCPUPoints = 24 assert.Equal(t, numCPUPoints, expectedCPUPoints) assertContainsTaggedFloat(t, acc, "user", 11.4, 0, cputags) assertContainsTaggedFloat(t, acc, "system", 10.9, 0, cputags) assertContainsTaggedFloat(t, acc, "idle", 158.8699, 0, cputags) assertContainsTaggedFloat(t, acc, "nice", 2.5, 0, cputags) assertContainsTaggedFloat(t, acc, "iowait", 0.7, 0, cputags) assertContainsTaggedFloat(t, acc, "irq", 1.2, 0, cputags) assertContainsTaggedFloat(t, acc, "softirq", 0.31, 0, cputags) assertContainsTaggedFloat(t, acc, "steal", 0.0002, 0, cputags) assertContainsTaggedFloat(t, acc, "guest", 12.9, 0, cputags) assertContainsTaggedFloat(t, acc, "guestNice", 2.524, 0, cputags) assertContainsTaggedFloat(t, acc, "stolen", 0.281, 0, cputags) assertContainsTaggedFloat(t, acc, "busy", 42.7152, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageUser", 8.3, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageSystem", 2.7, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageIdle", 78.7699, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageNice", 1.2, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageIowait", 0.5, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageIrq", 1.1, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageSoftirq", 0.2, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageSteal", 0.0001, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageGuest", 4.8, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageGuestNice", 2.2, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageStolen", 0.23, 0.0005, cputags) assertContainsTaggedFloat(t, acc, "percentageBusy", 21.2301, 0.0005, cputags) err = (&DiskStats{&mps}).Gather(&acc) require.NoError(t, err) tags := map[string]string{ "path": "/", "fstype": "ext4", } assert.True(t, acc.CheckTaggedValue("total", uint64(128), tags)) assert.True(t, acc.CheckTaggedValue("used", uint64(105), tags)) assert.True(t, acc.CheckTaggedValue("free", uint64(23), tags)) assert.True(t, acc.CheckTaggedValue("inodes_total", uint64(1234), tags)) assert.True(t, acc.CheckTaggedValue("inodes_free", uint64(234), tags)) assert.True(t, acc.CheckTaggedValue("inodes_used", uint64(1000), tags)) err = (&NetIOStats{ps: &mps, skipChecks: true}).Gather(&acc) require.NoError(t, err) ntags := map[string]string{ "interface": "eth0", } assert.NoError(t, acc.ValidateTaggedValue("bytes_sent", uint64(1123), ntags)) assert.NoError(t, acc.ValidateTaggedValue("bytes_recv", uint64(8734422), ntags)) assert.NoError(t, acc.ValidateTaggedValue("packets_sent", uint64(781), ntags)) assert.NoError(t, acc.ValidateTaggedValue("packets_recv", uint64(23456), ntags)) assert.NoError(t, acc.ValidateTaggedValue("err_in", uint64(832), ntags)) assert.NoError(t, acc.ValidateTaggedValue("err_out", uint64(8), ntags)) assert.NoError(t, acc.ValidateTaggedValue("drop_in", uint64(7), ntags)) assert.NoError(t, acc.ValidateTaggedValue("drop_out", uint64(1), ntags)) err = (&DiskIOStats{&mps}).Gather(&acc) require.NoError(t, err) dtags := map[string]string{ "name": "sda1", "serial": "ab-123-ad", } assert.True(t, acc.CheckTaggedValue("reads", uint64(888), dtags)) assert.True(t, acc.CheckTaggedValue("writes", uint64(5341), dtags)) assert.True(t, acc.CheckTaggedValue("read_bytes", uint64(100000), dtags)) assert.True(t, acc.CheckTaggedValue("write_bytes", uint64(200000), dtags)) assert.True(t, acc.CheckTaggedValue("read_time", uint64(7123), dtags)) assert.True(t, acc.CheckTaggedValue("write_time", uint64(9087), dtags)) assert.True(t, acc.CheckTaggedValue("io_time", uint64(123552), dtags)) err = (&MemStats{&mps}).Gather(&acc) require.NoError(t, err) vmtags := map[string]string(nil) assert.True(t, acc.CheckTaggedValue("total", uint64(12400), vmtags)) assert.True(t, acc.CheckTaggedValue("available", uint64(7600), vmtags)) assert.True(t, acc.CheckTaggedValue("used", uint64(5000), vmtags)) assert.True(t, acc.CheckTaggedValue("used_perc", float64(47.1), vmtags)) assert.True(t, acc.CheckTaggedValue("free", uint64(1235), vmtags)) assert.True(t, acc.CheckTaggedValue("active", uint64(8134), vmtags)) assert.True(t, acc.CheckTaggedValue("inactive", uint64(1124), vmtags)) assert.True(t, acc.CheckTaggedValue("buffers", uint64(771), vmtags)) assert.True(t, acc.CheckTaggedValue("cached", uint64(4312), vmtags)) assert.True(t, acc.CheckTaggedValue("wired", uint64(134), vmtags)) assert.True(t, acc.CheckTaggedValue("shared", uint64(2142), vmtags)) acc.Points = nil err = (&SwapStats{&mps}).Gather(&acc) require.NoError(t, err) swaptags := map[string]string(nil) assert.NoError(t, acc.ValidateTaggedValue("total", uint64(8123), swaptags)) assert.NoError(t, acc.ValidateTaggedValue("used", uint64(1232), swaptags)) assert.NoError(t, acc.ValidateTaggedValue("used_perc", float64(12.2), swaptags)) assert.NoError(t, acc.ValidateTaggedValue("free", uint64(6412), swaptags)) assert.NoError(t, acc.ValidateTaggedValue("in", uint64(7), swaptags)) assert.NoError(t, acc.ValidateTaggedValue("out", uint64(830), swaptags)) }
func TestHaproxyGeneratesMetricsWithAuthentication(t *testing.T) { //We create a fake server to return test data ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { username, password, ok := r.BasicAuth() if !ok { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "Unauthorized") return } if username == "user" && password == "password" { fmt.Fprint(w, csvOutputSample) } else { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "Unauthorized") } })) defer ts.Close() //Now we tested again above server, with our authentication data r := &haproxy{ Servers: []string{strings.Replace(ts.URL, "http://", "http://*****:*****@", 1)}, } var acc testutil.Accumulator err := r.Gather(&acc) require.NoError(t, err) tags := map[string]string{ "host": ts.Listener.Addr().String(), "proxy": "be_app", "sv": "host0", } assert.NoError(t, acc.ValidateTaggedValue("stot", uint64(171014), tags)) checkInt := []struct { name string value uint64 }{ {"bin", 5557055817}, {"scur", 288}, {"qmax", 81}, {"http_response.1xx", 0}, {"http_response.2xx", 1314093}, {"http_response.3xx", 537036}, {"http_response.4xx", 123452}, {"dreq", 1102}, {"dresp", 80}, {"wretr", 17}, {"wredis", 19}, {"ereq", 95740}, {"econ", 0}, {"eresp", 0}, {"req_rate", 35}, {"req_rate_max", 140}, {"req_tot", 1987928}, {"bin", 5557055817}, {"bout", 24096715169}, {"rate", 18}, {"rate_max", 102}, {"throttle", 13}, {"lbtot", 114}, } for _, c := range checkInt { assert.Equal(t, true, acc.CheckValue(c.name, c.value)) } //Here, we should get error because we don't pass authentication data r = &haproxy{ Servers: []string{ts.URL}, } err = r.Gather(&acc) require.Error(t, err) }
func TestLustre2GeneratesMetrics(t *testing.T) { tempdir := os.TempDir() + "/telegraf/proc/fs/lustre/" ost_name := "OST0001" mdtdir := tempdir + "/mdt/" err := os.MkdirAll(mdtdir+"/"+ost_name, 0755) require.NoError(t, err) osddir := tempdir + "/osd-ldiskfs/" err = os.MkdirAll(osddir+"/"+ost_name, 0755) require.NoError(t, err) obddir := tempdir + "/obdfilter/" err = os.MkdirAll(obddir+"/"+ost_name, 0755) require.NoError(t, err) err = ioutil.WriteFile(mdtdir+"/"+ost_name+"/md_stats", []byte(mdtProcContents), 0644) require.NoError(t, err) err = ioutil.WriteFile(osddir+"/"+ost_name+"/stats", []byte(osdldiskfsProcContents), 0644) require.NoError(t, err) err = ioutil.WriteFile(obddir+"/"+ost_name+"/stats", []byte(obdfilterProcContents), 0644) require.NoError(t, err) m := &Lustre2{ Ost_procfiles: []string{obddir + "/*/stats", osddir + "/*/stats"}, Mds_procfiles: []string{mdtdir + "/*/md_stats"}, } var acc testutil.Accumulator err = m.Gather(&acc) require.NoError(t, err) tags := map[string]string{ "name": ost_name, } intMetrics := []*metrics{ { name: "write_bytes", value: 15201500833981, }, { name: "read_bytes", value: 78026117632000, }, { name: "write_calls", value: 71893382, }, { name: "read_calls", value: 203238095, }, { name: "cache_hit", value: 7393729777, }, { name: "cache_access", value: 19047063027, }, { name: "cache_miss", value: 11653333250, }, } for _, metric := range intMetrics { assert.True(t, acc.HasUIntValue(metric.name), metric.name) assert.True(t, acc.CheckTaggedValue(metric.name, metric.value, tags)) } err = os.RemoveAll(os.TempDir() + "/telegraf") require.NoError(t, err) }
func TestDockerStats_GenerateStats(t *testing.T) { var mps MockPS var acc testutil.Accumulator ds := &DockerContainerStat{ Name: "blah", CPU: &cpu.CPUTimesStat{ CPU: "all", User: 3.1, System: 8.2, Idle: 80.1, Nice: 1.3, Iowait: 0.2, Irq: 0.1, Softirq: 0.11, Steal: 0.0001, Guest: 8.1, GuestNice: 0.324, Stolen: 0.051, }, Mem: &docker.CgroupMemStat{ ContainerID: "blah", Cache: 1, RSS: 2, RSSHuge: 3, MappedFile: 4, Pgpgin: 5, Pgpgout: 6, Pgfault: 7, Pgmajfault: 8, InactiveAnon: 9, ActiveAnon: 10, InactiveFile: 11, ActiveFile: 12, Unevictable: 13, HierarchicalMemoryLimit: 14, TotalCache: 15, TotalRSS: 16, TotalRSSHuge: 17, TotalMappedFile: 18, TotalPgpgIn: 19, TotalPgpgOut: 20, TotalPgFault: 21, TotalPgMajFault: 22, TotalInactiveAnon: 23, TotalActiveAnon: 24, TotalInactiveFile: 25, TotalActiveFile: 26, TotalUnevictable: 27, }, } mps.On("DockerStat").Return([]*DockerContainerStat{ds}, nil) err := (&DockerStats{&mps}).Gather(&acc) require.NoError(t, err) dockertags := map[string]string{ "name": "blah", "id": "", "command": "", } assert.True(t, acc.CheckTaggedValue("user", 3.1, dockertags)) assert.True(t, acc.CheckTaggedValue("system", 8.2, dockertags)) assert.True(t, acc.CheckTaggedValue("idle", 80.1, dockertags)) assert.True(t, acc.CheckTaggedValue("nice", 1.3, dockertags)) assert.True(t, acc.CheckTaggedValue("iowait", 0.2, dockertags)) assert.True(t, acc.CheckTaggedValue("irq", 0.1, dockertags)) assert.True(t, acc.CheckTaggedValue("softirq", 0.11, dockertags)) assert.True(t, acc.CheckTaggedValue("steal", 0.0001, dockertags)) assert.True(t, acc.CheckTaggedValue("guest", 8.1, dockertags)) assert.True(t, acc.CheckTaggedValue("guestNice", 0.324, dockertags)) assert.True(t, acc.CheckTaggedValue("stolen", 0.051, dockertags)) assert.True(t, acc.CheckTaggedValue("cache", uint64(1), dockertags)) assert.True(t, acc.CheckTaggedValue("rss", uint64(2), dockertags)) assert.True(t, acc.CheckTaggedValue("rss_huge", uint64(3), dockertags)) assert.True(t, acc.CheckTaggedValue("mapped_file", uint64(4), dockertags)) assert.True(t, acc.CheckTaggedValue("swap_in", uint64(5), dockertags)) assert.True(t, acc.CheckTaggedValue("swap_out", uint64(6), dockertags)) assert.True(t, acc.CheckTaggedValue("page_fault", uint64(7), dockertags)) assert.True(t, acc.CheckTaggedValue("page_major_fault", uint64(8), dockertags)) assert.True(t, acc.CheckTaggedValue("inactive_anon", uint64(9), dockertags)) assert.True(t, acc.CheckTaggedValue("active_anon", uint64(10), dockertags)) assert.True(t, acc.CheckTaggedValue("inactive_file", uint64(11), dockertags)) assert.True(t, acc.CheckTaggedValue("active_file", uint64(12), dockertags)) assert.True(t, acc.CheckTaggedValue("unevictable", uint64(13), dockertags)) assert.True(t, acc.CheckTaggedValue("memory_limit", uint64(14), dockertags)) assert.True(t, acc.CheckTaggedValue("total_cache", uint64(15), dockertags)) assert.True(t, acc.CheckTaggedValue("total_rss", uint64(16), dockertags)) assert.True(t, acc.CheckTaggedValue("total_rss_huge", uint64(17), dockertags)) assert.True(t, acc.CheckTaggedValue("total_mapped_file", uint64(18), dockertags)) assert.True(t, acc.CheckTaggedValue("total_swap_in", uint64(19), dockertags)) assert.True(t, acc.CheckTaggedValue("total_swap_out", uint64(20), dockertags)) assert.True(t, acc.CheckTaggedValue("total_page_fault", uint64(21), dockertags)) assert.True(t, acc.CheckTaggedValue("total_page_major_fault", uint64(22), dockertags)) assert.True(t, acc.CheckTaggedValue("total_inactive_anon", uint64(23), dockertags)) assert.True(t, acc.CheckTaggedValue("total_active_anon", uint64(24), dockertags)) assert.True(t, acc.CheckTaggedValue("total_inactive_file", uint64(25), dockertags)) assert.True(t, acc.CheckTaggedValue("total_active_file", uint64(26), dockertags)) assert.True(t, acc.CheckTaggedValue("total_unevictable", uint64(27), dockertags)) }
func TestDisqueCanPullStatsFromMultipleServers(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } 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\r\n" { return } fmt.Fprintf(c, "$%d\n", len(testOutput)) c.Write([]byte(testOutput)) } }() addr := fmt.Sprintf("disque://%s", l.Addr().String()) r := &Disque{ Servers: []string{addr}, } var acc testutil.Accumulator err = r.Gather(&acc) require.NoError(t, err) checkInt := []struct { name string value uint64 }{ {"uptime", 1452705}, {"clients", 31}, {"blocked_clients", 13}, {"used_memory", 1840104}, {"used_memory_rss", 3227648}, {"used_memory_peak", 89603656}, {"total_connections_received", 5062777}, {"total_commands_processed", 12308396}, {"instantaneous_ops_per_sec", 18}, {"latest_fork_usec", 1644}, {"registered_jobs", 360}, {"registered_queues", 12}, } for _, c := range checkInt { assert.True(t, acc.CheckValue(c.name, c.value)) } checkFloat := []struct { name string value float64 }{ {"mem_fragmentation_ratio", 1.75}, {"used_cpu_sys", 19585.73}, {"used_cpu_user", 11255.96}, {"used_cpu_sys_children", 1.75}, {"used_cpu_user_children", 1.91}, } for _, c := range checkFloat { assert.True(t, acc.CheckValue(c.name, c.value)) } }
func TestRedisGeneratesMetrics(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") } 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\r\n" { return } fmt.Fprintf(c, "$%d\n", len(testOutput)) c.Write([]byte(testOutput)) } }() addr := fmt.Sprintf("redis://%s", 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 }{ {"uptime", 238}, {"clients", 1}, {"used_memory", 1003936}, {"used_memory_rss", 811008}, {"used_memory_peak", 1003936}, {"used_memory_lua", 33792}, {"rdb_changes_since_last_save", 0}, {"total_connections_received", 2}, {"total_commands_processed", 1}, {"instantaneous_ops_per_sec", 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}, {"connected_slaves", 0}, {"master_repl_offset", 0}, {"repl_backlog_active", 0}, {"repl_backlog_size", 1048576}, {"repl_backlog_histlen", 0}, } for _, c := range checkInt { assert.True(t, acc.CheckValue(c.name, c.value)) } checkFloat := []struct { name string value float64 }{ {"mem_fragmentation_ratio", 0.81}, {"used_cpu_sys", 0.14}, {"used_cpu_user", 0.05}, {"used_cpu_sys_children", 0.00}, {"used_cpu_user_children", 0.00}, } for _, c := range checkFloat { assert.True(t, acc.CheckValue(c.name, c.value)) } }
func TestRabbitMQGeneratesMetrics(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var rsp string if r.URL.Path == "/api/overview" { rsp = sampleOverviewResponse } else if r.URL.Path == "/api/nodes" { rsp = sampleNodesResponse } else { panic("Cannot handle request") } fmt.Fprintln(w, rsp) })) defer ts.Close() r := &RabbitMQ{ Servers: []*Server{ { URL: ts.URL, }, }, } var acc testutil.Accumulator err := r.Gather(&acc) require.NoError(t, err) intMetrics := []string{ "messages", "messages_ready", "messages_unacked", "messages_acked", "messages_delivered", "messages_published", "channels", "connections", "consumers", "exchanges", "queues", } for _, metric := range intMetrics { assert.True(t, acc.HasIntValue(metric)) } nodeIntMetrics := []string{ "disk_free", "disk_free_limit", "fd_total", "fd_used", "mem_limit", "mem_used", "proc_total", "proc_used", "run_queue", "sockets_total", "sockets_used", } for _, metric := range nodeIntMetrics { assert.True(t, acc.HasIntValue(metric)) } }