⛏️

Cloud Pub/SubトピックにCLIからJSONメッセージを公開する

2021/12/06に公開

背景

Cloud Pub/Subでサブスクライバのテストをパブリシャーサービスを動作させることなく実施したかった。

内容

前提

ここでは、 Cloud Logging のイベントをリアルタイムで検出して対応する | Google Cloud Blog のアーキテクチャを参考に、Infra/Apps がGKEの場合を取りあげて、Cloud Functionsのテストの場合を考える。

GKEの場合の主なログ形式は textPayloadjsonPayload の2つがある。サンプルとしては以下のような形式。

サンプルログファイル
textPayload.json
{
  "severity":"ERROR",
  "message":"There was an error in the application.",
  "httpRequest":{
    "requestMethod":"GET"
  },
  "times":"2020-10-12T07:20:50.52Z",
  "logging.googleapis.com/insertId":"42",
  "logging.googleapis.com/labels":{
    "user_label_1":"value_1",
    "user_label_2":"value_2"
  },
  "logging.googleapis.com/operation":{
    "id":"get_data",
    "producer":"github.com/MyProject/MyApplication",
     "first":"true"
  },
  "logging.googleapis.com/sourceLocation":{
    "file":"get_data.py",
    "line":"142",
    "function":"getData"
  },
  "logging.googleapis.com/spanId":"000000000000004a",
  "logging.googleapis.com/trace":"projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824",
  "logging.googleapis.com/trace_sampled":false
}
jsonPayload.json
{
  "insertId": "42",
  "jsonPayload": {
    "message": "There was an error in the application",
    "times": "2019-10-12T07:20:50.52Z"
  },
  "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"
}

手順

# 上のJSONファイルを保存する
$ tree .
.
└── textPayload.json
└── jsonPayload.json
# 現在の環境を確認する
$ gcloud config list
# トピック一覧を表示する
$ gcloud pubsub topics list
# 対象トピックにtextPayload形式のログメッセージを公開する
$ gcloud pubsub topics publish TOPIC_NAME --message "$(cat textPayload.json | jq -c)"
# 対象トピックにjsonPayload形式のログメッセージを公開する
$ gcloud pubsub topics publish TOPIC_NAME --message "$(cat jsonPayload.json | jq -c)"

参考

Discussion