Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

計器進入!OpenTelemetryで見える アプリのパフォーマンスボトルネック

Avatar for Andrey Chernov Andrey Chernov
November 28, 2025
9

計器進入!OpenTelemetryで見える アプリのパフォーマンスボトルネック

DroidKaigi.collect { #28@Fukuoka }

Avatar for Andrey Chernov

Andrey Chernov

November 28, 2025
Tweet

Transcript

  1. Andrey Chernov andousan 2 val andousan = flowOf( Me(nickname =

    "andousan"), Company.Pixiv(position = "Android Engineer"), Experience(android = 9.years()), Passion(about = "Kotlin Multiplatform の信者"), Passion(about = "o11y ❤"), LinkedIn(id = "inetand"), Github(id = "inetand"), ) FukuokaScope().launch { andousan.collect(DroidKaigiCollector) }
  2. テレメトリーとは • システムではなにが起こっているかを示すデータ • ユーザーテレメトリー ◦ ユーザーの行動を分析するためのデータ ◦ 例:ボタンクリック、セッション時間、画面遷移など •

    パフォーマンステレメトリー ◦ アプリパフォーマンスの情報を原因と結果を結びつける 「パンくず」のようなデータ ◦ 例:アプリ起動時間、リクエストにかかる時間など 10
  3. モバイルObservabilityの現状(Firebase) • クラッシュレポート → Firebase Crashlytics • アプリのパフォーマンス → Firebase

    Performance • ユーザーの行動アナリティックス → Firebase Analytics • Firebaseでユーザーとパフォーマンスの テレメトリーがすでに 完結しているのでObservabilityの観点では充実している? 13
  4. ❶ BigQuery へのエクスポートが 24時間がかかる • RUM*として利用できない ❷ トレースの関係性がない 。子のトレースも設定できない ❸

    サンプリングを制御できず、重要なトレースが欠損する • サンプリング方式は固定(head-samplingのみ) • カスタムトレースのセッションのサンプリング Firebase Performanceの制限 15 *RUM – Realtime User Monitoring
  5. OpenTelementry(OTel)とは • CNCF*のOSS規格 1. メトリックス 2. ログ 3. トレース •

    三本柱のシグナルを提供する標準化された 仕様とOSSの計装SDK 21 *CNCF(Cloud Native Computing Foundation)プロジェクト
  6. OpenTelemetry SDKの選択肢 • otel-android SDK • otel-java SDK • Embrace

    Kotlin SDK • Datadog Tracing Android SDK • Elastic OTel Android SDK • Honeycomb OTel Android SDK • …or 独自のラッパーを実装する 27
  7. OpenTelemetry SDKの選択肢 • otel-android SDK • otel-java SDK • Embrace

    Kotlin SDK • Datadog Tracing Android SDK • Elastic OTel Android SDK • Honeycomb OTel Android SDK • …or 独自のラッパーを実装する 28
  8. ① OpenTelemetryの初期化 29 val exporter = OtlpHttpSpanExporter.builder().setEndpoint("http://10.0.2.2:4318/v1/traces").build() val resourceMeta =

    Resource.builder() .put("service.name", "sponsor-booth-app:android") .put("service.version", BuildConfig.VERSION_NAME) .build() val tracerProvider = SdkTracerProvider.builder() .setResource(resourceMeta) .addSpanProcessor(BatchSpanProcessor.builder(exporter).build()).build() val otelJava = io.opentelemetry.sdk.OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build() val otelKotlin: OpenTelemetry = otelJava.toOtelKotlinApi() val tracer = otelKotlin.tracerProvider.getTracer("sponsor-booth-app", "0.1.0”) Kotlin
  9. 利用例:Spanを作成する 30 val span = tracer.createSpan( name = "span1" )

    // アプリ起動、画面遷移、I/O処理など span.end() Kotlin
  10. 利用例:親付きSpanを作成する 31 val parent = tracer.createSpan( name = "span1", )

    // Start of the session val child = tracer.createSpan( name = "span2", parentContext = parent.storeInContext( otelKotlin.contextFactory.root() ) ) // アプリ起動、画面遷移、I/O処理、BGジョブなど child.end() // 他のspanも開始できる parent.end() Kotlin
  11. 利用例:親付きSpanを作成する 32 val parent = tracer.createSpan( name = "span1", )

    // Start of the session val child = tracer.createSpan( name = "span2", parentContext = parent.storeInContext( otelKotlin.contextFactory.root() ) ) // アプリ起動、画面遷移、I/O処理、BGジョブなど child.end() // 他のspanも開始できる parent.end() Kotlin
  12. OpenTelemetry Java SDKの留意点 • WorkManager経由でのSpanの同期 ◦ 送信リトライ ◦ DozeMode・Network制限の考慮など •

    未送信・同期に失敗したSpanの永続化 • 親Spanの管理 ※ opentelemetry-androidのStableリリースで上記の課題が解決される見込み 33
  13. ネットワークリクエストの測定 36 private fun startSpanForMetric(metric: String): CatSpan { if (requestMeasurementSpan

    == null) { // 親のSpanが作成されていなければ作成する requestMeasurementSpan = createRequestMeasurementSpanIfNotCreated() } return tracer.startSpan(name = metric, parent = requestMeasurementSpan) } // 他のメソッドも同様に対応する override fun dnsStart(call: Call, domainName: String) { super.dnsStart(call, domainName) dnsSpan = startSpanForMetric("dns_lookup") } override fun dnsEnd(call: Call, domainName: String, inetAddressList: List<InetAddress>) { super.dnsEnd(call, domainName, inetAddressList) dnsSpan?.stop() } // 他のメソッドも同様に対応する TimingEventListener.kt
  14. Firebase Performance vs OTel 41 Firebase Performance OpenTelemetry SDK Open

    Source ❌ 🟢 Vendor-Lock Free ❌ 🟢 分散トレーシング対応 ❌ 🟢 自動計装 🟢 🔺(独自実装) サンプリング制御可否 ❌ 🟢 バックエンド・インフラの 分散トレース ❌ 🟢 Logの対応 ❌ 🟢