プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

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"で検索すると先ほどのログが見つかりますね (それ以外も出る気がするけど気にしない)

f:id:puni-o:20180628180028j:plain

ということでこのクエリで引っかかるレコードが1件でもあったらアラート出しましょう

アラートの追加

  • Azureのポータルから対象のApplication Insightsを開きます

  • アラート を選択

f:id:puni-o:20180628180446j:plain

  • 新しいアラート ルール を選択

f:id:puni-o:20180628180532j:plain

ターゲットはすでに選択されていると思います

選択されていなかったらFunctionsが動いているWeb Serviceを選択

f:id:puni-o:20180628180847j:plain

  • 条件の追加を選択

f:id:puni-o:20180628180941j:plain

シグナルの種類から 「ログ検索」を選べば「Custom log search」が出てくるのでこれを選択

検索クエリに先ほどのクエリを入れて、アラートロジックを0より大きいに

f:id:puni-o:20180628181206j:plain

「完了」ボタンが押せるようになっているはずなので押します

  • アラートの詳細を定義します

f:id:puni-o:20180628181414j:plain

こんな感じで (重要度については後述)

  • アクショングループを定義します

f:id:puni-o:20180628181549j:plain

WebHook使って通知しようとおもいます (上のWebHookは私が作ったアクショングループ名、WebHookについては省略)

  • 保存します

これで5分に1回ログを検索して見つかったらWebHookに投げてくれるようになります

WebHook作る

FunctionsでSlackに投げるようにします

blog.shibayan.jp

しばやん先生のブログ見て真似します

飛んでくるJSONが違うのでそこだけ注意。 飛んでくるJSONの定義はこちら

docs.microsoft.com

このJSONserverityが先ほどアラートの詳細で定義した重要度になります。 重大度0~4が「low」「medium」「high」「warning」「error」という文字列になってやってきます。 4が一番ヤバイってことらしいですがそういう説明どこかにあるんですかね? (重要度なのか重大度なのかとかも)

serverityで色を変えて、あとはtitleとかtitle_linkにそれっぽいものを突っ込んでおきます

試す

Slackのデフォルトアイコンだと見たくもないWarningログをさらに見たくなくなるのでねねっちに変えて実験します

f:id:puni-o:20180628182943j:plain

うっとうしい

TCP/IPのサーバーが送るデータをマルチキャストするツール

というのが必要になりました

昔作った記憶がうっすらとあるんですが、探すより作った方が早かったので作りました

github.com

ソケット繋いで受信したデータをマルチキャストするだけ

多分間違っていないと思うので必要な方は好きにしてください

フィードバックなどいただけましたらうれしいですね

Azure FunctionsでオレオレOAuth

いまさらですがFunctionsはじめました

de:codeだったりネットだったりから情報は収集していましたが実際に作ったことは今までなかったんですが

Functionsすごい、文明開化!!

ということでFunctionsを実務に使おうということになったわけで、認証も必要になるわけなんですが

Basic認証はだめ、なんかだめ

というお上の一言でOAuth認証を入れる羽目になりました

Azure Functionsで認証したかったらEasy Authが楽らしいですね。 ググるとたくさん出てくるんですがAzure ADなんて使えませんしサードパーティーなんてもってのほかです。 認証情報は自分で管理するんです (しろめ)

OAuthやるよ、トークンはJWTだよ

愚痴っぽくだらだら書きましたが、サンプルつくりました

github.com

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がちゃんとわかっているのか怪しい)

突っ込み等々ありましたら是非指摘ください