All Products
Search
Document Center

Application Real-Time Monitoring Service:Go components and frameworks supported by ARMS Application Monitoring

Last Updated:Jun 06, 2025

This topic lists the requirements of Go application monitoring for operating systems and architecture, and the supported third-party components and frameworks.

Operating system requirements

Compiler name

Operating system

Architecture

instgo_linux_amd64

Linux

amd64

instgo_linux_arm64

Linux

arm64

instgo_darwin_amd64

Darwin

amd64

instgo_darwin_arm64

Darwin

arm64

instgo_windows_amd64.exe

Windows

amd64

Supported Go versions

Go 1.18 and later

Supported plugin versions

Message

Component

Repository

Minimum version

Maximum version

AMQP

https://github.com/rabbitmq/amqp091-go

v1.9.0

v1.10.0

Segmentio Kafka

https://github.com/segmentio/kafka-go

v0.4.10

v0.4.48

RocketMQ Client Go

https://github.com/apache/rocketmq-client-go

v2.1.0

v2.1.2

RocketMQ Client

https://github.com/apache/rocketmq-clients/tree/master/golang

v5.0.0

v5.1.2

IBM Sarama

https://github.com/IBM/sarama

v1.40.0

v1.45.1

Shopify Sarama

https://github.com/IBM/sarama

v1.22.0

v1.38.1

RPC frameworks

Component

Repository

Minimum version

Maximum version

Beego

https://github.com/beego/beego

v1.2.0

v2.3.8

Dubbo

https://github.com/apache/dubbo-go

v3.0.1

v3.1.0

Echo

https://github.com/labstack/echo

v4.0.0

v4.13.3

FastHTTP

https://github.com/valyala/fasthttp

v1.45.0

v1.61.0

Fiber

https://github.com/gofiber/fiber

v2.43.0

v2.52.6

Gin

https://github.com/gin-gonic/gin

v1.7.0

v1.10.0

GoFrame

https://github.com/gogf/gf

v2.4.0

v2.9.0

Go Micro

https://github.com/go-micro/go-micro

v4.9.0

v5.3.1

Go Restful

https://github.com/emicklei/go-restful

v3.7.0

v3.12.1

Go Zero

https://github.com/zeromicro/go-zero

v1.5.0

v1.8.3

gRPC

https://github.com/grpc/grpc-go

v1.44.0

v1.72.1

Iris

https://github.com/kataras/iris

v12.0.0

v12.2.11

Kitex

https://github.com/cloudwego/kitex

v0.5.1

v0.13.1

Kratos

https://github.com/go-kratos/kratos

v2.1.2

v2.8.4

Macaron

https://github.com/go-macaron/macaron

v1.1.0

v1.5.0

Mux

https://github.com/gorilla/mux

v1.3.0

v1.8.1

Net/HTTP

https://pkg.go.dev/net/http

v1.18

v1.24

Thrift

https://github.com/apache/thrift/tree/master/lib/go

v0.19.0

v0.20.0

Hertz

https://github.com/cloudwego/hertz

v0.8.0

v0.10.0

SQL/NOSQL

Component

Repository

Minimum version

Maximum version

Go Elasticsearch

https://github.com/elastic/go-elasticsearch

v8.0.0

v8.18.0

Go Redis

https://github.com/redis/go-redis

v8.10.0

v9.8.0

Go SQL Driver

https://github.com/go-sql-driver/mysql

v1.4.0

v1.9.2

Gorm

https://github.com/go-gorm/gorm

v1.20.12

v1.30.0

GORM MySQL

https://github.com/go-gorm/mysql

v1.0.4

v1.5.7

Go MySQL Driver

https://pkg.go.dev/database/sql

v1.18

v1.24

Mongo

https://github.com/mongodb/mongo-go-driver

v1.11.1

v1.17.3

Redis Go

https://github.com/gomodule/redigo

v1.9.0

v1.9.2

Logs

Component

Repository

Minimum version

Maximum version

Zerolog

https://github.com/rs/zerolog

v1.10.0

v1.34.0

Zap

https://github.com/uber-go/zap

v1.13.0

v1.27.0

Logrus

https://github.com/sirupsen/logrus

v1.5.0

v1.9.3

Log

https://pkg.go.dev/log

v1.21

No limit

Slog

https://pkg.go.dev/log/slog

v1.21

No limit

Trace SDK

Component

Repository

Minimum version

Maximum version

OTel SDK

https://github.com/open-telemetry/opentelemetry-go

v1.6.0

v1.36.0

AI SDK

Component

Repository

Minimum version

Maximum version

MCP SDK

https://github.com/mark3labs/mcp-go

v0.20.0

No limit

Langchain SDK

https://github.com/tmc/langchaingo

v0.1.10

No limit

Other SDKs

Component

Repository

Minimum version

Maximum version

FC Go SDK

https://github.com/aliyun/fc-runtime-go-sdk

v0.2.9

v0.2.11

K8s Client

https://github.com/kubernetes/client-go

v0.27.0

v0.32.3

K8s Controller Runtime

https://github.com/kubernetes-sigs/controller-runtime

v0.13.1

v0.18.7

FAQ

Why are there broken chains when using message frameworks?

Due to limitations in the specific implementations of message frameworks, the current version of the Go agent has certain limitations in Trace context propagation for some message frameworks, as detailed below:

Component

Repository

Producer

Consumer

AMQP

https://github.com/rabbitmq/amqp091-go

No limits.

Only Receive Span is counted. Spans generated by downstream calls based on message content cannot be linked with the Receive Span.

Segmentio Kafka

https://github.com/segmentio/kafka-go

No limits.

Only Receive Span is counted. Spans generated by downstream calls based on message content cannot be linked with the Receive Span.

Shopify Sarama

https://github.com/IBM/sarama

When using AsyncProducer, the Publish Span cannot be linked with the Span of the associated call.

Only Receive Span is counted. Spans generated by downstream calls based on message content cannot be linked with the Receive Span.

IBM Sarama

https://github.com/IBM/sarama

When using AsyncProducer, the Publish Span cannot be linked with the Span of the associated call.

Only Receive Span is counted. Spans generated by downstream calls based on message content cannot be linked with the Receive Span.

RocketMQ Client Go

https://github.com/apache/rocketmq-client-go

No limits.

  • Only PushConsumer is supported.

  • For batch consumption of multiple messages with downstream calls during consumption, all downstream call Spans will be attached to the last message in the batch (this issue does not exist when consuming a single message at a time).

RocketMQ Client

https://github.com/apache/rocketmq-clients/tree/master/golang

No limits.

Only Receive Span is counted. Spans generated by downstream calls based on message content cannot be linked with the Receive Span.

Why can't I see database/NoSQL related calls in the console when using Redis database clients?

Due to limitations in the framework implementation, the Go Agent cannot effectively instrument actions performed before the init function is executed.

Please ensure that you initialize the Redis client or database client in the init function.

// Ineffective approach
var rdb = redis.NewClient(&redis.Options{
	Addr:     "localhost:6379",
	Password: "", // no password set
	DB:       0,  // use default DB
})

// Effective approach
var rdb *redis.Client

func init() {
	rdb = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
}

Why can't I see custom OTel SDK instrumentation?

  1. Please select opentelemetry-plugin in the Agent switch settings section on the Custom configuration page, and then restart your application.

    image

  2. The default sample rate is 10%. If you have a small number of requests, you might not see any data. We recommend adjusting the sample rate.

How do I add custom Spans for RabbitMQ?

The following is an example of adding custom Spans:

import (
  "context"
  oTrace "go.opentelemetry.io/otel/trace"
  "go.opentelemetry.io/otel"
  "go.opentelemetry.io/otel/trace"
)

//Create a span for each message when handling messages
func handle(deliveries <-chan amqp.Delivery, done chan error) {
    cleanup := func() {
        Log.Printf("handle: deliveries channel closed"
        done <- nil
    }

    defer cleanup()
    for d := range deliveries {
      var headerMap propagation.MapCarrier
      headerMap = make(map[string]string)
      headerMap["traceparent"] = delivery.Headers["traceparent"]
      ctx := otel.GetTextMapPropagator().Extract(context.Background(), headerMap)
      ctx = oTrace.ContextWithSpanContext(context.Background(), oTrace.SpanFromContext(ctx).SpanContext())
      tracer = otel.GetTracerProvider().Tracer("")
      opts := append([]oTrace.SpanStartOption{}, trace.WithSpanKind(oTrace.SpanKindConsumer))
      ctx, span := tracer.Start(context.Background(), "mq", opts...)
      span.End
      DeliveryCount++
      if *Verbose == true {
          Log.Printf(
              "got %dB delivery: [%v] %q",
              len(d.Body),
              d.DeliveryTag,
              d.Body
          )
          for k, v := range d.Headers {
              if strV, ok := v.(string); ok {
                  Log.Printf("[Headers] delivery has header < %s - %s >", k, strV)
              }
          }
      } else {
          if DeliveryCount%65536 == 0 {
              Log.Printf("delivery count %d", DeliveryCount)
          }
      }
      if *AutoAck == false {
          d.Ack(false)
      }
    }
}