This topic describes the operating system and architecture requirements for Go application monitoring, along with the supported third-party components and frameworks.
Operating system requirements
Build 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
Version 1.18 and later
Supported plug-in versions
Message
Component | Repository address | Earlier versions | Later versions |
AMQP | v1.4.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.3 |
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 | Lower versions | Later versions |
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.19.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 | No limit | |
Kratos | v2.1.2 | v2.9.2 | |
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 | |
Rpcx | v1.9.0 | No limit | |
Req | v3.0.0 | No limit |
SQL/NoSQL
Component | Repository Address | Minimum version | Later versions |
Go Elasticsearch | v7.0.0 | No limit | |
Go Redis | v8.10.0 | No limit | |
Go SQL Driver | v1.4.0 | v1.9.3 | |
Gorm | v1.20.12 | v1.31.1 | |
GORM MySQL | v1.0.4 | No limit | |
Go standard library MySQL | v1.18 | No limit | |
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 | |
ClickHouse | v2.0.1 | No limit | |
GORM ClickHouse | v0.2.0 | No limit |
Logging
Component | Repository Address | Earlier Version | Newer 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 | Higher version |
Cron | v3.0.0 | No limit | |
XxlJob | v1.2.0 | No limit | |
Asynq | v0.23.0 | No limit |
Trace SDK
Component | Repository Address | Minimum version | Advanced Edition |
OpenTracing SDK | v1.1.0 | v1.2.0 | |
OpenTelemetry SDK | v1.6.0 | v1.40.0 |
AI SDK
Component | Repository address | Minimum version | Higher versions |
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 | |
openai-go | v1.5.0 | No limit | |
go-openai | v1.30.0 | No limit | |
deepseek | v1.3.0 | No limit | |
coze-studio | v0.2.0 | No limit | |
adk-go | v0.3.0 | No limit | |
eino | v0.4.0 | No limit | |
Google GenAI | v1.30.0 | No limit (Google GenAI Stream mode currently supports only versions v1.36.0, v1.37.0, v1.45.0, and v1.46.0.) |
Alibaba Cloud SDK
Component | Repository address | Minimum version | Higher version |
FC Go SDK | v0.2.9 | v0.3.1 | |
OTS Go SDK | v1.5.0 | No limit |
Other SDKs
Component | Repository address | Earlier versions | Newer version |
ants pool | v1.1.0 | No limit | |
K8s Client | v0.27.0 | v0.32.3 | |
K8s Controller Runtime | v0.13.1 | v0.23.3 |
FAQ
How do I maintain trace continuity for Asynq versions earlier than v0.26.0?
For more information, see How do I maintain trace continuity for Asynq versions earlier than v0.26.0?.
Why does trace discontinuity occur when using message frameworks?
Because of implementation details in certain message frameworks, the current Go agent has limitations when propagating trace context across them.
Component | Repository URL | Producer | Consumer |
AMQP | No limit. | Only Receive Spans are recorded. Spans generated from downstream calls based on message content cannot be linked to the Receive Span. | |
Segmentio Kafka | No limit. | Only Receive Spans are recorded. Spans generated from downstream calls based on message content cannot be linked to the Receive Span. | |
Shopify Sarama | When using AsyncProducer, the Publish Span cannot be linked to its parent calling Span. | Only Receive Spans are recorded. Spans generated from downstream calls based on message content cannot be linked to the Receive Span. | |
IBM Sarama | When using AsyncProducer, the Publish Span cannot be linked to its parent calling Span. | Only Receive Spans are recorded. Spans generated from downstream calls based on message content cannot be linked to the Receive Span. | |
RocketMQ Client Go | No limit. |
| |
RocketMQ Client | https://github.com/apache/rocketmq-clients/tree/master/golang | No limit. | Only Receive Spans are recorded. Spans generated from downstream calls based on message content cannot be linked to the Receive Span. |
Why don't I see database or NoSQL calls in the console when using Redis clients?
Because of framework implementation details, the Go agent cannot instrument actions that run before the init function.
Make sure you initialize your Redis or database client inside the init function.
// Invalid approach
var rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// Valid 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 don't I see my custom OpenTelemetry SDK instrumentation?
In the Custom Configuration page, select opentelemetry-plugin in the Agent Switch Settings section, then restart your application.

The default sample rate is 10%. You might not see traces if there are few requests. You can adjust the sample rate as needed.
How do I add custom spans for RabbitMQ?
Use the following example code to add custom spans:
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 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 custom spans for Kafka?
Use the following example code to add custom spans:
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 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 process
}
}
}