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など) にログイベントを送信する。
▼ ログシンクフィルター¶
シンクを発火させる時のログの条件を設定する。
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 |
ログの重要度レベルを持つ。 | |
jsonPayload 、textPayload |
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="-"