Sink Interface
The Sink interface is a core component of the go-events library, designed to enable flexible and extensible event handling.  Sinks act as destinations for events, allowing for diverse actions like logging, metrics, or external system integration. 
Interface Definition:
// Sink defines the interface for handling events.
          type Sink interface {
              // Emit emits the given event to the sink.
              Emit(ctx context.Context, event Event) error
          }
          
          Types of Sinks:
- Log Sink: This sink outputs events to a standard logging facility.
- Usage: 
go-eventsprovides several built-in log sinks:logrusSink: Emits events to alogruslogger.import ( "context" "github.com/sirupsen/logrus" "github.com/docker/go-events" ) func main() { logger := logrus.New() sink := events.NewLogrusSink(logger) emitter := events.NewEmitter(sink) emitter.Emit(context.Background(), events.NewEvent("test-event")) }zapSink: Emits events to azaplogger.import ( "context" "go.uber.org/zap" "github.com/docker/go-events" ) func main() { logger, _ := zap.NewProduction() sink := events.NewZapSink(logger) emitter := events.NewEmitter(sink) emitter.Emit(context.Background(), events.NewEvent("test-event")) }stdSink: Emits events tostdlogger.import ( "context" "fmt" "github.com/docker/go-events" ) func main() { sink := events.NewStdSink(fmt.Println) emitter := events.NewEmitter(sink) emitter.Emit(context.Background(), events.NewEvent("test-event")) }
 
 - Usage: 
 - Metric Sink: This sink pushes events to a metrics system.
- Usage: 
prometheusSink: Sends events to a Prometheus server.import ( "context" "github.com/docker/go-events" "github.com/prometheus/client_golang/prometheus" ) func main() { counter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "test_events_total", Help: "Total number of test events emitted.", }) prometheus.MustRegister(counter) sink := events.NewPrometheusSink(func(event events.Event) error { counter.Inc() return nil }) emitter := events.NewEmitter(sink) emitter.Emit(context.Background(), events.NewEvent("test-event")) }
 
 - Usage: 
 - Custom Sink: Developers can create their own custom sinks to integrate with specific systems or implement custom event handling logic.
- Example:
import ( "context" "github.com/docker/go-events" ) type MyCustomSink struct { // Add any necessary fields for your custom sink here } func (s *MyCustomSink) Emit(ctx context.Context, event events.Event) error { // Implement your custom event handling logic here // This example simply prints the event name fmt.Println("Received event:", event.Name) return nil } func main() { sink := &MyCustomSink{} emitter := events.NewEmitter(sink) emitter.Emit(context.Background(), events.NewEvent("test-event")) } 
 - Example:
 
Example Usage:
import (
              "context"
          
              "github.com/docker/go-events"
          )
          
          func main() {
              // Create a new emitter with a log sink
              emitter := events.NewEmitter(events.NewLogrusSink(logrus.New()))
          
              // Emit an event
              emitter.Emit(context.Background(), events.NewEvent("my-event"))
          }
          
          Source Code: sink.go