This topic describes the operating system and architecture requirements for Go application monitoring and lists 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
1.18 and later
Supported plugin versions
Messaging
Component | Repository address | Minimum version | Maximum version |
AMQP | v1.9.0 | v1.10.0 | |
Segmentio Kafka | v0.4.10 | v0.4.48 | |
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 | v1.22.0 | v1.45.2 | |
Shopify Sarama | v1.22.0 | v1.38.1 |
RPC frameworks
Component | Repository address | Minimum version | Maximum version |
Beego | v1.2.0 | v2.3.8 | |
Dubbo | v3.0.1 | v3.3.0 | |
Echo | v4.0.0 | v4.13.4 | |
FastHTTP | v1.45.0 | v1.65.0 | |
Fiber | v2.43.0 | v2.52.8 | |
Gin | v1.7.0 | No limit | |
GoFrame | v2.4.0 | v2.9.0 | |
Go Micro | v4.9.0 | v5.3.1 | |
Go Restful | v3.7.0 | v3.12.1 | |
Go Zero | v1.5.0 | v1.9.0 | |
gRPC | v1.44.0 | No limit | |
Iris | v12.0.0 | v12.2.11 | |
Kitex | v0.5.1 | v0.14.1 | |
Kratos | v2.1.2 | v2.8.4 | |
Macaron | v1.1.0 | v1.5.0 | |
Mux | v1.3.0 | v1.8.1 | |
Net/HTTP | v1.18 | No limit | |
Thrift | v0.19.0 | v0.20.0 | |
Hertz | v0.8.0 | v0.10.2 |
SQL/NoSQL
Component | Repository address | Minimum version | Maximum version |
Go Elasticsearch | v8.0.0 | v8.18.1 | |
Go Redis | v8.10.0 | v9.11.0 | |
Go SQL Driver | v1.4.0 | v1.9.3 | |
Gorm | v1.20.12 | v1.30.0 | |
GORM MySQL | v1.0.4 | v1.5.7 | |
Go standard library database/sql | v1.18 | v1.24 | |
Mongo | v1.11.1 | v1.17.3 | |
PostgreSQL | v10.10.0 | v10.14.0 | |
Redis Go | v1.9.0 | v1.9.2 |
Logging
Component | Repository address | Minimum version | Maximum version |
Gokit Log | v0.1.0 | v0.2.1 | |
Zerolog | v1.10.0 | v1.34.0 | |
Zap | v1.13.0 | v1.27.0 | |
Logrus | v1.5.0 | No limit | |
Log | v1.21 | No limit | |
Slog | v1.21 | No limit |
Task scheduling
Component | Repository address | Minimum version | Maximum version |
Cron | v3.0.0 | No limit |
Trace SDKs
Component | Repository address | Minimum version | Maximum version |
OpenTracing SDK | v1.1.0 | v1.2.0 | |
OpenTelemetry SDK | v1.6.0 | v1.37.0 |
AI SDKs
Component | Repository address | Minimum version | Maximum version |
Dify Sandbox | v0.2.0 | No limit | |
Dify Plugin Daemon | v0.0.6 | No limit | |
MCP SDK | v0.20.0 | No limit | |
Langchain SDK | v0.1.0 | No limit |
Alibaba Cloud SDKs
Component | Repository address | Minimum version | Maximum version |
FC Go SDK | v0.2.9 | v0.3.1 | |
OTS Go SDK | v1.5.0 | No limit |
Other SDKs
Component | Repository address | Minimum version | Maximum version |
K8s Client | v0.27.0 | v0.32.3 | |
K8s Controller Runtime | v0.13.1 | v0.18.7 |
FAQ
Why are traces broken when I use a messaging framework?
Because of implementation details in some messaging frameworks, the Go agent has limitations when propagating the trace context. The limitations are as follows:
Component | Repository address | Producer | Consumer |
AMQP | No limitations. | Only Receive spans are collected. Spans created by downstream calls based on the message content cannot be linked to the Receive span. | |
Segmentio Kafka | No limitations. | Only Receive spans are collected. Spans created by downstream calls based on the message content cannot be linked to the Receive span. | |
Shopify Sarama | When you use AsyncProducer, the Publish span cannot be linked to its parent call span. | Only Receive spans are collected. Spans created by downstream calls based on the message content cannot be linked to the Receive span. | |
IBM Sarama | When you use AsyncProducer, the Publish span cannot be linked to its parent call span. | Only Receive spans are collected. Spans created by downstream calls based on the message content cannot be linked to the Receive span. | |
RocketMQ Client Go | No limitations. |
| |
RocketMQ Client | https://github.com/apache/rocketmq-clients/tree/master/golang | No limitations. | Only Receive spans are collected. Spans created by downstream calls based on the message content cannot be linked to the Receive span. |
Why can't I see database/NoSQL calls in the console when I use a Redis client?
Because of framework-specific implementations, the Go agent cannot effectively instrument actions that are executed before the init function.
Initialize the Redis client or database client in the init function.
// Invalid code
var rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// Valid code
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 my custom OTel SDK instrumentation?
On the Custom Configurations page, select opentelemetry-plugin in the Probe switch settings section. Then, restart the application.

The default sample rate is 10%. If you have a low volume of requests, you might not see any data. You can adjust the sample rate as needed.
How do I add a custom span for RabbitMQ?
The following code sample shows how to add a custom span:
import (
"context"
oTrace "go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
// Create a span for each message in the message handler.
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{}, oTrace.WithSpanKind(oTrace.SpanKindConsumer))
ctx, span := tracer.Start(context.Background(), "mq", opts...)
defer span.End()
//other process
}
}
How do I add a custom span for Kafka?
The following code sample shows how to add a custom span:
import (
kafka "github.com/segmentio/kafka-go"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
oTrace "go.opentelemetry.io/otel/trace"
)
// Create a span for each message in the message handler.
func handle(msg kafka.Message) {
for _, attr := range msg.Headers {
if attr.Key == "traceparent" {
var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
headerMap["traceparent"] = string(attr.Value)
ctx := otel.GetTextMapPropagator().Extract(context.Background(), headerMap)
ctx = oTrace.ContextWithSpanContext(context.Background(), oTrace.SpanFromContext(ctx).SpanContext())
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]oTrace.SpanStartOption{}, oTrace.WithSpanKind(oTrace.SpanKindConsumer))
ctx, span := tracer.Start(context.Background(), "mq", opts...)
defer span.End()
//other process
}
}
}