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

Container Compute Service:Gateway with Inference Extension を使用した生成 AI リクエストの監視

最終更新日:Mar 26, 2026

Gateway with Inference Extension は、OpenTelemetry Gen AI Semantic Conventions に基づいて、生成 AI リクエストのメトリックとログをエクスポートします。このトピックでは、Gateway with Inference Extension を使用してこれらのメトリックとログをエクスポートする方法について説明します。

背景情報

OpenTelemetry Gen AI Semantic Conventions は、大規模言語モデル (LLM)、テキスト生成、イメージ生成などを使用する生成 AI アプリケーションをモニタリングおよびトレースするための標準化されたフレームワークを提供します。このフレームワークは、すべての生成 AI リクエストのメトリック、ログ、およびトレースデータを統合し、システム間の分析とトラブルシューティングを簡素化します。この規則の主な目的は次のとおりです。

  • 標準化されたデータ収集:

    生成 AI リクエストの共通属性には、モデル名、入出力トークン数、構成パラメーターが含まれます。

  • エンドツーエンドのトレース分析のサポート:

    生成 AI リクエストからのトレースデータを、データベースや API ゲートウェイなどの他のシステムからのデータと関連付けます。

  • 統一された分析とモニタリング:

    標準化されたラベルにより、Prometheus や Grafana などのツールでデータを集約および可視化できます。

前提条件

可観測性データ出力の構成

生成 AI 可観測性プラグインのデプロイ

Gateway with Inference Extension は、gen-ai-telemetry 可観測性プラグインを使用して可観測性データをエクスポートします。gen-ai-telemetry 可観測性プラグインはイメージとして提供され、固定のスケジュールでは更新されません。最新のイメージバージョンを取得するには、gen-ai-telemetry プラグインのリリース履歴を表示できます。

kubectl apply -f - <<EOF
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyExtensionPolicy
metadata:
  name: ack-gateway-llm-telemetry
spec:
  targetRefs:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: mock-route
  wasm:
  - name: llm-telemetry
    rootID: ack-gateway-extension
    code:
      type: Image
      image:
        url: registry-cn-hangzhou.ack.aliyuncs.com/acs/gen-ai-telemetry-wasmplugin:g76f5a66-aliyun
EOF

gen-ai-telemetry 可観測性プラグインイメージは、内部ネットワーク経由でプルできます。クラスターがインターネットからイメージをプルできない場合は、イメージアドレスをリージョンの VPC エンドポイントに変更できます。たとえば、クラスターが中国 (北京) リージョンにある場合は、registry-cn-beijing-vpc.ack.aliyuncs.com/acs/gen-ai-telemetry-wasmplugin:{image_tag} を使用してイメージをプルします。

ゲートウェイメトリックタグのルールの構成

mock-vllm アプリケーションをデプロイすると、custom-proxy-config という名前の EnvoyProxy リソースも作成されます。ゲートウェイメトリックをエクスポートするには、このリソースにメトリックタグのルールを追加します。

  1. EnvoyProxy リソースを編集します。

    kubectl edit envoyproxy custom-proxy-config
  2. custom-proxy-configspec.bootstrap コンテンツを次の YAML で更新します。

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: custom-proxy-config
      namespace: default
    spec:
      bootstrap:
        type: JSONPatch
        jsonPatches:
        - op: add
          path: /stats_config
          value:
            stats_tags:
              - tag_name: gen_ai.operation.name
                regex: "(\\|gen_ai.operation.name=([^|]*))"
              - tag_name: gen_ai.system
                regex: "(\\|gen_ai.system=([^|]*))"
              - tag_name: gen_ai.token.type
                regex: "(\\|gen_ai.token.type=([^|]*))"
              - tag_name: gen_ai.request.model
                regex: "(\\|gen_ai.request.model=([^|]*))"
              - tag_name: gen_ai.response.model
                regex: "(\\|gen_ai.response.model=([^|]*))"
              - tag_name: gen_ai.error.type
                regex: "(\\|gen_ai.error.type=([^|]*))"
              - tag_name: server.port
                regex: "(\\|server.port=([^|]*))"
              - tag_name: server.address
                regex: "(\\|server.address=([^|]*))"

    保存して終了すると、構成はすぐに有効になります。その後、ゲートウェイは生成 AI に関連するメトリックをエクスポートできます。

ログ出力の構成

ゲートウェイログをエクスポートするには、EnvoyProxy リソースも変更する必要があります。必要に応じて構成を追加できます。

  1. EnvoyProxy リソースを編集します。

    kubectl edit envoyproxy custom-proxy-config
  2. custom-proxy-configspec.telemetry コンテンツを次の YAML で更新します。

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: custom-proxy-config
      namespace: default
    spec:
      telemetry:
        accessLog:
          disable: false
          settings:
          - sinks:
            - type: File
              file:
                path: /dev/stdout
            format:
              type: JSON
              json:
                # デフォルトのアクセスログフィールド
                start_time: "%START_TIME%"
                method: "%REQ(:METHOD)%"
                x-envoy-origin-path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
                protocol: "%PROTOCOL%"
                response_code: "%RESPONSE_CODE%"
                response_flags: "%RESPONSE_FLAGS%"
                response_code_details: "%RESPONSE_CODE_DETAILS%"
                connection_termination_details: "%CONNECTION_TERMINATION_DETAILS%"
                upstream_transport_failure_reason: "%UPSTREAM_TRANSPORT_FAILURE_REASON%"
                bytes_received: "%BYTES_RECEIVED%"
                bytes_sent: "%BYTES_SENT%"
                duration: "%DURATION%"
                x-envoy-upstream-service-time: "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%"
                x-forwarded-for: "%REQ(X-FORWARDED-FOR)%"
                user-agent: "%REQ(USER-AGENT)%"
                x-request-id: "%REQ(X-REQUEST-ID)%"
                :authority: "%REQ(:AUTHORITY)%"
                upstream_host: "%UPSTREAM_HOST%"
                upstream_cluster: "%UPSTREAM_CLUSTER%"
                upstream_local_address: "%UPSTREAM_LOCAL_ADDRESS%"
                downstream_local_address: "%DOWNSTREAM_LOCAL_ADDRESS%"
                downstream_remote_address: "%DOWNSTREAM_REMOTE_ADDRESS%"
                requested_server_name: "%REQUESTED_SERVER_NAME%"
                route_name: "%ROUTE_NAME%"
                # 生成 AI リクエストの新しいフィールド
                gen_ai.operation.name: "%FILTER_STATE(wasm.gen_ai.operation.name:PLAIN)%"
                gen_ai.system: "%FILTER_STATE(wasm.gen_ai.system:PLAIN)%"
                gen_ai.request.model: "%FILTER_STATE(wasm.gen_ai.request.model:PLAIN)%"
                gen_ai.response.model: "%FILTER_STATE(wasm.gen_ai.response.model:PLAIN)%"
                gen_ai.error.type: "%FILTER_STATE(wasm.gen_ai.error.type:PLAIN)%"
                gen_ai.prompt.tokens: "%FILTER_STATE(wasm.gen_ai.prompt.tokens:PLAIN)%"
                gen_ai.completion.tokens: "%FILTER_STATE(wasm.gen_ai.completion.tokens:PLAIN)%"
                gen_ai.server.time_per_output_token: "%FILTER_STATE(wasm.gen_ai.server.time_per_output_token:PLAIN)%"
                gen_ai.server.time_to_first_token: "%FILTER_STATE(wasm.gen_ai.server.time_to_first_token:PLAIN)%"

テストリクエストの送信

テストリクエストの送信の手順に複数回従って、ゲートウェイの可観測性データを生成します。

可観測性データの表示

  1. ゲートウェイワークロードの名前を取得します。

    export GATEWAY_DEPLOYMENT=$(kubectl -n envoy-gateway-system get deployment -l gateway.envoyproxy.io/owning-gateway-name=mock-gateway -o jsonpath='{.items[0].metadata.name}')
    echo $GATEWAY_DEPLOYMENT
  2. ゲートウェイの管理ポートをローカルでリッスンします。

    kubectl -n envoy-gateway-system port-forward deployments/$GATEWAY_DEPLOYMENT 19000:19000
  3. 新しいターミナルウィンドウを開き、ゲートウェイのメトリックデータを取得します。

    curl -s localhost:19000/stats/prometheus | grep gen_ai

    期待される出力:

    # TYPE gen_ai_client_operation_duration ヒストグラム
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="0.5"} 0
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="1"} 0
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="5"} 9
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="10"} 9
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="25"} 14
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="50"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="100"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="250"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="500"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="1000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="2500"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="5000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="10000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="30000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="60000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="300000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="600000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="1800000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="3600000"} 16
    gen_ai_client_operation_duration_bucket{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000",le="+Inf"} 16
    gen_ai_client_operation_duration_sum{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000"} 140.9499999999999886313162278384
    gen_ai_client_operation_duration_count{gen_ai_operation_name="chat",gen_ai_system="example.com",gen_ai_request_model="mock",gen_ai_response_model="mock",gen_ai_error_type="",server_port="8000",server_address="10.3.0.9:8000"} 16
  4. アクセスログを表示します。

    kubectl -n envoy-gateway-system logs deployments/$GATEWAY_DEPLOYMENT | tail -1

    期待される出力:

    Defaulted container "envoy" out of: envoy, shutdown-manager 
    {                                                                                                                                                                          
     ":authority": "example.com",                                                                                                                                             
     "bytes_received": 184,                                                                                                                                                   
     "bytes_sent": 355,                                                                                                                                                       
     "connection_termination_details": null,                                                                                                                                  
     "downstream_local_address": "10.3.0.38:10080",                                                                                                                           
     "downstream_remote_address": "10.3.15.252:45492",                                                                                                                        
     "duration": 2,                                                                                                                                                           
     "gen_ai.completion.tokens": "76",                                                                                                                                        
     "gen_ai.error.type": "",                                                                                                                                                 
     "gen_ai.operation.name": "chat",                                                                                                                                         
     "gen_ai.prompt.tokens": "18",                                                                                                                                            
     "gen_ai.request.model": "mock",                                                                                                                                          
     "gen_ai.response.model": "mock",                                                                                                                                         
     "gen_ai.server.time_per_output_token": "0",                                                                                                                              
     "gen_ai.server.time_to_first_token": "2",                                                                                                                                
     "gen_ai.system": "example.com",                                                                                                                                          
     "method": "POST",                                                                                                                                                        
     "protocol": "HTTP/1.1",                                                                                                                                                  
     "requested_server_name": null,                                                                                                                                           
     "response_code": 200,                                                                                                                                                    
     "response_code_details": "via_upstream",                                                                                                                                 
     "response_flags": "-",                                                                                                                                                   
     "route_name": "httproute/default/mock-route/rule/0/match/0/*",                                                                                                           
     "start_time": "2025-05-28T06:13:31.190Z",                                                                                                                                
     "upstream_cluster": "httproute/default/mock-route/rule/0/backend/0",                                                                                                     
     "upstream_host": "10.3.0.9:8000",                                                                                                                                        
     "upstream_local_address": "10.3.0.38:33370",                                                                                                                             
     "upstream_transport_failure_reason": null,                                                                                                                               
     "user-agent": "curl/8.8.0",                                                                                                                                              
     "x-envoy-origin-path": "/v1/chat/completions",                                                                                                                           
     "x-envoy-upstream-service-time": null,                                                                                                                                   
     "x-forwarded-for": "10.3.15.252",                                                                                                                                        
     "x-request-id": "0e67d734-aca7-4c80-bda3-79641cd63e2c"                                                                                                                   
    } 

    メトリックとログフィールドの説明については、「OpenTelemetry Gen AI Semantic Conventions」をご参照ください。

よくある質問

ゲートウェイリクエストエラー 413 Request Entity Too Large を解決するにはどうすればよいですか?

原因: 可観測性プラグインが有効になっている場合、ゲートウェイはリクエスト本文全体をバッファリングしてその内容を解析します。リクエスト本文がデフォルトのバッファー制限を超えると、リクエストは失敗し、HTTP エラーコード 413 Request Entity Too Large が返されます。

解決策: ClientTrafficPolicy リソースを作成して、ゲートウェイのバッファー制限を増やすことができます。

  1. client-buffer-limit.yaml という名前のファイルを次の内容で作成します。${gateway_name} を実際のゲートウェイ名 (Gateway リソースの metadata.name) に置き換えます。

    client-buffer-limit.yaml

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: ClientTrafficPolicy
    metadata:
      name: client-buffer-limit
      # ゲートウェイがデフォルトの名前空間にない場合は、namespace フィールドを追加します。
      # namespace: 
    spec:
      targetRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: ${gateway_name}
      connection:
        bufferLimit: 20Mi     # 必要に応じてサイズを調整します。
  2. 次のコマンドを実行して構成を適用します:

    kubectl apply -f client-buffer-limit.yaml

gen-ai-telemetry プラグインのリリース履歴

イメージタグ

リリース時間

説明

g2ad0869-aliyun

2025 年 5 月

生成 AI リクエストのメトリックモニタリングとログ拡張をサポートします。

g76f5a66-aliyun

2025 年 8 月

ストリーミングリクエストのトークン数が不正確に記録される問題を修正しました。