Real User Monitoring (RUM) は、モバイルアプリケーション向けの包括的なモニタリング機能を提供します。RUM を使用して、アプリケーションのパフォーマンス、クラッシュ、カクつきなどの主要なメトリックをリアルタイムで監視・分析できます。このトピックでは、HarmonyOS 向けソフトウェア開発キット (SDK) をご利用のアプリケーションに統合する方法について説明します。
バージョン要件
Stage アプリケーションの compatibleSdkVersion は 5.0.0 (12) 以降である必要があります。
バージョン 2.0.0 から SDK 統合パラメーターが変更され、それ以前のバージョンとの互換性がありません。バージョン 2.0.0 以降にスペックアップする場合は、最新の統合ドキュメントに従って SDK をスペックアップしてください。これにより、SDK が正しく初期化されます。
ステップ 1:SDK の統合
HarmonyOS RUM SDK はサードパーティリポジトリに公開されています。プロジェクト内の `oh-package.json5` ファイルの `dependencies` セクションに、SDK HAR パッケージの依存関係を追加します。設定は以下のとおりです。
"dependencies": { "@alibabacloud_rum/harmony_sdk": "2.0.2" }依存関係を設定した後、`ohpm install` コマンドを実行してパッケージをインストールします。パッケージはプロジェクトの `oh_modules` ディレクトリにインストールされます。
ohpm clean ohpm install設定が有効になるよう、プロジェクトを再ビルドします。
ステップ 3: SDK の構成
1. 権限の構成
ご利用のアプリケーションの `module.json5` 構成ファイルを確認し、以下の権限が含まれていることを保証します。
ohos.permission.INTERNET // ネットワークデータを送信
ohos.permission.GET_NETWORK_INFO // ネットワークステータス情報を取得2. ohmurl ルールの構成
プロジェクトレベルまたはモジュールレベルの `build-profile.json5` ファイル内で、`useNormalizedOHMUrl` を `true` に設定します。この設定項目が存在しない場合は、手動で追加してください。
{
"app" : {
"products": [{
"buildOption": {
"strictMode": {
"useNormalizedOHMUrl": true
}
}
}]
}
}3. hvigor プラグインの構成
Hvigor プラグインは SDK と連携し、コンパイル時に HarmonyOS アプリケーションにプローブコードを挿入します。
このプラグインはネットワークデータ収集に使用されます。現在、以下のネットワークフレームワークをサポートしています。
hms.collaboration.rcp
ohos.net.http
ohos.net.webSocket
ohos.net.socket.TCPSocket
プロジェクトでこれらのネットワークライブラリを使用していない場合、プラグインをインストールする必要はありません。
依存関係の宣言を追加します。
プロジェクトの `hvigor/hvigor-config.json5` ファイルにプラグインの依存関係を追加します。
{ "dependencies": { "@arms/rum-harmonyos-plugin": "^1.0.3" } }依存関係をインストールします。
方法 1:エディターの右上隅にある Sync Now をクリックするか、メニューから を選択します。DevEco Studio は `hvigor-config.json5` の構成に基づき、自動的に依存関係をインストールします。
方法 2:`hvigorw` コマンドラインインターフェイス (CLI) を使用して任意のコマンドを実行します。CLI は自動的にビルド依存関係をインストールします。
hvigorw --sync
(必須) 構成ファイルを作成します。
プロジェクトのルートディレクトリに、構成ファイル
alibabaCloudRumConfig.txtを作成します。このファイルは、プラグインが処理および無視するソースコードの範囲を指定します。ファイルには、次の構成を含める必要があります:-hook:処理対象のディレクトリまたはファイルを指定します。プラグインは、これらのパス内のソースファイルをスキャンおよび処理します。-keep:処理から除外するディレクトリまたはファイルを指定します。`keep` で指定されたパスは、`hook` パスに含まれていてもスキップされます。ネットワークデータ収集は、`hook` で構成されたパスに対してのみ有効です。
例:
# 処理対象の ets ソースコードのルートディレクトリを指定。 -hook ./src/main/ets/ # hook ディレクトリ内のすべてのファイルを処理しないように指定。 -keep ./src/main/ets/hook/モジュールのビルド構成ファイル `hvigorfile.ts` にプラグインを追加します。
import { hapTasks } from '@ohos/hvigor-ohos-plugin'; // プラグインをインポート。 import { AlibabaCloudRumPlugin } from '@arms/rum-harmonyos-plugin'; // ビルド構成内 export default { system: hapTasks, plugins: [ // プラグインインスタンスを追加。ここでは関数を呼び出す必要があります。 AlibabaCloudRumPlugin() ] };
4. SDK の初期化
方法 1 (推奨)
エントリーモジュールのカスタム AbilityStage の `onCreate` 関数内に、以下のコードを追加します。
AlibabaCloudRum.withServiceId("${your_serviceId}") // RUM アプリケーション作成時に ServiceId を取得します。 .withEndpoint("${your_endpoint}") // RUM アプリケーション作成時に Endpoint を取得します。 .withWorkspace("${your_workspace}")// RUM アプリケーション作成時に Workspace を取得します。 .start(this.context.getApplicationContext()); // アプリケーションコンテキストを取得します。方法 2
ご利用のアプリケーションのビジネスロジックにより、カスタム AbilityStage の `onCreate` ライフサイクルでの SDK 初期化が困難な場合は、最初のページ読み込みライフサイクル中に SDK を初期化できます。この場合、最初のページ読み込み前に発生したアプリケーション動作は収集されません。最初のページ読み込みライフサイクル中に、以下のコードを追加します。
AlibabaCloudRum.withServiceId("${your_serviceId}") // RUM アプリケーション作成時に ServiceId を取得します。 .withEndpoint("${your_endpoint}") // RUM アプリケーション作成時に Endpoint を取得します。 .withWorkspace("${your_workspace}")// RUM アプリケーション作成時に Workspace を取得します。 .withUiContext(this.getUIContext()) // uiContext を取得します。 .start(getContext(this).getApplicationContext()) // アプリケーションコンテキストを取得します。
5. データ収集
HarmonyOS SDK は、一部のデータタイプについて自動データ収集をサポートしています。axios や webview などのサードパーティネットワークライブラリについては、手動でイベントトラッキングを追加する必要があります。手順は以下のとおりです。
Axios ネットワークデータ収集
(任意) エンドツーエンド分散トレーシングを有効にするには、リクエストに Alibaba Cloud のカスタムビジネスリクエストヘッダーを挿入する必要があります。分散トレーシングが不要な場合は、この手順をスキップできます。エンドツーエンド分散トレーシングを使用する場合は、事前にコンソールでホストホワイトリストを構成する必要があります。詳細については、「Application Monitoring におけるフロントエンドとバックエンドのトレースの関連付け」をご参照ください。
重要各ネットワークリクエストごとに新しいカスタムヘッダーを取得および割り当てる必要があります。異なるリクエスト URL に対して API 呼び出し結果を再利用しないでください。
function getInsertHeaderMap(requestUrl: string): Map<string, string> | undefinedパラメーター
必須
説明
パラメーター制約
失敗時の結果
requestUrl
必須
リクエスト URL
文字列。有効なリクエスト URL であること。
取得に失敗しました。
// この例では、`AxiosRequestConfig` を使用してリクエストヘッダーを挿入する方法を示します。リクエストインターセプタを実装し、`InternalAxiosRequestConfig.headers` を処理してヘッダーを挿入することも可能です。 import axios, { AxiosError, AxiosHeaders, AxiosResponse, AxiosRequestConfig, InternalAxiosRequestConfig } from '@ohos/axios' import { AlibabaCloudRumTrace } from '@alibabacloud_rum/harmony_sdk' let customHeaders: AxiosHeaders = new AxiosHeaders() let traceHeader = AlibabaCloudRumTrace.axios.getInsertHeaderMap("https://www.example.com"); if (traceHeader) { traceHeader.forEach((value: string, key: string) => { customHeaders.set(key, value); }) } // AxiosRequestConfig を使用して実際のリクエストヘッダーに挿入。 let requestConfig: AxiosRequestConfig = { method: this.currMethod, headers: customHeaders, params: this.currRequestParam } axios.get("https://www.example.com", requestConfig);(必須) 正常および異常なネットワークリクエストのデータを収集します。
function handleSuccess(requestUrl: string, method: string, responseCode: number, requestDataSizeByte?: number, downloadSizeByte?: number, timingParam?: object, remoteAddressIP?: string, requestHeader?: Record<string, Object>, responseHeader?: Record<string, Object>, resourceType?: string, requestBody?: string)メトリックの説明:
パラメーター
必須
説明
パラメーター制約
失敗時の結果
requestUrl
必須
リクエスト URL
文字列。有効なリクエスト URL であること。
ネットワークイベントは収集されません。
method
必須
リクエストメソッド
文字列。HTTP 以外のリクエストメソッドの場合は空文字列を渡します。
ネットワークイベントは収集されません。
responseCode
必須
応答コード
数値。
ネットワークイベントは収集されません。
requestDataSizeByte
任意
アップロードされたリクエストデータのサイズ
数値。単位:バイト。
ネットワークイベントは収集されません。
downloadSizeByte
任意
ダウンロードサイズ
数値。単位:バイト。
ネットワークイベントは収集されません。
timingParam
任意
axios リクエストの各フェーズにかかった時間
http.PerformanceTiming
ネットワークイベントは収集されません。
remoteAddressIP
任意
宛先 IP アドレス
文字列
ネットワークイベントの関連フィールドが欠落します。
requestHeader
任意
リクエストヘッダー。分散トレーシング機能を使用するには、このパラメーターが必要です。
Record 型
ネットワークイベントの関連フィールドが欠落します。
responseHeader
任意
応答ヘッダー
Record 型
ネットワークイベントの関連フィールドが欠落します。
resourceType
任意
リソースタイプ
文字列。Multipurpose Internet Mail Extensions (MIME) タイプの Content-Type フィールドに従います。
ネットワークイベントの関連フィールドが欠落します。
requestBody
任意
リクエスト内容
文字列データ型
ネットワークイベントの関連フィールドが欠落します。
異常なネットワークリクエストのデータを収集します。
function handleError(requestUrl: string, method: string, requestDataSizeByte: number, errorParam: Error,requestHeader?: Record<string, Object>)パラメーター
必須
説明
パラメーター制約
失敗時の結果
requestUrl
必須
リクエスト URL
文字列。有効なリクエスト URL であること。
ネットワークイベントは収集されません。
method
必須
リクエストメソッド
文字列。HTTP 以外のリクエストメソッドの場合は空文字列を渡します。
ネットワークイベントは収集されません。
requestDataSizeByte
必須
アップロードされたリクエストデータのサイズ
数値。単位:バイト。
ネットワークイベントは収集されません。
errorParam
必須
ネットワークエラー
ビジネスエラー型
ネットワークイベントは収集されません。
requestHeader
任意
リクエストヘッダー
Record 型
ネットワークイベントの関連フィールドが欠落します。
以下に例を示します。
axios.get("http://www.example.com",requestConfig).then((responseData: AxiosResponse) => { AlibabaCloudRumTrace.axios.handleSuccess("http://www.example.com", "GET", responseData.status, requestDataSize, downloadSize, responseData.performanceTiming); }).catch((err: BusinessError) => { AlibabaCloudRumTrace.axios.handleError("http://www.example.com", "GET", 0, err); });
Webview データ収集
Web コンポーネントのライフサイクルコールバックに SDK 収集ロジックを追加します。手順は以下のとおりです。
JS スクリプトを挿入します。
javaScriptOnDocumentStartのパラメーターに、AlibabaCloudRumTrace.Web.getScriptItem()を追加します。`onPageEnd` ライフサイクルにイベントトラッキングを追加します。
onPageEnd内に、AlibabaCloudRumTrace.Web.onPageEndHilt(this.controller)を追加します。コンポーネントがアンインストールされる際に、SDK 収集リソースを破棄します。
onDisAppear内に、AlibabaCloudRumTrace.Web.onDisAppearHilt(this.controller)を追加します。
コード例:
import { AlibabaCloudRumTrace } from '@alibabacloud_rum/harmony_sdk';
Web()
.javaScriptOnDocumentStart([AlibabaCloudRumTrace.Web.getScriptItem()])
.onPageEnd(() => {
AlibabaCloudRumTrace.Web.onPageEndHilt(this.controller);
// this.controller: 現在の Web コンポーネントにバインドされている WebviewController である必要があります。
})
.onDisAppear(() => {
AlibabaCloudRumTrace.Web.onDisAppearHilt(this.controller);
// this.controller: 現在の Web コンポーネントにバインドされている WebviewController である必要があります。
})