Application Insightsの特定のログでアラートを出したい
みなさんこんにちはAzure初心者です
便利機能がいろいろあり過ぎて何を使っていいかわからない今日この頃ですが、今回はApplication Insightsの特定のログが出たらアラートを出すようにして運用を楽にします
っていうのをやろうとしたんですが、ググってもなかなかゆとり仕様のドキュメントが出てこないので試行錯誤したログになります (2018/6/28時点)
準備
とりあえず目当てのログを出すFunctionsを作ります
public static class Dummy { [FunctionName("Dummy")] public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log) { log.Warning("わーにんぐ"); return new OkResult(); } }
これで api/dummy
を呼ぶとログを出すようになります
今回はlog.Warning()
で出力されるログを対象にしようと頑張ってます (頑張っているだけ)
確認
Application Insightsの解析ページ(?どうやってこのページ出すのかよくわかっていない)でsearch "warning"
で検索すると先ほどのログが見つかりますね (それ以外も出る気がするけど気にしない)
ということでこのクエリで引っかかるレコードが1件でもあったらアラート出しましょう
アラートの追加
Azureのポータルから対象のApplication Insightsを開きます
アラート を選択
- 新しいアラート ルール を選択
ターゲットはすでに選択されていると思います
選択されていなかったらFunctionsが動いているWeb Serviceを選択
- 条件の追加を選択
シグナルの種類から 「ログ検索」を選べば「Custom log search」が出てくるのでこれを選択
検索クエリに先ほどのクエリを入れて、アラートロジックを0より大きいに
「完了」ボタンが押せるようになっているはずなので押します
- アラートの詳細を定義します
こんな感じで (重要度については後述)
- アクショングループを定義します
WebHook使って通知しようとおもいます (上のWebHookは私が作ったアクショングループ名、WebHookについては省略)
- 保存します
これで5分に1回ログを検索して見つかったらWebHookに投げてくれるようになります
WebHook作る
FunctionsでSlackに投げるようにします
しばやん先生のブログ見て真似します
飛んでくるJSONが違うのでそこだけ注意。 飛んでくるJSONの定義はこちら
このJSONのserverity
が先ほどアラートの詳細で定義した重要度になります。
重大度0~4が「low」「medium」「high」「warning」「error」という文字列になってやってきます。
4が一番ヤバイってことらしいですがそういう説明どこかにあるんですかね? (重要度なのか重大度なのかとかも)
serverityで色を変えて、あとはtitleとかtitle_linkにそれっぽいものを突っ込んでおきます
試す
Slackのデフォルトアイコンだと見たくもないWarningログをさらに見たくなくなるのでねねっちに変えて実験します
うっとうしい
TCP/IPのサーバーが送るデータをマルチキャストするツール
というのが必要になりました
昔作った記憶がうっすらとあるんですが、探すより作った方が早かったので作りました
ソケット繋いで受信したデータをマルチキャストするだけ
多分間違っていないと思うので必要な方は好きにしてください
フィードバックなどいただけましたらうれしいですね
Azure FunctionsでオレオレOAuth
いまさらですがFunctionsはじめました
de:codeだったりネットだったりから情報は収集していましたが実際に作ったことは今までなかったんですが
Functionsすごい、文明開化!!
ということでFunctionsを実務に使おうということになったわけで、認証も必要になるわけなんですが
「Basic認証はだめ、なんかだめ」
というお上の一言でOAuth認証を入れる羽目になりました
Azure Functionsで認証したかったらEasy Authが楽らしいですね。 ググるとたくさん出てくるんですがAzure ADなんて使えませんしサードパーティーなんてもってのほかです。 認証情報は自分で管理するんです (しろめ)
OAuthやるよ、トークンはJWTだよ
愚痴っぽくだらだら書きましたが、サンプルつくりました
HttpトリガーのFunctionsが二つ、JWTトークン作ってみるクラスが一つしか入っていないません。トークンは要求すればだれでももらえます
http://localhost:7071/api/token でトークンを取得
http://localhost:7071/api/hello でトークンを見て返す値を変える
というものです
JWTを使うためにNuGetからSystem.IdentityModel.Tokens.Jwt
を入れていますが、5.1.5より新しいのを入れるとアセンブリのロードに失敗するらしいので5.1.5を使ってます(解決策は面倒なので調べない)
試す
curlで実際に試してみます
まずは認証無しでhello
curl -i http://localhost:7071/api/hello HTTP/1.1 401 Unauthorized Date: Fri, 22 Jun 2018 10:20:15 GMT Server: Kestrel Content-Length: 0
Unauthorized返してますね
ということでトークン取得
curl -F user=user -F pass=pass -i http://localhost:7071/api/token HTTP/1.1 200 OK Date: Fri, 22 Jun 2018 10:21:12 GMT Content-Type: application/json; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked {"Token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ1c2VyIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvc2lkIjoidXNlciIsInVuaXF1ZV9uYW1lIjoidXNlciIsIm5iZiI6MTUyOTY2Mjg3MSwiZXhwIjoxNTI5NjYyODgxLCJpYXQiOjE1Mjk2NjI4NzEsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0LyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0LyJ9.rsA2178VEBo28HrM3UeEZxU76LPrBDmSZcoIHkfZe50","ExpirationDate":"2018-06-22T10:21:21Z"}
トークンもらえたのでこれを使います
curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJ1c2VyIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvc2lkIjoidXNlciIsInVuaXF1ZV9uYW1lIjoidXNlciIsIm5iZiI6MTUyOTY2Mjg3MSwiZXhwIjoxNTI5NjYyODgxLCJpYXQiOjE1Mjk2NjI4NzEsImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0LyIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0LyJ9.rsA2178VEBo28HrM3UeEZxU76LPrBDmSZcoIHkfZe50" -i http://localhost:7071/api/hello HTTP/1.1 200 OK Date: Fri, 22 Jun 2018 10:22:14 GMT Content-Type: text/plain; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked Hello user
200が返ってきました!
見よう見まねで作ったわけですがこれでいいのかな?(そもそもOAuthがちゃんとわかっているのか怪しい)
突っ込み等々ありましたら是非指摘ください