Android Monitoring API

Instana Android 代理程式 API

下一節說明 Instana Android 代理程式的用法。 Instana 的 Android 代理程式可透過下列說明的 Instana 類別方法來使用。

設定

我們建議在 Application 類別 ' onCreate()中起始設定 Instana ,就在 super.onCreate()之後:

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

配置參數

參數
說明
key (String) Instana 監視配置金鑰。
reportingURL (String) 指向要將監視資料傳送至其中的 Instana 實例的 URL。
httpCaptureConfig (HTTPCaptureConfig,選用) 依預設,會自動擷取 HTTP 要求和回應。 若要停用自動監視,請將此參數設為 HTTPCaptureConfig.MANUAL。 若要關閉 HTTP 階段作業監視,請將此參數設為 HTTPCaptureConfig.NONE
suspendReporting (SuspendReportingType,選用) 在背景中以低優先順序進行 Instana 信標的傳輸。 您可以選擇必須暫停信標傳輸的條件,例如電池電量不足、只有行動連線或永不連線時。
initialBeaconDelayMs (Long,選用) 代理程式會將第一個信標的傳輸延遲達所決定的時間,以確保用戶端在將任何信標傳送至 Instana 伺服器之前,已設定所有其他參數 (例如 Session Identifiers )。
附註: 只會延遲信標的傳輸; 不論 initialBeaconDelayMs 參數為何,只要起始設定代理程式,就會立即開始監視及擷取。
collectionEnabled (Bool,選用) 此參數會在啟動時啟用或停用 Android 代理程式的資料收集及提交。 依預設,會隨設定開啟資料收集。 若要設定 Instana ,但忽略任何資料收集,請在設定中將此參數設為 false 。 在需要使用者同意才能讓 Android 代理程式收集資料的情況下,此參數非常有用。 預設值為 true
enableCrashReporting (Boolean,選用) (技術預覽) 此參數會在啟動時啟用或停用損毀資料收集及提交。 必要的話,可以在啟動之後啟用收集和提交。 在 Android 代理程式可以收集損毀資料之前需要使用者同意的實務範例中,此參數非常有用。 預設值為 false
slowSendIntervalMillis (Long,選用) 此參數會提供有效的正整數 (毫秒) (範圍從 2000-3600000 毫秒) ,在引標傳送失敗時啟用慢速傳送模式特性。 預設值為 null,表示已停用慢速傳送模式。
usiRefreshTimeIntervalInHrs (Long,選用) 此參數決定重新整理 usi (userSessionID) 的時間間隔。 usi 會作為唯一 ID ,當未明確提供 識別使用者 資料時,或當應用程式沒有任何使用者環境定義時,會指派給應用程式。

* 如果此參數設為負值, usi 會保留其預設行為,永不重新整理。
* 如果此參數設為值零,則不會將 usi 傳送至後端,因此會取消啟動 ID。
* 如果此參數設為正值,則 usi 會以指定的時間間隔重新整理。

需要以小時為單位提供參數值。 預設值是 -1

現行配置

如果要檢查現行 Instana 配置,只要存取 InstanaConfig 實例即可:

val currentConfig = Instana.config

階段作業 ID

每一個 Instana 代理程式實例都有唯一的階段作業 ID ,您可以在應用程式中用於其他用途。

內容
說明
sessionId (String,選用) 現行階段作業 ID。 將在設定程序內建立此階段作業 ID。

範例

val sessionId = Instana.sessionId

自動 HTTP 監視

依預設,會自動擷取 HTTP 階段作業。 在起始設定 Instana 時 (在安裝 Instana Android 外掛程式和 Instana Android SDK之後) ,代理程式會處理其餘部分。

Instana Android 代理程式會自動編排程式碼,以監視受支援用戶端的 HTTP 要求:

  • OkHttp3
  • HttpURLConnection
  • 改裝

可以停用自動 HTTP 監視,以支援手動 HTTP 監視,如下列小節中所述。

手動 HTTP 監視

開始擷取

此函數會在稍後完成要求時傳回您需要的 HTTPMarker

Instana {
    fun startCapture(url: String, viewName: String? = view, requestHeaders: Map<String,String>?): HTTPMarker?
}
配置參數
參數
說明
url (String) 要擷取的 URL。
viewName (String,選用) 與此要求相關之可見視圖的選用名稱
requestHeaders (Map<String,String>,選用) 要求標頭名稱和值的選用清單

傳回: HTTP 標記,用來設定回應大小、在要求完成時呼叫完成或錯誤狀態。

完成擷取

完成要求之後,您必須使用 HTTPMarker 及選用 Error的回應來呼叫 finish :

HTTPMarker {
    fun finish(response: okhttp3.Response)
    fun finish(request: okhttp3.Request, error: Throwable)
    fun finish(connection: java.net.HttpURLConnection)
    fun finish(connection: java.net.HttpURLConnection, error: Throwable)
    fun finish(data: com.instana.android.instrumentation.HTTPMarkerData)
}

取消擷取

如果在完成之前已取消要求,請在 HTTPMarker 上呼叫此方法。

fun cancel()

範例

val request = yourMethodToCreateRequest()
val marker = Instana.startCapture(request.url().toString(), viewName: "User Details")
val response = OkHttpClient().newCall(request).execute()
marker?.finish(response)
val marker = Instana.startCapture("https://example.com/user", viewName: "User Details")
// Complete request and manually obtain any relevant information
val httpMarkerData = HTTPMarkerData(
            requestMethod = "GET",
            responseStatusCode = 200,
            responseSizeEncodedBytes = 200,
            responseSizeDecodedBytes = 1000
        )
marker?.finish(httpMarkerData)
HTTPMarker marker = Instana.startCapture("https://example.com/user", "User Details");
// Complete request and manually obtain any relevant information
HTTPMarkerData data = new HTTPMarkerData.Builder()
        .requestMethod("GET")
        .responseStatusCode(200)
        .responseSizeEncodedBytes(200)
        .responseSizeDecodedBytes(1000)
        .build();
marker.finish(data);

視圖

Instana 可以依邏輯視圖將行動式應用程式見解分段。 如果要這麼做,請透過 Instana.setView(String) 方法來設定視圖名稱。 然後,該視圖將與所有受監視信標相關聯,直到再次呼叫 setView 之後該視圖變更為止。

我們建議不要使用類別之類的技術或通用名稱 (例如 WebViewActivity) 以定義視圖。 建議使用視圖的可讀名稱,例如 product detail pagepayment selection。 聚焦於使用者體驗,可讓團隊成員在對程式碼庫沒有深入瞭解的情況下,瞭解所提供的見解。

附註: 當畫面呈現給使用者時,應該會呼叫 Instana.setView(String) ,而不是當建立畫面時 (例如在可以建立一次但顯示多次的「片段」中)。 設定視圖名稱也會啟用 Instana ,以追蹤 除了頁面載入之外的頁面轉移

範例

class WebViewActivity : AppCompatActivity() {

    override fun onResume() {
        super.onResume()
        Instana.view = "Webview: FitBit authorization"
    }
}

識別使用者

使用者特定資訊可以選擇性地與傳輸至 Instana 的資料一起傳送。 然後可以使用此資訊來解除鎖定其他功能,例如:

  • 計算受錯誤影響的使用者數目,
  • 過濾特定使用者的資料
  • 以查看哪個使用者起始視圖變更或 HTTP 要求。

依預設, Instana 不會將任何使用者識別資訊關聯至信標。 在選擇這樣做時,請注意個別的資料保護法。 我們通常建議透過使用者 ID 來識別使用者。 對於 Instana ,這是完全透通的 String ,僅用於計算特定度量值。 userNameuserEmail 也可以用來存取更多過濾器,以及更愉快地呈現使用者資訊。

在您處理匿名使用者因而無法存取使用者 ID 的情況下,您可以選擇使用階段作業 ID。 階段作業 ID 在過濾資料時沒有使用者 ID 那麼有用,但它們是計算受影響/唯一使用者度量值的良好指標。 建議設定使用者名稱 (例如 Anonymous ) ,以明確區分已鑑別與未經鑑別的使用者。 階段作業 ID 可以是機密資料 (視使用的架構/平台而定)。 請考量雜湊階段作業 ID ,以避免將資料傳輸至可授與存取權的 Instana。

請務必注意,已傳輸至 Instana 伺服器的資料無法追溯更新。 基於此原因,請務必在應用程式啟動程序中儘早呼叫此 API。

附註 : 如果未提供使用者資料,或應用程式缺少任何使用者環境定義,則會從引標擷取 usi (userSessionID)。 usi 用作特殊 ID ,指派給應用程式,以在使用者資料無法使用的情況下唯一識別使用者。 透過使用 配置參數 區段中的 usiRefreshTimeIntervalInHrs 參數,您可以指定重新整理 usi的時間間隔。

Instana {
    void setUserId(@Nullable String)
    @Nullable String getUserId()
    void setUserName(@Nullable String)
    @Nullable String getUserName()
    void setUserEmail(@Nullable String)
    @Nullable String getUserEmail()
}

範例

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL
            )
        )
        Instana.userId = "1234567890"
        Instana.userEmail = "instana@example.com"
        Instana.userName = "instana android agent demo"
    }
}

Meta 資料

任意 meta 資料可以選擇性地附加至傳輸至 Instana 的所有資料。 請考量使用此項目來追蹤使用者介面配置值、設定、特性旗標 ... 任何可能有助於分析的其他環境定義。

附註: 目前最多支援 50 個 meta 鍵值組。 索引鍵最多可以有 98 個字元,值最多可以有 1024 個字元。

Instana {
     val meta = MaxCapacityMap<String, String>(50)
}

內容

參數
說明
meta (MaxCapacityMap) 將保留所有 meta 鍵值組的物件。 它的介面類似於一般「對映」; 您可以照常新增及移除元素,只要您不超過它的容量上限

範例

class UserProfileActivity : AppCompatActivity() {

    override fun onResume() {
        super.onResume()
        Instana.meta.put("user authenticated", "true")
        Instana.meta.put("user type", "editor")
    }
}

從監視中排除 URL

提供正規表示式,並將 URL 新增至 ignoreURLs 清單,即可忽略 URL。 使用此功能的良好實務範例是忽略包含任何機密資料 (例如密碼) 的所有 HTTP 要求。

只會忽略自動監視的 URL。 將不會忽略手動監視的 URL。

Instana {
    val ignoreURLs = mutableListOf<Regex>()
}
Instana {
    List<Pattern> getIgnoreURLs()
}

範例

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL
            )
        )
        Instana.ignoreURLs.add("/.*([&?])password=.*/i".toRegex())
    }
}

此範例會忽略查詢中包含密碼的所有 URL。

報告自訂事件

自訂事件可讓您向 Instana 報告非標準活動、重要互動及自訂計時。 這在分析未捕捉的錯誤 (瀏覽途徑) 及追蹤其他效能度量時特別有用。

Instana {
    fun reportEvent(event: CustomEvent)
}

Instana 提供的 CustomEvent 可讓您設定多個參數, eventName (在其建構子中) 是唯一必要的參數。

配置參數

參數
說明
eventName (String) 自訂事件的名稱。 它將顯著顯示在 Instana 儀表板中
startTime (Long,選用) 事件開始的時間戳記,定義自新紀元以來的毫秒數。 將預設為 Now ()-duration
duration (Long,選用) 事件定義的持續時間 (以毫秒為單位)。 將預設為 0
viewName (String,選用) 發生事件的邏輯視圖。 將預設為 Instana.view 中的現行視圖集
meta (Map<String, String>,選用) meta 值的對映。 這些將與此事件的廣域 Instana.meta 標籤合併; 它們將不會套用至任何其他未來事件
backendTracingID (String,選用) 由啟用 Instana 功能的伺服器在 Server-Timing 標頭中傳送為 intid;desc=backendTracingID 的追蹤 ID
error (Throwable,選用) Throwable 發生錯誤,提供其他環境定義 (如果有的話)

範例

val myEvent = CustomEvent("MyCustomEvent").apply {
    duration = 300
    meta = mapOf("keyOne" to "valueOne", "keyTwo" to "valueTwo")
    backendTracingID = "1234567890"
}

Instana.reportEvent(myEvent)
Map<String,String> myMetas = new HashMap<>();
myMetas.put("keyOne", "valueOne");
myMetas.put("keyTwo", "valueTwo");

CustomEvent myEvent = new CustomEvent("MyCustomEvent");
myEvent.setDuration(300L, TimeUnit.MILLISECONDS);
myEvent.setMeta(myMetas);
myEvent.setBackendTracingID("1234567890");

Instana.reportEvent(myEvent);

Google 播放服務

您可以明確告知 Instana 是否有 Google Play 服務可供給定的使用者和階段作業使用。

Instana {
    val googlePlayServicesMissing: Boolean?
}

範例

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL
            )
        )
        Instana.googlePlayServicesMissing = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SUCCESS
    }
}
//app/build.gradle
dependencies {
    implementation 'com.google.android.gms:play-services-basement:17.1.1'
    implementation 'com.google.android.gms:play-services-base:17.1.0'
}

記載 Facade

依預設, Instana 會直接登入 LogCat。 您可以提供實作「日誌程式」介面的物件來傳送這些日誌:

interface Logger {
    fun log(level: Int, tag: String, message: String, error: Throwable?)
}

Instana {
    var logger: com.instana.android.Logger?
}

配置參數

參數
說明
level (Int) 由其中一個 android.util.Log 層次定義的記載層次 (android.util.Log.INFO, android.util.Log.ERROR, ...)
tag (String) 內部 Instana 代理程式標籤
message (String) Instana 產生的日誌訊息
error (Throwable,選用) Throwable 發生錯誤,提供其他環境定義 (如果有的話)

範例

Instana.logger = object : Logger {
    override fun log(level: Int, tag: String, message: String, error: Throwable?) {
        Log.d("my_tag", "intercepted Instana Android Agent log message: '$message'")
    }
}

記載層次

依預設, Instana 會產生 INFO 層次日誌。 您可以透過從一般 android.util.Log 層次 (android.util.Log.INFOandroid.util.Log.ERROR...) 定義任何記載層次來變更此項目:

Instana {
    var logLevel: Int
}

範例

Instana.logLevel = android.util.Log.ERROR

啟用/停用資料收集

您可以隨時啟用資料收集和提交,例如 Instana 代理程式啟動時或在執行時期期間。

在需要明確使用者同意才能繼續收集資料的情況下,這最有用。

Instana {
    fun setCollectionEnabled(enabled: Boolean)
    fun isCollectionEnabled()
}

範例

Instana.setCollectionEnabled(true)

編寫 URL 查詢參數

所收集 URL 中的查詢參數可能包含機密資料。 因此, Instana 代理程式支援查詢參數索引鍵的正規表示式型樣規格,其值應該編寫; 任何編寫的值都將取代為 <redacted>

在向 Instana 伺服器報告之前,會在 Instana 代理程式內進行編寫。 因此,密鑰將無法到達 Instana 伺服器進行處理,且無法在使用者介面中進行分析或使用 Instana API 進行擷取。

依預設, Instana 代理程式會配置三個正規表示式型樣的清單,以自動編寫查詢參數值:

  • "索引鍵"
  • "秘密"
  • "密碼"

編寫只會套用至自動監視的要求及其相關聯的日誌。 未編寫手動監視的要求。

Instana {
    val redactHTTPQuery = mutableListOf<Regex>()
}

範例

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL
            )
        )

        // in order to for example redact "https://example.com?secret=abcdef" into "https://example.com?secret=<redacted>"
        Instana.redactHTTPQuery.add("secret".toRegex())
        // in order to for example redact "https://example.com?hidden1=abcdef&hidden2=123456" into "https://example.com?hidden1=<redacted>&hidden2=<redacted>"
        Instana.redactHTTPQuery.add("^hidden[0-9]".toRegex())
    }
}

擷取 HTTP 標頭

Instana 代理程式可以選擇性地擷取每一個追蹤要求/回應的 HTTP 標頭。

可以定義正規表示式型樣清單,以決定將擷取哪些標頭。

如果要求及其回應中都有相同的標頭名稱,則只會保留回應的標頭值。

Instana {
    val captureHeaders = mutableListOf<Regex>()
}

範例

class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL
            )
        )

        // in order to capture all request/response headers like: "X-MyCompany-name1", "X-MyCompany-name2"...
        Instana.captureHeaders.add("X-MyCompany-.*".toRegex())
    }
}

慢速傳送模式

依預設會停用慢速傳送模式特性。 必要的話,您可以啟用此特性。

依預設,如果信標傳送失敗, Instana 代理程式會嘗試重新傳送信標,直到傳送成功為止。 這在某些行動網路上並不奏效。 透過啟用慢速傳送模式特性,信標傳送間隔會變更為指派給 slowSendIntervalMillis 參數的時間值。 每一個引標傳送只包含一個引標而非批次 (批次中最多 100 個引標)。 Instana 代理程式會保持慢速傳送模式,直到順利傳送一個引標為止。

slowSendIntervalMillis 的有效時間範圍是 2000-3600000 毫秒。

範例

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL,
                slowSendIntervalMillis = 60000
            )
        )
    }
}

使用者階段作業 ID

依預設,會追蹤使用者階段作業,且 ID 是隨機產生的「通用唯一 ID (UUID)」。 安裝應用程式時,此 ID 保持不變。 您可以使用 usiRefreshTimeIntervalInHrs 參數來配置使用者階段作業 ID 的有效期限。 下列參數值指出使用者階段作業 ID 的狀態:

  • 負數: 此值指出使用者階段作業 ID 永不到期。 預設值為 -1。

  • 正數: 此值表示在設定時間之後重新整理使用者階段作業 ID ,亦即產生並使用新的 UUID。

  • 零: 以 0.0 表示的這個值表示已停用使用者階段作業 ID。

範例

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Instana.setup(
            this,
            InstanaConfig(
                key = BuildConfig.INSTANA_KEY,
                reportingURL = BuildConfig.INSTANA_REPORTING_URL,
                usiRefreshTimeIntervalInHrs = 24
            )
        )
    }
}