Cloud Load Balancing の指標の使用

このページでは、Cloud Load Balancing で使用可能なロードバランサの種類を確認し、SLI として公開された Cloud Monitoring 指標を使用する方法を説明します。

Cloud Load Balancing サービスでは、Google Cloud でホストされているアプリケーションに対する最初のエントリ ポイントを主に提供します。ロードバランサは、公開された Google Cloud サービスのトラフィック、可用性、レイテンシに関する情報を自動的に提供するためにインストルメント化されています。したがって、アプリケーションのインストルメンテーションを必要とせず、ロードバランサは SLI 指標の最適なソースとして機能します。

はじめは、可用性とレイテンシに重点を置いて SLI と SLO を作成し、これらの項目の測定とアラートを行うことができます。このページでは実装例を紹介します。

詳細については、次のリンク先をご覧ください。

可用性の SLI と SLO

非 UDP アプリケーションには、リクエスト ベースの可用性 SLI が適しています。これは、サービスのやり取りがリクエストにきれいにマッピングされるためです。

リクエスト ベースの可用性 SLI を表現する際は、TimeSeriesRatio 構造体を使用して、後述する例のようにリクエスト総数に対する良好なリクエストの比率を設定します。「良好」または「有効」といった好意的な判断をするには、使用可能なラベルで指標をフィルタリングします。

外部レイヤ 7(HTTP/S)ロードバランサ

HTTP/S ロードバランサは、HTTP/S でアクセスされるアプリケーションを公開し、複数のリージョンに配置されたリソースにトラフィックを分散するために使用されます。

外部 HTTP(S) 負荷分散では、接頭辞 loadbalancing.googleapis.com が付いた https_lb_rule モニタリング対象リソースタイプと指標タイプを使用して、Monitoring に指標データを書き込みます。可用性の SLO に最も関連する指標タイプは https/request_count で、response_code_class 指標ラベルを使用してフィルタリングできます。

リクエストの結果が 4xx エラーのレスポンス コードは、サービスエラーやアプリケーション エラーではなくクライアント エラーを示す可能性があります。これを「有効」としてカウントしない場合は、「合計値」用のフィルタを次のように記述できます。

"totalServiceFilter":
  "metric.type=\"loadbalancing.googleapis.com/https/request_count\"
   resource.type=\"https_lb_rule\"
   resource.label.\"url_map_name\"=\"my-app-lb\"
   metric.label.\"response_code_class\">=\"499\"
   metric.label.\"response_code_class\"<\"399\"",

また、「良好」なリクエストの数を数える方法も決める必要があります。たとえば、レスポンス コードに 200 OK の成功ステータスを返すものだけをカウントする場合は、「良好」用のフィルタを次のように作成できます。

"goodServiceFilter":
  "metric.type=\"loadbalancing.googleapis.com/https/request_count\"
   resource.type=\"https_lb_rule\"
   resource.label.\"url_map_name\"=\"my-app-lb\"
   metric.label.\"response_code_class\"<=\"299\"",

この場合、リクエスト ベースの SLI は、次のように記述できます。

"serviceLevelIndicator": {
  "requestBased": {
    "goodTotalRatio": {
      "totalServiceFilter":
        "metric.type=\"loadbalancing.googleapis.com/https/request_count\"
         resource.type=\"https_lb_rule\"
         resource.label.\"url_map_name\"=\"my-app-lb\"
         metric.label.\"response_code_class\">\"499\"
         metric.label.\"response_code_class\"<\"399\"",
      "goodServiceFilter":
        "metric.type=\"loadbalancing.googleapis.com/https/request_count\"
         resource.type=\"https_lb_rule\"
         resource.label.\"url_map_name\"=\"my-app-lb\"
         metric.label.\"response_code_class\"<=\"299\"",
    }
  }
},

複数のバックエンドがトラフィックを処理するアプリケーションでは、特定のバックエンドの SLI を定義できます。特定のバックエンドの可用性 SLI を作成するには、次の例に示すように、フィルタで backend_target_name リソースラベルを指定した https/backend_request_count 指標を使用します。

"serviceLevelIndicator": {
  "requestBased": {
    "goodTotalRatio": {
      "totalServiceFilter":
        "metric.type=\"loadbalancing.googleapis.com/https/backend_request_count\"
         resource.type=\"https_lb_rule\"
         resource.label.\"url_map_name\"=\"my-app-lb\"
         resource.label.\"backend_target_name\"=\"my-app-backend\"
         metric.label.\"response_code_class\">\"499\"
         metric.label.\"response_code_class\"<\"399\"",
      "goodServiceFilter":
        "metric.type=\"loadbalancing.googleapis.com/https/backend_request_count\"
         resource.type=\"https_lb_rule\" resource.label.\"url_map_name\"=\"my-app-lb\"
         resource.label.\"backend_target_name\"=\"my-app-backend\"
         metric.label.\"response_code_class\"<\"299\"",
    }
  }
}

内部レイヤ 7(HTTP/S)ロードバランサ

内部 HTTP(S) 負荷分散では、接頭辞 loadbalancing.googleapis.com を付けた internal_http_lb_rule モニタリング対象リソースタイプと指標タイプを使用して、Monitoring に指標データを書き込みます。可用性の SLO に最も関連する指標タイプは https/internal_request_count で、response_code_class 指標ラベルを使用してフィルタリングできます。

リクエスト ベースの可用性 SLI の例を次に示します。

"serviceLevelIndicator": {
  "requestBased": {
    "goodTotalRatio": {
      "totalServiceFilter":
        "metric.type=\"loadbalancing.googleapis.com/https/internal/request_count\"
         resource.type=\"internal_http_lb_rule\"
         resource.label.\"url_map_name\"=\"my-internal-lb\"
         metric.label.\"response_code_class\">\"499\"
         metric.label.\"response_code_class\"<\"399\"",
      "goodServiceFilter":
         "metric.type=\"loadbalancing.googleapis.com/https/internal/request_count\"
          resource.type=\"internal_http_lb_rule\"
          resource.label.\"url_map_name\"=\"my-internal-lb\"
          metric.label.\"response_code_class\"<=\"299\"",
    }
  }
},

レイヤ 3(TCP)ロードバランサ

TCP ロードバランサにはリクエスト指標がありません。それを使用するアプリケーションがリクエスト レスポンス モデルに基づいていない可能性があるためです。このロードバランサが備える loadbalancing.googleapis.com 指標の中で可用性 SLI に適したものはありません。

これらのロードバランサの可用性 SLI を作成するには、カスタム指標またはログベースの指標を作成する必要があります。詳細については、カスタム指標の使用またはログベースの指標の使用をご覧ください。

レイテンシの SLI と SLO

リクエスト / レスポンス アプリケーションでは、レイテンシ SLO を記述する 2 通りの方法があります。

  • リクエスト ベースの SLO として記述。
  • ウィンドウ ベースの SLO として記述。

リクエスト ベースのレイテンシ SLO

リクエスト ベースの SLO では、レイテンシのしきい値を利用し、特定のコンプライアンス期間内にしきい値を下回るリクエストの割合をカウントします。たとえば、「1 時間の移動枠内で 99% のリクエストが 100 ミリ秒以内に完了する」などがリクエスト ベースの SLO になります。

リクエスト ベースのレイテンシ SLI を表すには、次のレイテンシの例で示すように DistributionCut 構造体を使用します。

単一のリクエスト ベースの SLO では、通常のパフォーマンスとユーザー エクスペリエンスの低下の両方を捉えることはできません。どちらの場合も、「テール」すなわち最も遅いリクエストのレスポンス時間が徐々に長くなることが確認されます。通常のパフォーマンスに対する SLO では、テール レイテンシの把握はサポートされません。テール レイテンシの説明については、サイト信頼性エンジニアリング第 6 章: 分散システムのモニタリングの「テールに気をつける」をご覧ください。

この制限を軽減するには、テール レイテンシを重視する 2 つ目の SLO を作成します。たとえば、「1 時間の移動枠内で 99.9% のリクエストが 1,000 ミリ秒以内に完了する」などです。2 つの SLO の組み合わせによって、一般的なユーザー エクスペリエンスとテール レイテンシの両方の低下が捉えられます。

ウィンドウ ベースのレイテンシ SLO

ウィンドウ ベースの SLO では、測定期間における良好の基準を定義し、間隔の合計に対する「良好」な間隔の比率を計算します。ウィンドウ ベースの SLO の例としては、「28 日間の移動枠内で、1 分間枠の 99% 以上において、95 パーセンタイルのレイテンシ指標が 100 ミリ秒未満」などがあります。

  • 「良好」の測定期間とは、1 分間枠の 95% でリクエストのレイテンシが 100 ミリ秒未満となることを意味します。
  • こうした「良好」な期間の比率が、コンプライアンスの測定値になります。コンプライアンス期間中に計算された割合が 0.99 以上の場合、サービスはコンプライアンスを遵守しています。

使用可能な指標がレイテンシのパーセンタイルで、次の両方の条件が満たされる場合は、ウィンドウ ベースの SLO を使用する必要があります。

  • データが期間に分割される(1 分間隔など)。
  • データがパーセンタイル グループ(p50、p90、p95、p99 など)で表現される。

この種のデータの場合、各パーセンタイル グループは、そのパーセンタイルの上位および下位のデータグループを分割した時間を示します。たとえば、p95 を有する 1 分間隔のレイテンシ指標が 89 ミリ秒とは、サービスに対するリクエストの 95% が 89 ミリ秒以内に応答されたことを示します。

外部レイヤ 7(HTTP/S)ロードバランサ

外部 HTTP(S) 負荷分散では、次の主要な指標タイプを使用してレイテンシを捉えます。

  • https/total_latencies: プロキシがリクエストを受信してから、最後のレスポンス バイトでクライアントから ACK を取得するまでのレイテンシの分布。全体的なユーザー エクスペリエンスが最も重要な場合に使用します。

  • https/backend_latencies: プロキシがバックエンドにリクエストを送信してから、バックエンドからレスポンスの最後のバイトを受信するまでにかかるレイテンシの分布。ロードバランサの背後でトラフィックを処理する、特定のバックエンドのレイテンシを測定する場合に使用します。

これらの指標は、https_lb_rule モニタリング対象リソースタイプに対して記述されます。

合計レイテンシ

この例の SLO では、リクエストの 99% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
             "metric.type=\"loadbalancing.googleapis.com/https/total_latencies\"
              resource.type=\"https_lb_rule\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.99,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}

バックエンド レイテンシ

この例の SLO は、「my-app-backend」バックエンド ターゲットへのリクエストの 98% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"loadbalancing.googleapis.com/https/backend_latencies\"
           resource.type=\"https_lb_rule\"
           resource.label.\"backend_target_name\"=\"my-app-backend\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}

内部レイヤ 7(HTTP/S)ロードバランサ

内部 HTTP(S) 負荷分散では、次の 2 つの主要な指標タイプを使用してレイテンシを捉えます。

  • https/internal/total_latencies: プロキシがリクエストを受信してから、最後のレスポンス バイトでクライアントから ACK を取得するまでのレイテンシの分布。全体的なユーザー エクスペリエンスが最も重要な場合に使用します。

  • https/internal/backend_latencies: プロキシがバックエンドにリクエストを送信してから、バックエンドからレスポンスの最後のバイトを受信するまでにかかるレイテンシの分布。ロードバランサの背後でトラフィックを処理する、特定のバックエンドのレイテンシを測定する場合に使用します。

これらの指標は、internal_http_lb_rule モニタリング対象リソースタイプに対して記述されます。

合計レイテンシ

この例の SLO では、リクエストの 99% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"loadbalancing.googleapis.com/https/internal/total_latencies\"
           resource.type=\"internal_http_lb_rule\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.99,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}

この例の SLO では、リクエストの 99% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

バックエンド レイテンシ

この例の SLO は、「my-internal-backend」バックエンド ターゲットへのリクエストの 98% が 1 時間の移動枠内において、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"loadbalancing.googleapis.com/https/internal/backend_latencies\"
           resource.type=\"https_lb_rule\"
           resource.label.\"backend_target_name\"=\"my-internal-backend\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}

外部レイヤ 3(TCP)ロードバランサ

外部 TCP ロードバランサでは、単一の指標タイプ(l3/external/rtt_latencies)を使用します。これには、外部ロードバランサ フローの TCP 接続で測定されたラウンドトリップ時間の分布が記録されます。

この指標は tcp_lb_rule リソースに対して記述されます。

この例の SLO では、リクエストの 99% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"loadbalancing.googleapis.com/l3/external/rtt_latencies\"
           resource.type=\"tcp_lb_rule\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.99,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}

内部レイヤ 3(TCP)ロードバランサ

内部 TCP ロードバランサでは、単一の指標タイプ(l3/internal/rtt_latencies)を使用します。これには、内部ロードバランサ フローの TCP 接続で測定されたラウンドトリップ時間の分布が記録されます。

この指標は internal_tcp_lb_rule リソースに対して記述されます。

この例の SLO では、リクエストの 99% が 1 時間の移動枠内で、レイテンシが 0~100 ミリ秒であることを期待しています。

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"loadbalancing.googleapis.com/l3/internal/rtt_latencies\"
           resource.type=\"internal_tcp_lb_rule\"",
        "range": {
          "min": 0,
          "max": 100
        }
      }
    }
  },
  "goal": 0.99,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 100 ms"
}