{
  "slug": "Tracking-system-request-with-Open-telemetry--sentry-and-Go-in-Golang-language-b77c9cc4fb5a",
  "title": "Tracking system request with Open telemetry, sentry and Go-in Golang language",
  "subtitle": "Use Open Telemetry Tracing system in sentry to understand what’s going on in the backend.",
  "excerpt": "Use Open Telemetry Tracing system in sentry to understand what’s going on in the backend.",
  "date": "2023-04-13",
  "tags": [
    "Go"
  ],
  "readingTime": "2 min",
  "url": "https://medium.com/@mobinshaterian/tracking-system-request-with-open-telemetry-sentry-and-go-in-golang-language-b77c9cc4fb5a",
  "hero": "https://cdn-images-1.medium.com/max/800/1*7hnKQazHsYyuosuZ9Hjxcg.png",
  "content": [
    {
      "type": "heading",
      "level": 2,
      "text": "Tracking system request with Open telemetry, sentry and Go-in Golang language"
    },
    {
      "type": "paragraph",
      "html": "Use Open Telemetry Tracing system in sentry to understand what’s going on in the backend."
    },
    {
      "type": "paragraph",
      "html": "Special thanks to <a href=\"https://medium.com/u/44a7f70b3770\" target=\"_blank\" rel=\"noreferrer noopener\">Mohsen Mottaghi</a>."
    },
    {
      "type": "image",
      "src": "https://cdn-images-1.medium.com/max/800/1*7hnKQazHsYyuosuZ9Hjxcg.png",
      "alt": "sentry requests captured",
      "caption": "sentry requests captured",
      "width": 1653,
      "height": 268
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Go-Micro Plugin for Using Opentelemetry in Go-Micro"
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Add tracking open telemetry in Go-micro"
    },
    {
      "type": "code",
      "lang": "python",
      "code": "import  SDKTrace \"go.opentelemetry.io/otel/sdk/trace\" sentryOtel\n\"github.com/getsentry/sentry-go/otel\""
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Add Tracer in main.go"
    },
    {
      "type": "code",
      "lang": "go",
      "code": "tp := SDKTrace.NewTracerProvider(  SDKTrace.WithSpanProcessor(sentryOtel.NewSentrySpanProcessor()),\n) otel.SetTracerProvider(tp) otel.SetTextMapPropagator(sentryOtel.NewSentryPropagator())\nentity.TracerMain = tp.Tracer(service)"
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Add Tracking system in service"
    },
    {
      "type": "code",
      "lang": "go",
      "code": "srv := micro.NewService(  ...  //Tracking\nmicro.WrapClient(opentelemetry.NewClientWrapper(opentelemetry.WithTraceProvider(tp))),\nmicro.WrapCall(opentelemetry.NewCallWrapper(opentelemetry.WithTraceProvider(tp))),\nmicro.WrapHandler(opentelemetry.NewHandlerWrapper(opentelemetry.WithTraceProvider(tp))),\nmicro.WrapSubscriber(opentelemetry.NewSubscriberWrapper(opentelemetry.WithTraceProvider(tp))),)"
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Sentry support OpenTelemetry"
    },
    {
      "type": "paragraph",
      "html": "With Sentry’s OpenTelemetry SDK, an OpenTelemetry <code>Span</code> becomes a Sentry <code>Transaction</code> or <code>Span</code>. The first <code>Span</code> sent through the Sentry <code>SpanProcessor</code> is a <code>Transaction</code>, and any child <code>Span</code> gets attached to the first <code>Transaction</code> upon checking the parent <code>Span</code> context. This is true for the OpenTelemetry root <code>Span</code> and any top level <code>Span</code> in the system. For example, a request sent from frontend to backend will create an OpenTelemetry root <code>Span</code> with a corresponding Sentry <code>Transaction</code>. The backend request will create a new Sentry <code>Transaction</code> for the OpenTelemetry <code>Span</code>. The Sentry <code>Transaction</code> and <code>Span</code> are linked as a trace for navigation and error tracking purposes."
    },
    {
      "type": "code",
      "lang": "go",
      "code": "import (\n\"go.opentelemetry.io/otel\" sdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n\"github.com/getsentry/sentry-go\"\n\"github.com/getsentry/sentry-go/otel\" //...)sentry.Init(sentry.ClientOptions{\n    Dsn: \"__DSN__\", EnableTracing:\n    true, TracesSampleRate: 1.0, Debug: true,\n})tp :=\nsdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(sentryotel.NewSentrySpanProcessor()),)otel.SetTracerProvider(tp)otel.SetTextMapPropagator(sentryotel.NewSentryPropagator()"
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Capture data with open telemetry"
    },
    {
      "type": "heading",
      "level": 3,
      "text": "Creating Spans"
    },
    {
      "type": "code",
      "lang": "go",
      "code": "ctx, span := tracer.Start(ctx, \"hello-span\")defer span.End()"
    },
    {
      "type": "heading",
      "level": 3,
      "text": "Span Attributes"
    },
    {
      "type": "paragraph",
      "html": "Attributes are keys and values that are applied as metadata to your spans and are useful for aggregating, filtering, and grouping traces. Attributes can be added at span creation, or at any other time during the lifecycle of a span before it has completed."
    },
    {
      "type": "code",
      "lang": "go",
      "code": "span.SetAttributes(attribute.Bool(\"isTrue\", true), attribute.String(\"stringAttr\", \"hi!\"))"
    },
    {
      "type": "heading",
      "level": 3,
      "text": "Events"
    },
    {
      "type": "paragraph",
      "html": "An event is a human-readable message on a span that represents “something happening” during it’s lifetime."
    },
    {
      "type": "code",
      "lang": "go",
      "code": "span.AddEvent(\"some things happened here!\")"
    },
    {
      "type": "paragraph",
      "html": "In this case we can easily use sentry capture message too."
    },
    {
      "type": "heading",
      "level": 3,
      "text": "Set span status"
    },
    {
      "type": "paragraph",
      "html": "A status can be set on a span, typically used to specify that there was an error in the operation a span is tracking — .<code>Error</code>"
    },
    {
      "type": "code",
      "lang": "go",
      "code": "span.SetStatus(codes.Error, \"operationThatCouldFail failed\")"
    },
    {
      "type": "heading",
      "level": 2,
      "text": "Connect Open telemetry into Jaeger and Prometheus"
    }
  ]
}
