/
rabbit.go
68 lines (57 loc) · 1.98 KB
/
rabbit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package rabbitMq
import (
"context"
"fmt"
"net/http"
"github.com/Ishan27g/go-utils/tracing"
"github.com/gin-gonic/gin"
"github.com/streadway/amqp"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)
// ExampleHandler that propagates span over rabbitmq.
// Extracts span from http request, publishes it as rabbitmq headers, then consumes and extracts
// a span which is a child of the original span.
func ExampleHandler(c *gin.Context) {
provider := tracing.Init("jaeger", "api-gw", "proxy")
defer provider.Close()
go func() {
headers := consumeOnce() // consume from queue
ctx := ExtractSpan(headers)
ctx, span := provider.Get().Start(ctx, "consumer-from-rabbit")
defer span.End()
span.SetAttributes(attribute.Key("consumer").Int(1))
}()
_, span := provider.Get().Start(c.Request.Context(), "producer-to-rabbit")
span.SetAttributes(attribute.Key("producer").Int(1))
defer span.End()
headers := ExtractHeader(span)
publish(headers) // publish to queue
c.JSON(http.StatusOK, "OK\n")
}
const traceId = "TraceId"
const spanId = "SpanId"
// ExtractHeader injects otel span into ampq headers
func ExtractHeader(span trace.Span) (header amqp.Table) {
header = make(amqp.Table)
header[traceId] = span.SpanContext().TraceID().String()
header[spanId] = span.SpanContext().SpanID().String()
return
}
// ExtractSpan returns a context with underlying span extracted from ampq headers
func ExtractSpan(header amqp.Table) context.Context {
traceID, err := trace.TraceIDFromHex(header[traceId].(string))
if err != nil {
fmt.Println("no traceId in header: ", err)
}
spanID, err := trace.SpanIDFromHex(header[spanId].(string))
if err != nil {
fmt.Println("no spanId in header: ", err)
}
var spanContextConfig trace.SpanContextConfig
spanContextConfig.TraceID = traceID
spanContextConfig.SpanID = spanID
spanContextConfig.TraceFlags = 01
spanContextConfig.Remote = false
return trace.ContextWithSpanContext(context.Background(), trace.NewSpanContext(spanContextConfig))
}