diff --git a/docs/platforms/go/common/tracing/instrumentation/custom-instrumentation/index.mdx b/docs/platforms/go/common/tracing/instrumentation/custom-instrumentation/index.mdx index 1ccb9b0eb02be4..c2f595d2940af5 100644 --- a/docs/platforms/go/common/tracing/instrumentation/custom-instrumentation/index.mdx +++ b/docs/platforms/go/common/tracing/instrumentation/custom-instrumentation/index.mdx @@ -15,3 +15,94 @@ To capture transactions and spans customized to your organization's needs, you m + +## Adding Span & Transaction Data Attributes + +You can capture data attributes along with your spans and transactions. You can specify data attributes when starting a span or transaction: + +```go +http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + options := []sentry.SpanOption{ + // Set the OP based on values from https://develop.sentry.dev/sdk/performance/span-operations/ + sentry.WithOpName("http.server"), + sentry.ContinueFromRequest(r), + sentry.WithTransactionSource(sentry.SourceURL), + } + + // Create a transaction and assign data attributes + transaction := sentry.StartTransaction(ctx, + fmt.Sprintf("%s %s", r.Method, r.URL.Path), + options..., + ) + transaction.SetData("dataAttr1", 42) + transaction.SetData("dataAttr2", true) + // omitted code ... + transaction.Finish() + + // ... or create a span and assign data attributes + span := sentry.StartSpan(ctx, "span1") + span.SetData("dataAttr1", 42) + span.SetData("dataAttr2", true) + // omitted code ... + span.Finish() +}) +``` + +Or you can add data attributes to an existing transaction or span: + +```go +http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + transaction := sentry.TransactionFromContext(ctx) + + if transaction != nil { + transaction.SetData("dataAttr1", 42) + transaction.SetData("dataAttr2", true) + } + + span := sentry.SpanFromContext(ctx) + span.SetData("dataAttr1", 42) + span.SetData("dataAttr2", true) +}) +``` + +Or you can update existing transaction and span data by: + +```go +if d, found := transaction.Data["dataAttr1"]; found { + if dataAttr1, ok := d.(int); ok { + transaction.SetData("dataAttr1", dataAttr1.(int)+42) + } +} + +if d, found := span.Data["dataAttr1"]; found { + if dataAttr1, ok := d.(int); ok { + span.SetData("dataAttr1", dataAttr1.(int)+42) + } +} +}) +``` + +To attach data attributes to the transaction and all its spans, you can use `BeforeSendTransaction`: + +```go +sentry.Init(sentry.ClientOptions{ + Dsn: "___PUBLIC_DSN___", + BeforeSendTransaction: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { + for _, sp := range event.Spans { + sp.SetData("dataAttr1", 42) + sp.SetData("dataAttr2", true) + } + + dataCtx, ok := event.Contexts["trace"]["data"].(map[string]any) + if !ok { + dataCtx = make(map[string]any) + event.Contexts["trace"]["data"] = dataCtx + } + dataCtx["num"] = 42 + return event + }, +}) +```