モバイル・アプリ・モニタリングのFAQ
モバイルアプリの監視に関するよくある質問(FAQ)では、モバイルアプリケーションを効果的に監視するための設定、トラブルシューティング、およびベストプラクティスについて解説しています。
データ収集とレポート作成
どのようなアプリケーション・データが収集されますか?
Instana モニタリングと連携して、モバイル・エージェントは以下のアプリケーション固有の情報を自動的に収集します。
- バンドルまたはアプリ識別子
- アプリおよびビルドのバージョン
- アプリの現在の言語
- iOS/Android バージョン、デバイスモデル、ハードウェア、デバイス、およびメーカー
- そのデバイスがジェイルブレイクされているか、ルート化されているか
- 画面サイズと解像度
- キャリア名と接続タイプ(
2G、3G、4G…)
ビーコン・レポートはどのように処理されますか?
メイン・スレッド (UI) がブロックされないように、レポート作成とキューの処理はバックグラウンド・スレッドで実行されます。
エージェントは、デバイス内の永続的なキューに受信したすべてのビーコンを収集するため、クラッシュや強制シャットダウンなどの予期せぬ事態が発生しても、ビーコンが失われることはありません。 各ビーコンには、約 600 バイトのストレージ・スペースが必要です。
ビーコンは、アプリのネットワークパフォーマンスへの影響を防ぐため、ビーコンの生成が停止してから1秒後に(バッテリー残量が少ない場合は10秒後に)削除されます。
フラッシュを行う前に、ビーコンは100個ずつグループ化されました。 その後、各バッチは単一の HTTP リクエストとして送信されます(デバイスが対応している場合は圧縮され、デバイスが対応している場合は同じ HTTP 接続が使用されます)。
エージェントがビーコンを送信しようとした際にデバイスがオフラインの場合、エージェントはデバイスがオンラインに戻るまで待機し、その後ビーコンを送信します。
キューのデフォルトの最大限度は 1000 ビーコンです。 キューが満杯の状態でさらにビーコンが生成された場合、新しいビーコンは破棄されます。
ビーコンの送信時にサーバーからエラー応答が返された場合、エージェントは 10s の指数関数的バックオフ機構を用いて、最大3回まで自動的に再送信を行います。 この自動再試行が失敗した場合でも、ビーコンは破棄されず、キューに残ったままとなり、新しいビーコンが生成された際に、キュー内の他のビーコンと共に再試行されます。
インターネットやネットワークの接続状態が悪いユーザーにはどうなりますか?
モバイル・アプリケーション・ユーザーからサーバーへのデータ送信要求が機能しない可能性があります。 これらのケースでは、次のモニター・データ伝送の一部としてビーコンを配信しようとします。例えば、以下のモバイル・アプリの開始時などです。
レポートの送信に失敗した場合はどうなりますか?
ネットワークの問題が原因で、ビーコン・レポートが失敗する可能性があります。 ビーコンは、次の送信試行のためにキューに保持されます。
オフライン中にデータは収集されますか?
はい、ここで説明されている100個のビーコンを上限として考えてください。 キューが満杯で(ネットワークの問題により)フラッシュできない場合、今後送信される予定のすべてのビーコンは破棄されます。
HTTP エンドポイント (SaaS 用) をプロキシー処理できますか?
Instana HTTP のエンドポイントに対するプロキシ設定は行わないことを推奨します。 Instana は、プロキシーのセットアップに対するサポート、およびプロキシーの使用によって発生する可能性のある問題に対するサポートを提供しま せん。 それでもこれを行いたい (またはしたい) 場合は、以下のポインターが役立ちます。
- 適切な
HostHTTP ヘッダーを設定します。 eum.instana.ioサーバーとeum-{region}.instana.ioサーバーの違いに注意してください。- サーバーがユーザー IP を認識していることを確認します。 ユーザーのIPアドレスを含むヘッダーをサーバー
X-FORWARDED-FORに送信する。 あるいは、ユーザーの IP が含まれている Instana サーバーにX-REALER-IPHTTP ヘッダーを送信します (X-REAL-IPではなく、意図的に送信します)。 - Instana サーバーが応答本文に組み込むすべての HTTP ヘッダーをパススルーします。
- プロキシーでのキャッシングは一切行わないでください。
テスト段階において、Androidアプリのデバッグビルドで Instana のモニタリングを有効にすることは可能ですか?
現在、 Gradle を使用することで、条件付きでのプラグイン使用状況を確認できます:
Instanainstana-example リポジトリのディレクトリにある以下の例を参照してください:
instana-example/app/build.gradle
instana-example/app/src/main/java/com/instana/mobileeum/DemoApp.kt
アプリ内で Instana のコードを一切実行したくない場合は、以下の手順に従ってください:
Gradle で最新の BuildType を入手してください。
で
app/build.gradle、以下のコードスニペットを使用して現在のビルドタイプを取得し、ビルドタイプに基づいてenableInstanaを定義してください。def buildType = gradle.startParameter.taskRequests.stream() .flatMap { it.args.stream() } .map { it.contains("Release") ? "Release" : it.contains("Debug") ? "Debug" : null} .filter(Objects::nonNull) .findFirst() buildType.ifPresent { println "buildType is ${it}" } def enableInstana = buildType.orElse("").matches("Debug")Instana pluginを条件付きで適用します。if (enableInstana) { println "instana> apply instana plugin" apply plugin: 'com.instana.android-agent-plugin' }Gradle ファイルに、条件付きで ` Instana ` キーを追加します。
また、 Instana が無効になっている場合、その
INSTANA_REPORTING_URLフィールドには空の文字列が表示されます。android { defaultConfig { def instanaProperties = new Properties() instanaProperties.load(new FileInputStream("$project.projectDir/instana.properties")) buildConfigField 'String', 'INSTANA_KEY', enableInstana ? "${instanaProperties["instana.key"]}" : '""' buildConfigField 'String', 'INSTANA_REPORTING_URL', enableInstana ? "${instanaProperties["instana.reportingURL"]}" : '""' } }Instana ランタイムを条件付きで初期化します。
これで、 Instana のランタイムが不要なビルドタイプで初期化されることはなくなります。
if (BuildConfig.INSTANA_REPORTING_URL.isNotBlank()) { Instana.setup(this, InstanaConfig( reportingURL = BuildConfig.INSTANA_REPORTING_URL, key = BuildConfig.INSTANA_KEY )) }
セッション数
モバイル Instana エージェントによって収集された情報は、セッションごとに整理されます。
各セッションはアプリのインスタンスにマップされます。アプリがインスタンス化されると開始され、アプリが停止すると終了します。
セッションのライフサイクル
- エージェントがセットアップされると、アプリケーションが開始されるたびにセッションが自動的に開始されます。
- セッションに対して、
sessionIDが自動的に生成されます。 - アプリケーションが (フォアグラウンドまたはバックグラウンドで) 稼働している間、
sessionIDは変更されません。 - Instana Androidエージェントまたは iOS エージェントによって送信されるすべてのビーコンには、同じ
sessionID sessionIDは、アプリケーションが停止すると破棄されます。プロセス自体が停止すると破棄されます。- 次回アプリが開始されると、新しい
sessionIDが自動的に生成されます。
HTTP モニタリング
どのような HTTP 情報がモニターされますか?
- リクエストの所要時間
- HTTP メソッド (
POST,GET……) - URL の完全なパス
- ステータスコード(例
200:) - レスポンスのサイズ(ヘッダー、本文、デコード済み本文)
- 根本的なエラー
- バックエンド相関のためのバックエンドトレースID
自動 HTTP モニタリングと手動 HTTP モニタリングの違いは何ですか?
iOS
iOS エージェントは、HTTP セッションの自動モニタリングと手動モニタリングを提供します。
自動モニター
URLSession を経由する HTTP のリクエストとレスポンスを監視するため、 HTTP の自動監視機能では、Foundationの URLProtocol を使用しています。 取り込まれた要求および応答はすべて Instana に報告されます。 デフォルトの URLSession は URLProtocol によって暗黙的にインターセプトすることができますが、すべてのカスタム・セッションでは、モニタリング用に明示的に URLProtocol を登録する必要があります。 多くのアプリケーションにカスタムの URLSession があるため、それらのセッションの登録プロセスは、Instana iOS エージェントの理想的なソリューションではありません。 登録プロセスを簡素化するために、すべての URLSessions の初期化指定子をスウィズリングすることで、すべてのセッションが暗黙的に登録されます。 スウィズリング・アプローチを使用すると、URLProtocol の登録が不要になり、自動 HTTP モニタリングが簡素化されます。 WKWebView の自動モニタリングは、信頼できないため使用できません。 アプリケーションと WebView の WebKit は、異なるプロセスで実行されます。 アプリケーションと WebKit プロセスの間には IPC がありますが、一部のデータ (POST 本体など) はアプリケーション・プロセスに送信されません。 これにより、予期しない動作が発生する可能性があります。
手動監視
HTTP 要求および応答を手動でキャプチャーすることにより、クライアントは自動モニターおよびスウィズリングからオプトアウトできます。 URLProtocol は URLSessions にインストールされません。 手動モニターとは、HTTP 要求と応答をキャプチャーするときに、クライアントによるモニターを使用するためにより多くの労力が必要になることを意味します。
Android
Android エージェントは、HTTP セッションの自動モニタリングと手動モニタリングを提供します。
自動モニター
このAndroidプラグインは、コンパイル時にアプリに追加のトラッキングコードを組み込みます。
Instana 現在、以下のネットワーククライアントの自動追跡に対応しています:
- OkHttp3
- HttpURLConnection
- Retrofit
Android エージェントの問題トラッカーで、より多くのネットワーク・クライアントをサポートするための関心事を登録します。
手動監視
HTTP 要求と応答を手動でキャプチャーすることにより、クライアントは自動モニターからオプトアウトして、追跡されるネットワーク要求と追跡されないネットワーク要求を完全に制御することができます。
詳細については、 Android API を参照してください。
React Native
React Native エージェントは、現在、HTTP セッションの自動モニターを提供します。
自動モニター
HTTP セッションの自動モニターについて詳しくは、各プラットフォームに固有の資料を参照してください。
iOS: 自動モニタリングを有効にして独自の URLProtocol を使用できますか?
はい。独自の URLProtocol を作成することで、カスタム URLSession を介して要求と応答をプロキシー処理できます。 Instana HTTP 監視機能は、デリゲートとして URLProtocol を持つものは URLSession すべて自動的に無視します。 ただし、カスタム URLSession が Instana.ignore(yourURLSession)によってモニターされないように明示的に無視することもできます。 デリゲートを使用せずに URLProtocol 自身の `` 内で `` URLSession を使用している場合は、 Instana iOS エージェントにおいて、このセッションを無視する必要があります。 そうでなければ、リクエストとレスポンスは二重に監視されます。
iOS: スウィズリングは危険ではないですか?
「常に」。 ランタイムでの スウィズリングは、ほとんどの場合、メソッドを追加することによって行われます。
func swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// looks weird, but it calls the original implementation
swizzled_touchesBegan(touches, with: event)
print("do some custom magic here")
}
そして、新しい方法と古い方法は、次のように交換されます。
if let originalMethod = class_getInstanceMethod(UIResponder.self, #selector(touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?))),
let swizzledMethod = class_getInstanceMethod(UIResponder.self, #selector(swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?))) {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
ただし、ランタイムが UIResponderのようにフォワード呼び出しを行うと、予期しない動作が発生する可能性があります。 実行環境がメッセージの転送を行うことがあります。 このスウィズリング手法は、メッセージ(例えば `new swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)`)が、`new` メソッドが存在しない別のレシーバーに転送された場合、クラッシュを引き起こす可能性があります。 Instana ( iOS )エージェントでは、クラスに2つ目のメソッドを追加することはできません。 したがって、元のセレクタに対して(ブロックを通じて)新しい実装を直接設定し、元の実装を上書きします。 一時的に保管された元の実装は、新しい関数内で呼び出されます。そのため、スワイズしてもトレースは残りません。
iOS: バックグラウンド・セッションのモニタリングは可能ですか?
いいえ。カスタム URLProtocol サブクラスをバックグラウンド・セッションで使用できないため、モニターできません。 (URLSession の資料を参照してください。)
バックエンド相関は HTTP 要求とどのように連携しますか?
すべての HTTP 要求には、Instana のホスト・エージェントによってモニターされるバックエンドに対する自動バックエンド相関が含まれます。 クライアント側で何かを追跡したり設定したりする必要はないかもしれません。
どの HTTP ヘッダーが使用されますか?
バックエンド間の相関を実現するため、エージェントは以下の HTTP ヘッダーを使用します:
- 応答ヘッダー:
Server-Timing
iOS 要件
どの iOS バージョンがサポートされますか?
iOS : Instana iOS agent は、 iOS 12 以降に対応しています。
どの Swift バージョンがサポートされますか?
Swift 5(Xcode 10.2 以降)またはそれ以降。
iOS エージェントはどのようにインストールしますか?
Xcode内の Swift パッケージマネージャーを使用してください。 あるいは、CocoaPods を使用することもできます。 Instana iOS エージェントを設定するには、. application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:内のメソッドを1つ呼び出します。
Androidの動作環境
どの Android バージョンがサポートされますか?
サポートされる最小 API レベル: Android API 16 (Android 4.1 「Jelly Bean」)。
AndroidX: AndroidX がサポートされ、必須です。
どの言語がサポートされますか?
言語: Java と Kotlin の両方がサポートされます。
Java 対応対象 : Java、 1.8 以降。
この Duplicate class com.google.common.util.concurrent.ListenableFuture コンパイルエラーは何を意味しているのでしょうか?
アプリがGuavaに依存している場合、 Instana のAndroidエージェントを追加すると、次のようなコンパイルエラーが発生する可能性があります。
Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules guava-25.0-android.jar (com.google.guava:guava:25.0-android) and listenablefuture-1.0.jar (com.google.guava:listenablefuture:1.0)
この問題を解決するには、アプリに次の依存関係を追加してください:
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
この NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform; 実行時エラーは何を意味しているのでしょうか?
これは既知の問題に関連しており、アプリケーションの解決 OkHttp 方法や OkHttp-logging-interceptor バージョンに違いがある場合に発生する可能性があります。 この状況については、以下のページで詳しく説明されています: https://github.com/square/okhttp/issues/2839。
Instana Androidエージェントは を使用しており OkHttp v4、これは よりも新しい可能性があります OkHttp。
この問題を解決するには、アプリケーションを OkHttp-logging-interceptorOkHttp 最新版にアップグレードしてください。
「 StrictMmode 」というエラーは android.os.StrictMode$StrictModeDiskReadViolation 何を意味するのでしょうか?
Instana Androidエージェントは、 Java のUUIDを使用します。
Android API 18 以前のバージョンにおいて、 StrictMode によって引き起こされるよく知られた誤検知があります: https://issuetracker.google.com/issues/36969031。
回避策: API 18 以前のバージョンでは、[ detectDiskReads ] または [ ] penaltyDeath を無効にしてください。
この java.lang.NoSuchMethodError: No virtual method setInitialDelay コンパイルエラーは何を意味しているのでしょうか?
エラー: java.lang.NoSuchMethodError: No virtual method setInitialDelay(JLjava/util/concurrent/TimeUnit;)Landroidx/work/OneTimeWorkRequest$Builder; in class Landroidx/work/OneTimeWorkRequest$Builder; or its super classes (declaration of 'androidx.work.OneTimeWorkRequest$Builder'
WorkManager 2.1.0 では、setInitialDelay のメソッド・シグニチャーが変更されました。 WorkManager 以前 2.1.0:
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
public @NonNull Builder setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
....
}
}
}
WorkManager の後 2.1.0:
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
public @NonNull B setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
...
}
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
}
}
事実上、プロジェクト内のすべての依存関係は、 WorkManager 2.1.0 + またはそれ以前のバージョンのみを使用する必要があります。
Instana Android エージェントは、WorkManager 2.4.0+ を使用します。
このエラーが表示された場合、最も考えられる原因は、別の依存関係が WorkManager の古いバージョンを使用していることです。 必ず更新してください。
この Required: PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS コンパイルエラーは何を意味しているのでしょうか?
このエラーは、 3.6.1 より古いバージョンの Android Gradle プラグインを必要とする Gradle プラグインが、Android Gradle プラグインのバージョン 3.6.1 以降を使用してコンパイルされた場合に発生することが知られています。
たとえば、Realm Databaseプラグイン( 7.0.1 )を、Androidの Gradle プラグイン( 4.0.1 )および Instana Androidエージェント( 3.4.0 )と併用すると、このコンパイルエラーが発生する可能性があります。 結果として生成されるエラー・ログには、最初に Realm の変換プログラム・タスクの失敗への参照が含まれ、次におそらく他のプラグインへの参照が含まれます (関連するものではありません)。
[...]
Task :app:transformClassesWithRealmTransformerForDevevelopDebug FAILED
[...]
この問題を解決するには、 問題のプラグインのアップグレードを試行してください。
あるいは、次のいずれかを行います。
問題を引き起こしているプラグインの後に、「 Instana 」Androidエージェントプラグインが起動されるようにしてください。 例:
apply plugin: 'com.android.application' apply plugin: 'realm-android' apply plugin: 'com.instana.android-agent-plugin'アプリのAndroid用 Gradle プラグインを、問題のプラグインが要求するバージョンにダウングレードしてください
ajc-transform の Problem processing attributes... コンパイル・エラーは何を意味しますか?
現時点では、Firebase Performanceプラグインによって適用されるバイトコード変換の1つが、 Instana のAndroidエージェントが正常に動作しないという悪影響を及ぼしているようです。
この問題を回避するには、Instana の Android エージェントが Firebase Performance プラグイン前に実行されていることを確認してください。
プロジェクトに各プラグインを追加する順序を変更することで、これを実現できます:
apply plugin: 'com.instana.android-agent-plugin' // Instana agent will be applied before Firebase Performance
apply plugin: 'com.google.firebase.firebase-perf'
Unable to find method... コンパイル・エラーは何を意味しますか?
Instana のAndroidエージェントの各メジャーバージョンは、特定のAndroid用 Gradle プラグインのブランチと互換性があります。
このエラーは、使用されている Android Gradle プラグインが Instana Android エージェントによってサポートされていない場合に発生する可能性があります。
資料の Android Gradle プラグインおよび Gradle バージョン セクションを参照して、互換性マトリックスを確認し、アプリケーションの現在の Android Gradle プラグイン・バージョンの場所を確認してください。
この Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture 実行時エラーは何を意味しているのでしょうか?
エラー全体の内容は、Fatal Exception: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture; です。
これは、ある時点でアプリの依存関係が 9999.0-empty-to-avoid-conflict-with-guava への依存関係を必要としていたが、不要になった場合に発生する可能性があります。
アプリに以下の依存関係が含まれている場合は、削除してみてください。
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
この Execution failed for task ':app:transformClassesWithDexBuilderFor...' コンパイルエラーは何を意味しているのでしょうか?
エラー全体の内容は、次のとおりです (例えば DevDebug フレーバーの場合)。
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexBuilderForDevDebug'.
> There were multiple failures while executing work items
> A failure occurred while executing com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform$DexConversionWorkAction
> Failed to process /Users/developer/Projects/mobile-app/android/app/build/intermediates/javac/devDebug/classes
[...]
このエラーは、Instana エージェントのバージョンと Android Gradle プラグインのバージョンの不一致を強調表示します。 サポートされる組み合わせについては、プラットフォーム固有のインストール手順を参照してください。
React Native
Instana ( React Native )エージェントは、 iOS プラットフォームでは iOS エージェントを、AndroidプラットフォームではAndroidエージェントを呼び出します。 iOS エージェントまたはAndroidエージェントは、 React Native のagent upgradeコマンドを使用してアップグレードできます。 詳しくは、各プラットフォームに固有の資料を参照してください。
iOS エージェントとAndroidエージェントのキャッシュを削除するにはどうすればよいですか?
モバイルアプリから React Native エージェントを新しいバージョンにアップグレードした際は、ターミナルから次のコマンドを実行し、キャッシュされている旧バージョンの iOS エージェントおよびAndroidエージェントを完全に削除してください:
cd android && ./gradlew clean
cd ..
cd ios && pod cache clean --all && rm -rf build
cd ..
rm -rf node_modules
yarn cache clean --force
yarn install
cd ios && pod install
機密データ
ユーザーを個別に特定できるデータを収集していますか?
デフォルトでは、 Instana エージェントには、個々のユーザーを特定できるデータは含まれていません。 また、エージェントは デバイス・フィンガープリントなどの手法を適用 しません 。
ユーザー固有のデータは、 iOS ユーザー API または Android ユーザー APIを介して Instana で使用可能にすることができます。
Instana に送信されたユーザー・データは何に使用されますか?
お客様は、ユーザー識別情報を Instana に送信するように Instana エージェントを構成することができます。 この情報は、Instana 内でユーザーに表示される機能を提供するためにのみ使用されます。 Instana は、このデータを他の方法で解釈したり、お客様間で相互に関連付けたりすることはありません。
Instana に送信された後にユーザー・データを削除できますか?
GDPR に準拠するためなどの、頻度の低い削除要求がサポートされます。 頻繁な削除要求または定期的な削除要求が予想される場合は、代わりに匿名化されたデータ (例えば、ハッシュ化されたユーザー ID) を Instana に送信します。
IP は匿名化されますか?
はい。IP は匿名化されます。 デフォルトでは、 IPv4 アドレスの最後のオクテットと IPv6 アドレスの最後の 80 ビットはゼロに設定されます。 Instana のユーザーインターフェース内にあるモバイルアプリのダッシュボードの「設定」タブから、より厳格な匿名化ルールを設定できます。
各フレームワークにはどのような機能がありますか?
次の表は、各フレームワークで利用可能な機能の概要を示しています:
機能 |
Androidネイティブ |
iOS |
Flutter |
React Native |
ノート |
|---|---|---|---|---|---|
パフォーマンス・モニタリング (メモリ不足、アプリの起動時間、ページの表示時間、およびクラッシュ) |
サポート対象 |
サポート対象 |
サポートされていません |
サポートされていません |
ネイティブプラットフォームでのみ利用可能です |
ANR(アプリが応答しない) |
対応済み(スタックトレース付き) |
サポート対象 |
サポートされていません |
サポートされていません |
Androidでサポートされているスタックトレース |
過剰なネットワーク使用 |
サポート対象 |
サポートされていません |
サポートされていません |
サポートされていません |
Androidでのみ対応しています |
ドロップしたビーコン |
サポート対象 |
サポート対象 |
サポート対象 |
サポート対象 |
すべてのプラットフォームで利用可能です |
自動 HTTP モニタリング |
サポート対象 |
サポート対象 |
サポート対象 |
サポート対象 |
ネットワークリクエストを自動的に追跡します |
手動 HTTP モニタリング |
サポート対象 |
サポート対象 |
サポート対象 |
サポートされていません |
ネイティブプラットフォームおよび Flutter でのみ利用可能です |
autoCaptureScreenNames |
サポート対象 |
サポート対象 |
サポート対象 |
サポートされていません |
React Native では利用できません |
enableW3CHeaders |
サポート対象 |
サポート対象 |
サポート対象 |
サポート対象 |
W3C コンテキストヘッダーのトレースに対応 |
速度制限 |
サポート対象 |
サポート対象 |
サポート対象 |
サポート対象 |
すべてのプラットフォームで利用可能です |
Instana は、 React Native でのExpoをサポートしていますか?
Instana のAndroidエージェントを使用するには、現在、 React Native アプリケーションにおいて、プロジェクトレベルおよびアプリレベルの Gradle ファイルの両方に変更を加える必要があります。 詳細については、 「 React Native 」のAndroid設定手順をご覧ください。
ただし、 Expoが管理するワークフロー では、ファイル build.gradle はビルド時に生成されるため、直接変更することはできません。 この制限は、手動での依存関係管理が可能な 「Bare 」または「 Ejected 」ワークフローを使用する場合にのみ適用されます。
一時的な回避策として、 Instana のAndroidエージェントをExpoと統合するためのカスタムExpo設定プラグインを作成することができます。 この方法は実験的なものであり、すべてのExpo環境で動作するとは限りません。 Instana この方法およびExpoが管理するワークフローについては、公式なサポートを提供していません。
プロジェクトのルートディレクトリに「 app.plugin.js 」という名前の新しいファイルを作成し、以下の内容を追加してください:
const {
withProjectBuildGradle,
withAppBuildGradle,
createRunOncePlugin,
} = require('@expo/config-plugins');
const INSTANA_ANDROID_PLUGIN_VERSION = '6.2.5';
const PLUGIN_NAME = 'withInstanaAndroidPlugin';
// Modify android/build.gradle
const withInstanaProjectGradle = (config) => {
return withProjectBuildGradle(config, (config) => {
if (config.modResults.language === 'groovy') {
let buildGradle = config.modResults.contents;
// Add INSTANA version to ext block if not present
if (!buildGradle.includes('INSTANA_ANDROID_PLUGIN_VERSION')) {
buildGradle = buildGradle.replace(
/ext\s*{([\s\S]*?)}/,
(match, contents) => {
return `ext {
${contents.trim()}
INSTANA_ANDROID_PLUGIN_VERSION = "${INSTANA_ANDROID_PLUGIN_VERSION}"
}`;
}
);
}
// Add classpath dependency
if (!buildGradle.includes('com.instana:android-agent-plugin')) {
buildGradle = buildGradle.replace(
/dependencies\s*{([\s\S]*?)}/,
(match, contents) => {
return `dependencies {
${contents.trim()}
classpath "com.instana:android-agent-plugin:$INSTANA_ANDROID_PLUGIN_VERSION"
}`;
}
);
}
config.modResults.contents = buildGradle;
}
return config;
});
};
// Modify android/app/build.gradle
const withInstanaAppGradle = (config) => {
return withAppBuildGradle(config, (config) => {
if (config.modResults.language === 'groovy') {
let appGradle = config.modResults.contents;
// Ensure plugin is applied only once
if (!appGradle.includes("apply plugin: 'com.instana.android-agent-plugin'")) {
appGradle = `apply plugin: 'com.instana.android-agent-plugin'\n` + appGradle;
}
config.modResults.contents = appGradle;
}
return config;
});
};
// Combine both modifications
const withInstanaPlugin = (config) => {
config = withInstanaProjectGradle(config);
config = withInstanaAppGradle(config);
return config;
};
module.exports = createRunOncePlugin(withInstanaPlugin, PLUGIN_NAME, '1.0.0');
の app.json または app.config.jsに、以下の設定を追加してプラグインを登録してください:
module.exports = {
expo: {
name: 'my-app',
slug: 'my-app',
plugins: ['./app.plugin.js'],
},
};
Instana は native_dio_adapterFlutter に対応していますか?
現在、 Instana は native_dio_adapterFlutter に対応していません。 Androidでは、この native_dio_adapter パッケージは HTTP へのリクエストを、 Google のネイティブネットワークライブラリであるCronetを経由して転送します。 このアプローチでは、Dart HttpClient ( Flutter Instana エージェントがこれを介して監視する HttpOverrides)と、および OkHttpClient (ネイティブ Android エージェントがバイトコード HttpURLConnection のインスツルメンテーションを通じて監視する)といった標準的な Android ネットワーククラスの両方をバイパスします。 これらのレイヤーがスキップされるため、 Instana のAndroidエージェントは現在、を使用して行われたネットワークリクエストを native_dio_adapterキャプチャすることができません。
Instana Instana で監視可能な、対応している Android ネットワーククライアントの一覧を掲載しています。 はこれらのサポート対象クラスに依存 native_dio_adapter していないため、Androidアプリで使用しても、関連するログやネットワークトレースは表示されません。 iOS, では、依然としてネットワークアクティビティが報告される場合がありますが、ネイティブ層とDart層の両方からのデータ収集が重複しているため、結果に一貫性がなかったり、重複したりする可能性があります。
が正式にサポート native_dio_adapter されるまでは、 HTTP による手動での監視を行うことをお勧めします。 手動による監視では、 Flutter ( Instana )エージェントを使用して、レイテンシ、応答ステータス、エラーなどのネットワークリクエストの詳細を明示的に記録することができます。 設定手順や使用例については、 『 HTTP 監視マニュアル』 を参照してください。