10日目の記事として、オフィスの環境改善でMackerelを利用したことについて書きたいと思います。さんの「mackerel-client-goを使ったBotを作る」でした。最後にオフィスの環境を改善したい皆さん仕事中「ちょっとだるいな」「ねむい」「頭が痛くなってきた」などと思ったことありませんか。いうときどうすれば良いのでしょう。閉め切ってるなら窓を開けて換気するなり、昼休みに散歩に行くと改善されるかもしれませんね。実は自分が体調悪いだけで、オフィスが閉め切ってるせいではないのかもしれないという不安があると思います。いうときにオフィスの環境を数値化できると便利です。netatmoウェザーステーション今回使用したのはこちらです。CO2濃度まで取得することができて、その上APIまでもが用意されているので簡単に値が測定できて、この記事のようにMackerelに投稿することも可能です。設置は簡単で、公式サイトや公式のモバイルアプリにて遠隔でオフィスの状態が確認できて便利です。今回やりたいことはオフィスの環境が悪化したらSlackで気づけるようにしたい換気してオフィスの環境がマシになったときもSlackで気づけると嬉しいなので、netatmoのAPIを叩いて値を取得し、それをMackerelに投稿した上で、通知の設定自体はMackerel側で設定すればいけそうです。Mackerelのアラート通知の通知先はSlack以外にもいろいろあるので、例えばCO2濃度が高すぎたらLINEで連絡をもらうとかTwilioなどを利用すれば電話をもらうことも可能です。mackerel.ioデータの取得こういう記事を参考にしました。qiita.comどうやらnpmのパッケージがあるのでそれを利用すればわりと簡単に値は取れました。以下のサイトにあるExampleを実行すると値がうまい具合に取れました。www.npmjs.comgetMeasure関数で欲しい値がいろいろ出力されて便利。Slackとの連携さて値は取れました(気温25°C、CO2濃度700ppmなどなど)。これをMackerelでグラフとしてみせるにはどうすれば良いでしょうか。Mackerelにはサービスメトリックというものがあります。サービスメトリックとはホストに紐付かないメトリックのことで、数値であれば基本的にグラフにできます。mackerel.io今回やりたいことはnetatmoから取得した値をサービスメトリックとして投稿なのでMackerelでそのAPIを叩けば良いです。mackerel.ioなお、Mackerelを利用したことがなければ、ログインした際にServiceの画面で新しいサービスを作り、「サービスメトリック」のタブにいくと以下のようにcurlでサービスメトリックを送る例が表示されるのでそちらを参考にするのも良いです。メトリック名を決めて、値を取得した時刻(エポック秒)と値と一緒にPOSTするとグラフに描画されます。403などが返された場合はAPIキーに書き込み権限がない可能性があるのでそちらを確認ください。いうグラフに一緒に描画されます)。POSTするメトリックは配列であるので、一度に複数のメトリックを投稿することができます。今回の場合も1回のPOSTで気温や湿度やCO2濃度を送ることができます。Scriptメトリックの取得とMackerelのPOSTができれば大体完成です。あとはこれが一生動き続ければ良いです(ちなみにnetatmoの値は10分置きに更新されるので取得も最短でも10分置きとするのが良さそうです)。nodeだとforeverなどを使うと一生動くようにできるみたいです。Scriptでも「N分置きに実行」というのができるじゃないか!ということでGASでやることにしました。できるわけではないので、アクセストークンの取得などを自前でやることになりました。詳しくは以下のサイトあたりに書いてありますが、初回はアクセストークンとリフレッシュトークンを取得し、それ以降アクセストークンの期限が切れたらリフレッシュトークンで更新するというようなことをすればOKでした。値を一時的に保存するのに利用してみました、今回の場合10分置きにmain関数が呼ばれてその度にアクセストークンを取得されては困るのでリフレッシュトークンを保存するようにしました以下のような感じでアクセストークンを更新したりしました。使いまわせるのでとりあえず長い時間キャッシュいれとく}コードトークンさえあればNetatmoからの値の取得とMackerelでグラフ化するコードはシンプルに書けました。上記のスクリプトが問題なく実行できると、指定したorgのサービスにグラフが投稿されているはずです。ここから先どうすれば良いでしょうか。監視設定グラフに描画されている値をみてるだけでも楽しいですが、ずっと画面みてるわけにはいきません。Mackerelで監視設定を指定してあげると、異常事態が起きた際知らせてくれます。Monitorsのページに行くとこういう画面になります。ここから「監視ルールの追加」を選び、「サービスメトリック監視」のタブにて以下のように値を指定します。こちらはアラートがあがってる状態のまま何分か経過した際再度通知をするかどうかの設定です。画像ではCO2濃度が1000ppm超えた場合Warning、2000ppm超えた場合Critical。その状態が30分続くたびに通知がくるようにしました。監視設定ができたところで、次に通知先のチャンネルを設定していきましょう。通知チャンネルの設定ページに飛びます。現在これだけのサービスに対応していますが、今回はSlack用の通知チャンネルを作成します。Slackのチャンネルの設定に関してはドキュメントに詳しく書いてあります。mackerel.ioなお、「通知チャンネル名」とは、Mackerel内で呼ぶ名前なので好きなものに指定してください。Slackの「チャンネル」とは別物です。Slackの通知チャンネルを作成し終えたところで、チャンネル一覧画面に戻ると、テスト通知ができます。これを押すと、指定したSlackにテスト通知がいきますので、いつでも確認ができます。通知グループMackerelには通知チャンネルの他に通知グループというものがあります。今のままでも別に問題はないですが、例えば「このメンバーにはこのアラートを飛ばしたい」みたいな用途のとき便利です。様々な通知チャンネルをまとめたようなものです。詳しくはドキュメントを参照ください。mackerel.ioアラート上記の設定がうまくいけば、例えばCO2濃度が高くなりすぎた際アラートがSlackに飛んできます。Slackから直接アラートの画面にいき、どういう具合にCO2濃度があがったのかを確認できますし、それをみてあわてて窓をあけたり、なんらかの間違いである場合は手動で閉じることができます。「しばらくアラートは飛んでほしくないな」という場合は「監視設定」の画面に戻り、監視設定ごと無効にするか監視設定ごとにミュートをすることができます。グラフの状態をメンバーと共有アラートが飛んでいないときでもSlackなどにグラフの現在の状況を共有したい場合があると思います。いうときはグラフの右上のカメラアイコンを押すと通知チャンネルを選択するモーダルが表示されるので、そこでチャンネルを選択して共有できます。詳しくはドキュメントをご覧ください。(実験的機能)ここからはおまけみたいなものですが、実験的機能である「式による監視」についてです。実験的機能はユーザの設定によりオン・オフできます。mackerel.ioさて、式による監視とはなんなのかというと、メトリックにたいして、様々な関数を使って計算をし、その結果を監視するというものです。今回は「気温」「湿度」がわかっているので、それらを利用して「不快指数」のグラフを式を使って作ってみました。式による監視や利用できる関数については以下を参照ください。Wikipediaにのっていました。Wikipediaサービスメトリックに関してはservice()関数を使うと取得できます。定数倍したい場合はscale()関数。名前をつけたい場合はalias()関数。参考に書いていくと以下のように不快指数の式が完成しました。'不快指数')こちらを「式による監視」の監視設定のエディタに入力すると、プレビューにて描画されるので確認できてべんりです。今回の用途だと不快指数自体をGASで計算してメトリックとして送ればよかったですが、もう少し現実的な用途だと例えばtimeLeftForecast()関数を利用すれば線形回帰によって異常を前もって予測できたりします。最後に今回は主にMackerelのサービスメトリックを中心に紹介しました。Mackerelはサーバ監視がメインですので今回の用途は少し違いますが、Mackerelがどういった機能を持っているのか実感いただけたら幸いです。id:arata3da4さんの「Github管理しているmackerelの監視ルールが変更されたらJenkinsからPRを投げる」です。はてなブログPro株式会社はてなでWebアプリケーションエンジニアやっています。Traceyさんが渋谷で撮ったMVが良いので見てくれMacのVSCodeのバックアップディレクトリにファイルを置いたらVSCode起動のたびに同じファイルが開かれて鬱陶しい月別アーカイブ検索はてなブログをはじめよう!stefafafanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。