エラーに会いに行く
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
}
現場からは以上です。