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  }