68 lines
2.3 KiB
Go
68 lines
2.3 KiB
Go
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
|
||
}
|