func()

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