モバイル・アプリケーションのモニタリング

Instana は、実際の URL 要求時間を分析することでモバイル・アプリケーションのモニタリングをサポートします。これにより、ユーザーのアプリケーション・エクスペリエンスに関する詳細な洞察と、アプリケーション呼び出しパスに対する深い可視性が提供されます。 Instana のアプリ監視機能では、 iOS またはAndroidエージェントが使用されます。 エージェントは、モバイル・アプリケーションへの依存関係としてインストールされます。

エンドユーザーモニタリング(EUM)またはリアルユーザーモニタリング(RUM)は、モバイルアプリにおけるデジタルユーザー体験を把握するための不可欠なツールです。

モバイルアプリ監視用エージェントのインストール

iOS

iOS エージェントをインストールするには、 Swift パッケージマネージャー(Xcode経由)または CocoaPods を使用してください。

Instana iOS エージェントの設定

iOS エージェントをインストールする前に、以下の前提条件が満たされていることを確認してください。

  • iOS バージョン12以降
  • Swift 5.4 またはそれ以降

Swift パッケージマネージャーを追加するには、以下の手順を実行してください:

  1. Xcode を開きます。
  2. Xcode プロジェクトを開きます。
  3. メニュー 「ファイル」 > 「パッケージ依存関係の追加 ...」を選択します。
  4. 表示されるウィンドウで、「 検索またはパッケージ URL を入力」 フィールドに https://github.com/instana/iOSAgent リポジトリを入力します。 次に、検索結果から iosagent を選択し、 をクリックします Add Package

CocoaPods, を追加するには、以下の手順を実行してください:

  1. Podfile 仕様内に、以下のコマンドを追加します。

    pod 'InstanaAgent', '~> 1.8.9'
     
  2. 依存関係をダウンロードし、 pod installを実行します。

このコマンドで、 1.8.9 を、 https://cocoapods.org/pods/InstanaAgentにリストされている最新の iOS エージェント・バージョンに置き換えます。

セットアップ手順の詳細については、 iOS エージェントのドキュメント( API )を参照してください。

Android

Android エージェントは、 Gradle プラグインと SDK ライブラリーで構成されています。 プラグインをアプリケーション・モジュールに適用し、SDK を依存関係として追加します。

Android エージェントをインストールする前に、以下の前提条件が満たされていることを確認してください。

  • Android 4.1 以降 (API レベル 16 以降)
  • Java 8 以降
  • Gradle 7.3.3+
  • AndroidX
  • targetSdk 33 以上
注: プロジェクトで「 7.3.3 」より前のバージョンの Gradle を使用する場合は、「 6.0.0 」より前のバージョンのAndroidエージェントを使用してください。

「 Instana 」Androidプラグインの追加

「 Instana 」Androidプラグインを追加するには、以下の手順に従ってください:

  1. プロジェクト・レベルの build.gradle ファイルに、以下のコードを追加します。
    注: 以下のスニペットでは、バージョン 6.3.0 を例として使用しています。 Instana エージェントの最新バージョンを確認するには、 https://mvnrepository.com/artifact/com.instana/android-agent-runtime を参照してください。
    buildscript {
       ext {
            instanaAgentVersion = "6.3.0"
        }
       repositories {
            google()
            mavenCentral()
        }
       dependencies {
          classpath "com.instana:android-agent-plugin:$instanaAgentVersion"
        }
    }
     
  2. com.android.application プラグインを適用した後、モジュール (アプリケーション・レベル) の Gradle ファイル (通常は app/build.gradle) に以下のコードを追加します。
apply plugin: 'com.android.application'
apply plugin: 'com.instana.android-agent-plugin'
 

Instana の追加 Android SDK

Instana ( Android SDK )を追加するには、以下の手順を実行してください:

  1. プロジェクト・レベルの build.gradle ファイルに、以下のコードを追加します。
    allprojects {
        repositories {
            google()
            mavenCentral()
        }
    }
     
  2. モジュール (アプリケーション・レベル) の Gradle ファイル (通常は app/build.gradle) で、以下のコードを追加します。
    dependencies {
        implementation 'com.instana:android-agent-runtime:$instanaAgentVersion'
    }
     
  3. minSdkVersion が 24 より前の場合、モジュール (アプリケーション・レベル) の Gradle ファイル (通常は app/build.gradle) に以下のコードを追加します。
    android {
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
     
  4. (任意):権限を READ_PHONE_STATE リクエストします。 ユーザーが携帯電話ネットワーク経由でインターネットにアクセスすると、 Instana エージェントは、その携帯電話ネットワークの具体的な種類を報告することができます。

携帯電話ネットワーク・タイプのレポートを有効にするには、アプリが READ_PHONE_STATE 権限を要求する必要があります。 権限の申請に関する詳細については、. Request App Permissions Android公式ドキュメントの該当セクションを参照してください。

アプリが権限を要求しない場合、またはユーザーが権限を拒否した場合、 Instana エージェントはモバイルネットワークの種類を報告しません。 ``を拡張するクラス内で、 ApplicationInstana ダッシュボードで確認した設定値で `` YOUR_APP_KEY と `` YOUR_REPORTING_URL を置き換えてください:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = "YOUR_APP_KEY",
                reportingURL = "YOUR_REPORTING_URL"
            )
        )
    }
}
 

このステップでは、基本的な初期化が完了します。 初期化オプション、トラッキングの表示、その他のオプションの完全な一覧については、 Androidエージェントのドキュメント( API )を参照してください。

Instana React Native エージェントの追加

React Native エージェントは、Android プラットフォームと iOS プラットフォームの両方をサポートします。

Instana React Native Agent に記載されている前提条件を確認してください。

依存関係の追加

Instana React Native エージェントを設定するには、以下の手順を実行してください:

  1. 依存関係を追加し、プロジェクトのルートで以下のコマンドを実行します。
    npm install @instana/react-native-agent --save
     
  2. クラス App.js ファイル内で、 Instana ダッシュボードに表示されている設定値に と YOUR_INSTANA_REPORTING_URLYOUR_INSTANA_APP_KEY 置き換えてください:
export default class App extends Component {
  componentDidMount() {
    Instana.setup(YOUR_INSTANA_APP_KEY, YOUR_INSTANA_REPORTING_URL, null);
  }
}
 

このステップでは、基本的な初期化が完了します。 初期化オプション、追跡表示、その他のオプションの完全な一覧については、 React Native エージェント( API )を参照してください。

Read Nativeエージェントを使用する際の留意点

  • Instana エージェントとMetroバンドラー間の通信を追跡しないようにするには、無視するURLリストに http://localhost:8081 以下を追加してください:
Instana.setIgnoreURLsByRegex(['http://localhost:8081.*']);
 
  • iOS アプリをサポートするには、プロジェクトに少なくとも1つの Swift ファイルが含まれている必要があります(内容は空でも構いません)。 Swift ファイルがない場合は、Xcodeプロジェクトを開き、空の <YourReactNativeProject>/iosSwift ファイルを追加してください。 Xcode により、ブリッジング・ヘッダーが作成されます。

  • Androidアプリをサポートするには、お使いの React Native のバージョンに適した Instana Androidプラグインのバージョンを使用してください:

    • React Native ( 0.63.3 )またはそれ以前のバージョンでは、 Instana Androidプラグイン( 1.5.3 )をご利用ください
    • React Native ( 0.63.4 以降)の場合は、 Instana Androidプラグイン( 5.2.2 以降)を使用してください

Android

注:Instana React Native の各バージョンは、 Instana Androidプラグインの特定のバージョンと互換性があります。 以下のスニペットでは、バージョン 6.2.5 を例として使用しています。 お使いの React Native のバージョンに対応した、最新の Instana Androidプラグインをご利用ください。 最新バージョンについては、 https://www.npmjs.com/package/@instana/react-native-agent をご覧ください。

自動 HTTP モニタリングを有効にするには、以下の手順を実行します。

  1. /android/build.gradle ファイルに、以下のコードを追加します。

    buildscript {
        ext {
            INSTANA_ANDROID_PLUGIN_VERSION = "6.2.5"
        }
        dependencies {
            classpath "com.instana:android-agent-plugin:$INSTANA_ANDROID_PLUGIN_VERSION"
        }
    }
     
  2. /android/app/build.gradle ファイルに、以下のコードを追加します。

    apply plugin: 'com.android.application'
    apply plugin: 'com.instana.android-agent-plugin'
     
fetch(url)

アプリが fetch を使用してネットワーク要求を実行する場合、 fetch を使用するたびに、実行時にアプリが異常終了することがあります。 No virtual method toString(Z)Ljava/lang/String;

この問題は、 React Native のイシュー( 2 7250 および28425)によって修正されました。 この問題が発生した場合は、以下の回避策を適用できます。

Android モジュール・レベルの Gradle ファイル (通常は app/gradle.build) で、以下のコードを追加します。

dependencies {
    implementation "com.squareup.okhttp3:okhttp:4.3.1"
    implementation "com.squareup.okhttp3:okhttp-urlconnection:4.3.1"
}
 
Execution failed for task ':app:transformClassesWithDexBuilderForDevDebug'

以前のバージョンから React Native 0.63.4 にアップグレードした場合は、現在使用しているバージョンが、

  • https://www.npmjs.com/package/@instana/react-native-agent に掲載されている、互換性のある Instana 用Androidプラグインのバージョン。
  • Gradle 7.3.3 以降の場合は、 android/gradle/wrapper/gradle-wrapper.propertiesdistributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip を参照してください。
  • Android Gradle プラグイン 7.2.2 以降の場合は、 android/build.gradleclasspath("com.android.tools.build:gradle:7.2.2") を参照してください。

Flutter

Flutter エージェントは、Android プラットフォームと iOS プラットフォームの両方をサポートします。

注:Flutter エージェントでは、 HTTP の自動トレース機能は提供されていません。 HTTP トレースの設定は開発者が手動で行う必要があります(このドキュメントに例が記載されています)。

Flutter エージェントを設定する前に、以下の前提条件が満たされていることを確認してください:

  • Flutter バージョン 1.20.0 以降
  • 2.12.0 と 3.0.0 の間の Dart バージョン

アプリケーションへのパッケージの追加

Instana エージェントの Flutter パッケージは、 pub.dev から入手できます。

パッケージをアプリに追加するには、以下の手順を実行します。

  1. アプリケーション・フォルダー内にある pubspec.yaml ファイルを開き、 dependenciesinstana_agent: を追加します。

  2. 以下のいずれかの方法でパッケージをインストールしてください:

    • コンソールから: flutter pub get を実行します。
    • Android Studio または IntelliJ: から、「パッケージ」 をクリックし、アクションリボンの pubspec.yaml
    • VS Code から:pubspec.yaml のアクション・リボンで 「パッケージの取得 (Get Packages)」 をクリックします。

Instana エージェントの初期化

パッケージを dart ファイルにインポートします。

import 'package:instana_agent/instana_agent.dart';
 

必要に応じて、アプリを停止して再始動します。

できるだけ早く Instana を設定してください。 例えば、 initState()では、以下のコードを追加します。

@override
  void initState() {
    super.initState();
    InstanaAgent.setup(key: 'YOUR-INSTANA-KEY', reportingUrl: 'YOUR-REPORTING_URL');
  }
 

iOS, 向けのアプリを構築したい場合は、プラットフォームバージョンを設定 ${appFolder}/ios/Podspec し、 11.0その最小値を に設定してください。

ビューの変更のトレース

Instana エージェントの初期化が完了したら、以下を追加してください InstanaAgent.setView('Home');

import 'package:instana_agent/instana_agent.dart';

[...]

InstanaAgent.setView('Home');
 

HTTP 要求のトレース

Instana エージェントの初期化が完了したら、 HTTP へのリクエストのキャプチャを開始します:

import 'package:instana_agent/instana_agent.dart';

[...]

InstanaAgent.startCapture(url: 'https://example.com/success', method: 'GET').then((marker) => marker
    ..responseStatusCode = 200
    ..responseSizeBody = 1000
    ..responseSizeBodyDecoded = 2400
    ..finish());
 

以下の例に示すように、独自の InstrumentedHttpClient 拡張 http.BaseClient を作成します。

class _InstrumentedHttpClient extends BaseClient {
   _InstrumentedHttpClient(this._inner);

   final Client _inner;

   @override
   Future<StreamedResponse> send(BaseRequest request) async {
      final Marker marker = await InstanaAgent.startCapture(url: request.url.toString(), method: request.method);

      StreamedResponse response;
      try {
         response = await _inner.send(request);
         marker
            ..responseStatusCode = response.statusCode
            ..responseSizeBody = response.contentLength
            ..backendTracingID = BackendTracingIDParser.fromHeadersMap(response.headers);
      } finally {
         await marker.finish();
      }

      return response;
   }
}

class _MyAppState extends State<MyApp> {

   [...]

   Future<void> httpRequest() async {
      final _InstrumentedHttpClient httpClient = _InstrumentedHttpClient(Client());
      final Request request = Request("GET", Uri.parse("https://www.ibm.com/products/instana"));
      httpClient.send(request);
   }

   [...]
}
 

ダッシュボード

サマリー

ダッシュボードの 「概要 」タブでは、重要なデータが一目で確認できます。 [概要] タブでは、以下の情報を確認できます:

セッション開始

ユーザーがアプリケーションを起動すると、セッション開始イベントが発生します。 「 セッション開始 」タイルには、選択した期間内に Instana エージェントから送信されたセッション開始ビーコンの総数が表示されます。

固有のユーザー

ユニークユーザー 」タイルには、一意のユーザーIDを持つユーザーの総数が表示されます。 一意のユーザーIDが設定されていない場合は、代わりに ( userSessionIdentifier usi) が使用されます。 この場合、アプリケーションがアンインストールされるか、ストレージがクリアされるまで、その後のすべてのセッションで同じusiが使用されます。

usiフィールドは、Androidエージェントのバージョン 6.0.6 および iOS エージェントのバージョン 1.6.5 で導入されました。 古いバージョンのエージェントを使用している場合、「usi」フィールドは空欄となり、各セッションが新しいユーザーとしてカウントされます。

注: セッション開始数とユニークユーザー 数のタイルに、値の不一致が見られる場合があります。 この不一致が生じるのは、値が選択された期間に依存しているためです。 たとえば、時間範囲が午前10時10分から午前10時20分までで、午前10時10分より前に開始された継続中のセッション(継続中のセッションは、セッション開始以外のユーザービーコンによって識別されます)がある場合、その時間範囲内のユニークユーザー数は表示されますが、セッション開始値は表示されないことがあります。 また、選択した期間内に1人のユーザーが複数のセッションを開始したために、「 セッション開始数」が 「ユニークユーザー 数」を上回る場合があることにお気づきかもしれません。

遷移の表示

ユーザーがアプリケーション内で異なるビューを切り替える際に、ビュー遷移ビーコンが送信されます。 たとえば、ホーム画面から製品画面に切り替えた場合、「 ビュー遷移 」タイルには、選択した期間内のビュー遷移ビーコンの総数が表示されます。

クラッシュの影響を受けるセッション率

クラッシュの影響を受けたセッション率 」タイルには、選択した期間内にユーザーがクラッシュを経験したセッションの割合が表示されます。 クラッシュの影響を受けたセッション数は、以下の式に示すように、クラッシュが発生したセッション数をユニークセッションの総数で割ることで算出できます:

Crash affected session rate = (Number of sessions with crashes / Total number of unique sessions) * 100
 

クラッシュの影響を受けるユーザー率

クラッシュ発生ユーザー率 」タイルには、選択した期間内にセッション中にクラッシュを経験したユニークユーザーの割合が表示されます。 セッションのクラッシュを経験したユーザー数をユニークユーザー総数で割ることで、クラッシュの影響を受けたユーザーの割合を算出できます。計算式は以下の通りです:

Crash affected user rate = (Number of users with crashes / Total number of unique users) * 100
 
図 1. ダッシュボードの「概要」
ダッシュボードの概要

クラッシュの概要

クラッシュ 」チャートには、選択した期間におけるモバイルアプリのクラッシュ件数が表示されます。 横軸は時間範囲を表し、縦軸はその期間中の事故総数を示しています。 これにより、傾向やピーク時間帯、あるいは事故の発生頻度が高まる特定の時間帯を特定するのに役立ちます。 事故の詳細を確認するには、グラフ上の事故発生箇所をクリックしてください。

表示される事故件数は、選択した期間に応じて変わります。 たとえば、「直近」が選択されている場合、各バーは1秒あたりのクラッシュ数を表し、横軸は秒単位で表示されます。 「過去1時間」を選択すると、各バーは1分あたりのクラッシュ件数を表し、横軸には時間が分単位で表示されます。

主なクラッシュグループ 」カードには、デフォルトで最も頻繁に発生するクラッシュグループが表示されます。 クラッシュグループは、クラッシュのエラータイプとエラーメッセージで構成されます。 影響を受けたユーザー数に基づいて、最も頻度の高いクラッシュグループを確認するには、カード内のタブを 「発生回数」 から 「影響を受けたユーザー」 に切り替えてください。

上位ビュー

トップビュー 」カードには、顧客におけるトップビュー遷移の発生状況が表示されます。

上位HTTP要求発信元

HTTP のリクエスト送信元トップ 」カードには、リクエストが送信されている上位のエンドポイントが表示されます。 「 エラー 」タブに切り替えると、エラーが発生した呼び出しの割合を確認できます。

パフォーマンス

アプリのパフォーマンスについて詳しく確認し、「アプリの起動時間」、「アプリが応答しない」、「メモリ不足」といったイベントについて理解を深めましょう。

「パフォーマンス」タブで収集されるメトリクスの詳細については、 「パフォーマンス」 を参照してください。

図 2. パフォーマンス・ダッシュボード
パフォーマンス・ダッシュボード

HTTP 要求

低速または問題のある HTTP 要求を確認します。 特定の起点を選択すると、スループットと待ち時間、およびエラー率と待ち時間の明細に関する洞察が得られます。

図 3. HTTP 要求詳細
HTTP 要求詳細

異常終了

アプリの異常終了に関して生成されたエラー・メッセージを表示できます。 異常終了は、エラー・メッセージによってグループ化されます。 クラッシュの詳細を表示するには、エラー・メッセージをクリックします。 詳細には、異常終了の回数、影響を受けるユーザーの数、ビュー、エラー・メッセージ、スタック・トレース、アプリケーション・バージョン、オペレーティング・システム、および異常終了が発生したデバイスの名前が含まれます。 異常終了を分析することで、モバイル・アプリケーションの安定性とパフォーマンスに関する洞察を得ることができます。 すべてのアクティブ・スレッドのロー・トレースを表示するには、 「すべてのスレッド」をクリックします。 異常終了したスレッドに関する以下の詳細を表示するには、 「異常終了したスレッド」をクリックします。

  • メモリー・アドレス
  • イメージ・クラス
  • ファイル名
  • 関数名
  • ファイル内のコードの行番号

「異常終了したスレッド」 ボタンは、Android アプリの iOS app または mapping ファイルの dSYM ファイルをアップロードした後にのみ有効になります。 ファイルをアップロードするには、 「ファイル dSYM のアップロード」 および 「ファイルの mapping アップロード」 を参照してください。

図 4. 異常終了の詳細
異常終了の詳細

ビュー

多くの場合、特定のビューを分離してパフォーマンスを分析することが重要です。これは、トラフィックが最も多いビューを見つける方法としても優れています。 特定のビューを選択すると、そのビューのすべてのメトリックが表示されます。

図 5. 詳細の表示
詳細の表示

カスタム・イベント

「カスタム・イベント」 タブでカスタム・イベントのリストを表示できます。 イベントを選択すると、関連するすべてのメトリックが表示されます。

図 6. カスタム・イベント
カスタム・イベント

チームアソシエーション

特定のモバイルアプリにチームを割り当てることはできますが、選択できるのは自分がメンバーとなっているチームのみです。

チームがモバイルアプリに関連付けられると、そのチームのメンバーのみがUI上でそのモバイルアプリを表示できるようになります。 また、モバイルアプリへのアクセス権限は、そのチーム内で割り当てられた役割によって決まります。

図 7. チーム所属
チーム所属

「チーム」の詳細については、 「チーム 」を参照してください。

スマート・アラート

構成されているすべてのスマート・アラートのリストが表示されます。 アラートをクリックして、その構成の表示、変更、または改訂履歴の表示を行います。 必要に応じて、アラートの無効化や削除も行うことができます。

「スマートアラート」リストおよび個々の設定には、そのスマートアラートが設定されている基盤となるSLOに関連付けられたチームが表示されます。

アラートの追加方法の詳細については、 「スマートアラート」 をご覧ください。

分析

トレースおよび呼び出しの分析機能と同様に、モバイル・アプリケーションのモニター・データに 「分析」 を使用して、事前構成されたダッシュボードではカバーされていない特定の質問に答えることができます。 Analytics の詳細については、 「Unbounded Analytics の操作」 を参照してください。

アプリケーション・モニタリング・データの単一ピースをビーコン と呼びます。 ビーコンにはいくつかの種類があり、具体的にはセッション開始リクエストと HTTP リクエストがあります。 Analyticsですべてのビーコンにアクセスできます。 ビーコン・データを使用して、トレースおよび呼び出しをフィルターに掛け、グループ化することができます。 デフォルトのグループ化は、選択したビーコン・タイプによって異なります。 グループを削除して、フィルターに一致する個々のビーコンを検査することができます。

図 8. 「分析」
分析

モバイルアプリケーションのサービス依存関係を確認する

[依存関係] タブには、選択したモバイルアプリケーションが呼び出す直接的なサービスが表示されます。 ルートノードはモバイルアプリケーションを表し、第1レベルのノードはそのアプリケーションが依存するサービスを示しています。 この情報は、グラフと詳細な表の両方で確認できます。

グラフ内の「モバイルアプリケーション」ノードをクリックすると、サイドパネルに、そのモバイルアプリケーションが行う呼び出しの総数、エラー率、平均レイテンシなどの詳細情報が表示されます。 サービスノードをクリックすると、サイドパネルに、そのサービスが受信した総通話数、選択したモバイルアプリケーションから発信された通話数、および同様の通話メトリクス(通話数、エラー率、平均遅延)が表示されます。

モバイルアプリケーションまたはサービスレベルで検出された問題を、深刻度別に色分けして確認できます。

図 9. 依存関係ビュー
依存関係ビューのダッシュボード

デバッグおよび分析のためにアプリケーションの状態を分析する

アプリケーションがビーコンを送信するたびに、 Instana は、そのアプリケーションがフォアグラウンドで実行中か、バックグラウンドで実行中か、あるいは状態が不明かといった、アプリケーションの状態を監視します。 アプリケーションの状態を確認することで、問題が発生したタイミングを把握することができます。 「不明」という状態は、エージェントがアプリケーションの状態を検出できないことを示しています。

アプリケーションの状態を活用することで、分析においてビーコンデータをフィルタリングしたりグループ化したりすることができ、デバッグや動作分析が容易になります。 アプリケーションの状態を利用することで、さまざまな状態におけるアプリケーションの動作を把握することができます。

地理データ

Instana ユーザーのIPアドレスを、 MaxMind が提供する GeoLite2 データベースに基づいて地理的な詳細情報に紐付けます。 IP アドレスは、リバース・プロキシー・サーバーを使用して収集されます。 セルフホスト型インストールの場合、エージェントのレポート用 URL として、ユーザー 監視エンドポイントの URL を設定してください。 エージェントのレポート用 URL が設定されていない場合、IPアドレスは収集されず、関連する地理的詳細情報は利用できません。