newrelic 勉強会

New Relic勉強会をペパボ社内で開催しました

newrelic 勉強会

こんにちは、 @tokkyです。 先日、ペパボ社内でNew Relic勉強会を開催しました。

この記事では、ペパボではどのように社内勉強会を開催しているのか、勉強会で学んだ内容、また、勉強会の成果として作ったBotなどについてお伝えします。

  1. 勉強会を開催した動機
  2. ペパボ社内での勉強会の運営
  3. 勉強会で扱った内容
  4. New Relic Insights
  5. 勉強会の様子
  6. NRQLで取得できる様々なデータ達
    1. products#showアクションに対する、ステータスコードが200のリクエストで発生するdatabaseCallCountのヒストグラム(直近1日)
    2. 直近1週間で、レスポンスタイムが1秒を超えているリクエストの割合
  7. New Relic Insights APIを活用して作成したBot
    1. Botの開発・運用
  8. おわりに

勉強会を開催した動機

今年の1月に、New Relic株式会社の方を弊社オフィスに招き、ワークショップを開催していただきました。 それまではNew Relic APMのダッシュボードを眺める程度にしか使っていなかったのですが、ワークショップで様々な便利な機能に触れる機会があり、もっといろんな使い方を学びたくなりました。

幸いにも同じことを考えているパートナーが複数いたので、ワークショップでは触れられなかった内容について社内で勉強会をやってみよう!となりました。

ペパボ社内での勉強会の運営

ペパボでは、時期にもよりますが、だいたい10前後の社内勉強会が常に開催されています。 社内勉強会を開催するときの明確な決まりは特にないのですが、GitHubの勉強会リポジトリにIssueを立てて参加者を募ることが多いです。 Issueベースで勉強会を運営する場合は、開催日時等の連絡事項を入力します。

開催日が決まったら、Googleカレンダーで勉強会用のメールアドレスをゲストに加えて予定を作成します。 SlackのGoogleカレンダーアプリと連携しているので、勉強会の前日・当日にSlack上で勉強会の通知が届くようになります。

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アプリの場合、Transactionnameというカラムには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のページに記入していく形式をとりました。 参加者が共同で一つのシートに記入することでメモを書く時間が削減され、認識の間違いが減るメリットがあることがわかりました。

scrapboxのシート

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以外にもceilingbucketsという引数を取り、指定されたパラメータによってヒストグラムの見た目を変えられます。

この二つを組み合わせると、特定の条件でdatabaseCallCountが急増しているかが一目でわかるようなヒストグラムを生成できます。

Database Call Count

直近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を作りました。インサイトスリです。

newrelic勉強会によって爆誕した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権限の取得方法は以下の記事に書かれていますので、気になった方は参照してみてください。

When you can't access some admin features and the owner of your Account has a herokumanager.com domain - Support: Products & Agents / Partnership Accounts - New Relic Explorers Hub

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速習実践ガイドという本の読書会も開催したことがあるのですが、勉強会を作る敷居が低く、周りのパートナーが気軽に参加してくれるので、いるだけで成長できる環境を実感できる良い機会でした。

勉強会を開催したい・参加したいと思える環境を、私からも周囲のパートナーにもっと広めていきたいと思います。