49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package kafka
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"github.com/IBM/sarama"
|
|
"go.opentelemetry.io/otel"
|
|
otelcodes "go.opentelemetry.io/otel/codes"
|
|
"strconv"
|
|
)
|
|
|
|
var ProduceTimeoutError = errors.New("kafka producer timeout")
|
|
|
|
func NewProducer(key int64) *Producer {
|
|
return &Producer{
|
|
key: key,
|
|
}
|
|
}
|
|
|
|
type Producer struct {
|
|
key int64
|
|
}
|
|
|
|
func (c *Producer) Produce(ctx context.Context, data Topic) error {
|
|
marshal, _ := json.Marshal(data)
|
|
msg := &sarama.ProducerMessage{
|
|
Topic: data.Name(),
|
|
Key: sarama.StringEncoder(strconv.FormatInt(c.key, 10)),
|
|
Value: sarama.ByteEncoder(marshal),
|
|
Headers: NewCarrier().Inject(ctx),
|
|
}
|
|
select {
|
|
case client.producer.Input() <- msg:
|
|
return nil
|
|
case <-ctx.Done():
|
|
return ProduceTimeoutError
|
|
}
|
|
}
|
|
|
|
func producerError() {
|
|
for err := range client.producer.Errors() {
|
|
ctx := NewCarrier().ExtractProducer(err.Msg.Headers)
|
|
_, span := otel.Tracer("common.db.kafka").Start(ctx, "kafka.producer.error")
|
|
span.SetStatus(otelcodes.Error, err.Error())
|
|
span.End()
|
|
}
|
|
}
|