ISUCON11 New Relic 支援プログラムにあわせて、ISUCON10 予選問題(以下、予選問題)をテーマにNew Relic Infrastructureをインストールし計測するための手順について解説したいと思います。ISUCON運営による、ISUCON10予選問題の解説と講評もあわせてご一読ください。また、Go Agentの導入についての記事も公開しています。
予選問題の参考実装の構成を踏まえると、New Relic Infrastructureおよび関連機能は以下のコンポーネントを計測するために利用できます。
- ホスト単位あるいはプロセス単位でのCPU、メモリ、IOなどのメトリクス => Infrastructuer Agent本体
- MySQLの秒間クエリ数、接続数、スロークエリ数やインベントリ情報 => On-host Integration
- ログの転送と分析 => New Relic Logs
- nginxのアクセスログやOSの標準ログ => Infrastructureの転送機能あるいはfluentd plugin
- MySQLのスロークエリログ(などパーサーがfluentdのプラグインのみ提供されているもの) => fluentd plugin
- アプリケーションのログ => (Logs in Contextを利用するため)New Relic APMおよびInfrastructureの転送機能あるいはfluentd plugin
それぞれに分けてインストール手順の概要を説明したいと思いますが、これらの機能間の相関は次の図のようになっています。
これらの依存関係は次のようになっています。
On-host integrationを利用するためにはInfrastructure Agentがインストールされている必要があります。予選問題の構成ではおそらくOSにMySQLがサービスとしてインストールされているため、OSにInfrastructure Agentをインストールし、そのAgentにOn-host integrationを追加する方法をおすすめします。設定することで、MySQLがインストールされているOSとは別のOSにインストールされたInfrastructure AgentからリモートでMySQLを計測するようOn-host integrationを追加できます。例えば、Docker上で動かしているMySQLをDockerのホストから計測する場合です。
New Relic Logsを利用するためには、ログの転送ツールをセットアップする必要があります。複数選択肢があり、転送元あるいは転送処理に応じて同時に複数利用できます。Infrastructure Agentはfluentbitを同梱しており、fluentbitでのログ転送機能はInfrastructure Agentから利用することができます。この場合、Infrastructure Agentのインストールが必須です。fluentdやその他の転送ツールを利用する場合は、ツールに応じたセットアップが必要です。上の例でMySQLのスロークエリログの転送でfluentdのみを記載しているのは、1レコードが複数行にわたるスロークエリログをパースするためのプラグインが現時点ではfluentd向けにしか提供されていなかったためです。
アプリケーションのログを転送する場合もいくつか選択肢がありますが、一番簡単な方法はアプリケーションのログをファイル出力し、そのファイルをInfrastructure Agentで転送することです。このときInfrastructure Agentが必須です。加えて、Logs in Contextの機能を使う場合は所定のフォーマットのログの出力を行うためにAPM Agentが必須です。Logs in ContextについてはGo Agentの導入記事をご参照ください。
Infrastructure Agentの導入
Infrastructure Agentのインストール方法は複数用意されています。New Relic Oneの画面から追加の手順を表示するとGuided Installを利用した手順が案内されます。これはInfrastructure Agent本体のインストールだけではなく、nginxなどのインストールされているミドルウェアを検出しOn-host integrationのインストールを提案したり、ファイルを検知してログの転送を提案してくれます。通常はこちらの利用をおすすめできますが、パフォーマンスを競うISUCONではどこにどんなツールをインストールしたか制御できる手動でのインストールが好まれるかもしれません。その場合はPackage Manager経由でのインストール、あるいはtarball形式のインストールをおすすめします。
インストールしたら、設定ファイルを確認・編集します。デフォルトでは/etc/newrelic-infra.yml
に配置されています。プロセス単位のメトリクスを計測するためには、enable_process_metrics: true
を追加しておきます。
$ sudo cat /etc/newrelic-infra.yml
license_key:
enable_process_metrics: true
Infrastructure Agent本体の導入はこれで完了です。サービスとして正常に起動しているか確認しておきます。
$ systemctl status newrelic-infra.service
● newrelic-infra.service - New Relic Infrastructure Agent
Loaded: loaded (/etc/systemd/system/newrelic-infra.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-07-19 01:20:33 UTC; 1 day 1h ago
Main PID: 601 (newrelic-infra-)
Tasks: 31 (limit: 9545)
Memory: 145.6M (limit: 1.0G)
CGroup: /system.slice/newrelic-infra.service
├─ 601 /usr/bin/newrelic-infra-service
├─ 726 /usr/bin/newrelic-infra
ここまで確認できたら、New Relic Oneの画面でデータが表示されていることを確認します。
正しく表示されない場合は、ドキュメントを参照いただくか、予選参加者の方向けサポートをご利用ください。
On-host integrationの導入
OS中心のメトリクスではなく、データベースやWebサーバーといったミドルウェア固有のメトリクスを計測するためにOn-host integrationあるいはFlexを利用することができます。予選問題の初期実装で使われるミドルウェアでは、MySQLをOn-host integrationで計測できます。nginxもサポートしていますが、nginxのHTTP stub status moduleに依存しているため、今回はMySQLでの手順のみ紹介します。
On-host integrationのインストールはこちらのドキュメントに記載の通り、integrationの名前を指定してパッケージをインストールして行います。MySQLの場合はnri-mysql になります。また、いくつかのintegrationでは追加のセットアップ手順が必要で、MySQLの場合も対象のデータベースに専用のユーザーなどを作成しておく必要があります。
integrationのインストール後、Infrastructure Agentを再起動し、New Relic Oneの画面でデータが表示されていることを確認します。
アプリから見たクエリのパフォーマンスはAPMでも見えますが、データベース中心のメトリクスの確認に利用できます。
Logsの導入
New Relic Logsを導入するためには、ログを転送するためのツールを導入する必要があります。よく使われるものとしては、Infrastructure Agentに同梱されているfluentbitやfluentdがあり、予選問題でもそのどちらか、あるいは両方を利用するとよいでしょう。
Infrastructure Agentのログ転送機能を使う場合、単純なfluentbitのtailプラグイン相当の機能であれば、設定ファイルを追加するだけで利用できます。また、fluentbit形式の設定ファイルを指定し、fluentbitの機能を活用することもできます。以前の記事をご一読ください。
特殊な形式のログをパースしたり前処理するためにプラグインも利用できます。例えばMySQLのスロークエリログをファイル出力するように設定変更し、New Relic Logsに転送することができます。このとき、複数行にまたがる1レコードを正しくパースするためにはプラグインが必要ですが、fluentd向けのもののみ見つかりました(GitHubのリポジトリはアーカイブされていました)。fluentbitよりもfluentdのほうがより高度な処理を行いやすいこともあり、ISUCONでもfluentdを使いたいことがあるでしょう。そのときはfluentdをインストールし、New Relicのpluginを追加してください。MySQLのスロークエリの転送の手順についてはflunetdの記事を御覧ください。
設定が完了したら、こちらもNew Relic Oneの画面でログが転送されているのを確認します。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。