Service Mesh は Managed Service for OpenTelemetry と統合されており、分散アプリケーションのパフォーマンスボトルネックの特定に役立ちます。トレースデータの表示、トレーストポロジーの表示、アプリケーションの依存関係の分析、リクエストのカウントが可能です。
背景情報
分散トレーシングは、特にマイクロサービスアーキテクチャで構築されたアプリケーションのプロファイリングと監視を行います。ASM インスタンス内のサイドカープロキシは、スパンを自動的に生成して送信できますが、スパンが単一のトレースに正しく関連付けられるように、アプリケーションは適切な HTTP ヘッダーを伝播させる必要があります。具体的には、アプリケーションは各受信リクエストから特定のヘッダーを収集し、その受信リクエストによってトリガーされるすべての送信リクエストにそれらを転送する必要があります。OpenTelemetry は、それぞれ異なるヘッダーを使用する複数のプロパゲーターをサポートしています。以下のセクションでは、サポートされているプロパゲーターとそれに対応するヘッダーを示します。
B3 プロパゲーター
-
x-request-id -
x-b3-traceid -
x-b3-spanid -
x-b3-parentspanid -
x-b3-sampled -
x-b3-flags -
x-ot-span-context
W3C Trace Context プロパゲーター
-
traceparent -
tracestate
V1.18.0.124 以前の ASM インスタンスは、デフォルトで B3 プロパゲーターを使用します。V1.18.0.124 より新しいバージョンの ASM インスタンスは、デフォルトで W3C Trace Context プロパゲーターを使用します。
前提条件
-
Managed Service for OpenTelemetry をアクティブ化していること。料金については、「料金ルール」をご参照ください。
-
ASM インスタンスが作成され、そのインスタンスに対して Managed Service for OpenTelemetry が有効化されていること。詳細については、「ASM トレーシングデータを Managed Service for OpenTelemetry に収集する」をご参照ください。
-
ASM インスタンスに追加された ACK クラスターにアプリケーションがデプロイされていること。詳細については、「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。
サンプルアプリケーションの説明
Bookinfo サンプルアプリケーションでは、productpage サービス (Python で実装) は OpenTracing ライブラリを使用して、B3 伝播形式の HTTP リクエストから必要なヘッダーを抽出します。
def getForwardHeaders(request):
headers = {}
# x-b3-*** ヘッダーは、OpenTracing スパンを使用して設定できます
span = get_current_span()
carrier = {}
tracer.inject(
span_context=span.context,
format=Format.HTTP_HEADERS,
carrier=carrier)
headers.update(carrier)
# ...
incoming_headers = ['x-request-id']
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
reviews サービス (Java で実装) も B3 伝播形式の HTTP ヘッダーを使用します。
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
@HeaderParam("end-user") String user,
@HeaderParam("x-request-id") String xreq,
@HeaderParam("x-b3-traceid") String xtraceid,
@HeaderParam("x-b3-spanid") String xspanid,
@HeaderParam("x-b3-parentspanid") String xparentspanid,
@HeaderParam("x-b3-sampled") String xsampled,
@HeaderParam("x-b3-flags") String xflags,
@HeaderParam("x-ot-span-context") String xotspan) {
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);
アクセス例
ブラウザのアドレスバーに http://{Ingress ゲートウェイの IP アドレス}/productpage 形式の URL を入力し、Enter キーを押します。Bookinfo アプリケーションのページに移動します。
アプリケーションの表示
Managed Service for OpenTelemetry コンソールの [Applications] ページには、監視対象のすべてのアプリケーションの主要メトリクスが表示されます。これには、当日のリクエスト数とエラー数、および正常性ステータスが含まれます。また、アプリケーションにラベルを設定して、ラベルでアプリケーションをフィルタリングできます。
-
左側のナビゲーションペインで、[アプリケーション] をクリックします。ページの上部で、ターゲットリージョンを選択します。
アプリケーション詳細の表示
[Application Details] ページには、アプリケーションがデプロイされている各サーバーにおけるアプリケーションの主要メトリクス、呼び出しトポロジー、およびトレースが表示されます。
-
左側のナビゲーションペインで、[アプリケーション] をクリックします。 ページの上部で対象のリージョンを選択し、次に対象アプリケーションの名前をクリックします。
-
左側のナビゲーションペインで、[アプリケーション詳細] をクリックします。左側のマシンリストで、[すべて] または IP アドレスで識別されるマシンをクリックします。
[概要] タブでは、呼び出しトポロジーと主要なパフォーマンスメトリックを表示できます。[トレース] タブでは、選択したマシンのアプリケーションのトレースリストを期間の降順で表示できます。このページには、最大 100 件のトレースが一覧表示されます。[トレース] タブをクリックすると、トレースレコードのリストが表示されます。左側のパネルには、[応答時間]、[リクエスト]、[エラー] などの並べ替えメトリックと、インスタンスフィルタリング機能があります。右側のリストには、各スパンの [開始時刻]、[スパン名]、[ホスト/IP]、[期間]、[ステータス]、[traceid] などの情報が表示されます。[期間が次より大きい] 入力ボックスと [例外] チェックボックスを使用して、レコードをフィルターできます。[ログの表示] をクリックすると、対応する呼び出しのログ詳細が表示されます。
トレースのウォーターフォールチャートの表示
トレースのウォーターフォールチャートには、ログ生成時刻、ステータス、IP アドレスまたはサーバー名、サービス名、タイムラインが表示されます。
-
[アプリケーション詳細] ページで、[トレース] タブをクリックし、目的のトレースのトレース ID をクリックします。
-
表示された[トレース] ページで、トレースのウォーターフォールチャートを表示します。
説明-
[IP アドレス] フィールドには、[アプリケーション設定] ページの表示設定によって、IP アドレスまたはマシン名が表示されます。 詳細については、「アプリケーションとタグの管理」をご参照ください。
-
サービス名にポインターを合わせると、期間、開始時刻、タグ、ログイベントなど、サービスに関する情報を表示できます。詳細については、「アプリケーションの詳細」をご参照ください。
トレースの詳細ページの上部には、開始時刻、合計期間、アプリケーション数、トレースの深さ、およびスパンの合計数を含むサマリーが表示されます。サマリーの下にあるスパンリストでは、インデントによってサービス間の呼び出し階層が示されます。列には、[Span Name]、[Timeline] (消費時間の割合を示す青いバー)、[Application Name]、[Start Time]、[IP Address]、および [Status] が含まれます。
-
よくある質問
ASM コンソールで Managed Service for OpenTelemetry にトレーシングデータを収集した後、トレース情報を表示できないのはなぜですか?
-
トレースプッシュログを表示します。
-
クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得して kubectl でクラスターに接続する」をご参照ください。
-
次のコマンドを実行して、istio-system 名前空間内の tracing-on-external-zipkin Deployment に関連する Pod のトレースプッシュログを表示します。
kubectl logs "$(kubectl get pods -n istio-system -l app=tracing -o jsonpath='{.items[0].metadata.name}')" -n istio-system -c `nginx`出力された Nginx ログの
status値が406の場合、/api/v2/spansへの POST リクエストが HTTP 406 ステータスコードを返したことを示します。remote_addr:192.168.26.98 time_local:17/Aug/2021:08:15:17 +0000 method:POST uri:/api/v2/spans host:zipkin status:406 bytes_sent:1146 referer:- useragent:- forwardedfor:192.168.26.98 request_time:0.012 upstream_response_time:0.011 remote_addr:192.168.26.98 time_local:17/Aug/2021:08:15:17 +0000 method:POST uri:/api/v2/spans host:zipkin status:406 bytes_sent:1146 referer:- useragent:- forwardedfor:192.168.26.98 request_time:0.012 upstream_response_time:0.013
-
-
1 日あたりのサービスリクエスト数のクォータと、前日の実際のサービスリクエスト数を表示します。
-
左側のナビゲーションペインで、[クラスター設定] をクリックすると、リクエストクォータと昨日のリクエスト数を表示できます。
[Quota configuration] パネルの [Configuration quota] フィールドには、現在のクォータ値が 10,000 リクエスト単位で表示されます。前日の実際のリクエスト数は、パネルタイトルの括弧内に表示されます。前日のリクエスト数が設定されたクォータを超えている場合は、クォータを増やす必要があります。
前日の実際のリクエスト数が設定された 1 日のクォータを超えている場合、報告されたデータは破棄されます。
-
1 日あたりのサービスリクエスト数のクォータを変更します。
実際の 1 日のリクエスト数が 1 日のクォータを超えると、報告されたデータは破棄され、トレース情報は表示されません。この問題を解決するには、1 日のクォータを実際の 1 日のリクエスト数より大きい値に増やしてください。
-
Managed Service for OpenTelemetry コンソールの左側のナビゲーションペインで、[クラスター設定] をクリックします。
-
[クラスター設定] タブの [クォータ設定] エリアで、[設定クォータ] をサービスリクエスト数より大きい値に変更してから、[保存] をクリックします。
-
[プロンプト] ダイアログボックスで、[OK] をクリックします。
-
Ingress ゲートウェイまたはサイドカーでリクエストが処理された後、traceid が変更されるのはなぜですか?
この問題は、アプリケーションのリクエストの 伝播ヘッダー が不完全な場合に発生し、サイドカープロキシがそれらを再生成します。カスタム traceid を使用するには、B3 伝播形式では少なくとも x-b3-traceid と x-b3-spanid を含めるか、W3C Trace Context 伝播形式では少なくとも traceparent ヘッダーを含める必要があります。