package ceph import ( "fmt" "io/ioutil" "os" "path" "strconv" "strings" "testing" "github.com/influxdata/telegraf/testutil" "github.com/stretchr/testify/assert" ) const ( epsilon = float64(0.00000001) ) type expectedResult struct { metric string fields map[string]interface{} tags map[string]string } func TestParseSockId(t *testing.T) { s := parseSockId(sockFile(osdPrefix, 1), osdPrefix, sockSuffix) assert.Equal(t, s, "1") } func TestParseMonDump(t *testing.T) { dump, err := parseDump(monPerfDump) assert.NoError(t, err) assert.InEpsilon(t, int64(5678670180), dump["cluster"]["osd_kb_used"], epsilon) assert.InEpsilon(t, 6866.540527000, dump["paxos"]["store_state_latency.sum"], epsilon) } func TestParseOsdDump(t *testing.T) { dump, err := parseDump(osdPerfDump) assert.NoError(t, err) assert.InEpsilon(t, 552132.109360000, dump["filestore"]["commitcycle_interval.sum"], epsilon) assert.Equal(t, float64(0), dump["mutex-FileJournal::finisher_lock"]["wait.avgcount"]) } func TestDecodeStatus(t *testing.T) { acc := &testutil.Accumulator{} err := decodeStatus(acc, clusterStatusDump) assert.NoError(t, err) for _, r := range cephStatusResults { acc.AssertContainsTaggedFields(t, r.metric, r.fields, r.tags) } } func TestDecodeDf(t *testing.T) { acc := &testutil.Accumulator{} err := decodeDf(acc, cephDFDump) assert.NoError(t, err) for _, r := range cephDfResults { acc.AssertContainsTaggedFields(t, r.metric, r.fields, r.tags) } } func TestDecodeOSDPoolStats(t *testing.T) { acc := &testutil.Accumulator{} err := decodeOsdPoolStats(acc, cephODSPoolStatsDump) assert.NoError(t, err) for _, r := range cephOSDPoolStatsResults { acc.AssertContainsTaggedFields(t, r.metric, r.fields, r.tags) } } func TestGather(t *testing.T) { saveFind := findSockets saveDump := perfDump defer func() { findSockets = saveFind perfDump = saveDump }() findSockets = func(c *Ceph) ([]*socket, error) { return []*socket{{"osd.1", typeOsd, ""}}, nil } perfDump = func(binary string, s *socket) (string, error) { return osdPerfDump, nil } acc := &testutil.Accumulator{} c := &Ceph{} c.Gather(acc) } func TestFindSockets(t *testing.T) { tmpdir, err := ioutil.TempDir("", "socktest") assert.NoError(t, err) defer func() { err := os.Remove(tmpdir) assert.NoError(t, err) }() c := &Ceph{ CephBinary: "foo", OsdPrefix: "ceph-osd", MonPrefix: "ceph-mon", SocketDir: tmpdir, SocketSuffix: "asok", CephUser: "client.admin", CephConfig: "/etc/ceph/ceph.conf", GatherAdminSocketStats: true, GatherClusterStats: false, } for _, st := range sockTestParams { createTestFiles(tmpdir, st) sockets, err := findSockets(c) assert.NoError(t, err) for i := 1; i <= st.osds; i++ { assertFoundSocket(t, tmpdir, typeOsd, i, sockets) } for i := 1; i <= st.mons; i++ { assertFoundSocket(t, tmpdir, typeMon, i, sockets) } cleanupTestFiles(tmpdir, st) } } func assertFoundSocket(t *testing.T, dir, sockType string, i int, sockets []*socket) { var prefix string if sockType == typeOsd { prefix = osdPrefix } else { prefix = monPrefix } expected := path.Join(dir, sockFile(prefix, i)) found := false for _, s := range sockets { fmt.Printf("Checking %s\n", s.socket) if s.socket == expected { found = true assert.Equal(t, s.sockType, sockType, "Unexpected socket type for '%s'", s) assert.Equal(t, s.sockId, strconv.Itoa(i)) } } assert.True(t, found, "Did not find socket: %s", expected) } func sockFile(prefix string, i int) string { return strings.Join([]string{prefix, strconv.Itoa(i), sockSuffix}, ".") } func createTestFiles(dir string, st *SockTest) { writeFile := func(prefix string, i int) { f := sockFile(prefix, i) fpath := path.Join(dir, f) ioutil.WriteFile(fpath, []byte(""), 0777) } tstFileApply(st, writeFile) } func cleanupTestFiles(dir string, st *SockTest) { rmFile := func(prefix string, i int) { f := sockFile(prefix, i) fpath := path.Join(dir, f) err := os.Remove(fpath) if err != nil { fmt.Printf("Error removing test file %s: %v\n", fpath, err) } } tstFileApply(st, rmFile) } func tstFileApply(st *SockTest, fn func(prefix string, i int)) { for i := 1; i <= st.osds; i++ { fn(osdPrefix, i) } for i := 1; i <= st.mons; i++ { fn(monPrefix, i) } } type SockTest struct { osds int mons int } var sockTestParams = []*SockTest{ { osds: 2, mons: 2, }, { mons: 1, }, { osds: 1, }, {}, } var monPerfDump = ` { "cluster": { "num_mon": 2, "num_mon_quorum": 2, "num_osd": 26, "num_osd_up": 26, "num_osd_in": 26, "osd_epoch": 3306, "osd_kb": 11487846448, "osd_kb_used": 5678670180, "osd_kb_avail": 5809176268, "num_pool": 12, "num_pg": 768, "num_pg_active_clean": 768, "num_pg_active": 768, "num_pg_peering": 0, "num_object": 397616, "num_object_degraded": 0, "num_object_unfound": 0, "num_bytes": 2917848227467, "num_mds_up": 0, "num_mds_in": 0, "num_mds_failed": 0, "mds_epoch": 1}, "leveldb": { "leveldb_get": 321950312, "leveldb_transaction": 18729922, "leveldb_compact": 0, "leveldb_compact_range": 74141, "leveldb_compact_queue_merge": 0, "leveldb_compact_queue_len": 0}, "mon": {}, "paxos": { "start_leader": 0, "start_peon": 1, "restart": 4, "refresh": 9363435, "refresh_latency": { "avgcount": 9363435, "sum": 5378.794002000}, "begin": 9363435, "begin_keys": { "avgcount": 0, "sum": 0}, "begin_bytes": { "avgcount": 9363435, "sum": 110468605489}, "begin_latency": { "avgcount": 9363435, "sum": 5850.060682000}, "commit": 9363435, "commit_keys": { "avgcount": 0, "sum": 0}, "commit_bytes": { "avgcount": 0, "sum": 0}, "commit_latency": { "avgcount": 0, "sum": 0.000000000}, "collect": 1, "collect_keys": { "avgcount": 1, "sum": 1}, "collect_bytes": { "avgcount": 1, "sum": 24}, "collect_latency": { "avgcount": 1, "sum": 0.000280000}, "collect_uncommitted": 0, "collect_timeout": 0, "accept_timeout": 0, "lease_ack_timeout": 0, "lease_timeout": 0, "store_state": 9363435, "store_state_keys": { "avgcount": 9363435, "sum": 176572789}, "store_state_bytes": { "avgcount": 9363435, "sum": 216355887217}, "store_state_latency": { "avgcount": 9363435, "sum": 6866.540527000}, "share_state": 0, "share_state_keys": { "avgcount": 0, "sum": 0}, "share_state_bytes": { "avgcount": 0, "sum": 0}, "new_pn": 0, "new_pn_latency": { "avgcount": 0, "sum": 0.000000000}}, "throttle-mon_client_bytes": { "val": 246, "max": 104857600, "get": 896030, "get_sum": 45854374, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 896026, "put_sum": 45854128, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-mon_daemon_bytes": { "val": 0, "max": 419430400, "get": 2773768, "get_sum": 3627676976, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 2773768, "put_sum": 3627676976, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-mon": { "val": 0, "max": 104857600, "get": 34504949, "get_sum": 226860281124, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 34504949, "put_sum": 226860281124, "wait": { "avgcount": 0, "sum": 0.000000000}}} ` var osdPerfDump = ` { "WBThrottle": { "bytes_dirtied": 28405539, "bytes_wb": 0, "ios_dirtied": 93, "ios_wb": 0, "inodes_dirtied": 86, "inodes_wb": 0}, "filestore": { "journal_queue_max_ops": 0, "journal_queue_ops": 0, "journal_ops": 1108008, "journal_queue_max_bytes": 0, "journal_queue_bytes": 0, "journal_bytes": 73233416196, "journal_latency": { "avgcount": 1108008, "sum": 290.981036000}, "journal_wr": 1091866, "journal_wr_bytes": { "avgcount": 1091866, "sum": 74925682688}, "journal_full": 0, "committing": 0, "commitcycle": 110389, "commitcycle_interval": { "avgcount": 110389, "sum": 552132.109360000}, "commitcycle_latency": { "avgcount": 110389, "sum": 178.657804000}, "op_queue_max_ops": 50, "op_queue_ops": 0, "ops": 1108008, "op_queue_max_bytes": 104857600, "op_queue_bytes": 0, "bytes": 73226768148, "apply_latency": { "avgcount": 1108008, "sum": 947.742722000}, "queue_transaction_latency_avg": { "avgcount": 1108008, "sum": 0.511327000}}, "leveldb": { "leveldb_get": 4361221, "leveldb_transaction": 4351276, "leveldb_compact": 0, "leveldb_compact_range": 0, "leveldb_compact_queue_merge": 0, "leveldb_compact_queue_len": 0}, "mutex-FileJournal::completions_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-FileJournal::finisher_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-FileJournal::write_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-FileJournal::writeq_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-JOS::ApplyManager::apply_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-JOS::ApplyManager::com_lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-JOS::SubmitManager::lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "mutex-WBThrottle::lock": { "wait": { "avgcount": 0, "sum": 0.000000000}}, "objecter": { "op_active": 0, "op_laggy": 0, "op_send": 0, "op_send_bytes": 0, "op_resend": 0, "op_ack": 0, "op_commit": 0, "op": 0, "op_r": 0, "op_w": 0, "op_rmw": 0, "op_pg": 0, "osdop_stat": 0, "osdop_create": 0, "osdop_read": 0, "osdop_write": 0, "osdop_writefull": 0, "osdop_append": 0, "osdop_zero": 0, "osdop_truncate": 0, "osdop_delete": 0, "osdop_mapext": 0, "osdop_sparse_read": 0, "osdop_clonerange": 0, "osdop_getxattr": 0, "osdop_setxattr": 0, "osdop_cmpxattr": 0, "osdop_rmxattr": 0, "osdop_resetxattrs": 0, "osdop_tmap_up": 0, "osdop_tmap_put": 0, "osdop_tmap_get": 0, "osdop_call": 0, "osdop_watch": 0, "osdop_notify": 0, "osdop_src_cmpxattr": 0, "osdop_pgls": 0, "osdop_pgls_filter": 0, "osdop_other": 0, "linger_active": 0, "linger_send": 0, "linger_resend": 0, "poolop_active": 0, "poolop_send": 0, "poolop_resend": 0, "poolstat_active": 0, "poolstat_send": 0, "poolstat_resend": 0, "statfs_active": 0, "statfs_send": 0, "statfs_resend": 0, "command_active": 0, "command_send": 0, "command_resend": 0, "map_epoch": 3300, "map_full": 0, "map_inc": 3293, "osd_sessions": 0, "osd_session_open": 0, "osd_session_close": 0, "osd_laggy": 0}, "osd": { "opq": 0, "op_wip": 0, "op": 23939, "op_in_bytes": 1245903961, "op_out_bytes": 29103083856, "op_latency": { "avgcount": 23939, "sum": 440.192015000}, "op_process_latency": { "avgcount": 23939, "sum": 30.170685000}, "op_r": 23112, "op_r_out_bytes": 29103056146, "op_r_latency": { "avgcount": 23112, "sum": 19.373526000}, "op_r_process_latency": { "avgcount": 23112, "sum": 14.625928000}, "op_w": 549, "op_w_in_bytes": 1245804358, "op_w_rlat": { "avgcount": 549, "sum": 17.022299000}, "op_w_latency": { "avgcount": 549, "sum": 418.494610000}, "op_w_process_latency": { "avgcount": 549, "sum": 13.316555000}, "op_rw": 278, "op_rw_in_bytes": 99603, "op_rw_out_bytes": 27710, "op_rw_rlat": { "avgcount": 278, "sum": 2.213785000}, "op_rw_latency": { "avgcount": 278, "sum": 2.323879000}, "op_rw_process_latency": { "avgcount": 278, "sum": 2.228202000}, "subop": 1074774, "subop_in_bytes": 26841811636, "subop_latency": { "avgcount": 1074774, "sum": 745.509160000}, "subop_w": 0, "subop_w_in_bytes": 26841811636, "subop_w_latency": { "avgcount": 1074774, "sum": 745.509160000}, "subop_pull": 0, "subop_pull_latency": { "avgcount": 0, "sum": 0.000000000}, "subop_push": 0, "subop_push_in_bytes": 0, "subop_push_latency": { "avgcount": 0, "sum": 0.000000000}, "pull": 0, "push": 28, "push_out_bytes": 103483392, "push_in": 0, "push_in_bytes": 0, "recovery_ops": 15, "loadavg": 202, "buffer_bytes": 0, "numpg": 18, "numpg_primary": 8, "numpg_replica": 10, "numpg_stray": 0, "heartbeat_to_peers": 10, "heartbeat_from_peers": 0, "map_messages": 7413, "map_message_epochs": 9792, "map_message_epoch_dups": 10105, "messages_delayed_for_map": 83, "stat_bytes": 102123175936, "stat_bytes_used": 49961820160, "stat_bytes_avail": 52161355776, "copyfrom": 0, "tier_promote": 0, "tier_flush": 0, "tier_flush_fail": 0, "tier_try_flush": 0, "tier_try_flush_fail": 0, "tier_evict": 0, "tier_whiteout": 0, "tier_dirty": 230, "tier_clean": 0, "tier_delay": 0, "agent_wake": 0, "agent_skip": 0, "agent_flush": 0, "agent_evict": 0}, "recoverystate_perf": { "initial_latency": { "avgcount": 473, "sum": 0.027207000}, "started_latency": { "avgcount": 1480, "sum": 9854902.397648000}, "reset_latency": { "avgcount": 1953, "sum": 0.096206000}, "start_latency": { "avgcount": 1953, "sum": 0.059947000}, "primary_latency": { "avgcount": 765, "sum": 4688922.186935000}, "peering_latency": { "avgcount": 704, "sum": 1668.652135000}, "backfilling_latency": { "avgcount": 0, "sum": 0.000000000}, "waitremotebackfillreserved_latency": { "avgcount": 0, "sum": 0.000000000}, "waitlocalbackfillreserved_latency": { "avgcount": 0, "sum": 0.000000000}, "notbackfilling_latency": { "avgcount": 0, "sum": 0.000000000}, "repnotrecovering_latency": { "avgcount": 462, "sum": 5158922.114600000}, "repwaitrecoveryreserved_latency": { "avgcount": 15, "sum": 0.008275000}, "repwaitbackfillreserved_latency": { "avgcount": 1, "sum": 0.000095000}, "RepRecovering_latency": { "avgcount": 16, "sum": 2274.944727000}, "activating_latency": { "avgcount": 514, "sum": 261.008520000}, "waitlocalrecoveryreserved_latency": { "avgcount": 20, "sum": 0.175422000}, "waitremoterecoveryreserved_latency": { "avgcount": 20, "sum": 0.682778000}, "recovering_latency": { "avgcount": 20, "sum": 0.697551000}, "recovered_latency": { "avgcount": 511, "sum": 0.011038000}, "clean_latency": { "avgcount": 503, "sum": 4686961.154278000}, "active_latency": { "avgcount": 506, "sum": 4687223.640464000}, "replicaactive_latency": { "avgcount": 446, "sum": 5161197.078966000}, "stray_latency": { "avgcount": 794, "sum": 4805.105128000}, "getinfo_latency": { "avgcount": 704, "sum": 1138.477937000}, "getlog_latency": { "avgcount": 678, "sum": 0.036393000}, "waitactingchange_latency": { "avgcount": 69, "sum": 59.172893000}, "incomplete_latency": { "avgcount": 0, "sum": 0.000000000}, "getmissing_latency": { "avgcount": 609, "sum": 0.012288000}, "waitupthru_latency": { "avgcount": 576, "sum": 530.106999000}}, "throttle-filestore_bytes": { "val": 0, "max": 0, "get": 0, "get_sum": 0, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 0, "put_sum": 0, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-filestore_ops": { "val": 0, "max": 0, "get": 0, "get_sum": 0, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 0, "put_sum": 0, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-client": { "val": 0, "max": 104857600, "get": 130730, "get_sum": 1246039872, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 130730, "put_sum": 1246039872, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-cluster": { "val": 0, "max": 104857600, "get": 1108033, "get_sum": 71277949992, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 1108033, "put_sum": 71277949992, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-hb_back_server": { "val": 0, "max": 104857600, "get": 18320575, "get_sum": 861067025, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 18320575, "put_sum": 861067025, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-hb_front_server": { "val": 0, "max": 104857600, "get": 18320575, "get_sum": 861067025, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 18320575, "put_sum": 861067025, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-hbclient": { "val": 0, "max": 104857600, "get": 40479394, "get_sum": 1902531518, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 40479394, "put_sum": 1902531518, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-msgr_dispatch_throttler-ms_objecter": { "val": 0, "max": 104857600, "get": 0, "get_sum": 0, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 0, "put_sum": 0, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-objecter_bytes": { "val": 0, "max": 104857600, "get": 0, "get_sum": 0, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 0, "put_sum": 0, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-objecter_ops": { "val": 0, "max": 1024, "get": 0, "get_sum": 0, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 0, "put_sum": 0, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-osd_client_bytes": { "val": 0, "max": 524288000, "get": 24241, "get_sum": 1241992581, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 25958, "put_sum": 1241992581, "wait": { "avgcount": 0, "sum": 0.000000000}}, "throttle-osd_client_messages": { "val": 0, "max": 100, "get": 49214, "get_sum": 49214, "get_or_fail_fail": 0, "get_or_fail_success": 0, "take": 0, "take_sum": 0, "put": 49214, "put_sum": 49214, "wait": { "avgcount": 0, "sum": 0.000000000}}} ` var clusterStatusDump = ` { "health": { "health": { "health_services": [ { "mons": [ { "name": "a", "kb_total": 114289256, "kb_used": 26995516, "kb_avail": 81465132, "avail_percent": 71, "last_updated": "2017-01-03 17:20:57.595004", "store_stats": { "bytes_total": 942117141, "bytes_sst": 0, "bytes_log": 4345406, "bytes_misc": 937771735, "last_updated": "0.000000" }, "health": "HEALTH_OK" }, { "name": "b", "kb_total": 114289256, "kb_used": 27871624, "kb_avail": 80589024, "avail_percent": 70, "last_updated": "2017-01-03 17:20:47.784331", "store_stats": { "bytes_total": 454853104, "bytes_sst": 0, "bytes_log": 5788320, "bytes_misc": 449064784, "last_updated": "0.000000" }, "health": "HEALTH_OK" }, { "name": "c", "kb_total": 130258508, "kb_used": 38076996, "kb_avail": 85541692, "avail_percent": 65, "last_updated": "2017-01-03 17:21:03.311123", "store_stats": { "bytes_total": 455555199, "bytes_sst": 0, "bytes_log": 6950876, "bytes_misc": 448604323, "last_updated": "0.000000" }, "health": "HEALTH_OK" } ] } ] }, "timechecks": { "epoch": 504, "round": 34642, "round_status": "finished", "mons": [ { "name": "a", "skew": 0, "latency": 0, "health": "HEALTH_OK" }, { "name": "b", "skew": -0, "latency": 0.000951, "health": "HEALTH_OK" }, { "name": "c", "skew": -0, "latency": 0.000946, "health": "HEALTH_OK" } ] }, "summary": [], "overall_status": "HEALTH_OK", "detail": [] }, "fsid": "01234567-abcd-9876-0123-ffeeddccbbaa", "election_epoch": 504, "quorum": [ 0, 1, 2 ], "quorum_names": [ "a", "b", "c" ], "monmap": { "epoch": 17, "fsid": "01234567-abcd-9876-0123-ffeeddccbbaa", "modified": "2016-04-11 14:01:52.600198", "created": "0.000000", "mons": [ { "rank": 0, "name": "a", "addr": "192.168.0.1:6789/0" }, { "rank": 1, "name": "b", "addr": "192.168.0.2:6789/0" }, { "rank": 2, "name": "c", "addr": "192.168.0.3:6789/0" } ] }, "osdmap": { "osdmap": { "epoch": 21734, "num_osds": 24, "num_up_osds": 24, "num_in_osds": 24, "full": false, "nearfull": false, "num_remapped_pgs": 0 } }, "pgmap": { "pgs_by_state": [ { "state_name": "active+clean", "count": 2560 }, { "state_name": "active+scrubbing", "count": 10 }, { "state_name": "active+backfilling", "count": 5 } ], "version": 52314277, "num_pgs": 2560, "data_bytes": 2700031960713, "bytes_used": 7478347665408, "bytes_avail": 9857462382592, "bytes_total": 17335810048000, "read_bytes_sec": 0, "write_bytes_sec": 367217, "op_per_sec": 98, "read_op_per_sec": 322, "write_op_per_sec": 1022 }, "mdsmap": { "epoch": 1, "up": 0, "in": 0, "max": 0, "by_rank": [] } } ` var cephStatusResults = []expectedResult{ { metric: "ceph_osdmap", fields: map[string]interface{}{ "epoch": float64(21734), "num_osds": float64(24), "num_up_osds": float64(24), "num_in_osds": float64(24), "full": false, "nearfull": false, "num_remapped_pgs": float64(0), }, tags: map[string]string{}, }, { metric: "ceph_pgmap", fields: map[string]interface{}{ "version": float64(52314277), "num_pgs": float64(2560), "data_bytes": float64(2700031960713), "bytes_used": float64(7478347665408), "bytes_avail": float64(9857462382592), "bytes_total": float64(17335810048000), "read_bytes_sec": float64(0), "write_bytes_sec": float64(367217), "op_per_sec": pf(98), "read_op_per_sec": float64(322), "write_op_per_sec": float64(1022), }, tags: map[string]string{}, }, { metric: "ceph_pgmap_state", fields: map[string]interface{}{ "count": float64(2560), }, tags: map[string]string{ "state": "active+clean", }, }, { metric: "ceph_pgmap_state", fields: map[string]interface{}{ "count": float64(10), }, tags: map[string]string{ "state": "active+scrubbing", }, }, { metric: "ceph_pgmap_state", fields: map[string]interface{}{ "count": float64(5), }, tags: map[string]string{ "state": "active+backfilling", }, }, } var cephDFDump = ` { "stats": { "total_space": 472345880, "total_used": 71058504, "total_avail": 377286864, "total_bytes": 472345880, "total_used_bytes": 71058504, "total_avail_bytes": 377286864}, "pools": [ { "name": "data", "id": 0, "stats": { "kb_used": 0, "bytes_used": 0, "objects": 0}}, { "name": "metadata", "id": 1, "stats": { "kb_used": 25, "bytes_used": 25052, "objects": 53}}, { "name": "rbd", "id": 2, "stats": { "kb_used": 0, "bytes_used": 0, "objects": 0}}, { "name": "test", "id": 3, "stats": { "kb_used": 55476, "bytes_used": 56806602, "objects": 1}}]}` var cephDfResults = []expectedResult{ { metric: "ceph_usage", fields: map[string]interface{}{ "total_space": pf(472345880), "total_used": pf(71058504), "total_avail": pf(377286864), "total_bytes": pf(472345880), "total_used_bytes": pf(71058504), "total_avail_bytes": pf(377286864), }, tags: map[string]string{}, }, { metric: "ceph_pool_usage", fields: map[string]interface{}{ "kb_used": float64(0), "bytes_used": float64(0), "objects": float64(0), "percent_used": (*float64)(nil), "max_avail": (*float64)(nil), }, tags: map[string]string{ "name": "data", }, }, { metric: "ceph_pool_usage", fields: map[string]interface{}{ "kb_used": float64(25), "bytes_used": float64(25052), "objects": float64(53), "percent_used": (*float64)(nil), "max_avail": (*float64)(nil), }, tags: map[string]string{ "name": "metadata", }, }, { metric: "ceph_pool_usage", fields: map[string]interface{}{ "kb_used": float64(0), "bytes_used": float64(0), "objects": float64(0), "percent_used": (*float64)(nil), "max_avail": (*float64)(nil), }, tags: map[string]string{ "name": "rbd", }, }, { metric: "ceph_pool_usage", fields: map[string]interface{}{ "kb_used": float64(55476), "bytes_used": float64(56806602), "objects": float64(1), "percent_used": (*float64)(nil), "max_avail": (*float64)(nil), }, tags: map[string]string{ "name": "test", }, }, } var cephODSPoolStatsDump = ` [ { "pool_name": "data", "pool_id": 0, "recovery": {}, "recovery_rate": {}, "client_io_rate": {}}, { "pool_name": "metadata", "pool_id": 1, "recovery": {}, "recovery_rate": {}, "client_io_rate": {}}, { "pool_name": "rbd", "pool_id": 2, "recovery": {}, "recovery_rate": {}, "client_io_rate": {}}, { "pool_name": "pbench", "pool_id": 3, "recovery": { "degraded_objects": 18446744073709551562, "degraded_total": 412, "degrated_ratio": "-13.107"}, "recovery_rate": { "recovering_objects_per_sec": 279, "recovering_bytes_per_sec": 176401059, "recovering_keys_per_sec": 0}, "client_io_rate": { "read_bytes_sec": 10566067, "write_bytes_sec": 15165220376, "op_per_sec": 9828, "read_op_per_sec": 182, "write_op_per_sec": 473}}]` var cephOSDPoolStatsResults = []expectedResult{ { metric: "ceph_pool_stats", fields: map[string]interface{}{ "read_bytes_sec": float64(0), "write_bytes_sec": float64(0), "op_per_sec": (*float64)(nil), "read_op_per_sec": float64(0), "write_op_per_sec": float64(0), "recovering_objects_per_sec": float64(0), "recovering_bytes_per_sec": float64(0), "recovering_keys_per_sec": float64(0), }, tags: map[string]string{ "name": "data", }, }, { metric: "ceph_pool_stats", fields: map[string]interface{}{ "read_bytes_sec": float64(10566067), "write_bytes_sec": float64(15165220376), "op_per_sec": pf(9828), "read_op_per_sec": float64(182), "write_op_per_sec": float64(473), "recovering_objects_per_sec": float64(279), "recovering_bytes_per_sec": float64(176401059), "recovering_keys_per_sec": float64(0), }, tags: map[string]string{ "name": "pbench", }, }, } func pf(i float64) *float64 { return &i }