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 | 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.40.0 | v1.45.1 | |
Shopify Sarama | v1.22.0 | v1.38.1 |
RPC frameworks
Component | Repository | Minimum version | Maximum version |
Beego | v1.2.0 | v2.3.8 | |
Dubbo | v3.0.1 | v3.1.0 | |
Echo | v4.0.0 | v4.13.3 | |
FastHTTP | v1.45.0 | v1.61.0 | |
Fiber | v2.43.0 | v2.52.6 | |
Gin | v1.7.0 | v1.10.0 | |
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.8.3 | |
gRPC | v1.44.0 | v1.72.1 | |
Iris | v12.0.0 | v12.2.11 | |
Kitex | v0.5.1 | v0.13.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 | v1.24 | |
Thrift | v0.19.0 | v0.20.0 | |
Hertz | v0.8.0 | v0.10.0 |
SQL/NOSQL
Component | Repository | Minimum version | Maximum version |
Go Elasticsearch | v8.0.0 | v8.18.0 | |
Go Redis | v8.10.0 | v9.8.0 | |
Go SQL Driver | v1.4.0 | v1.9.2 | |
Gorm | v1.20.12 | v1.30.0 | |
GORM MySQL | v1.0.4 | v1.5.7 | |
Go MySQL Driver | v1.18 | v1.24 | |
Mongo | v1.11.1 | v1.17.3 | |
Redis Go | v1.9.0 | v1.9.2 |
Logs
Component | Repository | Minimum version | Maximum version |
Zerolog | v1.10.0 | v1.34.0 | |
Zap | v1.13.0 | v1.27.0 | |
Logrus | v1.5.0 | v1.9.3 | |
Log | v1.21 | No limit | |
Slog | v1.21 | No limit |
Trace SDK
Component | Repository | Minimum version | Maximum version |
OTel SDK | v1.6.0 | v1.36.0 |
AI SDK
Component | Repository | Minimum version | Maximum version |
MCP SDK | v0.20.0 | No limit | |
Langchain SDK | v0.1.10 | No limit |
Other SDKs
Component | Repository | Minimum version | Maximum version |
FC Go SDK | v0.2.9 | v0.2.11 | |
K8s Client | v0.27.0 | v0.32.3 | |
K8s 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 | 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 | 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 | 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 | 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 | No limits. |
| |
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?
Please select opentelemetry-plugin in the Agent switch settings section on the Custom configuration page, and then restart your application.
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)
}
}
}