fix(observer): add nil guards, fix resource leak, silent event drops, and missing doc comments

- WrapUDPConn, WrapPacketConn, WrapListener: add nil guards for pc/ln params
- NewGRPCPlugin: return no-op observer instead of nil on connection error
- gRPC plugin: fix resource leak by wiring Close() through observerWrapper
  and service.Close() lifecycle
- Both plugins: log unknown event types instead of silently dropping them
- httpPlugin: remove dead nil check for always-non-nil client field
- Stats.Reset: update core interface doc to match implementation behavior
- Add doc comments to all exported symbols across the observer package
This commit is contained in:
ginuerzh
2026-05-24 23:13:52 +08:00
parent bc3d12ec2c
commit 7c95d40e05
8 changed files with 58 additions and 4 deletions
+5 -1
View File
@@ -21,6 +21,8 @@ type grpcPlugin struct {
}
// NewGRPCPlugin creates an Observer plugin based on gRPC.
// On connection error it returns a no-op observer that logs and discards
// events rather than nil, so callers can always call Observe safely.
func NewGRPCPlugin(name string, addr string, opts ...plugin.Option) observer.Observer {
var options plugin.Options
for _, opt := range opts {
@@ -34,7 +36,7 @@ func NewGRPCPlugin(name string, addr string, opts ...plugin.Option) observer.Obs
conn, err := plugin.NewGRPCConn(addr, &options)
if err != nil {
log.Error(err)
return nil
return &grpcPlugin{log: log} // no-op: client is nil, Observe returns nil
}
p := &grpcPlugin{
@@ -82,6 +84,8 @@ func (p *grpcPlugin) Observe(ctx context.Context, events []observer.Event, opts
TotalErrs: ev.TotalErrs,
},
})
default:
p.log.Warnf("unknown event type: %s", event.Type())
}
}
reply, err := p.client.Observe(ctx, &req)
+5 -1
View File
@@ -53,6 +53,8 @@ type httpPlugin struct {
}
// NewHTTPPlugin creates an Observer plugin based on HTTP.
// Events are POSTed as JSON to the given URL. If url does not have a scheme
// prefix, "http://" is prepended.
func NewHTTPPlugin(name string, url string, opts ...plugin.Option) observer.Observer {
var options plugin.Options
for _, opt := range opts {
@@ -74,7 +76,7 @@ func NewHTTPPlugin(name string, url string, opts ...plugin.Option) observer.Obse
}
func (p *httpPlugin) Observe(ctx context.Context, events []observer.Event, opts ...observer.Option) error {
if p.client == nil || len(events) == 0 {
if len(events) == 0 {
return nil
}
@@ -108,6 +110,8 @@ func (p *httpPlugin) Observe(ctx context.Context, events []observer.Event, opts
TotalErrs: ev.TotalErrs,
},
})
default:
p.log.Warnf("unknown event type: %s", e.Type())
}
}
v, err := json.Marshal(r)