#自己紹介
渋谷でうろちょろするインフラエンジニアでっす。
LinuxとかCiscoとか、ESXiとかOpenstackで生きてきましたが、
この度GCPを使ったサービスの基盤開発を仰せつかり、がっぷり取り組んでおります。
たのしいぜ!
#やりたかったこと
GCPのStackdriver Loggingに流れてきたログを、Pub/SubでCloud Functions叩いてSlackに通知したいぜ。
#背景
Stackdriver loggingには、GCE上のgoogle-fluentdで整形されてこんな形のjsonPayloadで通知されるようになってます。
{
insertId: "XXXXXXXXXXXXX"
jsonPayload: {
date: " 2019/11/07 08:03:15.393"
message: " ERROR hogehoge"
process: "11920"
severity: "ERROR"
}
labels: {
compute.googleapis.com/resource_name: "test"
}
logName: "projects/hogera/logs/test"
receiveTimestamp: "2019-11-07T08:03:16.592248634Z"
resource: {…}
timestamp: "2019-11-07T08:03:15.393217602Z"
}
で、severityがERRORとかFATALが発生したらPub/Subに収容し、
Slack通知用のCloud Functionsを叩こう、という算段です。
事象が発生したホスト名をペイロードから取ろうとして、ハタと手が止まる。
compute.googleapis.com/resource_name: "test"
キーにスラッシュ入ってね?これどうにかしてエスケープできんのか?
困った
Cloud FunctionsでtextPayloadというオブジェクトに詰めて、こんなかんじで取得しようとしたんですが・・・・
const textPayload = JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString());
const body = {
attachments: [{
title: "APPLICATION LOG DETECTED",
text: textPayload.jsonPayload.severity,
color: LOG_COLORS["WARNING"],
fields: [
{ title: "Host", value: textPayload.labels.compute.googleapis.com/resource_name, short: true }, ★★
{ title: "Instance_id", value: textPayload.resource.labels.instance_id, short: true },
{ title: "Message", value: textPayload.jsonPayload.message, short: true },
{ title: "Timestamp", value: textPayload.timestamp, short: true },
]
}]
};
上記の★★でうまく動かず。
エスケープ、どうすんだろ。
compute.googleapis.com/resource_name: "test"
エラー。
#助けて先生
ぷろぐらむわかんなーいということで隣席の先生に泣きついたところ、事も無げに、
「Javascriptではブラケット記法とドット記法は等価でござるよ」
とのたまいました。
先生はさらりさらりと上記コードの★★を以下のようにブラケット記法に書き換え。
◎Before
{ title: "Host", value: textPayload.labels.compute.googleapis.com/resource_name, short: true },
◎After
{ title: "Host", value: textPayload.labels["compute.googleapis.com/resource_name"], short: true },
Yay!
ドット記法でもうまくエスケープする方法あるんですかね。
職業プログラマはやはり凄いなあ。先生ありがとう。
#今後
気が向いたら、GCP界隈の記事を上げるかもしれない。