visual alerter basic functionality
This commit is contained in:
parent
3aaa1896cc
commit
cf68e2a654
|
@ -1,10 +1,12 @@
|
||||||
package component
|
package component
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/sqshq/sampler/console"
|
"github.com/sqshq/sampler/console"
|
||||||
"github.com/sqshq/sampler/data"
|
"github.com/sqshq/sampler/data"
|
||||||
ui "github.com/sqshq/termui"
|
ui "github.com/sqshq/termui"
|
||||||
"image"
|
"image"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Alerter struct {
|
type Alerter struct {
|
||||||
|
@ -35,7 +37,57 @@ func (a *Alerter) RenderAlert(buffer *ui.Buffer, area image.Rectangle) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.Fill(ui.NewCell(' ', ui.NewStyle(console.ColorBlack)), area)
|
color := console.ColorWhite
|
||||||
buffer.SetString(a.alert.Title, ui.NewStyle(console.ColorWhite), getMiddlePoint(area, a.alert.Title, -1))
|
|
||||||
buffer.SetString(a.alert.Text, ui.NewStyle(console.ColorWhite), getMiddlePoint(area, a.alert.Text, 0))
|
if a.alert.Color != nil {
|
||||||
|
color = *a.alert.Color
|
||||||
|
}
|
||||||
|
|
||||||
|
width := max(len(a.alert.Title), len(a.alert.Text)) + 10
|
||||||
|
|
||||||
|
if width > area.Dx() {
|
||||||
|
width = area.Dx()
|
||||||
|
}
|
||||||
|
|
||||||
|
cells := ui.WrapCells(ui.ParseText(fmt.Sprintf("%s\n%s\n",
|
||||||
|
strings.ToUpper(a.alert.Title), a.alert.Text), ui.NewStyle(console.ColorWhite)), uint(width))
|
||||||
|
|
||||||
|
var lines []string
|
||||||
|
line := ""
|
||||||
|
|
||||||
|
for i := 0; i < len(cells); i++ {
|
||||||
|
if cells[i].Rune == '\n' {
|
||||||
|
lines = append(lines, line)
|
||||||
|
line = ""
|
||||||
|
} else {
|
||||||
|
line += string(cells[i].Rune)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
block := *ui.NewBlock()
|
||||||
|
block.SetRect(getRectCoordinates(area, width, len(lines)))
|
||||||
|
block.BorderStyle = ui.Style{Fg: color}
|
||||||
|
block.Draw(buffer)
|
||||||
|
|
||||||
|
buffer.Fill(ui.NewCell(' ', ui.NewStyle(console.ColorBlack)), block.Inner)
|
||||||
|
|
||||||
|
for i := 0; i < len(lines); i++ {
|
||||||
|
buffer.SetString(lines[i],
|
||||||
|
ui.NewStyle(color), getMiddlePoint(block.Inner, lines[i], i-1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO move to utils
|
||||||
|
func max(a int, b int) int {
|
||||||
|
if a > b {
|
||||||
|
return a
|
||||||
|
} else {
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRectCoordinates(area image.Rectangle, width int, height int) (int, int, int, int) {
|
||||||
|
x1 := area.Min.X + area.Dx()/2 - width/2
|
||||||
|
y1 := area.Min.Y + area.Dy()/2 - height
|
||||||
|
return x1, y1, x1 + width, y1 + height + 2
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ func (m *Menu) printAllDirectionsArrowSign(buffer *ui.Buffer, y int) {
|
||||||
func (m *Menu) renderOptions(buffer *ui.Buffer) {
|
func (m *Menu) renderOptions(buffer *ui.Buffer) {
|
||||||
|
|
||||||
// TODO extract styles to console.Palette
|
// TODO extract styles to console.Palette
|
||||||
highlightedStyle := ui.NewStyle(console.ColorOlive, console.ColorBlack, ui.ModifierReverse)
|
highlightedStyle := ui.NewStyle(console.ColorBlack, console.ColorOlive)
|
||||||
regularStyle := ui.NewStyle(console.ColorWhite, console.ColorBlack)
|
regularStyle := ui.NewStyle(console.ColorWhite, console.ColorBlack)
|
||||||
|
|
||||||
offset := 1
|
offset := 1
|
||||||
|
|
|
@ -7,7 +7,7 @@ runcharts:
|
||||||
w: 53
|
w: 53
|
||||||
h: 16
|
h: 16
|
||||||
triggers:
|
triggers:
|
||||||
- title: LATENCY
|
- title: Latency threshold exceeded
|
||||||
condition: echo "$prev < 0.2 && $cur > 0.2" |bc -l
|
condition: echo "$prev < 0.2 && $cur > 0.2" |bc -l
|
||||||
actions:
|
actions:
|
||||||
terminal-bell: true
|
terminal-bell: true
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package data
|
package data
|
||||||
|
|
||||||
|
import ui "github.com/sqshq/termui"
|
||||||
|
|
||||||
type Consumer struct {
|
type Consumer struct {
|
||||||
SampleChannel chan Sample
|
SampleChannel chan Sample
|
||||||
AlertChannel chan Alert
|
AlertChannel chan Alert
|
||||||
|
@ -8,11 +10,13 @@ type Consumer struct {
|
||||||
type Sample struct {
|
type Sample struct {
|
||||||
Label string
|
Label string
|
||||||
Value string
|
Value string
|
||||||
|
Color *ui.Color
|
||||||
}
|
}
|
||||||
|
|
||||||
type Alert struct {
|
type Alert struct {
|
||||||
Title string
|
Title string
|
||||||
Text string
|
Text string
|
||||||
|
Color *ui.Color
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConsumer() Consumer {
|
func NewConsumer() Consumer {
|
||||||
|
|
|
@ -51,13 +51,14 @@ func (s *Sampler) sample(item Item) {
|
||||||
val, err := item.nextValue()
|
val, err := item.nextValue()
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
sample := Sample{Label: item.Label, Value: val}
|
sample := Sample{Label: item.Label, Value: val, Color: item.Color}
|
||||||
s.consumer.SampleChannel <- sample
|
s.consumer.SampleChannel <- sample
|
||||||
s.triggersChannel <- sample
|
s.triggersChannel <- sample
|
||||||
} else {
|
} else {
|
||||||
s.consumer.AlertChannel <- Alert{
|
s.consumer.AlertChannel <- Alert{
|
||||||
Title: "SAMPLING FAILURE",
|
Title: "SAMPLING FAILURE",
|
||||||
Text: err.Error(),
|
Text: err.Error(),
|
||||||
|
Color: item.Color,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,9 @@ func (t *Trigger) Execute(sample Sample) {
|
||||||
|
|
||||||
if t.actions.visual {
|
if t.actions.visual {
|
||||||
t.consumer.AlertChannel <- Alert{
|
t.consumer.AlertChannel <- Alert{
|
||||||
Title: t.title, Text: fmt.Sprintf("%s: %v", sample.Label, sample.Value),
|
Title: t.title,
|
||||||
|
Text: fmt.Sprintf("%s: %v", sample.Label, sample.Value),
|
||||||
|
Color: sample.Color,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +103,7 @@ func (t *Trigger) evaluate(sample Sample) bool {
|
||||||
output, err := runScript(t.condition, sample.Label, t.valuesByLabel[sample.Label])
|
output, err := runScript(t.condition, sample.Label, t.valuesByLabel[sample.Label])
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
//t.consumer.AlertChannel <- Alert{Title: "TRIGGER CONDITION FAILURE", Text: err.Error()}
|
t.consumer.AlertChannel <- Alert{Title: "TRIGGER CONDITION FAILURE", Text: err.Error()}
|
||||||
}
|
}
|
||||||
|
|
||||||
return t.digitsRegexp.ReplaceAllString(string(output), "") == TrueIndicator
|
return t.digitsRegexp.ReplaceAllString(string(output), "") == TrueIndicator
|
||||||
|
|
Loading…
Reference in New Issue