Files
MujicaUI/examples/gallery/pages_devtools_streams.go
T

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")
}
})
})
}