⛏️
Cloud Pub/SubトピックにCLIからJSONメッセージを公開する
背景
Cloud Pub/Subでサブスクライバのテストをパブリシャーサービスを動作させることなく実施したかった。
内容
前提
ここでは、 Cloud Logging のイベントをリアルタイムで検出して対応する | Google Cloud Blog のアーキテクチャを参考に、Infra/Apps
がGKEの場合を取りあげて、Cloud Functionsのテストの場合を考える。
GKEの場合の主なログ形式は textPayload
と jsonPayload
の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