iOS向けモバイルアプリ監視
Applications ManagerのiOS向けモバイルAPMを使用すると、実際のエンドユーザーデバイスでネイティブモバイルアプリケーションのパフォーマンスを追跡できます。たとえば、ニュースリーダーアプリケーションは、内部で次の操作を実行する場合があります。
- テーブルビューに移動して記事のリストを表示
- REST API呼び出しを使用して記事のリストを読み込み
- SQLiteデータベースに記事のリストをキャッシュ
- 各記事のサムネイルをダウンロード
- ファイルシステムにサムネイルをキャッシュ
- カスタムテーブルビューのセルスタイルなどの複雑なUIを構築
上記のすべては、ユーザーエクスペリエンスに影響を与える可能性のある長時間実行される操作であるため、さまざまなデバイスでベンチマークを取り、最適化することが重要です。Applications ManagerのモバイルAPMは、ライブラリ形式でアプリケーションにAPMエージェントを埋め込むことにより、世界中のすべてのユーザーからメトリックを収集および集計します。
APMエージェントは、トランザクションとコンポーネントを使用してコードの実行時間を測定します。前の例では、ナビゲーションの開始から最終的なUIのレンダリングまでの一連の操作全体をトランザクションと見なすことができます。個々の操作は、HTTP、SQLite、ファイルシステム、UIなどのさまざまなコンポーネントタイプにグループ化できます。単純な操作はトランザクションのみを使用して測定でき、複雑な操作はコンポーネントを持つトランザクションを使用して測定できます。
iOS向けモバイルアプリ監視の設定に関する詳細は、次のトピックを参照してください。
- Swift Package Managerを使用してME APMインサイトを統合
- ME APMインサイトを設定
- トランザクションを開始
- コンポーネントを使用してトランザクション内の操作をグループ化
- データをフラッシュ
- カスタムAPI
Swift Package Managerを使用してME APMインサイトを統合する
リポジトリからSwift Package Managerを使用してME APMインサイトパッケージを統合するには、以下の手順に従います。
- Xcodeでプロジェクトを開きます。
- メニューバーから[ファイル]→[Add Packages…]を選択します。
- パッケージリポジトリのURLを入力します。https://github.com/ManageEngine/MEAPMinsight
- [Dependency Rule]を[Up to Next Major Version]に設定します。
- パッケージを追加するアプリケーションターゲットを選択します。
- [Add Package]をクリックします。
ME APMインサイトを設定する
Swift Package Managerを使用してME APMインサイトを追加した後、次の設定手順を完了します。
1. モバイルアプリ監視を作成する
- MangeEngine Applications Managerでモバイルアプリ監視を作成します。
- 生成された設定ファイル(apm_config.plist)をダウンロードします。
2. Xcodeプロジェクトに設定ファイルを追加する
- ダウンロードした設定ファイル(apm_config.plist)をXcodeプロジェクトのルートにドラッグします。
- ダイアログで:
- [Action]を[Copy files to destination]に設定します。
- 必要なアプリケーションターゲットを選択します。
- [Finish]をクリックします。
3. 自己署名証明書(該当する場合)
DEMコレクターが自己署名SSL証明書を使用している場合:
i. Xcodeプロジェクトに証明書を追加する:
- DEMコレクターのインストールディレクトリ/conf/sslcertsからapm_cert.cerをコピーし、Xcodeプロジェクトが開かれているサーバーに移動します。
- apm_cert.cerをXcodeプロジェクトのルートにドラッグします。
- ダイアログで:
- [Action]を[Copy files to destination]に設定します。
- 必要なアプリケーションターゲットを選択します。
- [Finish]をクリックします。
これにより、ME APMインサイト SDKはDEMコレクターと安全に通信できます。
ii. App Transport Securityの例外を追加する
自己署名証明書を使用する場合、DEMコレクタードメインのInfo.plistファイルで例外を許可する必要があります。そのためには、Info.plistファイルを開き、次の設定を追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>[collectordomain].com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
[collectordomain].comをDEMコレクタードメインに置き換えます。
4. AppDelegateクラスでSDKを初期化する
監視を開始するには、次のコードを使用してAppDelegateクラスでSDKを初期化します。
import ME APMインサイト
@main
class AppDelegate: UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
#if DEBUG
APMInsight.setDebugLoggingEnabled(true)
APMInsight.setEnvironment("debug")
#endif
APMInsight.startMonitoring()
// 以下は任意です
APMInsight.enableErrorReporting()
// HTTP追跡から除外するURLの配列を渡します
APMInsight.enableHttpTracking([
"https://api.example.com/analytics",
"https://cdn.example.com"
])
return true
}
}
重要:クラッシュレポートが正しくシンボル化されるようにするには、ビルド設定で[Debug Information Format]を[DWARF with dSYM file]に設定してください。アプリを配布または出荷する前に、この設定がリリースビルドに適用されていることを確認してください。
トランザクションを開始する
通常、長時間実行される操作の前にトランザクションを開始し、操作が完了したときに停止する必要があります。トランザクションはスレッドセーフであり、異なるスレッドから開始および停止できます。トランザクションオブジェクトは一度だけ開始および停止できます。同じ名前のトランザクションは、アプリケーション全体で平均化されます。したがって、同じ操作が同じトランザクション名を使用して複数回実行されると、平均実行時間が記録されます。
func listArticles() {
let transaction = APMInsight.startTransaction(withName: "List Articles")
// 長時間実行される操作を実行します
APMInsight.stopTransaction(transaction)
}
コンポーネントを使用してトランザクション内の操作をグループ化する
トランザクション内の操作をさまざまな種類のコンポーネントにグループ化できます。APMHTTPComponent、APMSQLiteComponent、APMUIComponentなどの事前定義されたタイプのいずれかを使用するか、独自のタイプを指定できます。コンポーネントはスレッドセーフであり、異なるスレッドから開始および停止できます。コンポーネントオブジェクトは一度だけ開始および停止できます。親トランザクションがすでに停止された後は、コンポーネントオブジェクトを停止することはできません。トランザクション内の複数のコンポーネントは、重複して並行して実行できます。トランザクション内で同じ名前のコンポーネントは平均化されます。
func listArticles() {
let transaction = APMInsight.startTransaction(withName: "List Articles")
let httpComponent = transaction?.startComponent(withType: APMHttpComponent)
let articlesComponent = transaction?.startComponent(withType: "Download Articles")
// 記事をダウンロード
transaction?.stopComponent(articlesComponent)
for article in articles {
let thumbnailComponent = transaction?.startComponent(withType: "Download Thumbnail")
// サムネイルをダウンロード
transaction?.stopComponent(thumbnailComponent)
}
transaction?.stopComponent(httpComponent)
APMInsight.stopTransaction(transaction)
}
上記の例では、HTTP操作(記事とサムネイルのダウンロード)にかかる合計時間はAPMHttpComponentによって測定され、記事だけにかかる時間は「Download Articles」によって測定されます。各サムネイルにかかる時間は、ループ内で複数回実行されるため、「Download Thumbnail」によって平均化され、記録されます。
データをフラッシュする
最近記録されたデータを手動でフラッシュすることが望ましい場合があります。アプリケーションが終了する直前にトランザクションを記録する場合、これを行いたい場合があります。アップロード間隔を長く設定している場合(デフォルトは30秒)、次のアップロード間隔の前にアプリケーションが終了する場合に備えて、必要に応じて手動でデータをフラッシュする必要があります。
APMInsight.flush()
カスタムAPI
カスタムAPIは、ユーザーIDの動的な値を設定したり、カスタムイベントを追跡したり、画面をキャプチャしたりするために使用されます。このドキュメントでは、利用可能なさまざまな種類のカスタムAPIと、それらを使用するための構文について説明します。以下は、利用可能なAPIのリストです。
1. SDKの初期化
以下のAPIを使用して、カスタムアップロード間隔でSDKを初期化できます。デフォルトでは、データアップロード間隔は30秒に設定されています。
Swiftの構文:
APMInsight.startMonitoring()
Objective-Cの構文:
[APMInsight startMonitoring];
2. カスタムユーザーID
デフォルトでは、一意のユーザーIDがSDKによって生成されます。ユーザーIDをカスタマイズしたい場合は、次の構文を実装することで行うことができます。これは、特定のユーザーに固有のメトリックを追跡したり、問題をデバッグしたりする場合に便利です。
メモ:この関数には、メールアドレス、電話番号、名前などの個人を特定できる情報(PII)を渡さないでください。匿名化された、または機密性の低い識別子のみを使用してください。
Swiftの構文:
APMInsight.setUserId("user123")
Objective-Cの構文:
[APMInsight setUserId:@"user123"];
3. トランザクション
以下のAPIを使用して、アプリケーション固有のタイミングでカスタムイベントを追跡できます。
Swiftの構文:
let transaction = APMInsight.startTransaction(withName: "List Articles")
let httpComponent = transaction?.startComponent(withType: APMHttpComponent)
let articlesComponent = transaction?.startComponent(withType: "Download Articles")
// 記事をダウンロード
transaction?.stopComponent(articlesComponent)
for article in articles {
let thumbnailComponent = transaction?.startComponent(withType: "Download Thumbnail")
// サムネイルをダウンロード
transaction?.stopComponent(thumbnailComponent)
}
transaction?.stopComponent(httpComponent)
APMInsight.stopTransaction(transaction)
Objective-Cの構文:
APMInsightTransaction *transaction = [APMInsight startTransactionWithName:@"List Articles"];
APMInsightComponent *httpComponent = [transaction startComponentWithType:APMHttpComponent];
APMInsightComponent *articlesComponent = [transaction startComponentWithType:@"Download Articles"];
// 記事をダウンロード
[transaction stopComponent:articlesComponent];
for (Article *article in articles) {
APMInsightComponent *thumbnailComponent = [transaction startComponentWithType:@"Download Thumbnail"];
// サムネイルをダウンロード
[transaction stopComponent:thumbnailComponent];
}
[transaction stopComponent:httpComponent];
[APMInsight stopTransaction:transaction];
4. HTTPコール
デフォルトでは、次のネットワークライブラリを使用するネットワークリクエストは自動的にキャプチャされます。
- NSUrlSession
- NSUrlConnection
さらにHTTPコールを追加したい場合は、以下のAPIを使用します。
Swiftの構文:
/*!
HTTPコールを追加します。このメソッドはスレッドセーフです。
@param name HTTPコール名。
@param duration HTTPコールの読み込み時間(ミリ秒)。
@param startTime HTTPコールの開始時間(ミリ秒)。
@param respCode HTTPコールのレスポンスコード。
@param httpMethod HTTPコールのメソッド。
*/
APMInsight.addHttpCall("example.com", withTime: 30, startTime:1642750130310,
respCode: 200, httpMethod: "GET")
Objective-Cの構文:
/*!
HTTPコールを追加します。このメソッドはスレッドセーフです。
@param name HTTPコール名。
@param duration HTTPコールの読み込み時間(ミリ秒)。
@param startTime HTTPコールの開始時間(ミリ秒)。
@param respCode HTTPコールのレスポンスコード。
@param httpMethod HTTPコールのメソッド。
*/
[APMInsight addHttpCall:@"example.com" withTime:30 startTime: 1642750130310
respCode:200 httpMethod:@"GET"];
5. 画面
デフォルトでは、すべての画面がキャプチャされます。ただし、見つからない画面を追加したい場合は、以下のAPIを使用します。
Swiftの構文:
/*!
画面を追加します。このメソッドはスレッドセーフです。
@param screen 画面名。
@param duration 画面の読み込み時間。
@param startTime 画面の開始時間。
*/
APMInsight.addScreen("DetailScreen", withTime: 60, startTime: "1642750130310")
Objective-Cの構文:
/*!
画面を追加します。このメソッドはスレッドセーフです。
@param screen 画面名。
@param duration 画面の読み込み時間。
@param startTime 画面の開始時間。
*/
[APMInsight addScreen:@"DetailScreen" withTime:60 startTime:@"1642750130310"];
SwiftUIビューの追跡
デフォルトでは、SwiftUIビューは自動的に追跡されません。SwiftUIビューを追跡するには、ビューに手動で.trackScreen()修飾子を追加する必要があります。
swiftUIの構文:
import SwiftUI
struct MainView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink("Go to Detail", destination: DetailView())
}
.trackScreen("MainView")
}
}
}
struct DetailView: View {
var body: some View {
VStack {
Text("Detail Screen")
}
.trackScreen("DetailView")
}
}
メモ:
.trackScreen()修飾子は、追跡したい各SwiftUIビューに追加する必要があります。- 画面名パラメーターは、ビューを識別する説明的な文字列である必要があります。
6. 環境
以下のAPIを使用して、開発、デバッグ、本番、リリースなどのさまざまな環境設定にわたるデータをフィルタリングするためのカスタム環境詳細を設定できます。
Swiftの構文:
/*!
APMエージェントの環境名を設定します。
@param environment カスタム環境名(例:「debug」、「release」、「beta-release」)
*/
APMInsight.setEnvironment("release")
Objective-Cの構文:
/*!
APMエージェントの環境名を設定します。
@param environment カスタム環境名(例:「debug」、「release」、「beta-release」)
*/
[APMInsight setEnvironment:@"release"];
7. フラッシュ
以下のAPIを使用して、次のアップロード間隔を待たずに、記録されたデータをすぐにDEMコレクターにアップロードできます。デフォルトでは、フラッシュ間隔は60秒に設定されています。
Swiftの構文:
APMInsight.flush()
Objective-Cの構文:
[APMInsight flush];
メモ:ネットワークが利用できない場合、データは次のアップロード間隔までキューに保持されます。長いアップロード間隔を設定している場合は、手動でデータをフラッシュする必要がある場合があります。
8. HTTPコールの除外
以下のAPIにURLのリストを引数として渡すことで、カスタムURLを追跡から除外できます。
Swiftの構文:
APMInsight.enableHttpTracking(["example.com", "demo.com"])
Objective-Cの構文:
[APMInsight enableHttpTracking:@[@"example.com", @"demo.com"]];
9. 画面の除外
以下のAPIに画面のリストを引数として渡すことで、カスタム画面を追跡から除外できます。
Swiftの構文:
APMInsight.ignoreScreens(["DetailScreen", "HomeScreen"])
Objective-Cの構文:
[APMInsight ignoreScreens:@[@"DetailScreen", @"HomeScreen"]];