Mobile App 監視常見問題 (FAQ)
- 資料收集和報告
- 階段作業數
- HTTP 監視
- 需求
- iOS
- Android
- 支援哪些 Android 版本?
- 支援哪些語言?
-
Duplicate class com.google.common.util.concurrent.ListenableFuture編譯錯誤意味著什麼? -
NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform;執行時期錯誤的意義為何? -
android.os.StrictMode$StrictModeDiskReadViolationStrictMmode 錯誤表示什麼? -
java.lang.NoSuchMethodError: No virtual method setInitialDelay編譯錯誤意味著什麼? -
Required: PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS編譯錯誤意味著什麼? -
ajc-transform中的Problem processing attributes...編譯錯誤是什麼意思? -
Unable to find method...編譯錯誤意味著什麼? -
Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture執行時期錯誤的意義為何? -
Execution failed for task ':app:transformClassesWithDexBuilderFor...'編譯錯誤意味著什麼?
- React Native
- 如何清除快取的 iOS 代理程式及 Android 代理程式?
- 機密資料
資料收集和報告
收集哪些應用程式資料?
除了 Instana 監視之外,行動代理程式還會自動收集下列應用程式特定資訊:
- 軟體組或應用程式 ID。
- 應用程式和建置版本。
- 現行應用程式語言。
- iOS/Android 版本、裝置機型、硬體、裝置及製造商。
- 裝置是越獄或根權限。
- 螢幕大小和解析度。
- 載波名稱及連線類型 (
2G、3G、4G...)。
如何處理引標報告?
為了避免封鎖主要執行緒 (UI) ,會在背景執行緒中執行報告和佇列處理。
代理程式會在裝置的持續佇列中收集所有送入的引標,因此,如果發生非預期的事件 (例如當機或強制關閉) ,則引標不會遺失。 每一個信標需要大約 600 位元組的儲存體空間。
信標的產生速率限制為每 10 秒插槽中 20 個信標,每 5 分鐘插槽中 500 個信標。
信標產生停止後一秒會清除信標 (如果電池電量不足,則為 10 秒) ,以防止對應用程式網路效能的任何影響。
在清除之前,信標會以 100 個批次的方式結合。 然後會在單一 HTTP 要求中傳輸每一個批次 (如果裝置支援它,則會壓縮; 如果裝置支援它,則會使用相同的 HTTP 連線)。
當代理程式嘗試傳送裝置時,如果裝置離線,則代理程式會等待直到裝置回到線上以傳送引標。
佇列的預設上限為 1000 個引標。 如果在佇列已滿時產生更多信標,則會捨棄新的信標。
如果信標的傳輸收到來自伺服器的錯誤回應,代理程式將使用 10s 指數回復機制自動重試傳輸最多 3 次。 如果此自動重試失敗,信標仍不會被捨棄,當產生新的信標時,它們會留在佇列中與佇列的其餘部分一起重試。
網際網路或網路連線不正確的使用者會發生什麼情況?
從行動應用程式使用者到我們伺服器的資料傳輸要求可能無法運作。 在這些情況下,我們會嘗試在下次監視資料傳輸的過程中 (例如,在下列行動式應用程式啟動時) 遞送信標。
如果報告失敗會發生什麼情況?
由於網路問題,引標報告可能會失敗。 引標會保留在佇列中,供下次嘗試傳輸時使用。
離線時是否收集資料?
不過,請考量這裡說明的 100 個信標的限制。 如果佇列已滿且無法清除 (因為網路問題) ,則會捨棄所有即將出現的引標。
是否可以 Proxy HTTP 端點 (適用於 SaaS)?
建議 不要 嘗試對 HTTP 端點進行 Proxy 處理。 Instana 不 支援任何 Proxy 設定,也不支援因使用 Proxy 而可能產生的任何問題。 如果您仍然想要 (或必須) 執行此動作,您可以找到這些有用的指標:
- 設定適當的
HostHTTP 標頭。 - 尊重
eum.instana.io與eum-{region}.instana.io伺服器之間的差異。 - 請確定我們的伺服器知道使用者 IP。 將
X-FORWARDED-FOR標頭傳送至具有使用者 IP 的伺服器。 或者,將X-REALER-IPHTTP 標頭 (是,故意不是X-REAL-IP) 傳送至包含使用者 IP 的 Instana 伺服器。 - 傳遞 Instana 伺服器包含在回應內文中的所有 HTTP 標頭。
- 不要在 Proxy 中執行任何快取。
我可以在測試階段期間僅在 Android 應用程式除錯建置中啟用 Instana 監視嗎?
目前,您可以使用 Gradle 本身來執行此動作,以取得條件式外掛程式用法:
請參閱 Instana 儲存庫的 instana-example 目錄中的下列範例:
instana-example/app/build.gradle
instana-example/app/src/main/java/com/instana/mobileeum/DemoApp.kt
附註: Instana 提供兩個用於 Android 監視的程式庫: plugin 程式庫及 runtime 程式庫。 下列步驟基於建置類型,如下所示:-完全未載入 Instana plugin 程式庫。 -Instana runtime 程式庫仍包裝在您的應用程式軟體組中,不過它會保留 uninitialized。 如果您不想在應用程式中執行任何 Instana 程式碼,請遵循下列步驟:
取得 gradle 中的現行 BuildType 。
在
app/build.gradle中,請使用下列程式碼 Snippet 來查詢現行建置類型,並根據建置類型來定義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 監視之間有何差異?
iOS
iOS 代理程式提供自動及手動監視 HTTP 階段作業。
自動
為了監視通過 URLSession的 HTTP 要求和回應,自動 HTTP 監視會使用 Foundation 的 URLProtocol。 所有擷取的要求和回應都會報告給 Instana。 雖然 URLProtocol可以隱含地截取預設 URLSession ,但所有自訂階段作業都需要明確的 URLProtocol 登錄才能進行監視。 因為許多應用程式都有自訂 URLSession,所以那些階段作業的登錄程序並不是 Instana iOS 代理程式的理想解決方案。 為了簡化登錄程序,會透過混淆所有 URLSessions的起始設定元來隱含地登錄所有階段作業。 使用混淆方法,不需要登錄 URLProtocol ,它可簡化自動 HTTP 監視。 WKWebView 的自動監視無法使用,因為它不可靠。 應用程式及 WebView的 WebKit 在不同的程序中執行。 應用程式與 WebKit 處理程序之間有 IPC ,但部分資料 (例如 POST 內文) 不會傳輸至應用程式處理程序。 這會導致非預期的行為。
手動
透過手動擷取 HTTP 要求及回應,用戶端可以拒絕自動監視及混淆。 沒有任何 URLProtocol 安裝至 URLSessions。 手動監視表示當您擷取 HTTP 要求及回應時,需要用戶端更努力使用監視。
Android
Android 代理程式提供 HTTP 階段作業的自動及手動監視。
自動
在編譯時期, Android 外掛程式會在應用程式中編排一些額外的追蹤程式碼。
我們目前支援自動追蹤這些網路用戶端:
- OkHttp3
- HttpURLConnection
- 改裝
在 Android 代理程式的問題追蹤器中登錄您的興趣,以支援更多網路用戶端。
手動
透過手動擷取 HTTP 要求及回應,用戶端可以拒絕自動監視,並完全控制要追蹤哪些網路要求,哪些不是。
請參閱 Android API 以進一步瞭解此資訊。
React Native
React Native 代理程式目前提供自動 HTTP 階段作業。
自動
如需自動監視 HTTP 階段作業的詳細資料,請參閱每一個平台專用的文件。
iOS: 我可以在啟用自動監視的情況下使用自己的 URLProtocol 嗎?
是,您可以建立自己的 URLProtocol ,以透過自訂 URLSession來 Proxy 您的要求和回應。 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中進行正向呼叫時,它可能會導致非預期的行為。 有時執行時期有時會執行訊息轉遞。 如果訊息 (例如新的 swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)) 轉遞至新方法不存在的另一個接收端,則此混淆技術可能會導致當機。 在 Instana iOS 代理程式中,我們不會將第二個方法新增至類別。 因此,我們將新的實作直接 (透過區塊) 設為原始選取元,並置換原始實作。 然後在新函數內呼叫暫時儲存的原始實作; 因此,混淆不會留下任何追蹤資料。
iOS: 是否可以監視背景階段作業?
否,因為自訂 URLProtocol 子類別無法用於背景階段作業。 (請參閱 URLSession 文件。)
後端相關性如何使用 HTTP 要求?
所有 HTTP 要求都包括自動後端相關性,與 Instana 主機代理程式所監視的後端。 不需要追蹤或設定任何用戶端。
正在使用哪些 HTTP 標頭?
為了達到後端相關性,代理程式會使用下列 HTTP 標頭:
- Response headers:
Server-Timing
需求
iOS
支援哪些 iOS 版本?
iOS: Instana iOS 代理程式與 iOS 11 相容。
支援哪些 Swift 版本?
Swift 5 (自 Xcode 10.2) 或更高版本
如何安裝 iOS 代理程式?
iOS: 在 Xcode 內使用 Swift Package Manager。 或者,您也可以使用 CocoaPods。 若要設定 Instana iOS 代理程式,請在 application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:中呼叫一個方法。
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 編譯錯誤的意義為何?
如果您的應用程式與番石榴有相依關係,在新增 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 及 OkHttp-logging-interceptor 升級至可用的版本。
android.os.StrictMode$StrictModeDiskReadViolation StrictMmode 錯誤意味著什麼?
Instana Android 代理程式使用 Java 的 UUID。
在 Android API 18 及更低版本中, StrictMode 會引發眾所周知的誤判: https://issuetracker.google.com/issues/36969031
作為暫行解決方法,請針對 API 18 及更低版本停用 penaltyDeath 或 detectDiskReads 。
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 編譯錯誤的意義為何?
當使用 Android Gradle 外掛程式 3.6.1 或更高版本來編譯 Gradle 外掛程式 (需要 3.6.1 之前的 Android Gradle 外掛程式) 時,已知會開啟此錯誤。
例如,我們發現在 7.0.1 中搭配使用 Realm Database 外掛程式與 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 外掛程式所套用的其中一個位元組碼轉換似乎具有阻止 Instana Android 代理程式執行其工作的負面影響。
若要防止此問題,請確定在 Firebase Performance 外掛程式 之前 執行 Instana 的 Android 代理程式。
您可以透過變更將每一個外掛程式新增至專案的順序來達成:
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 外掛程式分支相容。
當 Instana Android 代理程式不支援所使用的 Android Gradle 外掛程式時,最有可能顯示此錯誤。
請參閱說明文件的 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 代理程式。 可以使用 React Native 代理程式升級來升級 iOS 代理程式或 Android 代理程式。 如需詳細資料,請參閱每一個平台特定的文件。
如何清除快取的 iOS 代理程式及 Android 代理程式?
當 React Native 代理程式從行動式應用程式升級至新版本時,請從終端機執行下列指令,以徹底清除 iOS 代理程式及 Android 代理程式的快取舊版本: {: codeblock} 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。 如果您預期經常或定期刪除要求,請改為將匿名化資料傳輸至 Instana (例如,雜湊化使用者 ID)。
您是否匿名 IP?
是, IP 已匿名化。 依預設, IPv4 位址的最後一個八位元組及 IPv6 位址的最後 80 位元會設為零。 透過 Instana 使用者介面內行動式應用程式儀表板中的配置標籤,可以配置更嚴格的匿名化規則。