refactor(tixel-watch): refactor watch-tool to enable type safety and better performance
This commit is contained in:
parent
159df116c8
commit
25dffecb43
8 changed files with 367 additions and 201 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue