Cloud Functionsのエラー通知


エラーに会いに行く

Cloud Functionsでエラー検知したいときありますよね。
その仕組みを今回作ります。

トピック作成

まずは、Pub/Sub→トピックから通知用の「トピック作成」をします。
コンボ開始です。

シンク作成

次にロギング→ログルーターでシンクを作成します。
名前と説明を決め、シンクの宛先で「Cloud Pub/Sub トピック」を選択します。
「シンクに含めるログの選択」で下記のように入力します。
タイミングはそこまでシビアではないので、落ち着いて入力してもらえればと思ってます。
内容はfunction_name以外はそのままでいいと思います。

resource.type="cloud_function"
resource.labels.function_name="SampleFunction"
severity>=ERROR

CloudFunctions作成

あとは、起き攻めよろしく、エラー通知用にトリガーのタイプを「Cloud Pub/Sub」にしたCloudFunctionsを作成します。
単純にSlack通知します。

// Package p contains a Pub/Sub Cloud Function.
package p

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"
	"net/http"
	"net/url"
)

const WebHook = "Slack WebHook Url"

// PubSubMessage is the payload of a Pub/Sub event. Please refer to the docs for
// additional information regarding Pub/Sub events.
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// HelloPubSub consumes a Pub/Sub message.
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
	err := slackNotify(WebHook, string(m.Data))
	if err != nil {
		log.Printf("err %v",err)
		return err
	}
	return nil
}

func slackNotify(webhook string, data string) error {
	payload := fmt.Sprintf("{'text': '<!channel> \n```%s```'}", data)
	values := url.Values{}
	values.Add("payload", payload)
	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
	_, err := http.PostForm(webhook, values)
	if err != nil {
		return err
	}
	return nil
}

現場からは以上です。