created: 2020-06-04T07:21:16.000Z

LogEntry からそのログ周辺へのCloudLogging のURLを生成する

こんな処理をつくるとき

  • CloudLogging でエラーログを補足したら
  • そのログを PubSub にシンクして
  • それを CloudFunction でSlackに通知する

通知メッセージの中にそのログへのリンクを置きたくて、URLを生成する処理を書いた

LogEntry

CloudFunction は LogEntry という構造体を呼び出し時に受け取る

この中の timestampresource.type を使う

ログクエリ

CloudLogging は、URLにログクエリを埋め込むことができる

以下のような条件のログクエリを生成して、それをURLにつける

  • 同じ resource.type
  • エラーログの発生から前後10秒

insertId でもそのログへのリンクが生成できるが、たぶんエラーログの場合は前後に何があったか知りたいはずなので「エラーログの発生から前後10秒」にしている

コード

こんな感じ

import { URL } from 'url';
import * as querystring from 'querystring';

const buildLogEntryUrl = (log: LogEntry, projectId?: string) => {
  const at = new Date(log.timestamp);
  const from = new Date(at.getTime() - 10000).toISOString();
  const to = new Date(at.getTime() + 10000).toISOString();
  const query = querystring.escape(
    [
      `timestamp>="${from}"`,
      `timestamp<="${to}"`,
      `resource.type=${log.resource.type}`,
    ].join('\n')
  );
  const param = projectId ? `?project=${projectId}` : '';
  return new URL(
    `https://console.cloud.google.com/logs/query;query=${query}${param}`
  );
};

project はクエリパラメータにつけると一意になるので、つけれそうならつける