feat:新增自动化拉取并汇总分析数据功能

This commit is contained in:
nnbcccscdscdsc
2026-03-24 16:05:14 +08:00
parent 9503862eda
commit f0d297f272
5 changed files with 411 additions and 1 deletions

View File

@@ -66,6 +66,48 @@ func LoadEventsFromFiles(paths []string) ([]Event, error) {
return events, nil
}
// LoadEventsFromFilesWithSharedMaxOffset 从多个 JSONL 原始日志文件中加载事件,
// 并按每个输入文件的最大 message_id 计算共享截断点。
func LoadEventsFromFilesWithSharedMaxOffset(paths []string, sharedMaxOffset uint64) ([]Event, *uint64, error) {
eventsByFile := make([][]Event, 0, len(paths))
var minMaxMessageID uint64
hasSharedMax := false
for _, path := range paths {
fileEvents, err := LoadEventsFromFile(path)
if err != nil {
return nil, nil, err
}
eventsByFile = append(eventsByFile, fileEvents)
fileMaxMessageID, ok := maxBusinessMessageID(fileEvents)
if !ok {
return nil, nil, nil
}
if !hasSharedMax || fileMaxMessageID < minMaxMessageID {
minMaxMessageID = fileMaxMessageID
hasSharedMax = true
}
}
if !hasSharedMax {
return nil, nil, nil
}
cutoff, ok := subtractUint64(minMaxMessageID, sharedMaxOffset)
if !ok {
return []Event{}, nil, nil
}
var events []Event
for _, fileEvents := range eventsByFile {
events = append(events, filterEventsByMaxMessageID(fileEvents, cutoff)...)
}
return events, &cutoff, nil
}
// LoadEventsFromFile 从单个 JSONL 原始日志文件中加载事件。
func LoadEventsFromFile(path string) ([]Event, error) {
file, err := os.Open(path)
@@ -357,6 +399,45 @@ func calculateBitrateBPS(bodySize int, latencyNS *int64) *float64 {
return &value
}
// 最大 message_id 计算函数
func maxBusinessMessageID(events []Event) (uint64, bool) {
var maxMessageID uint64
hasBusinessMessage := false
for _, event := range events {
if !IsBusinessEvent(event) {
continue
}
if !hasBusinessMessage || event.MessageID > maxMessageID {
maxMessageID = event.MessageID
hasBusinessMessage = true
}
}
return maxMessageID, hasBusinessMessage
}
// 根据 message_id 截断事件列表的函数
func filterEventsByMaxMessageID(events []Event, maxMessageID uint64) []Event {
filtered := make([]Event, 0, len(events))
for _, event := range events {
if event.MessageID > maxMessageID {
continue
}
filtered = append(filtered, event)
}
return filtered
}
func subtractUint64(value, offset uint64) (uint64, bool) {
if offset > value {
return 0, false
}
return value - offset, true
}
// 判断事件是否是业务相关的时延事件(其中一项)
func IsBusinessEvent(event Event) bool {
switch event.Event {