こんにちは、 @tokkyです。 先日、ペパボ社内でNew Relic勉強会を開催しました。
この記事では、ペパボではどのように社内勉強会を開催しているのか、勉強会で学んだ内容、また、勉強会の成果として作ったBotなどについてお伝えします。
- 勉強会を開催した動機
- ペパボ社内での勉強会の運営
- 勉強会で扱った内容
- New Relic Insights
- 勉強会の様子
- NRQLで取得できる様々なデータ達
- New Relic Insights APIを活用して作成したBot
- おわりに
勉強会を開催した動機
今年の1月に、New Relic株式会社の方を弊社オフィスに招き、ワークショップを開催していただきました。 それまではNew Relic APMのダッシュボードを眺める程度にしか使っていなかったのですが、ワークショップで様々な便利な機能に触れる機会があり、もっといろんな使い方を学びたくなりました。
幸いにも同じことを考えているパートナーが複数いたので、ワークショップでは触れられなかった内容について社内で勉強会をやってみよう!となりました。
ペパボ社内での勉強会の運営
ペパボでは、時期にもよりますが、だいたい10前後の社内勉強会が常に開催されています。 社内勉強会を開催するときの明確な決まりは特にないのですが、GitHubの勉強会リポジトリにIssueを立てて参加者を募ることが多いです。 Issueベースで勉強会を運営する場合は、開催日時等の連絡事項を入力します。
開催日が決まったら、Googleカレンダーで勉強会用のメールアドレスをゲストに加えて予定を作成します。 SlackのGoogleカレンダーアプリと連携しているので、勉強会の前日・当日にSlack上で勉強会の通知が届くようになります。
勉強会で扱った内容
では、勉強会で扱った内容について具体例を挙げて少し紹介します。
New Relic Insights
New Relic Insightsは、New Relic APM/Browser などで取得されたデータをNRQL(New Relic Query Language
: SQLライクなクエリ言語)で可視化できる機能を提供してくれます。
NRQLは、Ruby on Railsで構築されたWebアプリケーションの場合、以下のような形式で記述します。
SELECT average(duration) FROM Transaction
WHERE name = 'Controller/users/show'
SINCE 30 minutes ago COMPARE WITH 1 week ago TIMESERIES AUTO
上記のクエリは、「直近30分のusers#show
に対するアクセス時間の平均を、1週間前の同時期と比較してグラフで表示する」ことを表します。
Transaction
とはNew Relic APMから取得できるデータが蓄積されているテーブルと考えて差し支えありません。また、エラーに関するデータはTransactionError
、New Relic Browserに関するデータはPageView
というテーブルに格納されています。
Ruby on Railsアプリの場合、Transaction
のname
というカラムにはController/controller_name/action_name
という形式でコントローラ名とアクション名が記録されています。
Ruby on Railsに馴染みのない方に少し補足すると、Ruby on RailsではRESTfulなルーティングを構築することが多く、コントローラ名=どのモデルに
アクション名=どのようなリクエストをするか
がリクエストのURLとHTTPメソッド(GET、POSTなど)に一対一対応します。
Ruby on Railsのコントローラとアクションについては、Rails Guides Action Controllerの概要を参照すると良いでしょう。
今回の例では、Controller/users/show
なので、User
モデルに対するshow
というアクションは/users/:id
というURLに対応しています。
つまり、上記のクエリは「直近30分の/users/:id
に対するGETメソッドでのアクセス時間の平均を、1週間前の同時期と比較してグラフで表示する」と読み替えられます。
普通のSELECT文に加え、NRQL専用のキーワードをいくつか使えます。
SINCE
で期間を簡単に指定したり、COMPARE WITH
で期間比較を行ったり、TIMESERIES
でグラフ化させたりできるのが特長です。
勉強会の様子
学んだ内容は参加者全員が同じScrapboxのページに記入していく形式をとりました。 参加者が共同で一つのシートに記入することでメモを書く時間が削減され、認識の間違いが減るメリットがあることがわかりました。
勉強会は、NRQLのリファレンスを読みながら自分たちが関わっているサービスの様々な情報をNew Relic Insightsで見てみることから始まりました。 次第に「こういう情報が取れるんだったら、こういうケースでデータが可視化されていると役立つかも」といった気づきが増えてきて、各サービスに所属しているメンバーがそれぞれ自分たちのサービスで取得できた興味深いデータを持ち寄るといった活動ができるようになりました。
NRQLで取得できる様々なデータ達
上記の活動によって見られるようになった、NRQLを記述することで取得できるデータをいくつか紹介します。
products#show
アクションに対する、ステータスコードが200のリクエストで発生するdatabaseCallCountのヒストグラム(直近1日)
SELECT histogram(databaseCallCount,width: 100,buckets: 100) FROM Transaction
WHERE name = 'Controller/products/show' AND httpResponseCode ='200' SINCE 1 day ago
databaseCallCountには名前の通り、1回のトランザクションでデータベースを呼び出している回数が格納されています。
histogram
関数はattribute
以外にもceiling
とbuckets
という引数を取り、指定されたパラメータによってヒストグラムの見た目を変えられます。
この二つを組み合わせると、特定の条件でdatabaseCallCountが急増しているかが一目でわかるようなヒストグラムを生成できます。
直近1週間で、レスポンスタイムが1秒を超えているリクエストの割合
SELECT percentage(count(*), WHERE duration > 1) FROM Transaction
WHERE appName = 'ProductionName' SINCE 1 week ago
percentage関数
は第一引数に集約関数の結果
、第二引数にパーセンテージに含める条件
を記述します。上記の例では、全リクエスト中、レスポンスタイムが1秒を超えているものを対象としています。
このように、New Relic APMでは確認することが難しい情報を見たり、比較する対象を柔軟に変えたりできます。
New Relic Insights APIを活用して作成したBot
ペパボのSlackには様々なBotが住んでいます。
弊社サービスのカラーミーショップのNew Relic Insightsに関する情報を教えてくれるinsightaro(インサイ太郎)
や、Slackのユーザーがユーザーグループに加入した時にお知らせしてくれるじょい茄子
などがいます。
さて、New Relic InsightsはAPI経由でInsightsの情報を取得する機能があり、これを利用してSUZURIの有益な情報を教えてくれるBotを作りました。インサイトスリ
です。
このBotは、直近1時間/24時間にアクセスが多かったSUZURIのショップと商品ページのランキングを、New Relic InsightsにAPI経由で問い合わせて表示してくれます。
APIを利用するためには、Account ID
, API Key
, Query Key
の三点が必要になります。
SUZURIはHeroku上で運用されており、New RelicもHeroku Add-onsのものを利用しています。New RelicのAPI Keyを取得するためにはNew Relic上でAdmin権限が必要なのですが、Heroku Add-ons経由の場合は権限の取得に少し手間取りました。
Admin権限の取得方法は以下の記事に書かれていますので、気になった方は参照してみてください。
Botの開発・運用
私が最近業務でずっとRubyをメインで書いていることもあり、インサイトスリにはslack-ruby-bot
を採用しました。
運用については、インサイトスリは外部に公開する必要がないので、NKS(後述)で運用しています。
ペパボにはNyahと呼ばれるOpenStackで構築されたプライベートクラウド基盤があり、さらにNyah上にはKubernetsで構築されたNKS(Nyah Kubernetes Service
)と呼ばれるクラスタが存在しています。
Botの特性上24時間動いていて欲しいので、エラーで落ちたら自動で修復してくれるので便利ですし、秘匿情報もKubernetesのSecret
オブジェクトで管理できるので運用がとても楽でした。
NKSの作者は弊社の@alpacaです。詳細は以下のスライドに書かれていますので、気になった方は参照してみてください。
おわりに
今回のNew Relic社内勉強会を開催する前にも現場で使える Ruby on Rails 5速習実践ガイドという本の読書会も開催したことがあるのですが、勉強会を作る敷居が低く、周りのパートナーが気軽に参加してくれるので、いるだけで成長できる環境を実感できる良い機会でした。
勉強会を開催したい・参加したいと思える環境を、私からも周囲のパートナーにもっと広めていきたいと思います。