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() } }