本文列出了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.4.0 |
v1.12.0 |
|
|
Segmentio Kafka |
v0.4.10 |
無限制 |
|
|
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 |
無限制 |
|
|
franz-go |
v1.18.0 |
無限制 |
|
|
confluent-kafka-go |
v1.7.0 |
無限制 |
|
|
streadway-amqp |
v1.0.0 |
無限制 |
RPC架構
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
Beego |
v1.2.0 |
無限制 |
|
|
Dubbo |
v3.0.1 |
無限制 |
|
|
Echo |
v4.0.0 |
無限制 |
|
|
FastHTTP |
v1.6.0 |
無限制 |
|
|
Fiber |
v2.43.0 |
無限制 |
|
|
Gin |
v1.7.0 |
無限制 |
|
|
GoFrame |
v2.4.0 |
無限制 |
|
|
Go Micro |
v4.9.0 |
v5.30.0 |
|
|
Go Restful |
v3.7.0 |
無限制 |
|
|
Go Zero |
v1.5.0 |
無限制 |
|
|
gRPC |
v1.20.1 |
無限制 |
|
|
Iris |
v12.0.0 |
無限制 |
|
|
Kitex |
v0.5.1 |
無限制 |
|
|
Kratos |
v2.1.2 |
v2.9.2 |
|
|
Macaron |
v1.1.0 |
無限制 |
|
|
Mux |
v1.3.0 |
無限制 |
|
|
Net/HTTP |
v1.18 |
無限制 |
|
|
Thrift |
v0.19.0 |
v0.20.0 |
|
|
Hertz |
v0.8.0 |
v0.10.3 |
|
|
Rpcx |
v1.9.0 |
無限制 |
|
|
Req |
v3.0.0 |
無限制 |
SQL/NOSQL
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
Go Elasticsearch |
v7.0.0 |
無限制 |
|
|
Go Redis |
v8.10.0 |
無限制 |
|
|
Go SQL Driver |
v1.4.0 |
v1.9.3 |
|
|
Gorm |
v1.20.12 |
無限制 |
|
|
GORM MySQL |
v1.0.4 |
無限制 |
|
|
Go標準庫MySQL |
v1.18 |
無限制 |
|
|
Mongo |
v1.11.1 |
無限制 |
|
|
PostgreSQL |
v10.10.0 |
v10.15.1 |
|
|
Redis Go |
v1.9.0 |
v1.9.3 |
|
|
Rueidis |
v1.0.30 |
無限制 |
|
|
sqlx |
v1.3.0 |
無限制 |
|
|
Xorm |
v0.2.2 |
無限制 |
|
|
ClickHouse |
v2.0.1 |
無限制 |
|
|
GORM ClickHouse |
v0.2.0 |
無限制 |
|
|
Cassandra |
v1.3.0 |
無限制 |
日誌
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
Gokit Log |
v0.1.0 |
v0.2.1 |
|
|
Zerolog |
v1.10.0 |
無限制 |
|
|
Zap |
v1.13.0 |
無限制 |
|
|
Logrus |
v1.4.2 |
無限制 |
|
|
Log |
v1.21 |
無限制 |
|
|
Slog |
v1.21 |
無限制 |
|
|
go-zero logx |
v1.6.5 |
無限制 |
|
|
Kratos log |
https://github.com/go-kratos/kratos/blob/main/middleware/logging |
v2.1.2 |
v2.4.0 |
任務調度
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
Cron |
v3.0.0 |
無限制 |
|
|
XxlJob |
v1.2.0 |
無限制 |
|
|
Asynq |
v0.23.0 |
無限制 |
Trace SDK
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
OpenTracing SDK |
v1.1.0 |
v1.2.0 |
|
|
OpenTelemetry SDK |
v1.6.0 |
無限制 |
AI SDK
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
Dify Sandbox |
v0.2.0 |
無限制 |
|
|
Dify Plugin Daemon |
v0.0.6 |
無限制 |
|
|
MCP SDK |
v0.20.0 |
無限制 |
|
|
Langchain SDK |
v0.1.0 |
無限制 |
|
|
openai-go |
v1.5.0 |
無限制 |
|
|
go-openai |
v1.30.0 |
無限制 |
|
|
deepseek |
v1.3.0 |
無限制 |
|
|
coze-studio |
v0.2.0 |
無限制 |
|
|
adk-go |
v0.3.0 |
無限制 |
|
|
eino |
v0.4.0 |
無限制 |
|
|
Google GenAI |
v1.30.0 |
無限制(Google GenAI Stream 模式當前僅支援 v1.36.0、v1.37.0、v1.45.0、v1.46.0 版本) |
|
|
anthropic-sdk-go |
v1.25.0 |
無限制 |
|
|
volcengine-go-sdk |
v1.2.21 |
無限制 |
|
|
new-api |
v0.12.8 |
無限制 |
|
|
milvus client |
v2.5.0 |
無限制 |
|
|
beads |
v1.0.0 |
無限制 |
|
|
trpc-go-agent |
v0.1.0 |
無限制 |
|
|
agent-orchestrator |
v0.1.0 |
無限制 |
阿里雲SDK
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
FC Go SDK |
v0.2.9 |
v0.3.1 |
|
|
OTS Go SDK |
v1.5.0 |
無限制 |
其他SDK
|
組件 |
倉庫地址 |
低版本 |
高版本 |
|
ants pool |
v1.1.0 |
無限制 |
|
|
K8s Client |
v0.27.0 |
v0.32.3 |
|
|
K8s Controller Runtime |
v0.13.1 |
v0.23.3 |
常見問題
Asynq v0.26.0 以下的版本如何?不斷鏈
為什麼使用訊息架構時存在斷鏈?
受限於訊息架構的具體實現,目前的版本的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
}
}
}