---
title: クライアントサイドアプリ
description: >-
  スマートフォン、デスクトップ、小売キオスクなどのデバイスで動く、エンドユーザーが操作するアプリで OpenTelemetry を使用します。
aliases: [android, client-apps/overview]
default_lang_commit: bd0020e6582fd42cc898f33fd5eba17e6c8f52ad
---

サーバーサイドのワークロードと比較して、クライアントサイドのアプリケーションは、オブザーバビリティにおける特有の課題があります。
こうしたアプリは、あなたが管理できないデバイス上で動作し、ネットワーク条件、ハードウェア性能、ユーザーの振る舞いもさまざまです。

## なぜクライアントサイドのオブザーバビリティが重要なのか {#why-client-side-observability-matters}

従来のサーバーサイドモニタリングは、バックエンドシステムの可視化には役立ちますが、ユーザー体験の全体像までは捉えきれません。
クライアントサイドのオブザーバビリティは、以下のことができます。

- **実際のユーザー体験を把握する**:
  ユーザーが体験する実際の読み込み時間、フレームレート、応答性を確認できます。
- **コンテキストに沿って問題をデバッグする**:
  デバイスの特性やネットワーク条件、ユーザーの操作とエラーを紐づけられます。
- **エンドツーエンドのトランザクションを追跡する**:
  クライアントサイドの処理とバックエンドのトレースをつなぎ、完全な分散トレースを実現します。
- **アプリの健全性を大規模に監視する**:
  ユーザーベース全体のテレメトリーを集約し、パターンや傾向を特定できます。

## サーバーサイドの計装との主な違い {#key-differences-from-server-side-instrumentation}

クライアントアプリを計装する場合、以下の点を考慮してください。

- **リソース制約**:
  モバイル端末やブラウザは、CPU やメモリ、バッテリーに限りがあります。
  テレメトリーの収集は効率的に行い、アプリのパフォーマンスに悪影響を与えないようにします。
- **ネットワークの変動性**:
  ユーザーのネットワーク環境は、低速、断続的、またはオフラインである可能性があります。
  ネットワークの不安定さに備え、オフラインバッファリングとバッチエクスポートを実装します。
- **セッション管理**:
  ユーザーセッションを追跡し、関連するテレメトリーをまとめます。
  複数のアプリ起動にまたがるユーザージャーニーも把握しやすくなります。
- **プライバシーと同意**:
  クライアントアプリは、プライバシー規制の対象となるデータを収集することがよくあります。
  データ最小化、同意の管理、属性の削除を計画します。
- **データ量**:
  ユーザー数が数百万規模になりうる場合、コストを抑えつつ代表的なテレメトリーを保持するには、サンプリング戦略が不可欠になります。

## リアルユーザーモニタリング (RUM) {#real-user-monitoring-rum}

OpenTelemetry は、実際のユーザーがアプリケーションをどのように体験しているかを把握するリアルユーザーモニタリング（RUM）パターンをサポートしています。

- **ページ / 画面の読み込み性能**:
  最初のバイトや最初のコンテンツ描画、読み込み完了までの時間。
- **ユーザー操作**:
  クリックイベントや画面遷移のパターン、フォーム送信。
- **エラーとクラッシュ**:
  未処理の例外や ANR イベント、エラー率。
- **リソースの読み込み**:
  ネットワークリクエストの所要時間やキャッシュヒット率、リソースサイズ。

## バックエンドとの接続 {#connecting-to-your-backend}

クライアントテレメトリーは、バックエンドのトレースと結びつけられたときに最も価値が出ます。
HTTP リクエストにトレースコンテキストを伝搬させ、エンドツーエンドで見えるようにします。

```text
クライアントアプリ → API ゲートウェイ → バックエンドサービス → データベース
      │                 │                 │                │
      └─────────────────┴─────────────────┴────────────────┘
                          関連するトレース
```

クライアント SDK でトレースヘッダー (`traceparent`, `tracestate`) を付与するよう設定し、バックエンドサービスの各処理でもこのコンテキストを伝搬するようにします。
