This topic lists the operating system and architecture requirements for Go Application Monitoring, along with 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
Version 1.18 and later
Supported plugin versions
Messages
Component | Repository address | Minimum version | Maximum version |
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.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 | 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.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.31.1 | |
GORM MySQL | v1.0.4 | v1.5.7 | |
MySQL with the Go standard library | 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.15.0 | 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 |
Task 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 | Older 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 | Subsequent versions |
FC Go SDK | v0.2.9 | v0.3.1 | |
OTS Go SDK | v1.5.0 | No limit |
Other SDKs
Component | Repository address | Minimum version | Later versions |
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 message framework?
Because of the specific implementations of certain message frameworks, the current version of the Go agent has limitations in propagating trace contexts. The limitations 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 to 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 to the Receive span. | |
Shopify Sarama | When you use AsyncProducer, the Publish span cannot be linked to 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 to the Receive span. | |
IBM Sarama | When you use AsyncProducer, the Publish span cannot be linked to 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 to 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 to the Receive span. |
Why can't I see database/NoSQL calls in the console when I use a Redis client?
Because of the framework's implementation, the Go agent cannot effectively instrument actions that are executed before the init function.
Ensure that you initialize the Redis client or database client within 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 Probe Settings section, and then restart the application.

The default sample rate is 10%. If the number of requests is low, traces might not be captured. You can 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 process
}
}
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 process
}
}
}