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 page 或 payment selection。 聚焦於使用者體驗,可讓團隊成員在對程式碼庫沒有深入瞭解的情況下,瞭解所提供的見解。
附註: 當畫面呈現給使用者時,應該會呼叫 Instana.setView(String) ,而不是當建立畫面時 (例如在可以建立一次但顯示多次的「片段」中)。 設定視圖名稱也會啟用 Instana ,以追蹤 除了頁面載入之外的頁面轉移。
範例
class WebViewActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
Instana.view = "Webview: FitBit authorization"
}
}
識別使用者
使用者特定資訊可以選擇性地與傳輸至 Instana 的資料一起傳送。 然後可以使用此資訊來解除鎖定其他功能,例如:
- 計算受錯誤影響的使用者數目,
- 過濾特定使用者的資料
- 以查看哪個使用者起始視圖變更或 HTTP 要求。
依預設, Instana 不會將任何使用者識別資訊關聯至信標。 在選擇這樣做時,請注意個別的資料保護法。 我們通常建議透過使用者 ID 來識別使用者。 對於 Instana ,這是完全透通的 String ,僅用於計算特定度量值。 userName 和 userEmail 也可以用來存取更多過濾器,以及更愉快地呈現使用者資訊。
在您處理匿名使用者因而無法存取使用者 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.INFO、 android.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
)
)
}
}