Site24x7 Flutterプラグインにより、FlutterモバイルアプリケーションのHTTPリクエスト、クラッシュ、画面ロード時間、カスタムデータを監視できます。
これによりコンポーネント、個々のユーザー、セッションごとのトランザクションやグルーピングを追加することでアプリケーションパフォーマンスを強化できます。
Flutterアプリケーションにsite24x7_flutter_pluginをインストールします。
インストール方法は次のとおりです。
flutter pub add site24x7_flutter_plugin
dependencies:
site24x7_flutter_plugin: ^1.0.0
target 'Your_Project_Name' do
pod 'Site24x7APM'
end
pod install
アプリケーションプロジェクトレベルのandroidフォルダーにあるbuild.gradleファイルにZoho Maven URLを追加します。
allprojects {
repositories {
...
maven { url 'https://maven.zohodl.com' }
...
}
}
次のようにsite24x7_flutter.dartファイルからApmMobileapmFlutterPluginをインポートします。
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';
カスタムAPIを使用して、ユーザーアクション、スクリーンキャプチャ、エラー例外の追跡、その他関連タスクの操作を監視できます。
Site24x7の様々なタイプのカスタムAPIと、その使用法に関するする構文の概要を記載します。
次のAPIを使用して、Site24x7 Flutterエージェントを起動します。
これによりFlutterアプリケーションのエラーや例外を取得できるようになります。
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
//assign the Site24x7 error callbacks
//for non-async exceptions
FlutterError.onError = ApmMobileapmFlutterPlugin.instance.captureFlutterError; //site24x7 custom callback
//for async exceptions
PlatformDispatcher.instance.onError = (error, stack) {
ApmMobileapmFlutterPlugin.instance.captureException(error, stack, false, type: "uncaughtexception"); //site24x7 custom api
return true;
};
//starting the agent
await ApmMobileapmFlutterPlugin.instance.startMonitoring("appKey", uploadInterval); //site24x7 custom api
...
runApp(MyHomePage(title: 'Flutter Demo Home Page'));
...
}
次のメカニズムを使用して、画面のロードにどれだけ時間がかかっているかを特定できます。
このデータはSite24x7サーバーにプッシュされ、セッションの追跡とクラッシュのアラートに使用されます。
ステートレスウィジェットの場合:
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';
class FirstScreen extends StatelessWidget {
FirstScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Sample Widget'),
),
body: Center(
child: ElevatedButton(
child: const Text('Go To Stateless Widget'),
onPressed: () {
var initialTimeStamp = DateTime.now();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SampleStatelessWidget()
),
).then((value) {
var loadTime = DateTime.now().difference(initialTimeStamp).inMilliseconds;
ApmMobileapmFlutterPlugin.instance.addScreen("SampleStatelessWidget", loadTime.toDouble(), initialTimeStamp.millisecondsSinceEpoch); //site24x7 custom api
});
},
),
),
);
}
}
ステートフルウィジェットの場合:
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';
class SampleWidget extends StatefulWidget {
const SampleWidget({super.key});
@override
State createState() => _SampleWidgetState();
}
class _SampleWidgetState extends State {
late var _initialTimeStamp, _finalTimeStamp;
@override
void initState() {
super.initState();
_initialTimeStamp = DateTime.now();
}
void site24x7AfterBuildCallback(BuildContext context) {
var finalTimeStamp = DateTime.now();
}
@override
Widget build(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((_) => site24x7AfterBuildCallback(context));
return Scaffold(
appBar: AppBar(
title: const Text('Sample Widget'),
),
body: Center(
child: const Text('Hello Sample Widget');
),
);
}
@override
void didUpdateWidget(Fetch oldWidget) {
super.didUpdateWidget(oldWidget);
//send the widget loading time, i.e., difference between initial and final timestamp should be sent to the server using addScreen API
var loadTime = _finalTimeStamp.difference(_initialTimeStamp).inMilliseconds;
ApmMobileapmFlutterPlugin.instance.addScreen("Fetch", loadTime.toDouble(), _initialTimeStamp.millisecondsSinceEpoch); //site24x7 custom api
//assign final timestamp to initial timestamp
_initialTimeStamp = DateTime.now();
}
@override
void dispose() {
super.dispose();
//send the widget loading time, i.e., difference between initial and final timestamp should be sent to the server using addScreen API
var loadTime = _finalTimeStamp.difference(_initialTimeStamp).inMilliseconds;
ApmMobileapmFlutterPlugin.instance.addScreen("Fetch", loadTime.toDouble(), _initialTimeStamp.millisecondsSinceEpoch); //site24x7 custom api
}
}
ルーティング中のブレッドクラムを自動で取得する場合、次の方法でSite24x7NavigatorObserver()関数を使用します。
class MyHomePage extends StatefulWidget {
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State with WidgetsBindingObserver {
@override
Widget build(BuildContext context){
return MaterialApp(
routes: {
'/first': (context) => FirstScreen(),
'/second': (context) => SecondScreen(),
'/fetch': (context) => FetchScreen()
},
navigatorObservers: [
Site24x7NavigatorObserver() //site24x7 custom navigator observer
]
);
}
}
ネットワーク監視機能では、HTTPとDioパッケージを使用して、API要求を取得します。
HTTPパッケージ:
import 'package:http/http.dart' as http;
import 'package:site24x7_flutter_plugin/site24x7_flutter.dart';
...
//site24x7 custom components
var client = Site24x7HttpClient();
(or)
var client = Site24x7HttpClient(client: http.Client());
var dataURL = Uri.parse('https://jsonplaceholder.typicode.com/posts?userId=1&_limit=5');
http.Response response = await client.get(dataURL);
...
Dioパッケージ:
import 'package:dio/dio.dart';
import 'package:site24x7_flutter_plugin/site24x7_flutter_plugin.dart';
...
var dio = Dio();
dio.enableSite24x7(); //site24x7 dio extension
var dataURL = 'https://jsonplaceholder.typicode.com/posts?userId=1_limit=5';
final response = await dio.get(dataURL);
...
次のAPIを使用して、キャッチブロックで発生する例外を手動で取得できます。
同期例外の取得:
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
FlutterError.onError = ApmMobileapmFlutterPlugin.instance.captureFlutterError; //site24x7 custom callback
runApp(MyHomePage());
}
非同期例外の取得:
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
PlatformDispatcher.instance.onError = (error, stack){
ApmMobileapmFlutterPlugin.instance.platformDispatcherErrorCallback(error, stack); //site24x7 custom api
};
runApp(MyHomePage());
}
発生した例外の取得:
try {
//code which might generate exceptions
} catch (exception, stack){
ApmMobileapmFlutterPlugin.instance.captureException(exception, stack);
}
トランザクション内の一意のコンポーネントを起動と停止を行えます。
単一トランザクション内の複数コンポーネントを開始することもできます。
ApmMobileapmFlutterPlugin.instance.startTransaction("listing_blogs");
//Grouping various operations using components.
ApmMobileapmFlutterPlugin.instance.startComponent("listing_blogs", "http_request");
//your code/logic
ApmMobileapmFlutterPlugin.instance.stopComponent("listing_blogs", "http_request");
ApmMobileapmFlutterPlugin.instance.startComponent("listing_blogs", "view_data_onto_screen");
//your code/logic
ApmMobileapmFlutterPlugin.instance.stopComponent("listing_blogs", "view_data_onto_screen");
ApmMobileapmFlutterPlugin.instance.stopTransaction("listing_blogs");
一意のユーザーIDを設定することで特定のユーザーを追跡できます。
一意のIDが指定されていない場合、Site24x7でランダムなGUIDが生成されてユーザーのIDとして割り当てられます。
ApmMobileapmFlutterPlugin.instance.setUserId("user@example.com");
次の関数を使用して、ブレッドクラムを手動で追加します。
ApmMobileapmFlutterPlugin.instance.addBreadcrumb(event, message);
ex: ApmMobileapmFlutterPlugin.instance.addBreadcrumb("Info", "download completed");
次のAPIを使用して、次のアップロード時間を待つことなくSite24x7サーバーにデータを送信できます。
ApmMobileapmFlutterPlugin.instance.flush();
アプリケーションを強制的にクラッシュさせて、エラーメッセージ"This is a site24x7 crash"を表示できます。
ApmMobileapmFlutterPlugin.instance.crashApplication();
Version 1.0.0
2024/02/05
機能強化: