feat: log raw MQ body after dedup

Keep the original payload on post-dedup handling logs so accepted, filtered, and error paths can be traced.
This commit is contained in:
2026-08-15 17:37:14 +08:00
parent 6f846a0a3c
commit ab295d6d28
2 changed files with 17 additions and 5 deletions
+15 -5
View File
@@ -28,6 +28,8 @@ type ProcessFunc func(ctx context.Context, req notify.Request) (notify.Result, e
type HandleInput struct { type HandleInput struct {
Body []byte Body []byte
Headers map[string]any Headers map[string]any
Name string
Queue string
SourceName string SourceName string
MaxRetry int MaxRetry int
Deduper Deduper Deduper Deduper
@@ -81,29 +83,37 @@ func HandleMessage(ctx context.Context, in HandleInput, conv *tradesignal.Conver
} }
} }
raw := string(in.Body)
if hash == "" {
hash = MessageHash(in.Body)
}
slog.Info("mq message", "name", in.Name, "queue", in.Queue, "hash", hash, "raw", raw)
event, data, err := conv.Convert(in.Body) event, data, err := conv.Convert(in.Body)
if err != nil { if err != nil {
slog.Warn("invalid signal, ack", "error", err) slog.Warn("invalid signal, ack", "hash", hash, "raw", raw, "error", err)
return DispositionAck return DispositionAck
} }
src, err := lookup(ctx, in.SourceName) src, err := lookup(ctx, in.SourceName)
if err != nil || src == nil || src.Status != 1 { if err != nil || src == nil || src.Status != 1 {
slog.Warn("source unavailable, ack", "source", in.SourceName, "error", err) slog.Warn("source unavailable, ack", "source", in.SourceName, "hash", hash, "raw", raw, "error", err)
return DispositionAck return DispositionAck
} }
res, err := process(ctx, notify.Request{Source: src, Event: event, Data: data}) res, err := process(ctx, notify.Request{Source: src, Event: event, Data: data})
if err == nil { if err == nil {
if !res.Matched { if !res.Matched {
slog.Info("no matching rule", "source", src.Name, "event", event) slog.Info("no matching rule", "source", src.Name, "event", event, "hash", hash, "raw", raw)
} else if res.Filtered { } else if res.Filtered {
slog.Info("rule filtered", "source", src.Name, "event", event, "reason", res.Reason) slog.Info("rule filtered", "source", src.Name, "event", event, "reason", res.Reason, "hash", hash, "raw", raw)
} else {
slog.Info("mq message accepted", "source", src.Name, "event", event, "channels", res.Channels, "hash", hash, "raw", raw)
} }
return DispositionAck return DispositionAck
} }
if errors.Is(err, notify.ErrUnprocessable) { if errors.Is(err, notify.ErrUnprocessable) {
slog.Warn("unprocessable notify, ack", "source", src.Name, "event", event, "error", err) slog.Warn("unprocessable notify, ack", "source", src.Name, "event", event, "hash", hash, "raw", raw, "error", err)
return DispositionAck return DispositionAck
} }
+2
View File
@@ -121,6 +121,8 @@ func (s *Subscriber) handleDelivery(ch *amqp.Channel, d amqp.Delivery) {
disp := HandleMessage(context.Background(), HandleInput{ disp := HandleMessage(context.Background(), HandleInput{
Body: d.Body, Body: d.Body,
Headers: map[string]any(d.Headers), Headers: map[string]any(d.Headers),
Name: s.cfg.Name,
Queue: s.cfg.Queue,
SourceName: s.cfg.Source, SourceName: s.cfg.Source,
MaxRetry: s.cfg.MaxRetry, MaxRetry: s.cfg.MaxRetry,
Deduper: s.deduper, Deduper: s.deduper,