130 lines
4.5 KiB
Go
130 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/egoist/mygo/ui"
|
|
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/code"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/devtools"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/input"
|
|
)
|
|
|
|
func devLogStreamDemo(c *ui.Context, log func(string)) {
|
|
dtSection(c, "LogStream", func() {
|
|
s := devControls(c, "447", log, false)
|
|
type state struct {
|
|
lines []code.LogLine
|
|
stream devtools.LogStreamState
|
|
}
|
|
st := ui.Local(c.Root(), "447", func() state {
|
|
return state{lines: []code.LogLine{{Level: code.LogInfo, Text: "server ready"}, {Level: code.LogWarn, Text: "slow query"}}}
|
|
})
|
|
if input.Button(c, "Append line", input.ButtonOptions{}).Clicked() {
|
|
st.lines = append(st.lines, code.LogLine{Time: c.Now(), Level: code.LogInfo, Text: fmt.Sprintf("request %d completed", len(st.lines))})
|
|
log("line appended")
|
|
}
|
|
devPreview(c, s, func() {
|
|
data := st.lines
|
|
if s.empty {
|
|
data = nil
|
|
}
|
|
if devtools.LogStream(c, data, &st.stream, devtools.LogStreamOptions{}).Changed() {
|
|
log("pause or level changed")
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
func devTraceWaterfallDemo(c *ui.Context, log func(string)) {
|
|
dtSection(c, "TraceWaterfall", func() {
|
|
s := devControls(c, "448", log, false)
|
|
spans := ui.Local(c.Root(), "448", func() []devtools.WaterfallSpan {
|
|
return []devtools.WaterfallSpan{{ID: "root", Name: "GET /api", Service: "gateway", Duration: 320 * time.Millisecond}, {ID: "db", Parent: "root", Name: "Query", Service: "database", Start: 40 * time.Millisecond, Duration: 90 * time.Millisecond}, {ID: "pay", Parent: "root", Name: "Charge", Service: "payments", Start: 230 * time.Millisecond, Duration: 80 * time.Millisecond, Error: true}}
|
|
})
|
|
devPreview(c, s, func() {
|
|
data := *spans
|
|
if s.empty {
|
|
data = nil
|
|
}
|
|
if devtools.TraceWaterfall(c, data, devtools.TraceWaterfallOptions{}).Changed() {
|
|
log("span selected")
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
func devSystemMonitorDemo(c *ui.Context, log func(string)) {
|
|
dtSection(c, "SystemMonitor", func() {
|
|
s := devControls(c, "450", log, true)
|
|
type state struct {
|
|
times []time.Time
|
|
metrics []devtools.MonitorMetric
|
|
}
|
|
st := ui.Local(c.Root(), "450", func() state {
|
|
out := state{metrics: []devtools.MonitorMetric{{Name: "CPU", Unit: "%"}, {Name: "Memory", Unit: "GB"}}}
|
|
for i := range 20 {
|
|
out.times = append(out.times, time.Date(2026, 10, 5, 9, 0, i*5, 0, time.UTC))
|
|
out.metrics[0].Samples = append(out.metrics[0].Samples, 40+float64(i%7)*3)
|
|
out.metrics[1].Samples = append(out.metrics[1].Samples, 3.2+float64(i)*0.02)
|
|
}
|
|
return out
|
|
})
|
|
if input.Button(c, "Append sample", input.ButtonOptions{}).Clicked() {
|
|
st.times = append(append([]time.Time(nil), st.times...), st.times[len(st.times)-1].Add(5*time.Second))
|
|
for i := range st.metrics {
|
|
last := st.metrics[i].Samples[len(st.metrics[i].Samples)-1]
|
|
st.metrics[i].Samples = append(append([]float64(nil), st.metrics[i].Samples...), last+0.1)
|
|
}
|
|
log("sample appended")
|
|
}
|
|
devPreview(c, s, func() {
|
|
times, metrics := st.times, st.metrics
|
|
if s.empty {
|
|
times, metrics = nil, nil
|
|
}
|
|
if devtools.SystemMonitor(c, times, metrics, devtools.SystemMonitorOptions{Status: s.status, Error: "Agent offline"}).Changed() {
|
|
log("retry requested")
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
func devRefreshIntervalSelectorDemo(c *ui.Context, log func(string)) {
|
|
dtSection(c, "RefreshIntervalSelector", func() {
|
|
s := devControls(c, "451", log, false)
|
|
interval := ui.Local(c.Root(), "451", func() time.Duration { return 0 })
|
|
refreshing := ui.Local(c.Root(), "451-refreshing", func() bool { return false })
|
|
if input.Checkbox(c, refreshing, "Refreshing", input.CheckboxOptions{}).Changed() {
|
|
log("refresh state changed")
|
|
}
|
|
devPreview(c, s, func() {
|
|
r := devtools.RefreshIntervalSelector(c, interval, devtools.RefreshIntervalSelectorOptions{Refreshing: *refreshing})
|
|
if r.Refresh {
|
|
log("refresh requested")
|
|
}
|
|
if r.Changed {
|
|
log("interval changed")
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
func devDashboardFilterBarDemo(c *ui.Context, log func(string)) {
|
|
dtSection(c, "DashboardFilterBar", func() {
|
|
s := devControls(c, "452", log, false)
|
|
filters := ui.Local(c.Root(), "452", func() devtools.DashboardFilters { return devtools.DashboardFilters{} })
|
|
devPreview(c, s, func() {
|
|
opts := devtools.DashboardFilterBarOptions{Envs: []string{"production", "staging"}, Tags: []string{"api", "db", "web"}}
|
|
if s.empty {
|
|
opts.Envs, opts.Tags = nil, nil
|
|
*filters = devtools.DashboardFilters{}
|
|
}
|
|
if devtools.DashboardFilterBar(c, filters, opts).Changed() {
|
|
log("filters changed")
|
|
}
|
|
})
|
|
})
|
|
}
|