ゴールデンウィーク最終日!!
Goのお勉強がてら、mackerel-client-goを使ってオープンアラートの一覧をGoでSlackに通知させるよう作ってみました。公式のslack通知の機能とはどう違うの!?と思いますがツッコまないでくださいな!バッチとかにでも使ってください!!
■必要なドキュメントら
- mackerel-client-go
https://github.com/mackerelio/mackerel-client-go
- alerts.go
- hosts.go
- アラート – Mackerel API ドキュメント (v0)
- ホスト – Mackerel API ドキュメント (v0)
- 実装したこと
・アラートType
・Host ID
・Host Name
・ステータス
・メッセージ
をSlackにpostする。
オープンアラートではmkr/apiでHostnameがないため(IDだけじゃわからん)、hosts.goからfor文ですべてのホストを取得、マッピングをする必要があります。その後に、関数からSlackへpostする感じです。
(ちなみに以下はすべてのホストを取得するコード)
https://blog.lorentzca.me/trying-out-go-mackerel-client-library/ より
1 2 3 4 |
client := mkr.NewClient(os.Getenv("MACKEREL_APIKEY")) hosts, _ := client.FindHosts(&mkr.FindHostsParam{ Statuses: []string{"working", "standby", "maintenance", "poweroff"}, }) |
■RVIRUS0817/mackerel-notification-alerts
https://github.com/RVIRUS0817/mackerel-notification-alerts
- 準備
1 2 3 4 |
$ go get github.com/ashwanthkumar/slack-go-webhook $ go get github.com/mackerelio/mackerel-client-go $ export MACKEREL_APIKEY="XXXXXXXX" add slack webhook,cannnel |
- main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package main import ( "fmt" "os" "github.com/ashwanthkumar/slack-go-webhook" // "github.com/k0kubun/pp" mkr "github.com/mackerelio/mackerel-client-go" ) const ( WEBHOOKURL = "https://hooks.slack.com/xxxxxxxxxxxxxxx" CHANNEL = "xxxxxxxxxxxxx" USERNAME = "mackerel" ) func main() { hostsMap := FindHosts() client := mkr.NewClient(os.Getenv("MACKEREL_APIKEY")) alerts, err := client.FindAlerts() // pp.Println(alerts) // エラー処理 if err != nil { os.Exit(1) } // SprintfでPostSlackを送る for _, res := range alerts.Alerts { message := fmt.Sprintf(" AlertType: %v\n AlertHostID: %v\n AlertHost: %v\n AlertStatus: %v\n AlertMessage: %v\n", res.Type, res.HostID, hostsMap[res.HostID], res.Status, res.Message) PostSlack(message) } } // FindHosts func FindHosts() map[string]string { client := mkr.NewClient(os.Getenv("MACKEREL_APIKEY")) hosts, _ := client.FindHosts(&mkr.FindHostsParam{ Statuses: []string{"working", "standby", "maintenance", "poweroff"}, }) // Hostsを連想配列に var m map[string]string m = make(map[string]string) for _, v := range hosts { // fmt.Println(v.Name, v.ID) m[v.ID] = v.Name } // pp.Println(hosts) return m } // Slack通知 func PostSlack(msg string) { field1 := slack.Field{Title: "Message", Value: msg} attachment := slack.Attachment{} attachment.AddField(field1) color := "good" attachment.Color = &color payload := slack.Payload{ Username: USERNAME, Channel: CHANNEL, Attachments: []slack.Attachment{attachment}, } err := slack.Send(WEBHOOKURL, "", payload) if err != nil { os.Exit(1) } } |
49行目の連想配列にすることで、HostID(キー)がHostName(要素)と一致するようにして、31行目で出力したい各パラメーターに渡すだけです。(マッピング)slack通知は以下を参考にしました。
https://qiita.com/yhidetoshi/items/5e47fc8a54eb9f7380ff
- Slack
実際にcheck-procsで適当にテストアラートを出して実行してみましょう。
1 |
$ go run main.yml |
もちろんクローズされたときに実行しても通知は来ません。
■まとめ
GoでMackerel関連ツールなんでも作れそう!
他のも試してみます!
Mackerel-client-go使ってGoの勉強最適かもしれぬ。
Goがんばるぞ!!!✊
0件のコメント