すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:Zipkin を使用して Go アプリケーションのトレースデータをレポートする

最終更新日:Dec 30, 2024

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 アプリケーションの監視 を参照してください。

前提条件

Jaeger または Zipkin のエンドポイントを取得するには、次の手順を実行します。

  1. Managed Service for OpenTelemetry コンソール にログインします。

  2. 左側のナビゲーションペインで、クラスタ設定をクリックします。表示されるページで、アクセスポイント情報タブをクリックします。

  3. 上部のナビゲーションバーで地域を選択します。クラスタ情報セクションで、トークンを表示をオンにします。

  4. クライアントパラメータを Jaeger または Zipkin に設定します。この例では、Jaeger が選択されています。

    下部の表の関連情報列で、Jaeger または Zipkin のエンドポイントを取得します。

    Jaeger/Zipkin接入点信息

    説明

    アプリケーションが Alibaba Cloud の本番環境にデプロイされている場合は、VPC エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。一般的に、Zipkin には v2 のエンドポイントを使用します。Zipkin をよく理解している場合にのみ、v1 のエンドポイントを使用してください。

背景情報

Zipkin は、Twitter によってリアルタイムデータのトレースのために開発されたオープンソースの分散トレースシステムです。Zipkin は、複数の異種システムから収集されたリアルタイムの監視データを集約します。

次の図は、Zipkin を使用してデータをレポートする方法を示しています。

アプリケーションのインストルメント

Zipkin を使用して Go アプリケーションのトレースデータを Managed Service for OpenTelemetry コンソールにレポートする前に、アプリケーションをインストルメントする必要があります。

  1. 依存関係を追加します。

    [[constraint]]
      name = "github.com/openzipkin/zipkin-go"
      version = "0.1.1"
    
    [[constraint]]
      name = "github.com/gorilla/mux"
      version = "1.6.2"
  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;
    }
  3. リクエストデータを記録します。

    // トレーサーを使用してスパンを作成できるようになりました。
    span := tracer.StartSpan("some_operation")
    // ... 何らかの処理を実行 ...
    span.Finish()
    説明

    上記のコードを実行して、リクエストのルート操作を記録するルートスパンを作成できます。リクエストの前後の操作を記録する場合は、コンテキスト情報を指定します。例:

    childSpan := tracer.StartSpan("some_operation2", zipkin.Parent(span.Context()))
        // ... 何らかの処理を実行 ...
    childSpan.Finish()
  4. オプション。トラブルシューティングを容易にするために、スパンにカスタムタグを追加できます。たとえば、エラーが発生したかどうかを確認したり、リクエストの戻り値を記録したり、エラーメッセージを設定したりできます。

    カスタムタグを追加します。

    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()
  5. 分散システムでは、リモートプロシージャコール (RPC) リクエストはトレースデータとともに送信されます。トレースデータには、TraceId、ParentSpanId、SpanId、および Sampled パラメータの値が含まれています。Extract または Inject メソッドを呼び出して、HTTP リクエストヘッダーでトレースデータを渡すことができます。次の図は、プロセス全体を示しています。

    1.jpg

    説明

    Zipkin では、HTTP または Google Remote Procedure Call (gRPC) を介してコンテキスト情報を渡すことができます。

    1. クライアントで Inject メソッドを呼び出して、コンテキスト情報を指定します。

      req, _ := http.NewRequest("GET", "/", nil)
      // リクエストにトレースコンテキストを挿入する関数を設定します
      injector := b3.InjectHTTP(req)
      injector(sp.Context())
    2. サーバーで Extract メソッドを呼び出して、コンテキスト情報を抽出します。

      req, _ := http.NewRequest("GET", "/", nil)
              b3.InjectHTTP(req)(sp.Context())
      
              b.ResetTimer()
              _ = b3.ExtractHTTP(copyRequest(req))

Zipkin を使い始める

次の例は、Zipkin を使用して Go アプリケーションのトレースデータをレポートする方法を示しています。

  1. デモ ファイルをダウンロードします。

  2. utils.go ファイルのデータレポートのエンドポイントを変更します。

    説明

    <endpoint> を、クライアントが存在する地域のエンドポイントに置き換えます。Managed Service for OpenTelemetry コンソールにログインし、アクセスポイント情報クラスタ設定ページのタブでエンドポイントを確認できます。エンドポイントの取得方法の詳細については、このトピックの「前提条件」セクションを参照してください。

  3. 必要な依存関係をインストールします。

    dep ensure
  4. テストアプリケーションを実行します。

    go run main.go

    アプリケーションページManaged Service for OpenTelemetry コンソールで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。

FAQ

Q:上記の手順を実行した後、データがレポートされないのはなぜですか?

A:アプリケーションの実行時に返されるエラーメッセージを確認し、endpoint_url パラメータの値が有効かどうかを確認できます。たとえば、failed the request with status code 403 メッセージが返された場合、ユーザー名またはパスワードが無効です。