コンテンツにスキップ

Cloud Logging@Google Cloudリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Cloud Loggingとは

記入中...


02. セットアップ

コンソール画面の場合

ログを収集/保管できる。

Cloud Loggingでログを処理するためのAPI (logging.googleapis.com) を公開している。

項目 説明
ログベースのメトリクス 合致した文字列を持つログをトリガーとして、データポイントを発生させる。このデータポイントを集計し、ログベースのメトリクスとして使用できる。
ログルーター、シンク 合致した文字列を持つログをトリガーとして、指定したPub/Subトピックに振り分ける。
ログストレージ ログを保管する。


ログベースのメトリクス

▼ ユーザー定義

▼ ビルトイン

  • billing/bytes_ingested
  • billing/bytes_stored
  • billing/monthly_bytes_ingested
  • ...


ログルーター

▼ ログシンク

ログの特定の文字列を発火条件として、各種Google Cloudリソース (例:Cloud Pub/Sub、BigQuery、Cloud Storage、Cloud Monitoringなど) にログイベントを送信する。

google_cloud_logging

▼ ログシンクフィルター

シンクを発火させる時のログの条件を設定する。

resource.type = "k8s_container" AND resource.labels.namespace_name = "foo-namespace" AND resource.labels.pod_name =~ "foo-pod" AND jsonPayload.level = ("FATAL" OR "ERROR")


02. 文法

ログフィールド

▼ 種類

フィールド 説明
severity ログの重要度レベルを持つ。
jsonPayloadtextPayload messageキー配下に構造化ログまたは非構造化ログを持つ (コンソール画面上はmessageキーは省略される場合がある)。Cloud Loggingは、ログの構造を自動的に認識する。ログがjsonPayloadキーの場合、 messageキー配下のログは構造化ログである。一方でtextPayloadキーの場合、非構造化ログである。

*例*

例えば、Containerdが以下のようなログを作成したとする。

ログメッセージは、構造化ログになっている。

# わかりやすいように改行している。
2023-03-16T19:48:25.824524924+09:00 stderr F {
  "message": "There was an error in the application",
  "foo": "FOO"
  "bar": "BAR"
  "baz": "BAZ"
}
{
  "insertId": "42",
  "jsonPayload":
    {
      "message": "There was an error in the application",
      "foo": "FOO",
      "bar": "BAR",
      "baz": "BAZ",
    },
  "httpRequest": {"requestMethod": "GET"},
  "resource":
    {
      "type": "k8s_container",
      "labels":
        {
          "container_name": "hello-app",
          "pod_name": "helloworld-gke-6cfd6f4599-9wff8",
          "project_id": "stackdriver-sandbox-92334288",
          "namespace_name": "default",
          "location": "us-west4",
          "cluster_name": "helloworld-gke",
        },
    },
  "timestamp": "2020-11-07T15:57:35.945508391Z",
  "severity": "ERROR",
  "labels": {"user_label_2": "value_2", "user_label_1": "value_1"},
  "logName": "projects/stackdriver-sandbox-92334288/logs/stdout",
  "operation":
    {
      "id": "get_data",
      "producer": "github.com/MyProject/MyApplication",
      "first": "true",
    },
  "trace": "projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824",
  "sourceLocation":
    {"file": "get_data.py", "line": "142", "function": "getData"},
  "receiveTimestamp": "2020-11-07T15:57:42.411414059Z",
  "spanId": "000000000000004a",
}


ログクエリ

▼ レシピ

▼ テキスト検索

タグに関係なく、ログからテキストを検索する。

foo-pod

▼ ワイルドカード

=~演算子を使用して正規表現マッチングを有効化し、.*演算子や$演算子でワイルドカードを適用する。

# 前方一致
resource.labels.pod_name=~"foo-pod-.*"
# 後方一致
resource.labels.pod_name=~"pod$"
# 部分一致
resource.labels.pod_name=~".*pod.*"

▼ 除外

特定の値を持たないログをクエリする。

*実行例*

ヘルスチェック (/health) とメトリクス (/metrics) のエンドポイント以外のアクセスログをクエリする。

-jsonPayload.requestPath="/health"
-jsonPayload.requestPath="/metrics"


シンク

▼ フィルター

ログの条件を設定する。

ロジックは、ログクエリと同じである。

▼ リソースタイプ

# KubernetesCluster
resource.type = "k8s_cluster"
# Kubernetesコンテナ
resource.type = "k8s_container"

リソースラベル

# Kubernetes Cluster名
resource.labels.cluster_name = "foo-cluster"
# リソースのロケーション
resource.labels.location="asia-northeast1"
# Namespace名
resource.labels.namespace_name = "foo-namespace"
# Pod名
resource.labels.pod_name =~ "foo-pod"

▼ 任意のキー

# 任意のキー
jsonPayload.Level = "WARN"

▼ 組み合わせ

マイクロサービスアーキテクチャで、アウトバウンド時に送信元istio-proxyコンテナで発生したエラーをクエリする。

ここでは、アップストリーム側ClusterとしてPassthroughClusterを指定した。

# Kubernetes上のPod内のistio-proxyコンテナ
# ダウンストリーム側Clusterとして、PassthroughClusterを設定する
resource.labels.container_name="istio-proxy"
resource.labels.pod_name="foo-pod"
jsonPayload.upstream_cluster="PassthroughCluster"
-jsonPayload.response_flags="-"