fix(recorder): forward per-service recorder metadata to plugin recorders (#412)
User-configured metadata on recorder objects (recorders[].metadata in YAML) was silently discarded — MetadataRecordOption existed but was never called anywhere in the codebase, causing plugin (HTTP/gRPC) recorders to always receive null metadata. Fix: wrap recorders that carry config metadata in MetadataRecorder, which auto-appends the metadata to every Record() call. This covers all paths (handler, router, sniffer, service) with zero call-site changes.
This commit is contained in:
@@ -34,6 +34,7 @@ import (
|
|||||||
"github.com/go-gost/x/metadata"
|
"github.com/go-gost/x/metadata"
|
||||||
mdutil "github.com/go-gost/x/metadata/util"
|
mdutil "github.com/go-gost/x/metadata/util"
|
||||||
xstats "github.com/go-gost/x/observer/stats"
|
xstats "github.com/go-gost/x/observer/stats"
|
||||||
|
xrecorder "github.com/go-gost/x/recorder"
|
||||||
"github.com/go-gost/x/registry"
|
"github.com/go-gost/x/registry"
|
||||||
xservice "github.com/go-gost/x/service"
|
xservice "github.com/go-gost/x/service"
|
||||||
"github.com/vishvananda/netns"
|
"github.com/vishvananda/netns"
|
||||||
@@ -285,8 +286,15 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
|||||||
var recorders []recorder.RecorderObject
|
var recorders []recorder.RecorderObject
|
||||||
for _, r := range cfg.Recorders {
|
for _, r := range cfg.Recorders {
|
||||||
md := metadata.NewMetadata(r.Metadata)
|
md := metadata.NewMetadata(r.Metadata)
|
||||||
|
rec := registry.RecorderRegistry().Get(r.Name)
|
||||||
|
if r.Metadata != nil {
|
||||||
|
rec = &xrecorder.MetadataRecorder{
|
||||||
|
Recorder: rec,
|
||||||
|
Metadata: r.Metadata,
|
||||||
|
}
|
||||||
|
}
|
||||||
recorders = append(recorders, recorder.RecorderObject{
|
recorders = append(recorders, recorder.RecorderObject{
|
||||||
Recorder: registry.RecorderRegistry().Get(r.Name),
|
Recorder: rec,
|
||||||
Record: r.Record,
|
Record: r.Record,
|
||||||
Options: &recorder.Options{
|
Options: &recorder.Options{
|
||||||
Direction: mdutil.GetBool(md, parsing.MDKeyRecorderDirection),
|
Direction: mdutil.GetBool(md, parsing.MDKeyRecorderDirection),
|
||||||
@@ -295,6 +303,7 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) {
|
|||||||
HTTPBody: mdutil.GetBool(md, parsing.MDKeyRecorderHTTPBody),
|
HTTPBody: mdutil.GetBool(md, parsing.MDKeyRecorderHTTPBody),
|
||||||
MaxBodySize: mdutil.GetInt(md, parsing.MDKeyRecorderHTTPMaxBodySize),
|
MaxBodySize: mdutil.GetInt(md, parsing.MDKeyRecorderHTTPMaxBodySize),
|
||||||
},
|
},
|
||||||
|
Metadata: r.Metadata,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,23 @@ import (
|
|||||||
xctx "github.com/go-gost/x/ctx"
|
xctx "github.com/go-gost/x/ctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MetadataRecorder wraps a Recorder and automatically appends metadata
|
||||||
|
// to every Record call.
|
||||||
|
type MetadataRecorder struct {
|
||||||
|
recorder.Recorder
|
||||||
|
Metadata any
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *MetadataRecorder) Record(ctx context.Context, b []byte, opts ...recorder.RecordOption) error {
|
||||||
|
if r.Recorder == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if r.Metadata == nil {
|
||||||
|
return r.Recorder.Record(ctx, b, opts...)
|
||||||
|
}
|
||||||
|
return r.Recorder.Record(ctx, b, append(opts, recorder.MetadataRecordOption(r.Metadata))...)
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
RecorderServiceHandler = "recorder.service.handler"
|
RecorderServiceHandler = "recorder.service.handler"
|
||||||
RecorderServiceHandlerSerial = "recorder.service.handler.serial"
|
RecorderServiceHandlerSerial = "recorder.service.handler.serial"
|
||||||
|
|||||||
Reference in New Issue
Block a user