Zipkin を使用してアプリケーションをインストルメントし、アプリケーションのトレースデータを Managed Service for OpenTelemetry にレポートすると、Managed Service for OpenTelemetry はアプリケーションの監視を開始します。アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL 分析など、アプリケーションの監視データを表示できます。このトピックでは、Zipkin を使用して Go アプリケーションをインストルメントし、アプリケーションのトレースデータをレポートする方法について説明します。
より豊富な機能、高度なトレース機能、最適なユーザーエクスペリエンスを実現するために、OpenTelemetry プロトコルを使用してアプリケーションを Managed Service for OpenTelemetry に接続することをお勧めします。Alibaba Cloud は、OpenTelemetry をアプリケーションと統合する方法、および Managed Service for OpenTelemetry を使い始めるのに役立つ OpenTelemetry の使用に関するベストプラクティスに関する詳細な手順を提供しています。詳細については、準備 を参照してください。
ARMS は、Go アプリケーション用に商用サポートされている独自開発のエージェントを提供しています。このエージェントは非侵入型のインストルメンテーションを可能にし、より豊富な機能セットと強化された安定性を提供します。詳細については、Go アプリケーションの監視 を参照してください。
前提条件
背景情報
Zipkin は、Twitter によってリアルタイムデータのトレースのために開発されたオープンソースの分散トレースシステムです。Zipkin は、複数の異種システムから収集されたリアルタイムの監視データを集約します。
アプリケーションのインストルメント
Zipkin を使用して Go アプリケーションのトレースデータを Managed Service for OpenTelemetry コンソールにレポートする前に、アプリケーションをインストルメントする必要があります。
依存関係を追加します。
[[constraint]] name = "github.com/openzipkin/zipkin-go" version = "0.1.1" [[constraint]] name = "github.com/gorilla/mux" version = "1.6.2"
トレーサーを作成します。トレーサーを使用して、分散操作の時間を記録するスパンを作成できます。トレーサーには、データのレポート元のエンドポイント、オンプレミスマシンの IP アドレス、サンプリングレートなどの情報が含まれています。サンプリングレートを調整して、データレポートのコストを削減できます。
func getTracer(serviceName string, ip string) *zipkin.Tracer { // トレーサーが使用するレポーターを作成します。 reporter := httpreporter.NewReporter("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_aokcdqnxyz@123456ff_abcdef123@abcdef123/api/v2/spans") // サービスのローカルエンドポイントを設定します。 endpoint, _ := zipkin.NewEndpoint(serviceName, ip) // サンプリング戦略を設定します。 sampler := zipkin.NewModuloSampler(1) // トレーサーを初期化します。 tracer, _ := zipkin.NewTracer( reporter, zipkin.WithLocalEndpoint(endpoint), zipkin.WithSampler(sampler), ) return tracer; }
リクエストデータを記録します。
// トレーサーを使用してスパンを作成できるようになりました。 span := tracer.StartSpan("some_operation") // ... 何らかの処理を実行 ... span.Finish()
説明上記のコードを実行して、リクエストのルート操作を記録するルートスパンを作成できます。リクエストの前後の操作を記録する場合は、コンテキスト情報を指定します。例:
childSpan := tracer.StartSpan("some_operation2", zipkin.Parent(span.Context())) // ... 何らかの処理を実行 ... childSpan.Finish()
オプション。トラブルシューティングを容易にするために、スパンにカスタムタグを追加できます。たとえば、エラーが発生したかどうかを確認したり、リクエストの戻り値を記録したり、エラーメッセージを設定したりできます。
カスタムタグを追加します。
childSpan.Tag("http.status_code", statusCode)
カスタムエラーメッセージを作成します。
childSpan := tracer.StartSpan("some_operation2", zipkin.Parent(span.Context())) // ... 何らかの処理を実行 ... var events = make(map[string]string) events["event"] = "error" events["stack"] = "Runtime Exception: unable to find userid" jsonStr, err := json.Marshal(events) if err == nil { childSpan.Annotate(time.Now(), string(jsonStr)) } childSpan.Finish()
分散システムでは、リモートプロシージャコール (RPC) リクエストはトレースデータとともに送信されます。トレースデータには、TraceId、ParentSpanId、SpanId、および Sampled パラメータの値が含まれています。Extract または Inject メソッドを呼び出して、HTTP リクエストヘッダーでトレースデータを渡すことができます。次の図は、プロセス全体を示しています。
説明Zipkin では、HTTP または Google Remote Procedure Call (gRPC) を介してコンテキスト情報を渡すことができます。
クライアントで Inject メソッドを呼び出して、コンテキスト情報を指定します。
req, _ := http.NewRequest("GET", "/", nil) // リクエストにトレースコンテキストを挿入する関数を設定します injector := b3.InjectHTTP(req) injector(sp.Context())
サーバーで Extract メソッドを呼び出して、コンテキスト情報を抽出します。
req, _ := http.NewRequest("GET", "/", nil) b3.InjectHTTP(req)(sp.Context()) b.ResetTimer() _ = b3.ExtractHTTP(copyRequest(req))
Zipkin を使い始める
次の例は、Zipkin を使用して Go アプリケーションのトレースデータをレポートする方法を示しています。
デモ ファイルをダウンロードします。
utils.go ファイルのデータレポートのエンドポイントを変更します。
説明<endpoint>
を、クライアントが存在する地域のエンドポイントに置き換えます。Managed Service for OpenTelemetry コンソールにログインし、アクセスポイント情報 ページのタブでエンドポイントを確認できます。エンドポイントの取得方法の詳細については、このトピックの「前提条件」セクションを参照してください。必要な依存関係をインストールします。
dep ensure
テストアプリケーションを実行します。
go run main.go
のアプリケーションページManaged Service for OpenTelemetry コンソールで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。
FAQ
Q:上記の手順を実行した後、データがレポートされないのはなぜですか?
A:アプリケーションの実行時に返されるエラーメッセージを確認し、endpoint_url パラメータの値が有効かどうかを確認できます。たとえば、failed the request with status code 403
メッセージが返された場合、ユーザー名またはパスワードが無効です。