1
0
mirror of https://github.com/divan/expvarmon.git synced 2025-04-25 13:48:54 +08:00

Add N/A feature to var

This commit is contained in:
Ivan Daniluk 2016-11-13 21:57:32 +01:00
parent 542b9fcc4a
commit ee36707e1d
2 changed files with 48 additions and 28 deletions

View File

@ -82,7 +82,8 @@ func (s *Service) Update(wg *sync.WaitGroup) {
for name, v := range s.Vars {
value, err := expvar.GetValue(name.ToSlice()...)
if err != nil {
v.Set(nil)
v.SetNA()
continue
}
v.Set(value)
}

73
var.go
View File

@ -35,6 +35,7 @@ type Var interface {
Kind() VarKind
String() string
Set(*jason.Value)
SetNA() // mark as N/A
}
// IntVar represents variable which value can be represented as integer,
@ -71,10 +72,14 @@ func NewVar(name VarName) Var {
// to separate float from int, so let's keep everything as float.
type Number struct {
val float64
na bool
}
func (v *Number) Kind() VarKind { return KindDefault }
func (v *Number) String() string {
if v.na {
return "N/A"
}
// if fraction part is zero, assume int's integer
if _, frac := math.Modf(v.val); frac == 0 {
return fmt.Sprintf("%.0f", v.val)
@ -83,10 +88,7 @@ func (v *Number) String() string {
return fmt.Sprintf("%.02f", v.val)
}
func (v *Number) Set(j *jason.Value) {
if j == nil {
v.val = 0
return
}
v.na = false
if n, err := j.Float64(); err == nil {
v.val = n
} else if n, err := j.Int64(); err == nil {
@ -95,6 +97,10 @@ func (v *Number) Set(j *jason.Value) {
v.val = 0
}
}
func (v *Number) SetNA() {
v.na = true
v.val = 0
}
// Value implements IntVar for Number type.
func (v *Number) Value() int {
@ -104,17 +110,18 @@ func (v *Number) Value() int {
// Memory represents memory information in bytes.
type Memory struct {
bytes int64
na bool
}
func (v *Memory) Kind() VarKind { return KindMemory }
func (v *Memory) String() string {
if v.na {
return "N/A"
}
return fmt.Sprintf("%s", byten.Size(v.bytes))
}
func (v *Memory) Set(j *jason.Value) {
if j == nil {
v.bytes = 0
return
}
v.na = false
if n, err := j.Int64(); err == nil {
v.bytes = n
} else {
@ -127,22 +134,27 @@ func (v *Memory) Value() int {
// TODO: check for possible overflows
return int(v.bytes)
}
func (v *Memory) SetNA() {
v.na = true
v.bytes = 0
}
// Duration represents duration data (in ns)
type Duration struct {
dur time.Duration
na bool
}
func (v *Duration) Kind() VarKind { return KindDuration }
func (v *Duration) String() string {
if v.na {
return "N/A"
}
return fmt.Sprintf("%s", round(time.Duration(v.dur)))
}
func (v *Duration) Set(j *jason.Value) {
if j == nil {
v.dur = 0
return
}
v.na = false
if n, err := j.Int64(); err == nil {
v.dur = time.Duration(n)
} else if n, err := j.Float64(); err == nil {
@ -157,6 +169,10 @@ func (v *Duration) Value() int {
// TODO: check for possible overflows
return int(v.dur)
}
func (v *Duration) SetNA() {
v.na = true
v.dur = 0
}
// Strings represents string data.
type String struct {
@ -166,16 +182,15 @@ type String struct {
func (v *String) Kind() VarKind { return KindString }
func (v *String) String() string { return v.str }
func (v *String) Set(j *jason.Value) {
if j == nil {
v.str = "N/A"
return
}
if n, err := j.String(); err == nil {
v.str = n
} else {
v.str = "N/A"
}
}
func (v *String) SetNA() {
v.str = "N/A"
}
// GCPauses represents GC pauses data.
//
@ -185,12 +200,13 @@ func (v *String) Set(j *jason.Value) {
type GCPauses struct {
pauses [256]uint64
hist *Histogram
na bool
}
func (v *GCPauses) Kind() VarKind { return KindGCPauses }
func (v *GCPauses) String() string {
if v.hist == nil {
return ""
if v.na {
return "N/A"
}
// return Mean by default
return fmt.Sprintf("%v", round(time.Duration(v.hist.Mean())))
@ -203,10 +219,8 @@ func (v *GCPauses) Value() int {
return int(v.hist.Mean())
}
func (v *GCPauses) Set(j *jason.Value) {
v.na = false
v.pauses = [256]uint64{}
if j == nil {
return
}
if arr, err := j.Array(); err == nil {
for i := 0; i < len(arr); i++ {
p, _ := arr[i].Int64()
@ -232,6 +246,9 @@ func (v *GCPauses) Histogram(bins int) *Histogram {
v.hist = hist
return v.hist
}
func (v *GCPauses) SetNA() {
v.na = true
}
// GCIntervals represents GC pauses intervals.
//
@ -240,28 +257,27 @@ func (v *GCPauses) Histogram(bins int) *Histogram {
type GCIntervals struct {
intervals [256]uint64
hist *Histogram
na bool
}
func (v *GCIntervals) Kind() VarKind { return KindGCIntervals }
func (v *GCIntervals) String() string {
if v.hist == nil {
return ""
if v.na {
return "N/A"
}
// return Mean by default
return fmt.Sprintf("%v", round(time.Duration(v.hist.Mean())))
}
func (v *GCIntervals) Value() int {
if v.hist == nil {
if v.na {
return 0
}
// return Mean by default
return int(v.hist.Mean())
}
func (v *GCIntervals) Set(j *jason.Value) {
v.na = false
v.intervals = [256]uint64{}
if j == nil {
return
}
// as original array contains UNIX timestamps,
// we want to calculate diffs to previous values (interval)
// and work with them
@ -318,6 +334,9 @@ func (v *GCIntervals) Histogram(bins int) *Histogram {
v.hist = hist
return hist
}
func (v *GCIntervals) SetNA() {
v.na = true
}
// TODO: add boolean, timestamp, types