koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

Node-REDのMackerelノードを作る

この記事は Mackerel Advent Calendar 2017 - Qiita の13日目です。

昨日は hoosoi - Qiita さんの XXX でした。

さて、先日は Node-RED から http request node を使ってサービスメトリックを投げました。

koudenpa.hatenablog.com

API-Key を function node にべた書きするなど相当イケていない形であったことは否定できません。というか、クソ 改善の余地がある実装です。

というわけで、認証情報を秘密にすることを主な目的に Mackerel にサービスメトリックを投げるNodeを作成してみました。

Node-RED日本ユーザ会 : はじめてのノード開発

チュートリアルがあるのでそれに従って作成していきます。

やりたいことは単なるHTTPSリクエストなので、その機能があるノード参考にし パクって作成しました。

github.com

なお、かかった時間は断然APIを叩くことより、Nodeを作ることの方なので、 Node-RED Advent Calendar 2017 - Qiita なんじゃないの? という気もしますが、気づいた時には余裕で枠が埋まっていました。

Usage

ノードとしてはリポジトリにある通り(チキンなので npm には公開してないです)なので、どういう風に使えるのかを示します。

API Key を認証情報として設定したので、コピーやエクスポート時には出力されなくなり、Flowの共有など行うことができます。

以下は自分がテスト時に作成していた、Mackerel上で発生しているAlertの数をサービスメトリックとして投稿する、というFlowです。

これは単にカウントだけしていますが、全体、警告、クリティカル、の数を集計する、などしてみてもよさそうです。

f:id:koudenpa:20171210233255p:plain

上の図のFlowをエクスポートすると以下のようになります。 (Mackerelノードをインストールしたうえで)これをコピペすれば同じFlowが再現されるわけです。

こうしたFlowは Library - Node-RED で共有されているようです。 (実はよく知らんのです)

[{"id":"3e1bce3.6e35932","type":"mackerel","z":"a8acde07.136b","name":"GET /api/v0/alerts","method":"GET","path":"/api/v0/alerts","x":370,"y":40,"wires":[["2b26599e.6603e6"]]},{"id":"e24216a.22a94e8","type":"inject","z":"a8acde07.136b","name":"Inject per 5 minute","topic":"","payload":"","payloadType":"date","repeat":"300","crontab":"","once":false,"x":140,"y":40,"wires":[["3e1bce3.6e35932"]]},{"id":"2b26599e.6603e6","type":"switch","z":"a8acde07.136b","name":"","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"},{"t":"neq","v":"200","vt":"str"}],"checkall":"false","outputs":2,"x":330,"y":120,"wires":[["a00256f9.5c5a48"],[]]},{"id":"a00256f9.5c5a48","type":"function","z":"a8acde07.136b","name":"Summary alert count","func":"let time = (new Date()).getTime() / 1000;\nlet alertCount = msg.payload.alerts.length;\n\nmsg.serviceName = \"node-red\";\nmsg.payload = new Array({\n    name: \"alert-count\",\n    time: time,\n    value: alertCount\n});\n\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":120,"wires":[["a9418cb.2192c7"]]},{"id":"a9418cb.2192c7","type":"mackerel","z":"a8acde07.136b","name":"POST AlertCount","method":"POST","path":"/api/v0/services/node-red/tsdb","x":770,"y":120,"wires":[[]]}]

投稿されたサービスメトリック。1アラートは証明書の期限警告です。クリティカルになる前にCloseしたいです。

f:id:koudenpa:20171210233420p:plain

そもそもNode-REDってなんぞや?

記事冒頭で書け、という気もしますが一応です。

Node-RED日本ユーザ会 によると

Node-REDはハードウェアデバイス/APIおよびオンラインサービスを接続するためのツールです。

とのことです。

ブラウザ上のGUIでロジックを作ることができるのが特色だと思っています。

先の例では、MackerelのAPIからGetした内容を軽く加工してMackerelのAPIにPostする、といったことをしていますが、 入力元や出力先、加工内容を変える、といったことをブラウザ上から構成できるわけです。

カジュアルにモノやサービスを繋ぐにはとても便利なツールです。

まとめ

まとめとしては、特に予定地の頃から変わらず「APIを直で叩けば、インターネットに接続されている環境ならメトリック投げ放題。 これはPush型のサービスの非常に大きな利点だと思う」なのですが、様々な環境向けのユーティリティを整備することで、活用がより進むのではないかと思います。

そのためには Node-RED 向けなら npm に公開しないとなぁ、といったところですが、それはまた元気があれば試したいと思います。

明日は mattn - Qiita さんが長いものにまかれるようです。