refactor(tixel-watch): refactor watch-tool to enable type safety and better performance

This commit is contained in:
Patryk Hegenberg 2025-09-21 22:36:05 +02:00
parent 159df116c8
commit 25dffecb43
8 changed files with 367 additions and 201 deletions

View file

@ -5,6 +5,7 @@ import (
"fmt"
"log/slog"
"regexp"
"strconv"
"strings"
"github.com/hpcloud/tail"
@ -100,7 +101,7 @@ type DefaultLogParser struct{}
func (p *DefaultLogParser) Parse(line string, toolName string) LogEntry {
entry := NewLogEntry("log_entry")
entry.Tool = toolName
entry.Message = strings.TrimSpace(line)
entry.LogMessage = strings.TrimSpace(line)
entry.Raw = line
return entry
}
@ -119,7 +120,7 @@ func (p *RegexLogParser) Parse(line string, toolName string) LogEntry {
if fields != nil {
entry.Fields = fields
} else {
entry.Message = strings.TrimSpace(line)
entry.LogMessage = strings.TrimSpace(line)
}
return entry
@ -159,34 +160,36 @@ func (p *NginxTJMLogParser) Parse(line string, toolName string) LogEntry {
entry := NewLogEntry("log_entry")
entry.Tool = toolName
entry.Raw = line
entry.Fields = p.parseNginxTJM(line)
entry = p.parseNginxTJM(entry)
return entry
}
func (p *NginxTJMLogParser) parseNginxTJM(text string) map[string]any {
parts := strings.Fields(text)
func (p *NginxTJMLogParser) parseNginxTJM(entry LogEntry) LogEntry {
newEntry := entry
var nginxBase NGinXBaseInfo
parts := strings.Fields(entry.Raw)
if len(parts) < 10 {
return map[string]any{
"raw": text,
}
return newEntry
}
fields := make(map[string]any)
if len(parts) > 0 {
timestamp := strings.Trim(parts[0], "[]")
fields["timestamp"] = timestamp
timestampStr := strings.Trim(parts[0], "[]")
timestamp, err := parseRFC3339WithOptionalZ(timestampStr)
if err != nil {
slog.Error("unable to parse time", "error", err)
}
newEntry.Timestamp = timestamp
}
if len(parts) > 2 {
fields["client_ip"] = parts[2]
nginxBase.ClientIP = parts[2]
}
for i, part := range parts {
if strings.HasPrefix(part, "\"") {
if i+1 < len(parts) {
fields["method"] = strings.Trim(part, "\"")
fields["route"] = parts[i+1]
nginxBase.HTTPMethod = strings.Trim(part, "\"")
nginxBase.Route = parts[i+1]
}
break
}
@ -194,10 +197,15 @@ func (p *NginxTJMLogParser) parseNginxTJM(text string) map[string]any {
for _, part := range parts {
if after, ok := strings.CutPrefix(part, "status="); ok {
fields["status"] = after
statusCode, err := strconv.ParseInt(after, 10, 64)
if err != nil {
slog.Error("cant convert statuscode", "error", err)
}
nginxBase.StatusCode = int(statusCode)
break
}
}
newEntry.BaseInformation = nginxBase
return fields
return newEntry
}