ヘルスチェックのロギング

エンドポイントのヘルス ステータスが変化するタイミングで、負荷分散ヘルスチェックのログを取得できます。ヘルスチェックのログは次の目的に使用できます。

  • エンドポイントのヘルス ステータスをリアルタイムでデバッグし、トラブルシューティングする
  • エンドポイントのヘルス ステータスを可視化する
  • 監査とコンプライアンス

ヘルスチェックによって、ヘルス ステータスの遷移に関する情報が Logging に記録されます。Logging の有効化と無効化はヘルスチェックごとに行います。

Logging におけるヘルスチェックのログを確認する場合、ヘルスチェックに該当するログの除外がないようにしてください。GCE インスタンス グループネットワーク エンドポイント グループのログが許可されているかどうか確認する方法については、リソースタイプの除外の表示をご覧ください。

制限事項

  • 内部 TCP / UDP ロードバランサに接続された VM の nic0 以外のインターフェースのヘルスチェックのロギングはサポートされていません。
  • ログは、エンドポイントのヘルス ステータスの遷移に対してのみ生成されます。
  • レガシー ヘルスチェックはサポートされていません。
  • ターゲット プールはサポートされていません。

ロギングの有効化と無効化

このセクションでは、新規または既存のヘルスチェックでロギングを有効または無効にする方法について説明します。

新しいヘルスチェックでのロギングの有効化

Console

  1. Google Cloud Console の [ヘルスチェック] ページに移動します。
    [ヘルスチェック] ページに移動
  2. [ヘルスチェックを作成] をクリックします。
  3. [ログ] ラジオボタンを [オン] に設定します。
  4. ヘルスチェックの設定を続けます。

gcloud

gcloud compute health-checks create PROTOCOL HEALTH_CHECK_NAME \
   --enable-logging

ここで

  • --enable-logging は、ヘルスチェックのロギングを有効にします。

既存のヘルスチェックでのロギングの有効化

Console

  1. Google Cloud Console の [ヘルスチェック] ページに移動します。
    [ヘルスチェック] ページに移動
  2. ヘルスチェックの名前をクリックします。
  3. [編集] をクリックします。
  4. [ログ] ラジオボタンを [オン] に設定します。
  5. [保存] をクリックします。

gcloud

gcloud compute health-checks update PROTOCOL HEALTH_CHECK_NAME \
    --enable-logging

ここで

  • --enable-logging は、ヘルスチェックのロギングを有効にします。

既存のヘルスチェックでのロギングの無効化または変更

Console

  1. Google Cloud Console の [ヘルスチェック] ページに移動します。
    [ヘルスチェック] ページに移動
  2. ヘルスチェックの名前をクリックします。
  3. [編集] をクリックします。
  4. [ログ] ラジオボタンを [オフ] に設定します。
  5. [保存] をクリックします。

gcloud

ロギングの完全な無効化

gcloud compute health-checks update PROTOCOL HEALTH_CHECK_NAME \
    --no-enable-logging

ここで

  • --no-enable-logging は、ヘルスチェックのロギングを無効にします。

ログの表示

ログを表示するには、ログビューアに移動します。

ヘルスチェックのログは、インスタンス グループまたはネットワーク エンドポイント グループによってインデックスに登録されます。

すべてのログを表示するには、最初のプルダウン メニューでバックエンドのタイプに従って [GCE インスタンス グループ] または [ネットワーク エンドポイント グループ] を選択します。

または、ログビューアに移動して、[ラベルまたはテキスト検索でフィルタ] フィールドに次の文字列を貼り付けます。PROJECT_ID をプロジェクトの ID に置き換えます。

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"

より具体的な検索に基づいてログを取得することもできます。たとえば、次のフィルタは、指定されたバックエンド インスタンスの IP アドレスのすべてのログを表示します。

  logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"
jsonPayload.healthCheckProbeResult.ipAddress="IP_ADDRESS"

通常、ブール型のログフィールドは、フィールドの値が true の場合にのみ表示されます。ブール フィールドの値が false の場合、そのフィールドはログから省略されます。

ログフィールドには UTF-8 エンコードが適用されます。UTF-8 以外の文字列は、疑問符に置き換えられます。

ロードバランサのヘルスチェックに関するログベースの指標のエクスポートを構成できます。

ログの内容

ヘルスチェックのログエントリには、エンドポイントの状態のモニタリングとデバッグに役立つ情報が含まれています。ログエントリには次のタイプの情報が含まれています。

  • 重大度、プロジェクト ID、プロジェクト番号、タイムスタンプなど、ほとんどのログで表示される一般情報。
  • ヘルスチェック固有のフィールド(次の表をご覧ください)。

ヘルスチェックの状態

エンドポイントは HEALTHY または UNHEALTHY のいずれかとみなされます。これらは基本的な状態です。それぞれの基本的な状態には、詳細な状態が複数含まれています。次の表に、基本的なヘルス状態と詳細なヘルス状態の対応関係を示します。

基本的なヘルス状態 詳細なヘルス状態
HEALTHY HEALTHY
DRAINING
UNHEALTHY UNKNOWN
UNHEALTHY
TIMEOUT

状態を変更しても、ロードバランサの動作が変わるとは限りません。次のような場合を考えてみましょう。

  1. サーバーが不適切なレスポンスを送信しているため、エンドポイントは UNHEALTHY とみなされる。
  2. すると、サーバーが応答を停止し、状態が新しく TIMEOUT になる。
  3. 詳細な TIMEOUT 状態は基本的な UNHEALTHY 状態に対応するため、ロードバランサは依然としてエンドポイントは UNHEALTHY であるとみなす。

次の表に、各ヘルス状態の定義を示します。

ヘルスチェックの詳細な状態 意味 基本状態
HEALTHY エンドポイントにアクセス可能です。エンドポイントはヘルスチェックで定義された要件を満たしています。 HEALTHY
UNHEALTHY エンドポイントにアクセス可能ですが、ヘルスチェックで定義された要件を満たしていません。 UNHEALTHY
DRAINING エンドポイントはドレインされています。エンドポイントへの既存の接続は完了するまで続行されますが、新しい接続は受け入れられません。エンドポイントは HEALTHY とみなされます。 HEALTHY
TIMEOUT エンドポイントにアクセスできません。ヘルスチェックのタイプによっては、エンドポイントへの接続を確立できないか、サーバーが指定されたタイムアウト内に応答しません。エンドポイントは UNHEALTHY とみなされます。 UNHEALTHY
UNKNOWN ヘルスチェック システムはエンドポイントを認識していますが、ヘルス状態は不明です。エンドポイントは UNHEALTHY とみなされます。 UNHEALTHY

各エンドポイントを調べる複数のヘルス チェッカーがあります。Google Cloud は、一意のログのみが生成されるように、ロギングの前にログエントリの重複を排除します。

ヘルス チェッカーが再起動すると、エンドポイントのヘルス状態が実際には変更されていなくても、ログに記録されたヘルス状態が UNKNOWN から上記の既知の状態のいずれかに変わることがあります。Google Cloud は、ベスト エフォート ヒューリスティックを用いて、このようなログエントリを抑制しています。

Cloud Logging API を使用してログを操作できます。この API は、特定のフィールドが設定されたログをインタラクティブにフィルタし、一致するログを Cloud Logging、Cloud Storage、BigQuery、または Pub/Sub にエクスポートする方法を提供します。Cloud Logging API の詳細については、ログの表示をご覧ください。

ヘルスチェックのログエントリ

LogEntry jsonPayload には、次の情報を含むフィールド healthCheckProbeResult が入力されます。

フィールド
ipAddress string 各バックエンド VM のプライマリ ネットワーク インターフェースに関連付けられたプライマリ内部 IP アドレス。これは人が読める文字列です。
healthCheckProtocol HealthCheckProtocol エンドポイントのヘルスチェックに使用されるヘルスチェック プロトコル。 例: TCP、HTTP、HTTPS
healthState HealthState エンドポイントの現在のヘルス ステータス(HEALTHY または UNHEALTHY)。
previousHealthState HealthState エンドポイントの以前のヘルス ステータス(HEALTHY または UNHEALTHY)。
detailedHealthState DetailedHealthState エンドポイントの現在の詳しいヘルス ステータス。詳しくはヘルスチェックの状態をご覧ください。
previousDetailedHealthState DetailedHealthState エンドポイントの以前の詳しいステータス。詳しくはヘルスチェックの状態をご覧ください。
probeRequest string HTTP、HTTPS、HTTP/2 の場合、これは URL リクエストパス(リソース構成の requestPath フィールド)です。TCP / SSL の場合、これはヘルスチェック接続が確立されしだい送信される、構成済みのオプションの文字列(リソース構成の request フィールド)です。
probeCompletionTimestamp Timestamp プローブ完了のタイムスタンプ。
connectLatency Duration 接続指向のヘルスチェック プロトコル(TCP、SSL、HTTP、HTTPS、HTTP/2)向け接続の設定に費やされた時間。
responseLatency Duration プローバーによって測定された、リクエストとレスポンス間のレイテンシ。
probeResultText string プローブ結果に関する説明テキスト。「Connection timed out」や「HTTP response: Bad Gateway」などのメッセージが入る場合もあり、空の場合もあります。
probeSourceIp string ヘルスチェック プローブが送信された IP アドレス。
targetIp string プローブのターゲットである IP アドレス。これは ipAddress とは異なる場合があります。プローブの宛先 IP アドレスはロードバランサのタイプによって異なります。
  • 内部 TCP / UDP ロードバランサとネットワーク ロードバランサの場合、ヘルスチェック パケットの宛先はロードバランサの転送ルールの IP アドレスです。
  • インスタンス グループをバックエンドとして使用する外部 HTTP(S) ロードバランサ、TCP プロキシ ロードバランサ、SSL プロキシ ロードバランサの場合、ヘルスチェック パケットの宛先は、各バックエンド VM のプライマリ ネットワーク インターフェースに関連付けられたプライマリ内部 IP アドレスです。
  • ネットワーク エンドポイント グループをバックエンドとして使用する外部 HTTP(S) ロードバランサ、TCP プロキシ ロードバランサ、SSL プロキシ ロードバランサの場合、ヘルスチェック パケットの宛先は、エンドポイントの IP アドレスです。プライマリ アドレスとセカンダリ(エイリアス IP)アドレスのどちらでもあり得ます。
targetPort int プローブのターゲットであるポート。これはプローブのデフォルト ポートとヘルスチェックの作成時に指定したポートのどちらでもあり得ます。

フィルタの使用例

このセクションでは、一般的なログフィルタの例を示します。

特定のインスタンス グループのヘルスチェック結果をすべて検索します

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"  AND
resource.type="gce_instance_group" AND
resource.labels.instance_group_name="INSTANCE_GROUP_NAME"

特定の NEG のヘルスチェック結果をすべて検索します

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"  AND
resource.type="gce_network_endpoint_group" AND
resource.labels.network_endpoint_group_id="ENDPOINT_GROUP_ID"

バックエンド インスタンスの IP アドレス 10.128.15.201 のすべてのヘルスチェックの推移を検索する

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"
jsonPayload.healthCheckProbeResult.ipAddress="10.128.15.201"

前の状態が HEALTHY で、現在の状態が TIMEOUT であるすべてのエンドポイントを検索します

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"
jsonPayload.healthCheckProbeResult.previousDetailedHealthState="HEALTHY"
jsonPayload.healthCheckProbeResult.detailedHealthState="TIMEOUT"

特定の期間のヘルスログを検索します

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fhealthchecks"
timestamp>"2019-02-14T02:20:00.0Z"
timestamp<"2019-02-14T03:30:00.0Z"

次のステップ