github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/raft/reporter.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package raft 5 6 import ( 7 humanize "github.com/dustin/go-humanize" 8 "github.com/hashicorp/raft" 9 "gopkg.in/juju/worker.v1/dependency" 10 ) 11 12 // Report is part of the dependency.Reporter interface. 13 func (w *Worker) Report() map[string]interface{} { 14 out := make(map[string]interface{}) 15 r, err := w.Raft() 16 if err != nil { 17 out[dependency.KeyError] = err.Error() 18 return out 19 } 20 21 state := r.State() 22 out[dependency.KeyState] = state.String() 23 out["leader"] = r.Leader() 24 out["index"] = map[string]interface{}{ 25 "applied": r.AppliedIndex(), 26 "last": r.LastIndex(), 27 } 28 if state != raft.Leader { 29 lastContact := "never" 30 if t := r.LastContact(); !t.IsZero() { 31 lastContact = humanize.Time(t) 32 } 33 out["last-contact"] = lastContact 34 } 35 36 config := make(map[string]interface{}) 37 future := r.GetConfiguration() 38 if err := future.Error(); err != nil { 39 config[dependency.KeyError] = err.Error() 40 } else { 41 servers := make(map[string]interface{}) 42 for _, server := range future.Configuration().Servers { 43 servers[string(server.ID)] = map[string]interface{}{ 44 "suffrage": server.Suffrage.String(), 45 "address": server.Address, 46 } 47 } 48 config["servers"] = servers 49 } 50 out["cluster-config"] = config 51 52 return out 53 }