in devops/otel-pubsub-trace/src/publisher/main.go [118:163]
func (hh *helloHandler) Handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
span := trace.SpanFromContext(ctx)
defer span.End()
// Prepare pubsub message publish
topic := hh.pubsubClient.Topic(TopicName)
data := map[string]string{
"user_id": getUserID(),
"order_id": getOrderID(),
}
m, err := json.Marshal(data)
if err != nil {
log.Printf("error marshaling data: %v", err)
http.Error(w, "Bad Request: marshaling data", http.StatusBadRequest)
return
}
msg := pubsub.Message{Data: m}
// Create subspan to send message to pubsub
options := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindProducer),
trace.WithAttributes(
semconv.MessagingSystemKey.String("pubsub"),
semconv.MessagingDestinationKey.String(TopicName),
semconv.MessagingDestinationKindTopic,
),
}
if msg.Attributes == nil {
msg.Attributes = make(map[string]string)
}
otel.GetTextMapPropagator().Inject(ctx, propagation.MapCarrier(msg.Attributes))
_, subspan := otel.Tracer("publisher").Start(ctx, "send-to-pubsub", options...)
defer subspan.End()
msgId, err := topic.Publish(ctx, &msg).Get(ctx)
if err != nil {
log.Printf("failed to publish message: %v", err)
http.Error(w, "Bad Request: publish message", http.StatusBadRequest)
return
}
subspan.SetAttributes(semconv.MessagingMessageIDKey.String(msgId))
io.WriteString(w, "hello")
}