Docs » Splunk Observability Cloud でサポートされているインテグレーション » バックエンドアプリケーションをインストルメンテーションして、スパンを Splunk APM に送信する » Splunk Observability Cloud けに Go アプリケーションをインストルメンテーションする » SignalFx Tracing Library for Go からの移行

SignalFx Tracing Library for Go からの移行 🔗

Splunk Distribution of OpenTelemetry Go は、非推奨の SignalFx Go Tracing Library を置き換えるものです。Splunk Go OTel インストルメンテーションに移行するには、以下の手順に従ってください。

互換性と要件 🔗

Splunk Distribution of OpenTelemetry Go には Go 1.18 以上が必要です。Goインストルメンテーションの互換性と要件 を参照してください。

トレース設定の再設定 🔗

Splunk Distribution of OpenTelemetry Go の distro パッケージは、SignalFx Tracing Library for Go の tracing パッケージを置き換えます。tracing.Start 関数を distro.Run に置き換えてください。

tracing.StartOption インスタンスでは、以下の置換を使用します:

SignalFx トレーシング・ライブラリ

Splunk OTel Go

tracing.WithAccessToken

環境変数 SPLUNK_ACCESS_TOKEN を使用します。詳しくは 一般設定 を参照してください。

tracing.WithEndpointURL

SPLUNK_REALM 、またはその他の環境変数を使用してエクスポーターを設定します。詳しくは エクスポーターの設定 を参照してください。

tracing.WithGlobalTag

リソースの定義 を参照してください。

tracing.WithRecordedValueMaxLength

スパンリミットの設定 を参照してください。

tracing.WithServiceName

リソースの定義 を参照してください。

tracing.WithoutLibraryTags

トレース・ライブラリに関するメタデータは、distro.SDK に関連する Resource で入手できます。詳しくは リソースの定義 を参照してください。

アプリケーションが停止したら、distro.SDK をシャットダウンする必要があります。次の例のように、main 関数のクリーンアップ関数を延期してください:

sdk, err := distro.Run()
if err != nil {
   panic(err)
}
defer func() {
   // A context with a deadline can be passed here instead if needed
   if err := sdk.Shutdown(context.Background()); err != nil {
      panic(err)
   }
}()
/* ... */

リソースの定義 🔗

OpenTelemetry はリソースを使用して、すべてのスパンに適用されるメタデータを記述します。distro.Run 関数は、トレースに必要な Splunk と OpenTelemetry のメタデータをすべて含むデフォルトの Resource エンティティを作成します。サービスに関するメタデータを提供するには、 Resource にそれを含めます。

distro.SDK によって生成されたすべてのトレースのメタデータに追加属性を含めるには、OTEL_RESOURCE_ATTRIBUTES 環境変数を使用します。例:

export OTEL_RESOURCE_ATTRIBUTES="ab-test-value=red,owner=Lisa"

注意

サービス名の設定は必須。環境変数 OTEL_SERVICE_NAME を使ってサービス名を設定しないと、トレース・データが識別できなくなる可能性があります。

スパンリミットの設定 🔗

OpenTelemetry には、コードが計算リソースを過剰に使用するのを防ぐためのガードが含まれています。以下の環境変数を設定することで、スパン制限を設定することができます:

環境変数

説明

OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT

スパンごとの属性の最大数。デフォルト値は無制限です。

OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT

イベントごとの属性の最大数。デフォルト値は無制限です。

OTEL_LINK_ATTRIBUTE_COUNT_LIMIT

リンクあたりの最大属性数。デフォルト値は無制限です。

OTEL_SPAN_EVENT_COUNT_LIMIT

1スパンあたりの最大イベント数。デフォルト値は無制限です。

OTEL_SPAN_LINK_COUNT_LIMIT

スパンあたりの最大リンク数。デフォルト値は 1000 です。

OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT

span属性値の文字列の最大長。制限値より大きな値は切り捨てられます。デフォルト値は 12000 です。

OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT 環境変数を同じ値に設定することで、tracing.WithRecordedValueMaxLength のインスタンスを置き換えます。

マニュアルのインストルメンテーションをすべて書き換える 🔗

tracer パッケージを使用して作成されたすべてのスパンを、OpenTelemetry を使用するように編集します。

tracer パッケージを使ってインストルメンテーションされた次の関数を考えてみます:

func BusinessOperation(ctx context.Context, client string) {
   opts := []tracer.StartSpanOption{
      tracer.Tag("client", client),
      tracer.SpanType("internal"),
   }
   if parent, ok := tracer.SpanFromContext(ctx); ok {
      opts = append(opts, tracer.ChildOf(parent.Context()))
   }
   span := tracer.StartSpan("BusinessOperation", opts...)
   defer span.Finish()
   /* ... */
}

すべてのスパンをOpenTelemetryを使うように編集すると、コードは次の例のようになります:

func BusinessOperation(ctx context.Context, client string) {
   tracer := otel.Tracer("app-name")
   opts := []trace.SpanStartOption{
      trace.WithAttributes(attribute.String("client", client)),
      trace.WithSpanKind(trace.SpanKindInternal),
   }
   ctx, span := tracer.Start(ctx, "BusinessOperation", opts...)
   defer span.End()
   /* ... */
}

OpenTelemetryトレーサーを作成する 🔗

OpenTelemetry は、単一のインストルメンテーション・ライブラリのトレース機能をカプセル化するためにトレースを使用します。次の例のように、distro.SDK を起動したときに登録されるグローバルな TracerProvider から Tracer を作成します:

tracer := otel.Tracer("app-name")

新しいトレーサーとその Start 関数を使用して、すべての tracer.StartSpan 呼び出しを置き換えます:

ctx, span := tracer.Start(ctx, "BusinessOperation", /* options ... */)

tracer.StartSpanoperationName パラメータを Startname パラメータとして使用します。

StartSpanOptionインスタンスを置き換える 🔗

tracer.StartSpanOption インスタンスには以下の置換を使用します:

SignalFx トレーシング・ライブラリ

Splunk OTel Go

tracer.ChildOf

スパン間の関係は、 context.Context を使って定義されます。Start に渡される context.Context には、親スパンが含まれている必要があります。これは、Start への以前の呼び出しからコンテキストが返された場合、自動的に行われます。コンテキスト内で親スパンを明示的に定義するには、trace.ContextWithSpan を使用します。

tracer.ResourceName

リソースの定義 を参照してください。

tracer.ServiceName

リソースの定義 を参照してください。

tracer.SpanType

trace.WithSpanKind

tracer.StartTime

trace.WithTimestamp

tracer.Tag

trace.WithAttributes

tracer.WithRecordedValueMaxLength

スパンリミットの設定 を参照してください。

tracer.WithSpanID

スパンIDは自動的に設定されます。カスタム・スパンIDが必要な場合は、カスタム IDGenerator を作成してください。

すべてのスパンを終了する 🔗

次の例のように、OpenTelemetry End メソッドを使用してスパンを終了します:

defer span.End()

すべてのインストルメンテーション・ライブラリを交換する 🔗

もしあれば、以下のインストルメンテーション・ライブラリを OpenTelemetry と同等のものに置き換えてください:

SignalFx ライブラリ

OpenTelemetry ライブラリ

aws/aws-sdk-go/aws

otelaws

bradfitz/gomemcache/memcache

otelmemcache

confluentinc/confluent-kafka-go/kafka

splunkkafka

database/sql

splunksql ( splunkmysql splunkpgx splunkpq )

emicklei/go-restful

otelrestful

garyburd/redigo

gomodule/redigosplunkredigo

gin-gonic/gin

otelgin

globalsign/mgo

mongodb/mongo-go-driverotelmongo

go-chi/chi

splunkchi

go-redis/redis

本パッケージは OpenTelemetry のネイティブサポートを提供します。

gocql/gocql

otelgocql

gomodule/redigo

splunkredigo

google.golang.org/api

otelgrpc または otelhttp のいずれかを、gRPC または HTTP クライアントとともに使用して、cloudresourcemanager.NewService を呼び出します。

google.golang.org/grpc.v12

otelgrpc と共に最新バージョンのパッケージを使用してください。

google.golang.org/grpc

otelgrpc

gorilla/mux

otelmux

graph-gophers/graphql-go

splunkgraphql

jinzhu/gorm

splunkgorm

jmoiron/sqlx

splunksqlx

julienschmidt/httprouter

splunkhttprouter

k8s.io/client-go/kubernetes

splunkclient-go

labstack/echo.v4

otelecho

labstack/echo

echo@v4 にアップグレードし、otelecho を使用します。

miekg/dns

splunkdns

mongodb/mongo-go-driver/mongo

otelmongo

net/http

splunkhttp および otelhttp

olivere/elastic

splunkelastic

Shopify/sarama

otelsarama

syndtr/goleveldb/leveldb

splunkleveldb

tidwall/buntdb

splunkbuntdb

SignalFxトレーシング・ライブラリの削除 🔗

移行が完了したら、github.com/signalfx/signalfx-go-tracing パッケージの依存関係をすべて削除してください。go.mod ファイルをクリーンアップした後、これを確認してください。

このページは 2023年02月14日 に最終更新されました。