ISUCON10予選問題にNew Relic Infrastructureを入れてみる

所要時間:約 9分

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に同梱されているfluentbitfluentdがあり、予選問題でもそのどちらか、あるいは両方を利用するとよいでしょう。

Infrastructure Agentのログ転送機能を使う場合、単純なfluentbitのtailプラグイン相当の機能であれば、設定ファイルを追加するだけで利用できます。また、fluentbit形式の設定ファイルを指定し、fluentbitの機能を活用することもできます。以前の記事をご一読ください。

New Relic Infrastructureのログ転送でFluent Bitの機能をフル活用する

 

特殊な形式のログをパースしたり前処理するためにプラグインも利用できます。例えばMySQLのスロークエリログをファイル出力するように設定変更し、New Relic Logsに転送することができます。このとき、複数行にまたがる1レコードを正しくパースするためにはプラグインが必要ですが、fluentd向けのもののみ見つかりました(GitHubのリポジトリはアーカイブされていました)。fluentbitよりもfluentdのほうがより高度な処理を行いやすいこともあり、ISUCONでもfluentdを使いたいことがあるでしょう。そのときはfluentdをインストールし、New Relicのpluginを追加してください。MySQLのスロークエリの転送の手順についてはflunetdの記事を御覧ください。

設定が完了したら、こちらもNew Relic Oneの画面でログが転送されているのを確認します。