@@ -18,10 +18,11 @@ type Writer interface {
18
18
}
19
19
20
20
type producer struct {
21
- w Writer
21
+ w Writer
22
+ interceptors []ProducerInterceptor
22
23
}
23
24
24
- func NewProducer (cfg * ProducerConfig ) (Producer , error ) {
25
+ func NewProducer (cfg * ProducerConfig , interceptors ... ProducerInterceptor ) (Producer , error ) {
25
26
kafkaWriter := & kafka.Writer {
26
27
Addr : kafka .TCP (cfg .Writer .Brokers ... ),
27
28
Topic : cfg .Writer .Topic ,
@@ -51,7 +52,7 @@ func NewProducer(cfg *ProducerConfig) (Producer, error) {
51
52
kafkaWriter .Transport = transport
52
53
}
53
54
54
- p := & producer {w : kafkaWriter }
55
+ p := & producer {w : kafkaWriter , interceptors : interceptors }
55
56
56
57
if cfg .DistributedTracingEnabled {
57
58
otelWriter , err := NewOtelProducer (cfg , kafkaWriter )
@@ -64,18 +65,33 @@ func NewProducer(cfg *ProducerConfig) (Producer, error) {
64
65
return p , nil
65
66
}
66
67
67
- func (c * producer ) Produce (ctx context.Context , message Message ) error {
68
- return c .w .WriteMessages (ctx , message .toKafkaMessage ())
68
+ func (p * producer ) Produce (ctx context.Context , message Message ) error {
69
+ if len (p .interceptors ) > 0 {
70
+ p .executeInterceptors (ctx , & message )
71
+ }
72
+
73
+ return p .w .WriteMessages (ctx , message .toKafkaMessage ())
69
74
}
70
75
71
- func (c * producer ) ProduceBatch (ctx context.Context , messages []Message ) error {
76
+ func (p * producer ) ProduceBatch (ctx context.Context , messages []Message ) error {
72
77
kafkaMessages := make ([]kafka.Message , 0 , len (messages ))
73
78
for i := range messages {
79
+ if len (p .interceptors ) > 0 {
80
+ p .executeInterceptors (ctx , & messages [i ])
81
+ }
82
+
74
83
kafkaMessages = append (kafkaMessages , messages [i ].toKafkaMessage ())
75
84
}
76
- return c .w .WriteMessages (ctx , kafkaMessages ... )
85
+
86
+ return p .w .WriteMessages (ctx , kafkaMessages ... )
87
+ }
88
+
89
+ func (p * producer ) executeInterceptors (ctx context.Context , message * Message ) {
90
+ for _ , interceptor := range p .interceptors {
91
+ interceptor .OnProduce (ProducerInterceptorContext {Context : ctx , Message : message })
92
+ }
77
93
}
78
94
79
- func (c * producer ) Close () error {
80
- return c .w .Close ()
95
+ func (p * producer ) Close () error {
96
+ return p .w .Close ()
81
97
}
0 commit comments