1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cloud FunctionsでのTipps (Javascript ブラケット記法とドット記法について )

Last updated at Posted at 2019-11-07

#自己紹介

渋谷でうろちょろするインフラエンジニアでっす。
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界隈の記事を上げるかもしれない。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?