このトピックでは、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.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 | 制限なし | |
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 | v3.3.0 | |
Echo | v4.0.0 | 制限なし | |
FastHTTP | v1.45.0 | 制限なし | |
Fiber | v2.43.0 | 制限なし | |
Gin | v1.7.0 | 制限なし | |
GoFrame | v2.4.0 | 制限なし | |
Go Micro | v4.9.0 | v5.19.1 | |
Go Restful | v3.7.0 | 制限なし | |
Go Zero | v1.5.0 | 制限なし | |
gRPC | v1.44.0 | 制限なし | |
Iris | v12.0.0 | v12.2.11 | |
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 | v1.31.1 | |
GORM MySQL | v1.0.4 | 制限なし | |
Go standard library MySQL | v1.18 | 制限なし | |
Mongo | v1.11.1 | 制限なし | |
PostgreSQL | v10.10.0 | v10.15.0 | |
Redis Go | v1.9.0 | v1.9.3 | |
Rueidis | v1.0.30 | 制限なし | |
sqlx | v1.3.0 | v1.4.0 | |
Xorm | v0.2.2 | 制限なし | |
ClickHouse | v2.0.1 | 制限なし | |
GORM ClickHouse | v0.2.0 | 制限なし |
ロギング
コンポーネント | リポジトリアドレス | 以前のバージョン | 新しいバージョン |
Gokit Log | v0.1.0 | v0.2.1 | |
Zerolog | v1.10.0 | 制限なし | |
Zap | v1.13.0 | 制限なし | |
Logrus | v1.5.0 | 制限なし | |
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 | 制限なし |
トレース SDK
コンポーネント | リポジトリアドレス | 最小バージョン | アドバンストエディション |
OpenTracing SDK | v1.1.0 | v1.2.0 | |
OpenTelemetry SDK | v1.6.0 | v1.40.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 ストリームモードはバージョン v1.36.0、v1.37.0、v1.45.0、v1.46.0 のみをサポートしています。) |
Alibaba Cloud 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 より前のバージョンでトレースの継続性を維持する方法
詳細については、「Asynq v0.26.0 より前のバージョンでトレースの継続性を維持する方法」をご参照ください。
メッセージフレームワーク使用時にトレースが途切れる原因
特定のメッセージフレームワークの実装詳細により、現在の Go エージェントには、それらをまたいでトレースコンテキストを伝播する際に制限があります。
コンポーネント | リポジトリ URL | プロデューサー | コンシューマー |
AMQP | 制限なし。 | 受信スパンのみが記録されます。メッセージ本文に基づくダウンストリーム呼び出しから生成されたスパンは、受信スパンにリンクできません。 | |
Segmentio Kafka | 制限なし。 | 受信スパンのみが記録されます。メッセージ本文に基づくダウンストリーム呼び出しから生成されたスパンは、受信スパンにリンクできません。 | |
Shopify Sarama | AsyncProducer を使用する場合、発行スパンをその親の呼び出しスパンにリンクすることはできません。 | 受信スパンのみが記録されます。メッセージ本文に基づくダウンストリーム呼び出しから生成されたスパンは、受信スパンにリンクできません。 | |
IBM Sarama | AsyncProducer を使用する場合、発行スパンをその親の呼び出しスパンにリンクすることはできません。 | 受信スパンのみが記録されます。メッセージ本文に基づくダウンストリーム呼び出しから生成されたスパンは、受信スパンにリンクできません。 | |
RocketMQ Client Go | 制限なし。 |
| |
RocketMQ Client | https://github.com/apache/rocketmq-clients/tree/master/golang | 制限なし。 | 受信スパンのみが記録されます。メッセージ本文に基づくダウンストリーム呼び出しから生成されたスパンは、受信スパンにリンクできません。 |
Redis クライアント使用時にデータベースまたは NoSQL の呼び出しがコンソールに表示されない原因
フレームワークの実装詳細により、Go エージェントは init 関数の前に実行される操作のイベントトラッキングを行うことができません。
Redis またはデータベースのクライアントは、必ず init 関数内で初期化してください。
// 不正なアプローチ
var rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // パスワードなし
DB: 0, // デフォルトの DB を使用
})
// 有効なアプローチ
var rdb *redis.Client
func init() {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // パスワードなし
DB: 0, // デフォルトの DB を使用
})
}
カスタム OpenTelemetry SDK のイベントトラッキングが表示されない原因
「カスタム設定」ページで、[エージェントスイッチ設定] セクションの [opentelemetry-plugin] を選択し、アプリケーションを再起動します。

デフォルトのサンプルレートは 10% です。リクエストが少ない場合、トレースが表示されないことがあります。必要に応じてサンプルレートを調整できます。
RabbitMQ にカスタムスパンを追加する方法
カスタムスパンを追加するには、次のサンプルコードを使用します。
import (
"context"
oTrace "go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
// ハンドラ内の各メッセージに対してスパンを作成
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()
// その他の処理
}
}
Kafka にカスタムスパンを追加する方法
カスタムスパンを追加するには、次のサンプルコードを使用します。
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"
)
// ハンドラ内の各メッセージに対してスパンを作成
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()
// その他の処理
}
}
}