diff --git a/plugins/inputs/ceph/README.md b/plugins/inputs/ceph/README.md index 88ca4aff7c171..33585b079562a 100644 --- a/plugins/inputs/ceph/README.md +++ b/plugins/inputs/ceph/README.md @@ -136,6 +136,11 @@ All admin measurements will have the following tags: *Cluster Stats* ++ ceph_health + - fields: + - status + - overall_status + - ceph_osdmap - fields: - epoch (float) @@ -209,6 +214,7 @@ ceph_pool_usage,name=telegraf kb_used=0,bytes_used=0,objects=0 15506589110000000 ceph_pgmap_state,state=undersized+peered count=30 1550658910000000000 ceph_pgmap bytes_total=10733223936,read_op_per_sec=0,write_op_per_sec=0,num_pgs=30,data_bytes=0,bytes_avail=9654697984,read_bytes_sec=0,write_bytes_sec=0,version=0,bytes_used=1078525952 1550658910000000000 ceph_osdmap num_up_osds=1,num_in_osds=1,full=false,nearfull=false,num_remapped_pgs=0,epoch=34,num_osds=1 1550658910000000000 +ceph_health status="HEALTH_WARN",overall_status="HEALTH_WARN" 1550658910000000000 ``` *Admin Socket Stats* diff --git a/plugins/inputs/ceph/ceph.go b/plugins/inputs/ceph/ceph.go index d3911102d8011..e28f977d23777 100644 --- a/plugins/inputs/ceph/ceph.go +++ b/plugins/inputs/ceph/ceph.go @@ -319,6 +319,10 @@ func (c *Ceph) exec(command string) (string, error) { // CephStatus is used to unmarshal "ceph -s" output type CephStatus struct { + Health struct { + Status string `json:"status"` + OverallStatus string `json:"overall_status"` + } `json:"health"` OSDMap struct { OSDMap struct { Epoch float64 `json:"epoch"` @@ -357,6 +361,7 @@ func decodeStatus(acc telegraf.Accumulator, input string) error { } decoders := []func(telegraf.Accumulator, *CephStatus) error{ + decodeStatusHealth, decodeStatusOsdmap, decodeStatusPgmap, decodeStatusPgmapState, @@ -371,6 +376,16 @@ func decodeStatus(acc telegraf.Accumulator, input string) error { return nil } +// decodeStatusHealth decodes the health portion of the output of 'ceph status' +func decodeStatusHealth(acc telegraf.Accumulator, data *CephStatus) error { + fields := map[string]interface{}{ + "status": data.Health.Status, + "overall_status": data.Health.OverallStatus, + } + acc.AddFields("ceph_health", fields, map[string]string{}) + return nil +} + // decodeStatusOsdmap decodes the OSD map portion of the output of 'ceph -s' func decodeStatusOsdmap(acc telegraf.Accumulator, data *CephStatus) error { fields := map[string]interface{}{