New Relic の導入前に、各機能がどのように動作するのか確認したい場面があるかと思います。そこで今回は、iOS Agent に同梱されているサンプルアプリを使って、実際の動作を確認していきます。 New Relic の Agent は基本的に GitHub でソースコードが公開されているため、実装に興味がある方は、サンプルアプリのコードとあわせて Agent 自体の実装もぜひ確認してみてください。

事前準備

この記事で紹介するコードを実際に手元で動かしながら確認したい場合は、以下の準備を行ってください。

  1. 最新の Xcode のインストール
    Apple の公式サイト、または App Store から最新バージョンの Xcode をダウンロードしてインストールします。
  2. リポジトリのクローン
    New Relic iOS Agent の公式 GitHub リポジトリをクローンします。ターミナルで以下のコマンドを実行してください。クローンしたディレクトリ内の Test Harness/NRTestApp が、今回使用するサンプルアプリのプロジェクトです。
git clone git@github.com:newrelic/newrelic-ios-agent.git --recurse-submodules
  1. アプリケーショントークンの取得
    ご自身の New Relic アカウントへデータを送信するためには、アプリケーショントークンが必要となります。アプリケーショントークンの取得については、以下のブログを参考にしてください。具体的なアプリケーショントークンの設定については後述いたします。 https://newrelic.com/jp/blog/dem/setup-ios-swift-mobile-agent

アプリの起動

事前準備が終わったら、クローンしたディレクトリ内の Test Harness/NRTestApp にあるプロジェクト NRTestApp.xcodeproj をXcodeで開きます。 そして、プロジェクト内にある NRAPI-Info.plist の NRAPIKey の値に、先ほど取得したアプリケーショントークンを設定してください。サンプルアプリでは、ここで記載した NRAPIKey が AppDelegate で呼ばれ、エージェント起動の引数として用いられます。

13553-plist

その後、Xcode の Run ボタンもしくは cmd+R でアプリケーションをビルドすると、サンプルアプリが起動します。

UIで起動を確認

実は、アプリを起動しただけで、すでに起動イベントが New Relic へ送られています。早速モバイルモニタリングUIで確認してみましょう。 対象のアプリケーションの Summary 画面を開いてください。この画面には「Crash rate by app version」や「App launches」など、モバイルアプリの状態を確認するための指標が予め用意されています。アプリの起動に関する指標として、「App launches」のグラフに「1」が表示されているはずです。

13553-summary

サンプルアプリの画面説明

サンプルアプリの初期画面のテーブルに、「Utilities」という項目があります。この項目をタップすると、様々な iOS Agent の機能のテストが並ぶ Utilities 画面に遷移します。今回は、その中からエラーとログに関する機能を試してみましょう。 13553-initialAndUtilitiesViews

エラーイベントの送信

「Utilities」画面の「Record Error」をタップしてみてください。 コード(UtilViewModel.swift)では、以下のように NewRelic.recordError(error) というメソッドが呼ばれており、アプリ内でキャッチした既知のエラーを recordHandledException イベントとしてNew Relicに送信しています。

func makeError(){
    do {
        try errorMethod()
    } catch {
        NewRelic.recordError(error)
    }
}

送信されたエラーは、UIの「Handled Exceptions」画面に表示され、エラーの発生箇所や影響度などがひと目で分かります。 13553-handledExceptions

さらに、エラーをタップし詳細画面に遷移すると、エラー発生時のスタックトレースや、ユーザーがエラー発生前にどのような操作(画面遷移やタップなど)をしていたかを示す Event Trail も確認できるため、エラーの再現や原因の特定を行うことが出来ます。 また、Session Replay を有効にすることでエンドユーザーの操作画面を動画で確認することも可能です。

ログの送信

次に、「Utilities」画面の「Test Log Error」と「Test Log Attributes」をタップしてみてください。実装を見ると、それぞれ以下のログ用のメソッドが使われており、ログレベルが ERROR と WARN のログが送られることが分かります。

// Test Log Error の実装
func testLogError() {
    do {
        try errorMethod()
    } catch {
        NewRelic.logErrorObject(error)
    }
}

// Test Log Attributes の実装
func testLogAttributes() {
    NewRelic.logAttributes([
        "logLevel": "WARN",
        "message": "This is a test message for the New Relic logging system.",
        "additionalAttribute1": "attribute1",
        "additionalAttribute2": "attribute2"
    ])
}

New RelicのUIの「Logs(モバイルログ)」画面を開くと、送信した ERROR と WARN のログが時系列で表示されます。また、「Test Log Attributes」で送った WARN ログをクリックすると、additionalAttribute1 として任意のカスタム属性も一緒に送られていることが確認できます。

13553-logsDetail

このように、ログ画面では時系列に沿って詳細な情報を確認できます。エラーが発生した際には、前後のログを合わせて確認することでスムーズな原因特定が可能になります。

Logs verbosity

また、Application settings の「Logs verbosity(ログの詳細度)」を変更することで、取り込むログレベルをサーバー側から動的に調整することができます。 そのため、あらかじめアプリ内に INFO や DEBUG レベルのログを実装しておけば、本番環境でエラーが発生した際、アプリを再デプロイすることなく、UI 上で Logs verbosity を設定することで詳細な原因調査を開始できます。

13553-logsVerbosity

まとめ

本ブログでは、iOSのNew Relic Agentに付属しているサンプルアプリ「NRTestApp」を用いて、Agent の機能の一部を紹介いたしました。 New Relic の機能はたくさんあるため、ぜひ実際にサンプルアプリを動かしながら、使用されている機能やUIの様子を確認してみて下さい。