sparkline visualisation enhancements
This commit is contained in:
parent
e67ac7c19a
commit
017d7e5b18
|
@ -61,24 +61,29 @@ func (s *SparkLine) consumeSample(sample *data.Sample) {
|
||||||
}
|
}
|
||||||
|
|
||||||
s.values = append(s.values, float)
|
s.values = append(s.values, float)
|
||||||
// TODO cleanup old ones
|
max, min := s.values[0], s.values[0]
|
||||||
|
|
||||||
for i := len(s.values) - 1; i >= 0; i-- {
|
for i := len(s.values) - 1; i >= 0; i-- {
|
||||||
if len(s.values)-i > s.Dx() {
|
if len(s.values)-i > s.Dx() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if s.values[i] > s.maxValue {
|
if s.values[i] > max {
|
||||||
s.maxValue = s.values[i]
|
max = s.values[i]
|
||||||
}
|
|
||||||
if s.values[i] < s.minValue {
|
|
||||||
s.minValue = s.values[i]
|
|
||||||
}
|
}
|
||||||
|
if s.values[i] < min {
|
||||||
|
min = s.values[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.maxValue = max
|
||||||
|
s.minValue = min
|
||||||
|
|
||||||
|
// perform cleanup once in a while
|
||||||
|
if len(s.values)%100 == 0 {
|
||||||
|
s.values = append(s.values[:0], s.values[len(s.values)-s.Dx()+1:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO make sure that 0 value is still printed
|
|
||||||
// TODO make sure that cur value is printed on the same Y as sparkline (include in for loop for last iteratiton)
|
|
||||||
// TODO gradient color
|
|
||||||
func (s *SparkLine) Draw(buffer *ui.Buffer) {
|
func (s *SparkLine) Draw(buffer *ui.Buffer) {
|
||||||
|
|
||||||
textStyle := ui.NewStyle(s.palette.BaseColor)
|
textStyle := ui.NewStyle(s.palette.BaseColor)
|
||||||
|
@ -88,12 +93,6 @@ func (s *SparkLine) Draw(buffer *ui.Buffer) {
|
||||||
maxValue := util.FormatValue(s.maxValue, s.scale)
|
maxValue := util.FormatValue(s.maxValue, s.scale)
|
||||||
curValue := util.FormatValue(s.values[len(s.values)-1], s.scale)
|
curValue := util.FormatValue(s.values[len(s.values)-1], s.scale)
|
||||||
|
|
||||||
buffer.SetString(minValue, textStyle, image.Pt(s.Min.X+2, s.Max.Y-2))
|
|
||||||
buffer.SetString(maxValue, textStyle, image.Pt(s.Min.X+2, s.Min.Y+2))
|
|
||||||
|
|
||||||
curY := int((s.values[len(s.values)-1]/s.maxValue)*float64(s.Dy())) - 1
|
|
||||||
buffer.SetString(curValue, textStyle, image.Pt(s.Max.X-len(curValue)-2, s.Max.Y-util.Max([]int{curY, 2})))
|
|
||||||
|
|
||||||
indent := 2 + util.Max([]int{
|
indent := 2 + util.Max([]int{
|
||||||
len(minValue), len(maxValue), len(curValue),
|
len(minValue), len(maxValue), len(curValue),
|
||||||
})
|
})
|
||||||
|
@ -102,12 +101,23 @@ func (s *SparkLine) Draw(buffer *ui.Buffer) {
|
||||||
|
|
||||||
n := len(s.values) - i
|
n := len(s.values) - i
|
||||||
|
|
||||||
if n > s.Dx()-indent*2-2 {
|
if n > s.Dx()-indent-3 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
for j := 1; j < int((s.values[i]/s.maxValue)*float64(s.Dy()-2))+2; j++ {
|
top := int((s.values[i] / s.maxValue) * float64(s.Dy()-2))
|
||||||
buffer.SetString("▪", lineStyle, image.Pt(s.Inner.Max.X-n-indent, s.Inner.Max.Y-j))
|
|
||||||
|
if top == 0 {
|
||||||
|
top = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
for j := 1; j <= top; j++ {
|
||||||
|
buffer.SetCell(ui.NewCell(console.SymbolSquare, lineStyle), image.Pt(s.Inner.Max.X-n-indent, s.Inner.Max.Y-j))
|
||||||
|
if i == len(s.values)-1 && j == top {
|
||||||
|
buffer.SetString(curValue, textStyle, image.Pt(s.Inner.Max.X-n-indent+2, s.Inner.Max.Y-j))
|
||||||
|
buffer.SetString(minValue, textStyle, image.Pt(s.Inner.Max.X-n-indent+2, s.Max.Y-2))
|
||||||
|
buffer.SetString(maxValue, textStyle, image.Pt(s.Inner.Max.X-n-indent+2, s.Min.Y+1))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ runcharts:
|
||||||
position: [[0, 0], [52, 16]]
|
position: [[0, 0], [52, 16]]
|
||||||
triggers:
|
triggers:
|
||||||
- title: Latency threshold exceeded
|
- title: Latency threshold exceeded
|
||||||
condition: echo "$prev < 0.55 && $cur > 0.55" |bc -l
|
condition: echo "$prev < 0.8 && $cur > 0.8" |bc -l
|
||||||
actions:
|
actions:
|
||||||
terminal-bell: true
|
terminal-bell: true
|
||||||
sound: true
|
sound: true
|
||||||
|
@ -88,3 +88,7 @@ sparklines:
|
||||||
position: [[27, 17], [25, 5]]
|
position: [[27, 17], [25, 5]]
|
||||||
scale: 0
|
scale: 0
|
||||||
value: ps -A -o %cpu | awk '{s+=$1} END {print s}'
|
value: ps -A -o %cpu | awk '{s+=$1} END {print s}'
|
||||||
|
- title: Memory pages free
|
||||||
|
position: [[27, 27], [25, 5]]
|
||||||
|
scale: 0
|
||||||
|
value: memory_pressure | grep 'Pages free' | awk '{print $3}'
|
||||||
|
|
|
@ -4,4 +4,5 @@ const (
|
||||||
SymbolSelection rune = '▲'
|
SymbolSelection rune = '▲'
|
||||||
SymbolVerticalBar rune = '▎'
|
SymbolVerticalBar rune = '▎'
|
||||||
SymbolHorizontalBar rune = '═'
|
SymbolHorizontalBar rune = '═'
|
||||||
|
SymbolSquare rune = '■'
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue