This topic lists the operating system and architecture requirements for Go Application Monitoring. It also lists the supported third-party components and frameworks.
Operating system requirements
Compiler tool 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
Messages
Component | Repository address | Minimum version | Maximum version |
AMQP | v1.9.0 | v1.10.0 | |
Segmentio Kafka | v0.4.10 | v0.4.49 | |
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.46.3 | |
Shopify Sarama | v1.22.0 | v1.38.1 | |
Mqtt Server | v2.6.0 | No limit | |
franz-go | v1.18.0 | No limit | |
confluent-kafka-go | v1.7.0 | No limit | |
streadway-amqp | v1.0.0 | No limit |
RPC frameworks
Component | Repository address | Minimum version | Maximum version |
Beego | v1.2.0 | No limit | |
Dubbo | v3.0.1 | v3.3.0 | |
Echo | v4.0.0 | No limit | |
FastHTTP | v1.45.0 | No limit | |
Fiber | v2.43.0 | No limit | |
Gin | v1.7.0 | No limit | |
GoFrame | v2.4.0 | No limit | |
Go Micro | v4.9.0 | v5.3.1 | |
Go Restful | v3.7.0 | No limit | |
Go Zero | v1.5.0 | No limit | |
gRPC | v1.44.0 | No limit | |
Iris | v12.0.0 | v12.2.11 | |
Kitex | v0.5.1 | v0.15.2 | |
Kratos | v2.1.2 | v2.9.1 | |
Macaron | v1.1.0 | No limit | |
Mux | v1.3.0 | No limit | |
Net/HTTP | v1.18 | No limit | |
Thrift | v0.19.0 | v0.20.0 | |
Hertz | v0.8.0 | v0.10.3 |
SQL/NoSQL
Component | Repository address | Minimum version | Maximum version |
Go Elasticsearch | v8.0.0 | No limit | |
Go Redis | v8.10.0 | v9.17.2 | |
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 MySQL | v1.18 | v1.24 | |
Mongo | v1.11.1 | No limit | |
PostgreSQL | v10.10.0 | v10.15.0 | |
Redis Go | v1.9.0 | v1.9.3 | |
Rueidis | v1.0.30 | No limit | |
sqlx | v1.3.0 | v1.4.0 | |
Xorm | v0.2.2 | No limit |
Logs
Component | Repository address | Minimum version | Maximum version |
Gokit Log | v0.1.0 | v0.2.1 | |
Zerolog | v1.10.0 | No limit | |
Zap | v1.13.0 | No limit | |
Logrus | v1.5.0 | No limit | |
Log | v1.21 | No limit | |
Slog | v1.21 | No limit | |
go-zero logx | v1.6.5 | No limit | |
Kratos log | https://github.com/go-kratos/kratos/blob/main/middleware/logging | v2.1.2 | v2.4.0 |
Job scheduling
Component | Repository address | Minimum version | Maximum version |
Cron | v3.0.0 | No limit | |
XxlJob | v1.2.0 | No limit |
Trace SDK
Component | Repository address | Minimum version | Maximum version |
OpenTracing SDK | v1.1.0 | v1.2.0 | |
OpenTelemetry SDK | v1.6.0 | v1.39.0 |
AI SDK
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 |
ants pool | v1.1.0 | No limit | |
K8s Client | v0.27.0 | v0.32.3 | |
K8s Controller Runtime | v0.13.1 | v0.18.7 |
FAQ
Why do broken traces occur when I use a messaging framework?
Due to the specific implementation of messaging frameworks, the current version of the Go agent has limitations in propagating trace contexts for some frameworks. The details are as follows:
Component | Repository address | Producer | Consumer |
AMQP | No limit. | Only the Receive span is recorded. Spans generated from downstream calls based on the message content cannot be linked with the Receive span. | |
Segmentio Kafka | No limit. | Only the Receive span is recorded. Spans generated from downstream calls based on the message content cannot be linked with the Receive span. | |
Shopify Sarama | When you use AsyncProducer, the Publish span cannot be linked with the span of its parent call. | Only the Receive span is recorded. Spans generated from downstream calls based on the message content cannot be linked with the Receive span. | |
IBM Sarama | When you use AsyncProducer, the Publish span cannot be linked with the span of its parent call. | Only the Receive span is recorded. Spans generated from downstream calls based on the message content cannot be linked with the Receive span. | |
RocketMQ Client Go | No limit. |
| |
RocketMQ Client | https://github.com/apache/rocketmq-clients/tree/master/golang | No limit. | Only the Receive span is recorded. Spans generated from downstream calls based on the message content cannot be linked with the Receive span. |
Why can't I see database or NoSQL calls in the console when I use a Redis database client?
Due to the specific implementation of the framework, the Go agent cannot effectively instrument actions that are executed before the init function.
Make sure that you initialize the Redis client or database client in the init function.
// Invalid method
var rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// Valid method
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 Configuration page, select opentelemetry-plugin in the Agent Switch Settings section. Then, restart the application.

The default sample rate is 10 %. If the number of requests is low, the instrumentation might not be visible. Adjust the sample rate.
How do I add a custom span for RabbitMQ?
The following sample code 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 processes
}
}
How do I add a custom span for Kafka?
The following sample code 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)
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]oTrace.SpanStartOption{}, oTrace.WithSpanKind(oTrace.SpanKindConsumer))
ctx, span := tracer.Start(ctx, "mq", opts...)
defer span.End()
// Other processes
}
}
}