watch-tool/parser/nginx_tjm_parser.go
2025-09-25 00:01:34 +02:00

74 lines
1.5 KiB
Go

package parser
import (
"log/slog"
"strconv"
"strings"
"tixel_watch/helpers"
"tixel_watch/models"
)
type NginxTJMLogParser struct {
ToolName string
}
func (p *NginxTJMLogParser) Parse(line string) (models.LogMessage, error) {
entry := models.LogMessage{
Type: "log_entry",
Tool: p.ToolName,
Raw: line,
}
hostname, err := helpers.GetHostname()
if err != nil {
return entry, err
}
entry.Host = hostname
entry = p.parseNginxTJM(entry)
return entry, nil
}
func (p *NginxTJMLogParser) parseNginxTJM(entry models.LogMessage) models.LogMessage {
newEntry := entry
var nginxBase models.NGinXBaseInfo
parts := strings.Fields(entry.Raw)
if len(parts) < 10 {
return newEntry
}
if len(parts) > 0 {
timestampStr := strings.Trim(parts[0], "[]")
timestamp, err := helpers.ParseRFC3339WithOptionalZ(timestampStr)
if err != nil {
slog.Error("unable to parse time", "error", err)
}
newEntry.Timestamp = timestamp
}
if len(parts) > 2 {
nginxBase.ClientIP = parts[2]
}
for i, part := range parts {
if strings.HasPrefix(part, "\"") {
if i+1 < len(parts) {
nginxBase.HTTPMethod = strings.Trim(part, "\"")
nginxBase.Route = parts[i+1]
}
break
}
}
for _, part := range parts {
if after, ok := strings.CutPrefix(part, "status="); ok {
statusCode, err := strconv.ParseInt(after, 10, 64)
if err != nil {
slog.Error("cant convert statuscode", "error", err)
}
nginxBase.StatusCode = int(statusCode)
break
}
}
newEntry.ServiceInformation = nginxBase
return newEntry
}