.NET MAUI インストルメンテーションのカスタマイズ
MAUI エージェントでアプリケーションがインストゥルメント化されると、MAUI SDK を使用して、エージェントのインストルメンテーションをさらにカスタマイズできます。SDK には追加のクラスがあり、収集して Splunk AppDynamics に報告できるアプリケーションデータの種類を拡張できます。カスタマイズの手順については、以下のセクションを参照してください。
- 自動インストルメンテーションのカスタマイズ
- コールの追跡
- イベントの時間
- レポート メトリック(Report Metrics)
- HTTP リクエストへのトラッキングの追加
- トピックパスを残す
- アプリケーションキーの変更
- コレクタへのユーザデータの送信を停止する場合のエージェントの無効化
- エラーと例外のレポート
- クラッシュとしての集約例外の報告
- クラッシュレポートの無効化
- クラッシュ レポート コールバックの追加
- セッションフレームの開始と終了
- ユーザデータの追加
- ログレベルの設定(オプション)
- ネットワークリクエストに対応した URL の変換
- スクリーンショットの設定および作成
- スクリーンショットの無効化
- スクリーンショットのブロックとブロック解除
- WebView インストルメンテーション(JavaScript エージェントのインジェクション)
- MAUI 固有のインストルメンテーション
- MAUI SDK のドキュメント
自動インストルメンテーションのカスタマイズ
次の自動インストルメンテーションをカスタマイズできます。
- 自動ネットワーク リクエスト インストルメンテーション
- 自動ページ トラッキング インストルメンテーション
- 自動 UI トラッキング インストルメンテーション
はじめる前に
AppDynamics.Agent.AutoInstrument.Fody パッケージがプロジェクトに追加されていることを確認してください。「自動ネットワーク リクエスト インストルメンテーションの設定」を参照してください。
ネットワークリクエストの自動インストルメンテーションのカスタマイズ
自動ネットワーク リクエスト インストゥルメンテーションが有効になっている場合、ウィーバは HttpClient または Refit の使用によりインストゥルメンテーション コードを自動的に付加します。
プロジェクトレベルまたはクラスレベルで自動インストルメンテーションをさらにカスタマイズできます(以下のセクションを参照してください)。たとえば、次のようにすることができます。
-
FodyWeavers.xmlファイルからプロジェクトレベルで自動インストゥルメンテーションを有効にして、DisableNetworkInstrumentation属性を使用してクラスレベルで一部のファイルを除外する。 -
FodyWeavers.xmlEnableNetworkInstrumentationファイルからプロジェクトレベルで自動インストゥルメンテーションを無効にして、属性を使用してクラスレベルで一部のファイルを含める。
HttpRequestTrackerHandler を介して使用している場合、ネットワークリクエストが 2 回報告されることはありません。 プロジェクトレベルでの有効化/無効化
FodyWeavers.xml ファイル内の NetworkInstrumentationEnabled フラグを使用して、プロジェクトレベルで自動インストゥルメンテーションを有効または無効にすることができます。
たとえば、自動インストルメンテーションを有効にするには、NetworkInstrumentationEnabled を「true"」に設定します。
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
... Existing weavers ...
<AppDynamics.Agent.AutoInstrument NetworkInstrumentationEnabled="true"/>
</Weavers>
クラスレベルでの有効化/無効化
クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。
-
[EnableNetworkInstrumentation]
[EnableNetworkInstrumentation] public class MyClass { ... } -
[DisableNetworkInstrumentation]
[DisableNetworkInstrumentation] public class MyClass { ... }
推奨事項
-
DisableNetworkInstrumentation の手動のネットワーク リクエスト トラッキングを使用している場合は、同じネットワークリクエストに対して重複したエントリが表示されます。これを回避するには、手動インストルメンテーションを削除するか、そのクラスで
DisableNetworkInstrumentation属性を使用します。 - HTTP リクエストが別のプロジェクトで処理される場合は、インストゥルメンテーションを機能させるために、
AppDynamics.AgentとAppDynamics.Agent.AutoInstrument.Fodyの両方をそのプロジェクトにも追加する必要があります。 - 別のライブラリで生成された
HttpClientインスタンスを使用している場合は、インストゥルメンテーションを機能させるために必要なことは、同じプロジェクト内でインスタンスを作成して使用することのみです。自動インストルメンテーションは、プロジェクト内の新しい HttpClient インスタンスを対象とすることで機能します。
自動ページ トラッキング インストルメンテーションのカスタマイズ
自動ページ トラッキング インストルメンテーションが有効になっている場合、ウィーバはプロジェクト内のすべての Microsoft.Maui.Controls.Page のインスタンスを検索し、インストルメンテーション コードを挿入します。
プロジェクトレベルでの有効化/無効化
FodyWeavers.xml ファイル内の PageTrackingInstrumentationEnabled フラグを使用して、プロジェクトレベルで自動ページ トラッキング インストゥルメンテーションを有効または無効にすることができます。
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
... Existing weavers ...
<AppDynamics.Agent.AutoInstrument PageTrackingInstrumentationEnabled="true"/>
</Weavers>
クラスレベルでの有効化/無効化
クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。
-
[EnablePageTracking]
[EnablePageTracking] public class MyPage : ContentPage { ... } -
[UITrackingの無効化]
[DisablePageTracking] public class MyPage : ContentPage { ... }
自動 UI トラッキング インストルメンテーション
自動 UI トラッキング インストゥルメンテーションが有効になっている場合、ウィーバはプロジェクト内のすべての Button、Entry および ListView のインスタンスを検索し、インストゥルメンテーション コードを挿入します。
プロジェクトレベルでの有効化/無効化
FodyWeavers.xm ファイル内の UITrackingInstrumentationEnabled フラグを使用して、プロジェクトレベルで自動インストゥルメンテーションを有効または無効にすることができます。
例:
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
... Existing weavers ...
<AppDynamics.Agent.AutoInstrument UITrackingInstrumentationEnabled="true"/>
</Weavers>
クラスレベルでの有効化/無効化
クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。
-
[EnableUITracking]
[EnableUITracking] public class MyPage : ContentPage { ... } -
[UITrackingの無効化]
[DisableUITracking] public class MyPage : ContentPage { ... }
自動 UI トラッキングと XAML
自動 UI トラッキングは、XAML と分離コード UI 要素の両方で機能します。ただし、分離コード UI は自動的にインストゥルメント化されますが、XAML を自動インストゥルメント化するには追加の手順が必要です。.csproj ファイルに次の設定を追加します。
<PropertyGroup>
<FodyDependsOnTargets>
XamlC
</FodyDependsOnTargets>
</PropertyGroup>
自動 UI トラッキングは、事前にコンパイルされた XAML でのみ機能するため、XamlCompilationOptions.Compile を使用する必要があります。
[XamlCompilation(XamlCompilationOptions.Compile)]
詳細については、「XAML Compilation」を参照してください。
コールの追跡
メソッドをインストゥルメント化すると、インストゥルメント化されたメソッドが呼び出される頻度と、実行にかかる時間を確認できます。これを行うには、インストゥルメント化するメソッドの開始時と終了時にコールを追加します。
次の例では、クラス ShoppingCart のコンストラクタで実行されたコードがトラッキングされ、報告されます。独自のコードでは、BeginCall のクラスとメソッドを指定することによってコールの追跡を開始し、その後追跡を完了し、ReportCallEnded を呼び出すことによってデータを報告します。
using AppDynamics.Agent;
...
public class ShoppingCart {
public ShoppingCart() {
// Code to create the shopping cart
}
void CheckOut(int custId, int transactionId) {
var tracker = Instrumentation.BeginCall("ShoppingCart", "CheckOut", custId, transactionId);
// The code placed here will be tracked and reported.
tracker.ReportCallEnded();
}
}
イベントの時間
複数のメソッドにまたがるアプリケーション内のイベントの時間を計る必要がある場合があります。これを行うには、イベントの開始時に StartTimerWithName を、続いて終了時に StopTimerWithName を呼び出します。たとえば、ユーザが画面の表示に費やした時間を追跡するためのインストルメンテーションは次のようになります。
using AppDynamics.Agent;
...
async private void StartCapturePreview_Click(object sender, RoutedEventArgs e) {
capturePreview.Source = captureManager;
Instrumentation.StartTimerWithName("CapturePreview");
await captureManager.StartPreviewAsync();
}
async private void StopCapturePreview_Click(object sender, RoutedEventArgs e) {
await captureManager.StopPreviewAsync();
Instrumentation.StopTimerWithName("CapturePreview");
}
レポート メトリック(Report Metrics)
他のタイプのデータを報告するには、メトリックを使用できます。メトリック名には、英数字とスペースのみを使用します。不正な文字は、ASCII 16 進値に置き換えられます。メトリック値は整数である必要があります。
次のスニペットは、メトリックを報告する方法を示しています。
using AppDynamics.Agent;
...
Instrumentation.ReportMetricWithName("Database Rows", 5123);
HTTP リクエストへのトラッキングの追加
半自動 HTTP トラッキング
HttpMessageHandler は、すべてのトラッキングとエラー処理を処理します。ロギングなどの他の目的ですでにカスタム HttpMessageHandler を使用している場合は、他の内部ハンドラを含めることもできます。
半自動トラッキングを追加するには、HttpClient をインスタンス化し、HttpRequestTrackerHandler を渡します。
var client = new HttpClient(new HttpRequestTrackerHandler());
その後、クライアントを使用して送信されたすべてのリクエストがインストルメント化されます。
response = await client.GetAsync(uri);
HttpClient に HttpMessageHandler がすでに渡されている場合(たとえば、ロギングハンドラの追加)、HttpRequestTrackerHandler をインスタンス化して、既存のハンドラをコンストラクタに渡す必要があります。var loggingHandler = new MyLoggingHandler();
var client = new HttpClient(new HttpRequestTrackerHandler(loggingHandler));手動 HTTP トラッキング
AppDynamics.Agent.HttpRequestTracker クラスを使用してネットワークリクエストを手動で報告できます。
次の例では、System.Net.Http.HttpClient クラスで HttpRequestTracker を使用しています。tracker オブジェクトは、ネットワークリクエストおよびネットワークエラーを同期的にキャプチャして報告します。
using AppDynamics.Agent;
...
public async Task<string> Fetch(Uri uri) {
var client = new HttpClient();
// Create AppDynamics Tracker
var tracker = HttpRequestTracker.Create(uri);
// Add AppDynamics Server Correlation Headers
foreach (var header in ServerCorrelationHeaders.Generate) {
// Each header could have multiple values
foreach (var value in header.Value) {
client.DefaultRequestHeaders.Add(header.Key, value);
}
}
HttpResponseMessage response = null;
try {
response = await client.GetAsync(uri);
} catch (Exception ex) {
// Capture any network errors.
tracker.Exception = ex;
tracker.ReportDone();
throw ex; //you decide to throw it or not
}
if (!response.Equals(null)) {
// Capture request information such as the
// status code, status message, and headers.
tracker.ResponseCode = (int)response.StatusCode;
tracker.StatusLine = response.ReasonPhrase;
tracker.ResponseHeaderFields = response.Headers;
tracker.ReportDone();
return await response.Content.ReadAsStringAsync();
}
return null;
}
ネットワークリクエストへのカスタム ユーザー データ プロパティの追加
HttpRequestTracker にユーザーデータを追加することで、特定のネットワークリクエストに HttpRequestTracker カスタム ユーザー データ プロパティを追加できます。
public HttpRequestTracker withUserData(String key, String value)
public HttpRequestTracker withUserLong(String key, Long value)
public HttpRequestTracker withUserBoolean(String key, Boolean value)
public HttpRequestTracker withUserDouble(String key, Double value)
public HttpRequestTracker withUserDate(String key, Date value)
例
public byte[] sendRequest(URL url) throws HttpException {
HttpRequestTracker tracker = Instrumentation.beginHttpRequest(url);
try {
// implementation omitted
tracker.withResponseCode(theResponseCode)
.withResponseHeaderFields(theResponseHeaderFields)
.withUserData("key", "value")
.withUserLong("number", 100)
.withUserBoolean("boolean", true)
.withUserDouble("double", 1.1234)
.withUserDate("date", 1609488000)
.reportDone();
return responseBody;
} catch (UnderlyingException e) {
tracker.withException(e)
.reportDone();
throw new HttpException(e);
}
}
トピックパスを残す
トピックパスを残して関心のあるイベントにマークを付けることができます。たとえば、アプリケーションがクラッシュした場合に、残したトピックパスがクラッシュレポートに表示され、コンテキストを提供できます。また、トピックパスがセッションに表示されるように構成することもできます。
次に、トピックパスを残すためのメソッドの署名を示します。
static void AppDynamics.Agent.Instrumentation.LeaveBreadcrumb(string breadcrumb, BreadcrumbVisibility mode)トピックパスの可視性を設定するには、モードを使用します。可視性によって、コントローラ UI でのトピックパスの表示場所が定義されます。モードの値は、次のいずれかになります。
BreadcrumbVisibility.CrashesOnly:トピックパスはクラッシュスナップショットにのみ表示されます。BreadcrumbVisibility.CrashesAndSessions:トピックパスはクラッシュスナップショットとセッションに表示されます。
したがって、次のメソッドを使用すると、クラッシュレポートでのみ報告されるトピックパスを設定できます。
using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesOnly);クラッシュレポートおよびセッションでトピックパスを表示するには、次のようにします。
using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesAndSessions);アプリケーションキーの変更
.NET MAUI エージェント API を使用して、EUM アプリケーションキーを動的に変更できます。コントローラ UI でモバイルアプリケーションを作成する場合、EUM アプリケーションキーを受信します。EUM アプリケーションキーの取得については、「Set Up and Access Mobile RUM」を参照してください。
アプリケーションキーを変更する API は、Instrumentation クラスを介して使用できます。
Instrumentation.ChangeAppKey("NEW-APP-KEY");コレクタへのユーザデータの送信を停止する場合のエージェントの無効化
エージェントの初期化中および実行中に、エージェントを無効にしてコレクタへのすべてのデータの送信を停止できます。たとえば、プライバシー上の理由でユーザがモニタリングをオプトアウトするオプションがアプリにある場合は、エージェントを無効にできます。
shutdownAgent
shutdownAgentコールはコレクタへの発信データを停止し、デバイスにデータを保持しません。
using AppDynamics.Agent;
...
Instrumentation.shutdownAgent();
- このコールは、エージェントからのトラフィックのみを停止します。
- エージェントが初期化されると、コールは削除できず、ライセンスが消費されます。
- この状態をデバイスで永続的にする場合は、UserDefaults にコードを追加して状態を保存し、そのフラグを使用してコード内のエージェントを条件付きで初期化します。
エージェントの再起動
エージェントを再度有効にして shutdownAgent を無効にする場合は、restartAgent を使用します。
using AppDynamics.Agent;
...
Instrumentation.restartAgent();
- このコールは、同様にリモートでエージェントをシャットダウンできるサーバ側のコールにも対応します。
- コールは、アプリケーションの実行中にのみ有効です。
- エージェントがリモートで無効になっている場合、コールは無視されます。
- コールがメモリから削除され、アプリケーションが再起動されるか、デバイスが再起動されると、エージェントは通常どおり初期化されます。
エラーと例外のレポート
Instrumentation クラスの reportError メソッドを使用して例外を報告できます。報告された例外は、セッション詳細に表示されます。
また、問題に対して次のシビラティ(重大度)レベルの 1 つを設定することもできます。シビラティ(重大度)レベルを使用すると、[Code Issues Dashboard ] または [ Code Issues Analyze] でエラーをフィルタリングできます。
-
ErrorSeverityLevel.INFO -
ErrorSeverityLevel.WARNING -
ErrorSeverityLevel.CRITICAL
次の例では、API を使用して考えられる例外を報告し、ファイルへの書き込み時にシビラティ(重大度)レベルを ErrorSeverityLevel.CRITICAL(クリティカル)に設定します。
using AppDynamics.Agent;
...
try {
// possible exception //
}
catch (Exception e){
Instrumentation.ReportError(exception, ErrorSeverityLevel.CRITICAL);
}クラッシュとしての集約例外の報告
.NET MAUI エージェントを設定して、ブーリアン型のプロパティ EnableAggregateExceptionHandling を true に設定することで、(処理済みおよび未処理の)集約例外をクラッシュとして報告できます。プロパティが false に設定されている場合は、未処理の例外のみが報告されます。デフォルト値は false です。
次のコード例では、エージェントを設定して、(処理済みおよび未処理の)集約例外をクラッシュとして報告します。
using AppDynamics.Agent;
...
var config = AppDynamics.Agent.AgentConfiguration.Create(<EUM_APP_KEY>);
AppDynamics.Agent.Instrumentation.EnableAggregateExceptionHandling = true;
AppDynamics.Agent.Instrumentation.InitWithConfiguration(config);
...クラッシュレポートの無効化
クラッシュレポートはデフォルトで有効になっていますが、インストルメンテーション構成を使用して手動でクラッシュレポートを無効にできます。他のクラッシュレポートツールを使用している場合、競合を最小限に抑え、クラッシュレポートの結果を最適化するために、クラッシュレポートを無効にする場合があります。
次に示すように、crashReportingEnabled プロパティを使用してインストゥルメンテーションを構成することにより、クラッシュレポートを無効にできます。
var config = AgentConfiguration.Create(<EUM_APP_KEY>);
config.CrashReportingEnabled = false;
Instrumentation.InitWithConfiguration(config);クラッシュ レポート コールバックの追加
コードの他の部分(Google アナリティクスなど)がエージェントにより収集されるクラッシュレポート情報を使用できるようにすることもできます。サマリークラッシュ情報を渡すことができるようにするには、クラッシュレポートのランタイムコールバックを設定します。
たとえば、クラッシュ情報をコンソールに出力するには、次のように OnCrash イベントに登録できます。
IAgentConfiguration config = AgentConfiguration.Create(appKey);
config.OnCrash += (sender, crashReportSummaries) =>
{
foreach (var crashReportSummary in crashReportSummaries) {
Console.WriteLine($"Crash Detected: {crashReportSummary.ExceptionName}: {crashReportSummary.ExceptionReason} ({crashReportSummary.ExceptionId})");
}
};
Instrumentation.InitWithConfiguration(config);
プログラムによるセッションの制御
デフォルトでは、ユーザが非アクティブになってからモバイルセッションが終了します。たとえば、ユーザがアプリケーションを開くと、セッションは開始され、ユーザが設定した期間にアプリケーションを使用しなくなった後にのみ終了します。ユーザがアプリケーションの再使用を開始すると、新しいセッションが開始されます。
ただし、セッションの期間を定義するのに非アクティブな期間を設定する代わりに、次の API を使用して、セッションの開始と終了をプログラムで制御できます。
static void AppDynamics.Agent.Instrumentation.StartNextSession()
メソッド StartNextSession を呼び出すと、現在のセッションが終了し、新しいセッションが開始されます。API を使用すると、セッションを定義してフレーム化することができます。これにより、ビジネス目標と予想されるユーザフローをより厳密に合わせることができます。たとえば、API を使用して、製品の購入を追跡するセッションを定義したり、新しいユーザを登録したりすることができます。
この API を過剰に使用すると、セッションが調整されます(過剰使用はエージェントごとに 1 分あたり 10 コールを超えた場合になりますが、変更される可能性があります)。API を使用しない場合、セッションは、ユーザが非アクティブになった後、デフォルトの終了にフォールバックします。
プログラムによって制御されるセッションの例次の例では、商品の購入時に現在のセッションが終了し、新しいセッションが開始されます。
using AppDynamics.Agent;
...
public async Task BuySaleItemAsync(SaleItem item)
{
try
{
bool buySucceeded = await this.MobileService.InvokeApiAsync<SaleItem, bool>("buy", item);
if (buySucceeded)
{
await UserDialogs.Instance.AlertAsync("Thanks for buying this item");
Instrumentation.StartNextSession();
}
}
catch (Exception e)
{
Debug.WriteLine(@"Unexpected error {0}", e.Message);
}
}
セッションフレームの開始と終了
ISessionFrame API を使用して、セッションアクティビティに表示されるセッションフレームを作成できます。セッションフレームは、セッション中にユーザが実行している内容のコンテキストを提供します。この API を使用すると、ユーザ画面の命名方法が向上し、ビジネスコンテキスト内のユーザフローを記録できます。
使用例
次に、ISessionFrame API の一般的な使用例を示します。
- 1 つの画面で複数の関数を実行し、個々の関数をより詳細に追跡する必要があります。
- ユーザフローは、複数の画面またはユーザのインタラクションに及びます。たとえば、API を使用してセッションフレーム「Login」、「Product Selection」、および「Purchase」を作成して、ユーザが購入のためにフローを記録することができます。
- ユーザの操作に基づいて動的情報をキャプチャし、オーダー ID などのセッションフレームに名前を付けることができます。
ISessionFrame API
次の表に、セッションフレームで使用できる 2 つのメソッドと 1 つのプロパティを示します。つまり、StartSessionFrame を使用してセッションフレームを開始してから、返された ISessionFrame オブジェクトを使用してセッションフレームの名前を変更し、終了します。
| クラス | メソッド/プロパティ | 説明 |
|---|---|---|
Instrumentation |
方式:
|
セッションフレームを開始して名前を付けるには、これを使用します。セッションフレームに名前を付けると、[Sessions Details] ダイアログでフレームを簡単に識別して追跡できます。 |
ISessionFrame |
プロパティ:
|
セッションフレーム名の名前を変更します。ISessionFrame StartSessionFrame のプロパティを使用して、更新されたセッションフレーム名を割り当てます。 |
ISessionFrame |
方式:
|
セッションフレームを終了します。このメソッドは、ISessionFrame StartSessionFrame から呼び出します |
セッションフレームの例
次の例では、ISessionFrame API を使用し 、チェックアウトプロセス中のユーザアクティビティを追跡します。
using AppDynamics.Agent;
...
namespace ShoppingApp {
public partial class ShoppingCart : ContentPage {
private ISessionFrame sessionFrame;
private string orderId;
...
void checkoutCartButtonClicked(object sender, EventArgs e) {
// The checkout starts when the user clicks the checkout button.
// This may be after they have updated quantities of items in their cart, etc.
sessionFrame = Instrumentation.StartSessionFrame("Checkout");
}
void confirmOrderButtonClicked(object sender, EventArgs e) {
// Once they have confirmed payment info and shipping information, and they
// are clicking the "Confirm" button to start the backend process of checking out,
// we may know more information about the order itself, such as an order ID.
sessionFrame.Name = $"Checkout: Order ID {this.orderId}";
}
void processOrderCompleted(object sender, EventArgs e) {
// Once the order is processed, the user is done "checking out" so we end
// the session frame.
sessionFrame.End();
}
void checkoutCancelled(object sender, EventArgs e) {
// If they cancel or go back, you'll want to end the session frame also, or else
// it will be left open and appear to have never ended.
sessionFrame.End();
}
}
}
ユーザデータの追加
重要なイベントや情報を記録するために、文字列のキー/値ペアを設定できます。ユーザデータを設定するためのメソッドの署名を以下に示します。
static void AppDynamics.Agent.Instrumentation.SetUserData(string key, string value)たとえば、ユーザのログインのためのメソッドが呼び出されたときにユーザ ID をログに記録することができます。
using AppDynamics.Agent;
...
void LogInUser(UserCredentials) {
// Log in user
...
// Set user data with the user name.
Instrumentation.SetUserData("user_id", UserCredentials.ID);
}この情報は、[Network Request Analyze] で確認でき、取得されるクラッシュスナップショットに追加されます。キーと値はそれぞれ 2048 文字に制限されています。
また、次のメソッドを使用して、他のタイプ(long、boolean、double、DateTime)の値をユーザデータに設定することもできます。
ユーザデータを削除するには、次のメソッドを使用します。
ログレベルの設定(オプション)
クラス IAgentConfiguration の一部として、設定 LoggingLevel を使用してログレベルを設定できます。
LoggingLevel は、次の表にリストされているレベルのいずれかに設定できます。
| レベル | 説明 |
|---|---|
Off | エージェントはメッセージをまったく出力しません。 |
Error | エラーと最初のバナーのみを表示します。 |
Warn | 警告レベル以上のメッセージ。 |
Info | 情報レベル以上のメッセージ。開発者にとって役立つ場合があります。 |
Debug | サポート担当者と開発者にとって役立ちます。 |
Verbose |
詳細レベル以上のメッセージ。 詳細ロギングは、トラブルシューティングにのみ使用します。実稼働環境では必ず無効にしてください。 |
All | すべてのメッセージ |
例:
var config = AppDynamics.Agent.AgentConfiguration.Create("<#Your App Key#>");
config.LoggingLevel = AppDynamics.Agent.LoggingLevel.All;
AppDynamics.Agent.Instrumentation.InitWithConfiguration(config);
ネットワークリクエストに対応した URL の変換
特定の URL を変更または無視するコールバックは、Func に割り当てる必要があります。
OnNetworkRequest は同期されているため、関数からすばやく戻ることをお勧めします。public Func<IHttpRequestTracker, bool> OnNetworkRequest { get; set; }
URL の変換
URL を変換するには、OnNetworkRequest メソッドで次の手順を実行する必要があります。
例:
例:public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
var maskUrl = new Uri("http://networkrequest-mask.com/");
tracker.Uri = maskUrl;
return true;
}機密 URL の変換機密情報が含まれている URL を特定して変換することもできます。
例:
public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
var urlString = tracker.Uri.ToString();
if (urlString.Contains("accountInfo"))
{
tracker.Uri = new Uri("http://customer-account.com/");
}
return true;
}
URL の無視
onNetworkRequest メソッドが false を返した場合、ビーコンはドロップされます。一般に、ビーコンを無視するプロセスは次のとおりです。
- 正規表現やパターンマッチングなどの手法を使用して、特定の URL を識別します。
falseを返します。
false を返して、ネットワークリクエストを無視します。 例:
public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
if (tracker.Uri.ToString().Contains("avatar"))
{
//ignore calls for avatars
return false;
}
return true;
} すべてのネットワークリクエストを無視するには、次を実装します。 public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
return false;
}ネットワークリクエストのコールバックの登録
ネットワークリクエストのコールバックを登録するには、次の手順を実行します。
スクリーンショットの設定および作成
デフォルトでは、モバイルスクリーンショットはエージェント側で有効になりますが、コントローラ側では無効になります。これらのスクリーンショットは、コントローラの [セッションの詳細(Sessions Details)] ダイアログに表示されます。https://appdynamics.okta.com/プログラムで手動スクリーンショットを取得するには、コントローラ UI でスクリーンショットを有効にし、次のスクリーンショット API を追加する必要があります。
Instrumentation.TakeScreenshot();Disable Screenshotsスクリーンショットの無効化
スクリーンショットは、コントローラ UI またはエージェントを使用して無効にできます。エージェントでスクリーンショットを無効にするには、IAgentConfiguration オブジェクトのプロパティ ScreenshotsEnabled を false に設定します。
IAgentConfiguration config = AgentConfiguration.Create(appKey); config.ScreenshotsEnabled = false; Instrumentation.InitWithConfiguration(config);スクリーンショットのブロックとブロック解除
また、エージェントを使用して、コードブロックの実行中にスクリーンショットの実行をブロックできます。これにより、スクリーンショットのブロックを解除するまで、スクリーンショットの作成が一時的にブロックされます。これにより、ユーザがログインやアカウント画面などで個人データを入力する状況でのスクリーンショットの作成を停止できます。
Instrumentation クラスでは、スクリーンショットをブロックおよびブロック解除するためのメソッド(blockScreenshots() と unblockScreenshots())が使用できます。
IAgentConfiguration オブジェクトの ScreenshotsEnabled プロパティまたはコントローラ UI によってスクリーンショットが無効になっている場合、これらのメソッドは無効になります。また、Instrumentation.ScreenshotsBlocked プロパティを確認して、スクリーンショットがブロックされているか確認できます。public void LoginUser()
{
if (!Instrumentation.ScreenshotsBlocked)
{
Instrumentation.BlockScreenshots();
}
LoginCredentials credentials = UserLogin.GetCredentials();
if (credentials.Authorized)
{
RedirectToProfile(credentials.user);
Instrumentation.UnblockScreenshots();
}
}WebView インストルメンテーション(JavaScript エージェントのインジェクション)
WebView インストルメンテーションは、Javascript エージェントを WebView に自動的にインジェクションするため、WebView ナビゲーションもインストゥルメント化できます。デフォルトでは Ajax コールは無効になっていますが、プロパティ JsAgentEnabled および JsAgentAjaxEnabled を使用して、WebView インストゥルメンテーションと Ajax インストゥルメンテーションの両方を設定できます。
例
var config = AppDynamics.Agent.AgentConfiguration.Create("<#Your App Key#>");
config.JsAgentEnabled = true;
config.JsAgentAjaxEnabled = false;
AppDynamics.Agent.Instrumentation.InitWithConfiguration(config);
MAUI 固有のインストルメンテーション
AppDynamics.Agent.Maui を使用して MAUI 要素をインストゥルメント化できます。NuGet パッケージを追加するには、「Monitor .NET MAUI Applications」を参照してください。https://appdynamics.okta.com/
ページトラッキング
Note:これは自動的にインストゥルメント化できます。「Automatic Page Tracking」セクションを確認してください。
Xamarin.Forms を使用すると、ページの使用状況をトラッキングし、セッションタイムラインでユーザがアプリケーションをどのように操作しているかを確認できます。
ページをトラッキングするには、モニタする各ページのコンストラクタから を呼び出す必要があります。
public partial class MyPage : ContentPage
{
public MyPage()
{
InitializeComponent();
AppDynamics.Agent.Maui.PageTracker.TrackPage(this);
}
}
UI 要素のトラッキング
Note:これは自動的にインストゥルメント化できます。「UI の自動トラッキング」セクションを確認してください。
次の UI 要素とのユーザインタラクションをトラッキングできます。
- ボタン
- エントリ(Entries)
- リストビュー
UI 要素をインストゥルメント化するには、次の手順を実行します。
-
ビューにプロパティをアタッチします。
appd:UiInstrumentation.IsInstrumented="True" -
名前空間を追加します。
xmlns:appd="clr-namespace:AppDynamics.Agent.Maui;assembly=AppDynamics.Agent.Maui"
例
インストゥルメント化された UI 要素を含む ファイルの例:
<ContentPage
xmlns:appd="clr-namespace:AppDynamics.Agent.Maui;assembly=AppDynamics.Agent.Maui" >
<StackLayout>
<Button appd:UiInstrumentation.IsInstrumented="True" Clicked="OnButtonClicked" />
<Entry
appd:UiInstrumentation.IsInstrumented="True" />
<ListView
appd:UiInstrumentation.IsInstrumented="True">
<ListView.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>Item l</x:String>
<x:String>Item 2</x:String>
</x:Array>
</ListView.ItemsSource>
</ListView>
</StackLayout>
</ContentPage>
また、コードビハインド(xaml.cs ファイル)からプロパティをインストゥルメント化することもできます。
using AppDynamics.Agent.Maui;
...
var button = new Button();
button.SetValue(UiInstrumentation.IsInstrumentedProperty, true);
IsInstrumented プロパティは、次のイベントをトラッキングします。
- ボタン:ボタンがクリックされる
- リストビュー:項目が選択される
- エントリ:エントリがフォーカス/フォーカス解除される
MAUI SDK のドキュメント
完全な SDK API ドキュメントについては、「最新の MAUI SDK ドキュメント」を参照してください。