本文列出了Go应用监控对操作系统和架构的要求,以及支持的第三方组件和框架。
操作系统要求
|
编译工具名 |
操作系统 |
架构 |
|
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 |
支持的Go版本
1.18及以上版本
支持的插件版本
消息
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
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框架
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
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 |
无限制 |
|
|
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 |
无限制 |
|
|
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 |
无限制 |
|
|
Thrift |
v0.19.0 |
v0.20.0 |
|
|
Hertz |
v0.8.0 |
v0.10.2 |
SQL/NOSQL
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
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标准库MySQL |
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 |
日志
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
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 |
无限制 |
|
|
Log |
v1.21 |
无限制 |
|
|
Slog |
v1.21 |
无限制 |
任务调度
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
Cron |
v3.0.0 |
无限制 |
Trace SDK
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
OpenTracing SDK |
v1.1.0 |
v1.2.0 |
|
|
OpenTelemetry SDK |
v1.6.0 |
v1.37.0 |
AI SDK
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
Dify Sandbox |
v0.2.0 |
无限制 |
|
|
Dify Plugin Daemon |
v0.0.6 |
无限制 |
|
|
MCP SDK |
v0.20.0 |
无限制 |
|
|
Langchain SDK |
v0.1.0 |
无限制 |
阿里云SDK
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
FC Go SDK |
v0.2.9 |
v0.3.1 |
|
|
OTS Go SDK |
v1.5.0 |
无限制 |
其他SDK
|
组件 |
仓库地址 |
低版本 |
高版本 |
|
K8s Client |
v0.27.0 |
v0.32.3 |
|
|
K8s Controller Runtime |
v0.13.1 |
v0.18.7 |
常见问题
为什么使用消息框架时存在断链?
受限于消息框架的具体实现,当前版本的Go探针对某些消息框架的Trace上下文传递存在一定限制,具体如下:
|
组件 |
仓库地址 |
Producer |
Consumer |
|
AMQP |
无限制。 |
仅统计Receive Span,基于消息内容调用下游产生的Span无法与Receive Span串联。 |
|
|
Segmentio Kafka |
无限制。 |
仅统计Receive Span,基于消息内容调用下游产生的Span无法与Receive Span串联。 |
|
|
Shopify Sarama |
使用AsyncProducer时,Publish Span无法与所属调用的Span串联。 |
仅统计Receive Span,基于消息内容调用下游产生的Span无法与Receive Span串联。 |
|
|
IBM Sarama |
使用AsyncProducer时,Publish Span无法与所属调用的Span串联。 |
仅统计Receive Span,基于消息内容调用下游产生的Span无法与Receive Span串联。 |
|
|
RocketMQ Client Go |
无限制。 |
|
|
|
RocketMQ Client |
https://github.com/apache/rocketmq-clients/tree/master/golang |
无限制。 |
仅统计Receive Span,基于消息内容调用下游产生的Span无法与Receive Span串联。 |
为什么使用Redis数据库的客户端时控制台看不见数据库/NoSQL相关调用?
受限于框架的具体实现,Go Agent无法对init函数执行之前的动作进行有效的插桩。
请确保已在init函数中执行Redis客户端或者数据库客户端的初始化动作。
// 无效写法
var rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// 生效写法
var rdb *redis.Client
func init() {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
}
为什么看不到自定义的OTel SDK埋点?
-
请在自定义配置页面的探针开关设置区域选中opentelemetry-plugin,然后重启应用。
-
默认采样率为10%,请求次数少的情况下可能会看不到,建议调整采样率。
如何为RabbitMQ增加自定义Span?
增加自定义Span的示例代码如下:
增加自定义Span的示例代码如下:
import (
"context"
oTrace "go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
//在消息的handle对每个消息处理时候创建一个span
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
}
}
如何为Kafka增加自定义Span?
增加自定义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"
)
//在消息的handle对每个消息处理时候创建一个span
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
}
}
}