如何将Android应用的分析与诊断数据同步至Azure Application Insights
将Android应用数据同步至Azure Application Insights的正确方案
目前官方推荐的方案是使用Azure Monitor OpenTelemetry SDK for Android,这是替代已弃用的旧版Application Insights Android SDK的标准方案,可完整覆盖自定义事件、异常及崩溃数据的采集与上报。
1. 集成依赖
在Module级别的build.gradle(或build.gradle.kts)中添加以下依赖:
// OpenTelemetry核心依赖 implementation "io.opentelemetry:opentelemetry-sdk:1.32.0" implementation "io.opentelemetry:opentelemetry-sdk-trace:1.32.0" implementation "io.opentelemetry:opentelemetry-sdk-logs:1.32.0" implementation "io.opentelemetry:opentelemetry-exporter-otlp:1.32.0" // Azure Monitor导出器 implementation "com.azure.monitor:azure-monitor-opentelemetry-exporter:1.0.0-beta.22"
注:请使用最新稳定版本号,避免依赖冲突。
2. 初始化SDK
在应用启动时(比如Application类的onCreate方法)完成SDK初始化,配置Azure连接字符串:
import com.azure.monitor.opentelemetry.exporter.AzureMonitorExporterBuilder import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.sdk.OpenTelemetrySdk import io.opentelemetry.sdk.logs.SdkLoggerProvider import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor import io.opentelemetry.sdk.trace.SdkTracerProvider import io.opentelemetry.sdk.trace.export.BatchSpanProcessor class MyApplication : Application() { override fun onCreate() { super.onCreate() // 从Azure Application Insights资源获取连接字符串 val connectionString = "YOUR_APPLICATION_INSIGHTS_CONNECTION_STRING" // 创建Azure Monitor导出器 val exporter = AzureMonitorExporterBuilder() .connectionString(connectionString) .buildTraceExporter() val logExporter = AzureMonitorExporterBuilder() .connectionString(connectionString) .buildLogExporter() // 初始化TracerProvider(用于追踪/自定义事件) val tracerProvider = SdkTracerProvider.builder() .addSpanProcessor(BatchSpanProcessor.builder(exporter).build()) .build() // 初始化LoggerProvider(用于日志/异常) val loggerProvider = SdkLoggerProvider.builder() .addLogRecordProcessor(BatchLogRecordProcessor.builder(logExporter).build()) .build() // 构建OpenTelemetry实例 val openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(tracerProvider) .setLoggerProvider(loggerProvider) .buildAndRegisterGlobal() } }
3. 上报自定义事件
通过Tracer创建Span来记录自定义事件,携带事件属性:
val tracer = OpenTelemetry.globalTracerProvider.get("MyAppTracer") // 记录用户点击按钮事件 tracer.spanBuilder("Button_Clicked") .setAttribute("button_id", "submit_btn") .setAttribute("user_id", "12345") .startSpan() .end()
4. 捕获异常与崩溃
捕获未处理异常
实现全局异常处理器,将异常信息上报:
class GlobalExceptionHandler(private val defaultHandler: Thread.UncaughtExceptionHandler) : Thread.UncaughtExceptionHandler { private val logger = OpenTelemetry.globalLoggerProvider.get("MyAppLogger") override fun uncaughtException(t: Thread, e: Throwable) { // 记录异常日志 logger.logRecordBuilder() .setSeverity(Severity.ERROR) .setBody("Uncaught exception: ${e.message}") .setAttribute("thread_name", t.name) .setAttribute("exception_type", e.javaClass.name) .setAttribute("stack_trace", e.stackTraceToString()) .emit() // 调用默认处理器 defaultHandler.uncaughtException(t, e) } }
在Application的onCreate中注册:
val defaultHandler = Thread.getDefaultUncaughtExceptionHandler() Thread.setDefaultUncaughtExceptionHandler(GlobalExceptionHandler(defaultHandler))
捕获已处理异常
在代码中捕获异常时,直接通过Logger上报:
try { // 业务代码 } catch (e: IOException) { logger.logRecordBuilder() .setSeverity(Severity.WARN) .setBody("File operation failed: ${e.message}") .setAttribute("error_code", "FILE_IO_ERROR") .emit() }
5. 关键注意事项
- 连接字符串:必须从Azure Portal的Application Insights资源中获取,确保权限正确。
- 网络权限:在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET" />和<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />。 - 采样配置:可通过
BatchSpanProcessor和BatchLogRecordProcessor配置采样率,避免数据量过大。 - 版本兼容:确保OpenTelemetry SDK与Azure Monitor导出器版本匹配,参考官方版本矩阵。
内容的提问来源于stack exchange,提问作者Aniket
相关产品推荐
相关产品推荐

