Files
OmniSocketGo/cmd/latencysummary/main.go
2026-03-24 16:08:13 +08:00

68 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"flag"
"log"
"path/filepath"
"strings"
"omnisocketgo/cmd/internal/latencylog"
)
type stringListFlag []string
func (f *stringListFlag) String() string {
return ""
}
func (f *stringListFlag) Set(value string) error {
*f = append(*f, value)
return nil
}
func main() {
var inputPaths stringListFlag
outputPath := flag.String("output", "latency-summary.jsonl", "output JSONL file for summarized latency metrics")
// shared-max-offset 是一个可选参数,用于在对齐输入文件的 per-file max message_id 后,排除掉最新的共享 message_id 以外的记录。它指定了要排除的共享 message_id 的数量。
sharedMaxOffset := flag.Uint64("shared-max-offset", 1, "number of newest shared message IDs to exclude after aligning inputs by per-file max message_id")
flag.Var(&inputPaths, "input", "raw latency JSONL file path; can be provided multiple times")
flag.Parse()
if len(inputPaths) == 0 {
log.Fatal("at least one -input raw latency log file is required")
}
events, sharedMaxMessageID, err := latencylog.LoadEventsFromFilesWithSharedMaxOffset(inputPaths, *sharedMaxOffset)
if err != nil {
log.Fatalf("load raw latency logs: %v", err)
}
// sharedMaxMessageID 可能为 nil表示没有可用的共享 message_id 截止值(例如因为输入文件中没有共享消息)。在这种情况下,我们将继续处理所有事件,但会记录一个警告。
if sharedMaxMessageID != nil {
log.Printf("using shared message_id cutoff <= %d (shared-max-offset=%d)", *sharedMaxMessageID, *sharedMaxOffset)
} else {
log.Printf("no shared message_id cutoff available after applying shared-max-offset=%d", *sharedMaxOffset)
}
summaries := latencylog.SummarizeEvents(events)
if err := latencylog.WriteSummariesJSONL(*outputPath, summaries); err != nil {
log.Fatalf("write latency summary: %v", err)
}
chartPath := replaceFileExt(*outputPath, ".html")
if err := latencylog.WriteSummariesHTMLChart(chartPath, summaries); err != nil {
log.Fatalf("write latency chart: %v", err)
}
log.Printf("wrote %d summarized message records to %s", len(summaries), *outputPath)
log.Printf("wrote simple latency chart to %s", chartPath)
}
func replaceFileExt(path, ext string) string {
currentExt := filepath.Ext(path)
if currentExt == "" {
return path + ext
}
return strings.TrimSuffix(path, currentExt) + ext
}