Flutter モニタリング API
「 Flutter Monitoring」 API を使用して、 Instana で Flutter アプリケーションを監視および計測する方法をご紹介します。 このドキュメントでは、クロスプラットフォームのモバイルアプリに関するリアルタイムの可観測性とパフォーマンスに関する洞察を提供します。
Flutter エージェントのバージョン
Flutter エージェントの詳細なバージョン情報、機能、および修正内容については、 GitHub の 「変更履歴 」ファイルをご確認ください。
Instana Flutter エージェント API
以下のセクションでは、Instana Flutter エージェントの使用法について説明します。 InstanaFlutter エージェントは、以下で説明するクラ InstanaAgent スメソッドとともに使用できます:
セットアップ
特定のアクションが追跡されないのを防ぐため、以下のコマンドを使用して、アプリの状態クラスの Instana を initState() できるだけ早い段階で初期化してください:
static Future<void> setup({@required String key, @required String reportingUrl}) async
構成オプション
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
key (String) |
Instana の監視設定キー。 |
reportingURL (String) |
URL は、監視データが送信される Instana インスタンスを指しています。 |
options (SetupOptions、オプション) |
構成オプション ( collectionEnabledなど)。 |
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', null);
// Alternatively with configuration options
var options = SetupOptions();
options.collectionEnabled = false;
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
}
対応しているDartおよび Flutter のバージョン
現在、Dart SDK( 2.12.0 以降)および Flutter ( 1.20.0 以降)の全バージョンがサポートされています。
収集を有効または無効にする
データ収集は、実行時にいつでも有効にすることができます。 データ収集を有効にせずに ` Instana.setupAPI ` を呼び出した場合、その後データ収集を有効にすると、データ収集の開始が遅延します(たとえば、ユーザーの同意を得た後など)。
| プロパティー | 説明 | タイプ |
|---|---|---|
setCollectionEnabled |
データ収集を有効または無効にするフラグ。 | ブール |
例
InstanaAgent.setCollectionEnabled(true);
エラー処理
Instana エージェント(Android-agentおよび iOSAgent )のすべてのインターフェースは、 Future非同期の値を返します。 エラーは、 PlatformException 型の例外としてラップされます。
フューチャーズの一般的なエラー処理手法 に従って、発生する可能性のあるエラーをログに記録することをお勧めします。
例:
InstanaAgent.setup(key: 'KEY', reportingUrl: 'REPORTING_URL')
.catchError((e) =>
log("Captured PlatformException during Instana setup: $e")
);
同様に、非同期関数では次のようになります。
try {
var result = await InstanaAgent.setup(key: 'KEY', reportingUrl: 'REPORTING_URL');
} catch (e) {
log("Captured PlatformException during Instana setup: $e");
}
セッション ID
各 Instana エージェント(Android-agentおよび iOSAgent )のインスタンスには一意のセッション識別子が割り当てられており、これをアプリ内で他の目的に利用することができます。
static Future<String> getSessionID() async
復帰
Future<String>
例
var sessionID = await Instana.getSessionID();
手動 HTTP モニタリング
HTTP セッションは、 Flutter を使用して手動でキャプチャする必要があります。 詳しくは、各プラットフォームに固有の資料を参照してください。
static Future<Marker> startCapture({@required String url, @required String method, String viewName}) async
構成オプション
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
url (URL) |
取り込む URL。 |
method (String) |
要求の HTTP メソッド。 |
viewName (String、オプション) |
この要求に関連する可視ビューの名前 (オプション)。 |
復帰
Future<Marker>
例
final url = 'http://www.example.com/album'
var marker = await InstanaAgent.startCapture(url: url, method: 'GET', viewName: 'Album');
応答の詳細を設定する
レスポンスの処理が完了したら、レスポンスサイズと HTTP レスポンスステータスコードを. Markerに設定できます。
応答サイズの設定
marker.responseSizeHeader = 50; // Size of the HTTP header
marker.responseSizeBody = 1000; // Size of the http body
marker.responseSizeBodyDecoded = 2400; // // Size of the decoded http body
HTTP のレスポンスステータスコードを設定する
marker.responseStatusCode = 200; // The http status code
レスポンスヘッダーを設定する
setCaptureHeaders に基づいて Instana によってフィルタリングされています。marker.responseHeaders = response.headers;
Instana のバックエンドトレースIDを設定する
Instana バックエンドトレースIDは、 HTTP のリクエストおよびレスポンスに対してバックエンドトレースを作成するための識別子です。 この識別子は、 HTTPserver-timingヘッダーフィールドで指定されます。 例えば、server-timing: intid;desc=be01a91da80e33です。
marker.backendTracingID = 'be01a91da80e33'; // the backend tracing id
応答のバックエンド・トレース ID を抽出するには、以下に示すように BackendTracingIDParser ヘルパー・クラスを使用します。
var Map<String,String> headers = getResponseHeaders(); // You need to get this map from your `response` object
var backendTracingID = BackendTracingIDParser.fromHeadersMap(headers);
エラーメッセージを設定する
HTTP リクエストが失敗した場合、任意のエラーメッセージを設定できます。
marker.errorMessage = 'Download of album failed'; // the backend tracing id
HTTP の取り込みの終了
応答の詳細を設定した後、以下のコマンドに示すように、 Marker で finish を呼び出してキャプチャーをファイナライズする必要があります。
marker.finish();
HTTP の取り込みのキャンセル
以下のコマンドを使用して、保留中の Marker を取り消すこともできます。
marker.cancel();
ビュー
Instana は、モバイル・アプリケーションの洞察を論理ビューによってセグメント化することができます。 これを行うには、 InstanaAgent.setView(String) メソッドを使用してビュー名を設定します。 その後、ビューは、 setView を再度呼び出したときにビューが変更されるまで、すべてのモニター対象ビーコンに関連付けられます。
クラス ( WebViewActivityなど) などの技術名や総称名の代わりに、読み取り可能な名前 ( product detail page や payment selection など) を使用してビューを定義すると、コードベースに関する深い知識がなくても、チーム・メンバーは提供された洞察を理解することができます。
InstanaAgent.setView(String) は、画面が作成されるときではなく、ユーザーに表示されるときに呼び出す必要があります (フラグメントの場合のように、1 回作成しても複数回表示することができます)。 ビュー名を設定することで、 Instana はページの読み込みだけでなく、ページ遷移も追跡できるようになります。static Future<void> setView(String name) async
構成オプション
次の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
name (String) |
ビューの名前。 |
例
await InstanaAgent.setView('Webview: FitBit authorization');
ユーザーの識別
Instana に送信されるデータに、必要に応じてユーザー固有の情報を含めることができます。 この情報を使用して、以下のようなより多くの機能をアンロックすることができます。
- エラーの影響を受けるユーザーの数を計算する
- 特定のユーザーのデータをフィルターに掛ける
- ビューの変更または HTTP リクエストを発行したユーザーを確認する
デフォルトでは、Instana はユーザーが識別可能な情報をビーコンに関連付けません。
ユーザーを固有の状態に保つために、ユーザー ID を使用してユーザーを識別します。 Instana において、ユーザー ID は、特定のメトリクスの計算にのみ使用される透過的な String 識別子です。 より多くのフィルターにアクセスしたり、ユーザー情報をより快適に表示したりするために、userName と userEmail を使用することもできます。
匿名ユーザーを処理しているためにユーザー ID にアクセスできない場合は、代わりにセッション ID を使用することもできます。 セッション ID は、データをフィルタリングするためのユーザー ID ほど有用ではありませんが、影響を受けるユーザー・メトリックまたは固有のユーザー・メトリックを計算するための良い指標となります。 認証済みユーザーと非認証ユーザーを明確に区別するには、 Anonymous などのユーザー名を設定します。 セッション ID は、(使用するフレームワークまたはプラットフォームに応じて) 機密データにすることができます。 アクセス権を付与する可能性のあるデータが Instana に送信されるのを防ぐため、セッションIDのハッシュ化を検討してください。
static Future<void> setUserID(String userID) async
static Future<void> setUserName(String name) async
static Future<void> setUserEmail(String email) async
ユーザー識別フィールド
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
id (String) |
ユーザーの ID。 |
email (String) |
ユーザーの E メール・アドレス。 |
name (String) |
ユーザーの名前。 |
例
@override
void initState() {
super.initState();
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL');
await InstanaAgent.setUserID('1234567890');
await InstanaAgent.setUserName('John Appleseed');
await InstanaAgent.setUserEmail('john@appleseed.com');
}
メタデータ
任意のデータを、 Instana に送信されるすべてのデータに、必要に応じて添付することができます。 メタデータを使用して、UI 構成値、設定、機能フラグ、および分析に役立つ可能性のある追加コンテキストを追跡することを検討してください。
static Future<void> setMeta({@required String key, @required String value}) async
パラメーター
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
value (String) |
メタデータとして追加するキーと値のペアの value です。 |
key (String) |
メタデータとして追加するキーと値のペアの key です。 |
例
await InstanaAgent.setMeta(key: 'exampleKey', value: 'Some Value');
カスタム・イベントのレポート
カスタムイベントを使用すると、標準外のアクティビティ、重要なインタラクション、およびカスタムタイミングに関するレポートを Instana に送信できます。 これらのイベントのレポートは、キャッチされていないエラー (パンくずリスト) を分析し、より多くのパフォーマンス・メトリックを追跡する場合に役立ちます。
static Future<void> reportEvent({@required String name, EventOptions options}) async
パラメーター
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
name (String) |
アプリ内で発生し、カスタムビーコンの送信につながる可能性のあるイベントの種類を定義します。 |
options (EventOptions、オプション) |
イベントが開始された時刻を示すタイム・スタンプ (エポックからのミリ秒数)。 定義しない場合は、now() - duration へフォールバックします。 |
EventOptions
次の表は、 EventOptions: の一覧です
| パラメーター | 説明 |
|---|---|
startTime (int) |
イベントが開始された時刻を示すタイム・スタンプ (エポックからのミリ秒数)。 定義しない場合は、now() - duration へフォールバックします。 |
duration (int) |
イベントの持続時間 (ミリ秒)。 デフォルトはゼロです。 |
viewName (String) |
要求をグループ化するためのストリングをビューに渡すことができます。 nil を明示的に送信すると、 viewName は無視されます。 あるいは、パラメーター viewName を省略して、 setView(String)で設定した現在のビュー名を使用することもできます。 |
meta (Map<String, String>) |
文字列値を持つ JavaScript オブジェクト。このオブジェクトを使用すると、この単一のイベントについてのみ、 Instana にメタデータを送信することができます。 メタデータ API を使用する場合とは対照的に、このメタデータは後続のビーコンには含まれません。 |
backendTracingID (String) |
このイベントのバックエンド・トレースを作成するための ID。 |
customMetric (double) |
小数点以下 4 桁までの精度のカスタム・メトリック・データ。 このメトリックには機密情報を含めないでください。 |
例
await InstanaAgent.reportEvent(
name: 'advancedCustomEvent',
options: EventOptions()
..viewName = 'customViewName'
..startTime = DateTime.now().millisecondsSinceEpoch
..duration = 3 * 1000
..meta = {
'customKey1': 'customValue1',
'customKey2': 'customValue2'
}
..customMetric: 123.4567);
HTTP のヘッダーを取得する
必要に応じて、 Instana エージェントは、追跡対象となるすべてのリクエストまたはレスポンスの HTTP ヘッダーを取得することができます。
どのヘッダーをキャプチャーするかを決定するために、正規表現パターンのリストを定義できます。
要求とその応答の両方に同じヘッダー名が存在する場合は、応答のヘッダー値のみが保持されます。
static Future<void> setCaptureHeaders({@required List<String> regex}) async
例
InstanaAgent.setCaptureHeaders(regex: [
'x-ratelimit-limit',
'x-ratelimit-remaining',
'x-ratelimit-reset'
]);
URL のクエリパラメータを伏せ字にする
収集された URL の照会パラメーターに機密データが含まれている可能性があります。 そのため、 Instana エージェントでは、値を非表示にする必要があるクエリパラメータのキーに対して、正規表現パターンの指定をサポートしています。 編集する必要がある値は、ストリング <redacted>で置き換えられます。 この編集処理は、 Instana エージェントが Instana バックエンドに報告を行う前に、同エージェント内で実行されます。 したがって、シークレットは処理のために Instana バックエンドに送信されず、 Instana のUIで分析したり、 Instana API を使用して取得したりすることはできません。
デフォルトでは、 Instana エージェントには、キー「password」、「key」、「secret」のクエリパラメータ値を自動的にマスキングするための3つの正規表現パターンが設定されています。
static Future<void> redactHTTPQuery({@required List<String> regex}) async
例
InstanaAgent.redactHTTPQuery(regex: [
'user',
'id',
'key'
]);
HTTP のネイティブ監視
デフォルトでは HTTP のモニタリングは無効になっていますが、 iOS プラットフォーム内( Swift またはObjective- C 言語)およびAndroidプラットフォーム内( Kotlin または Java 言語)で行われる HTTP の呼び出しをキャプチャすることができます。
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
var options = SetupOptions(captureNativeHttp: true);
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
if (!ret) {
// Error handling here
if (kDebugMode) {
print("InstanaAgent setup failed");
}
}
}
自動 HTTP モニタリング
HTTP Dart言語で作成されたセッションは自動的にキャプチャされます。 以下の例に示すように、 HttpOverrides.global プロパティーを設定します。
例
@override
void main() {
HttpOverrides.global = InstanaHttpOverrides();
runApp(const MyApp());
}
他の目的のために独自のバージョンの HttpOverrides クラスが既にある場合は、 InstanaHttpOverrides クラス関数をご使用のクラスにマージし、結合されたクラスを自分で維持します。 複数の HttpOverrides クラスを結合すると、エラーが発生します。 InstanaHttpOverrides() 関数を使用する代わりに、 InstanaHttpOverrides クラスを分析して、 InstanaHttpOverrides クラスに似た HttpOverrides クラスを作成することもできます。
低速送信モード(バージョン 3.1.5 以降、非推奨)
低速送信モード機能は、デフォルトでは無効になっています。 必要に応じて、この機能を有効にすることができます。
デフォルトでは、ビーコンの送信に失敗した場合、 Instana エージェントは送信が成功するまでビーコンの再送信を試みます。 ビーコンの再送信は、一部のセルラー・ネットワークではうまく機能しません。 「低速送信モード」機能を有効にすると、ビーコンの送信間隔は、 パラメータ slowSendIntervalMillis に割り当てられた時間値に変更されます。 各ビーコン送信は、バッチ(1バッチあたり最大100個のビーコン)ではなく、1つのビーコンのみで構成されます。 Instana エージェントは、1つのビーコンが正常に送信されるまで、低速送信モードを維持します。
の有効な時間範囲は slowSendIntervalMillis 2~3600 秒です。
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
var options = SetupOptions();
options.slowSendInterval = 60.0;
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
if (!ret) {
// Error handling here
if (kDebugMode) {
print("InstanaAgent setup failed");
}
}
}
ユーザー・セッション ID
デフォルトでは、ユーザー・セッションは追跡され、ID はランダムに生成された Universally Unique Identifier (UUID) です。 この ID は、アプリのインストール中は変更されません。 パラメータ usiRefreshTimeIntervalInHrs を使用することで、ユーザーセッションIDの有効期限を設定できます。
以下のパラメーター値は、ユーザー・セッション ID の状況を示します。
負の数値: この値は、ユーザー・セッション ID の有効期限が切れないことを示します。 デフォルト値は -1 です。
正数: この値は、設定された時間が経過した後にユーザー・セッション ID がリフレッシュされることを意味します。つまり、新しい UUID が生成されて使用されます。
ゼロ: この値 0.0 は、ユーザー・セッション ID が使用不可であることを意味します。
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
var options = SetupOptions();
options.usiRefreshTimeIntervalInHrs = 24.0;
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
if (!ret) {
// Error handling here
if (kDebugMode) {
print("InstanaAgent setup failed");
}
}
}
スクリーンネームを自動的に取得する(パブリックプレビュー)
アプリケーションのナビゲーション戦略に応じて、 Instana にオブザーバーまたは go-routers を指定することで、スクリーン名を自動的に取得できます。
アプリケーションの基本UIがMaterialApp,CupertinoApp,または同様の基本ウィジェットには、navigatorObserversを追加することができますInstanaScreenNameObserver()オブザーバーのリストに追加すると、スクリーン名が自動的にキャプチャされ、ナビゲーション トラッキングが開始され、指定されたパスからスクリーン名が収集されます。
InstanaScreenNameObserver()高度なスクリーン名をキャプチャするための 3 つのパラメータをサポートします。 あなたが提供するbuildContextパラメータでは、ルート名が指定されていない場合、画面名はウィジェット、ウィジェットのタイトル、またはウィジェットの子から収集されます。 さらにカスタマイズできますScreenNameExtractorスクリーンネームを自動的にキャプチャし、RouteFilter 、デフォルトでは以下から名前を収集しますPageRoute。
アプリケーションの基本ナビゲーションが で管理されている go_router場合、 を使用して InstanaGoRouteObserver(yourRouterObject)、 Instana にルーターオブジェクトを渡すことができます。 Instana その後、ナビゲーションからスクリーンネームを取得します。
例
MaterialApp(
navigatorObservers: [
InstanaScreenNameObserver(), /*Providing instana observer here*/
],
title: "Title",
theme: new ThemeData(
...,
...
),
initialRoute: '/',
routes: {
// When navigating to the "/" route, build the FirstScreen widget.
'/': (context) => FirstScreen(
...,
),
// When navigating to the "/second" route, build the SecondScreen widget.
'/second': (context) => const SecondScreen(),
})
パラメーター
以下の表にパラメータを一覧で示します:
| パラメーター | 説明 |
|---|---|
buildContext (BuildContext、オプション) |
ルート ウィジェットからビルド コンテキストを提供します。 |
screenNameExtractor (ScreenNameExtractor、オプション) |
提供するScreenNameExtractor抽出メカニズムを適用して文字列を返すオブジェクト。 デフォルト値はRouteSettings名前。 |
routeFilter (RouteFilter、オプション) |
デフォルトでは、PageRoutes追跡されます。 以下の内容に基づいて授業を提供できますRouteFilter必要に応じて。 |
レート制限ビーコン
このパラメータを使用すると、特定の時間間隔内に送信できるビーコンの数の上限をカスタマイズできます。 次の表に、利用可能なオプションと、それに対応するビーコンの制限を一覧で示します。 デフォルトでは、 DEFAULT_LIMITS が選択されています。
| 選択可能な制限 | カウント |
|---|---|
DEFAULT_LIMITS |
- 5分間に500回のビーコン送信- 10秒間に20回のビーコン送信 |
MID_LIMITS |
- 5分間に1000回のビーコン送信- 10秒間に40回のビーコン送信 |
MAX_LIMITS |
- 5分間に2500個のビーコン- 10秒間に100個のビーコン |
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
var options = SetupOptions();
options.rateLimits = RateLimits.MAX_LIMITS;
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
}
w3cHeaders とのバックエンド相関
( Boolean , enableW3CHeaders オプション) オプションを有効にすると、Flutterエージェントは、監視対象のすべての API 呼び出しに および tracestate ヘッダー traceparent を含めます。 これらのヘッダーを使用すると、バックエンドに Instana エージェントが導入されていなくても、バックエンドの相関分析が可能になります。 そのような場合は、 バックエンドのトレース詳細をInstana バックエンドにエクスポートするために、互換性のあるモニタリングツール( OpenTelemetry など)を使用する必要があります。 このオプションが無効になっている場合、バックエンドの相関分析は、そのバックエンドが Instana エージェントによっても監視されている場合にのみ可能です。 デフォルト値はfalseです。
例
@override
void initState() {
super.initState();
setupInstana();
}
Future<void> setupInstana() async {
var options = SetupOptions();
options.enableW3CHeaders = true;
await InstanaAgent.setup(key: 'Your-Instana-Key', reportingUrl: 'Your-Instana-Reporting-URL', options: options);
}