refact metrics

mine
derailed 2019-06-21 23:49:19 -06:00
parent 1ffb11dbd6
commit 68b45fa6ec
3 changed files with 78 additions and 51 deletions

View File

@ -128,7 +128,7 @@ func (r *Container) Fields(ns string) Row {
ff := make(Row, 0, len(r.Header(ns)))
i := r.instance
scpu, smem, pcpu, pmem := gatherMetrics(i, r.metrics)
c, p := gatherMetrics(i, r.metrics)
ready, state, restarts := "false", MissingValue, "0"
cs := getContainerStatus(i.Name, r.pod.Status)
@ -143,10 +143,10 @@ func (r *Container) Fields(ns string) Row {
state,
restarts,
probe(i.LivenessProbe)+":"+probe(i.ReadinessProbe),
scpu,
smem,
pcpu,
pmem,
c.cpu,
c.mem,
p.cpu,
p.mem,
toStrPorts(i.Ports),
toAge(r.pod.CreationTimestamp),
)
@ -155,8 +155,8 @@ func (r *Container) Fields(ns string) Row {
// ----------------------------------------------------------------------------
// Helpers...
func gatherMetrics(co v1.Container, mx *mv1beta1.PodMetrics) (scpu, smem, pcpu, pmem string) {
scpu, smem, pcpu, pmem = NAValue, NAValue, NAValue, NAValue
func gatherMetrics(co v1.Container, mx *mv1beta1.PodMetrics) (c, p metric) {
c, p = noMetric(), noMetric()
if mx == nil {
return
}
@ -166,21 +166,23 @@ func gatherMetrics(co v1.Container, mx *mv1beta1.PodMetrics) (scpu, smem, pcpu,
mem float64
)
for _, c := range mx.Containers {
if c.Name != co.Name {
continue
if c.Name == co.Name {
cpu = c.Usage.Cpu().MilliValue()
mem = k8s.ToMB(c.Usage.Memory().Value())
break
}
cpu = c.Usage.Cpu().MilliValue()
mem = k8s.ToMB(c.Usage.Memory().Value())
break
}
c = metric{
cpu: ToMillicore(cpu),
mem: ToMi(mem),
}
scpu, smem = ToMillicore(cpu), ToMi(mem)
rcpu, rmem := containerResources(co)
if rcpu != nil {
pcpu = AsPerc(toPerc(float64(cpu), float64(rcpu.MilliValue())))
p.cpu = AsPerc(toPerc(float64(cpu), float64(rcpu.MilliValue())))
}
if rmem != nil {
pmem = AsPerc(toPerc(mem, k8s.ToMB(rmem.Value())))
p.mem = AsPerc(toPerc(mem, k8s.ToMB(rmem.Value())))
}
return

View File

@ -139,25 +139,7 @@ func (r *Node) Fields(ns string) Row {
iIP, eIP := r.getIPs(no.Status.Addresses)
iIP, eIP = missing(iIP), missing(eIP)
ccpu, cmem, scpu, smem, pcpu, pmem := NAValue, NAValue, NAValue, NAValue, NAValue, NAValue
if r.metrics != nil {
var (
cpu int64
mem float64
)
cpu = r.metrics.Usage.Cpu().MilliValue()
mem = k8s.ToMB(r.metrics.Usage.Memory().Value())
acpu := no.Status.Allocatable.Cpu().MilliValue()
amem := k8s.ToMB(no.Status.Allocatable.Memory().Value())
ccpu = ToMillicore(cpu)
pcpu = AsPerc(toPerc(float64(cpu), float64(acpu)))
cmem = ToMi(mem)
pmem = AsPerc(toPerc(mem, amem))
scpu = ToMillicore(cpu)
smem = ToMi(mem)
}
c, a, p := gatherNodeMX(no, r.metrics)
sta := make([]string, 10)
r.status(no.Status, no.Spec.Unschedulable, sta)
@ -172,12 +154,12 @@ func (r *Node) Fields(ns string) Row {
no.Status.NodeInfo.KernelVersion,
iIP,
eIP,
ccpu,
cmem,
pcpu,
pmem,
scpu,
smem,
c.cpu,
c.mem,
p.cpu,
p.mem,
a.cpu,
a.mem,
toAge(no.ObjectMeta.CreationTimestamp),
)
}
@ -185,6 +167,42 @@ func (r *Node) Fields(ns string) Row {
// ----------------------------------------------------------------------------
// Helpers...
type metric struct {
cpu, mem string
}
func noMetric() metric {
return metric{cpu: NAValue, mem: NAValue}
}
func gatherNodeMX(no *v1.Node, mx *mv1beta1.NodeMetrics) (c metric, a metric, p metric) {
c, a, p = noMetric(), noMetric(), noMetric()
if mx == nil {
return
}
cpu := mx.Usage.Cpu().MilliValue()
mem := k8s.ToMB(mx.Usage.Memory().Value())
c = metric{
cpu: ToMillicore(cpu),
mem: ToMi(mem),
}
acpu := no.Status.Allocatable.Cpu().MilliValue()
amem := k8s.ToMB(no.Status.Allocatable.Memory().Value())
a = metric{
cpu: ToMillicore(acpu),
mem: ToMi(amem),
}
p = metric{
cpu: AsPerc(toPerc(float64(cpu), float64(acpu))),
mem: AsPerc(toPerc(mem, amem)),
}
return
}
func withPerc(v, p string) string {
return v + " (" + p + ")"
}

View File

@ -268,17 +268,18 @@ func (r *Pod) Fields(ns string) Row {
ss := i.Status.ContainerStatuses
cr, _, rc := r.statuses(ss)
ccpu, cmem, pcpu, pmem := r.gatherPodMetrics(i)
c, p := r.gatherPodMX(i)
return append(ff,
i.ObjectMeta.Name,
strconv.Itoa(cr)+"/"+strconv.Itoa(len(ss)),
r.phase(i),
strconv.Itoa(rc),
ccpu,
cmem,
pcpu,
pmem,
c.cpu,
c.mem,
p.cpu,
p.mem,
na(i.Status.PodIP),
na(i.Spec.NodeName),
r.mapQOS(i.Status.QOSClass),
@ -289,17 +290,23 @@ func (r *Pod) Fields(ns string) Row {
// ----------------------------------------------------------------------------
// Helpers...
func (r *Pod) gatherPodMetrics(po *v1.Pod) (ccpu, cmem, pcpu, pmem string) {
ccpu, cmem, pcpu, pmem = NAValue, NAValue, NAValue, NAValue
func (r *Pod) gatherPodMX(po *v1.Pod) (c, p metric) {
c, p = noMetric(), noMetric()
if r.metrics == nil {
return
}
c, m := r.currentRes(r.metrics)
ccpu, cmem = ToMillicore(c.MilliValue()), ToMi(k8s.ToMB(m.Value()))
cpu, mem := r.currentRes(r.metrics)
c = metric{
cpu: ToMillicore(cpu.MilliValue()),
mem: ToMi(k8s.ToMB(mem.Value())),
}
rc, rm := r.requestedRes(po)
pcpu = AsPerc(toPerc(float64(c.MilliValue()), float64(rc.MilliValue())))
pmem = AsPerc(toPerc(k8s.ToMB(m.Value()), k8s.ToMB(rm.Value())))
p = metric{
cpu: AsPerc(toPerc(float64(cpu.MilliValue()), float64(rc.MilliValue()))),
mem: AsPerc(toPerc(k8s.ToMB(mem.Value()), k8s.ToMB(rm.Value()))),
}
return
}