Service Mesh (ASM) には、アプリケーションの実行状況をリアルタイムで把握できるように、複数の組み込みモニタリングメトリクスと複数のディメンションが用意されています。強力な拡張メカニズムにより、ASMでは、リクエストまたはレスポンスのコンテンツに基づいて処理ロジックを指定し、処理結果をモニタリングメトリクスのディメンションに追加できます。このトピックでは、Wasmプラグインを使用して、ASMの既存のモニタリングメトリクスにカスタムディメンションを追加する方法について説明します。
背景情報
ASMは、istio_requests_totalやistio_request_duration_millisecondsなど、複数のモニタリングメトリクスを提供します。デフォルトでは、これらのメトリクスは、source_workload、destination_workload、response_codeなど、いくつかのディメンションで構成されています。これらのディメンションに基づいて、メッシュプロキシによって生成されるモニタリングメトリクスを構成できます。詳細については、「可観測性設定の構成」をご参照ください。このようにして、さまざまなダッシュボードとアラートルールを作成できます。
前提条件
バージョン 1.18 以降の ASMインスタンスにクラスターを追加 します。
自動サイドカープロキシインジェクションが有効になっています。詳細については、「サイドカープロキシインジェクションポリシーの構成」をご参照ください。
イングレスゲートウェイを作成 します。
HTTPBin アプリケーションがデプロイされ、アクセスできる状態になっています。詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
手順 1:Wasmプラグインを作成し、HTTPBinアプリケーションに適用する
このセクションでは、RustでWasmプラグインを開発し、リクエストヘッダー内のuser-nameをBase64を使用してデコードし、user-nameをistio_requests_totalメトリクスにディメンションとして追加する方法について説明します。
他の言語のAPIは、RustプラグインのAPIと似ています。他の言語でWasmプラグインを作成する場合は、対応するSDKドキュメントを参照してください。
プラグインのソースコード を取得します。
Wasmプラグインをコンパイルしてデプロイします。詳細については、「ASMのEnvoyプロキシ用のRustでWasmプラグインを作成する」をご参照ください。
このプラグインは、
SetProperty関数を呼び出して、解析結果をfilter_stateとして指定するように設計されています。WasmPluginのサンプルYAMLファイルは次のとおりです。apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: add-metrics-log namespace: default spec: imagePullPolicy: IfNotPresent selector: matchLabels: app: httpbin url: oci://registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-wasm-rust-add-metrics-tag:v1.22.6.7-g1926b20-aliyun phase: AUTHNこの例のイメージはパブリックリポジトリに保存されています。したがって、
wasm-secretsを構成する必要はありません。使用しているACRがプライベートリポジトリの場合は、「ASMのEnvoyプロキシ用のRustでWasmプラグインを作成する」のサンプルYAMLファイルに従って調整する必要があります。
手順 2:可観測性設定を変更してカスタムディメンションを追加する
ASMコンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[モニタリングメトリクス構成] リストで、[REQUEST_COUNT] の [クライアント側メトリクス] と [サーバー側メトリクス] を有効にし、それぞれ値
filter_state["wasm.user-name"]を持つカスタムディメンションuser_nameを追加します。
[送信] をクリックして、
filter_stateをカスタムディメンションに追加します。
手順 3:HTTPBinサービスにアクセスする
次のコマンドを実行して、HTTPBinサービスにアクセスします。
curl ${IP address of ASM gateway}:80/status/418 --header "user-name:YXNtLXRlc3QtdXNlcgo="YXNtLXRlc3QtdXNlcgo=は、Base64でエンコードされたasm-test-userの結果です。 // Base64でエンコードされたasm-test-userの結果です。期待される出力:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`データプレーン上のASMクラスターのkubeconfigファイルを使用して、次のコマンドを実行し、HTTPBinポッドのPrometheusメトリクスを表示します。
kubectl exec deploy/httpbin -it -c istio-proxy -- curl localhost:15000/stats/prometheus | grep istio_requests_total期待される出力:
# TYPE istio_requests_total counter istio_requests_total{reporter="destination",source_workload="istio-ingressgateway",...,user_name="asm-test-user"} 3この場合、このディメンションに基づいて、Prometheusで特定のユーザーの統計情報を指定できます。