Download PDF
Download page Xamarin インストゥルメンテーションのカスタマイズ.
Xamarin インストゥルメンテーションのカスタマイズ
Related pages:
以下のセクションでは、Xamarin SDK を使用してインストゥルメンテーションをカスタマイズする方法について説明します。
エージェントは情報を報告する前にローカルバッファにイベントに関するデータを保存するため、慎重に API を使用することをお勧めします。
Xamarin 自動インストゥルメンテーションのカスタマイズ
次の自動インストゥルメンテーションをカスタマイズできます。
自動インストゥルメンテーションをカスタマイズするには、AppDynamics.Agent.AutoInstrument.Fody
パッケージがプロジェクトに追加されていることを確認してください。「自動ネットワーク リクエスト インストゥルメンテーションの設定」を参照してください。
自動ネットワーク リクエスト インストゥルメンテーションのカスタマイズ
自動ネットワーク リクエスト インストゥルメンテーションが有効になっている場合、ウィーバはプロジェクトで HttpClient または Refit の使用のすべての新しいインスタンスを検索します。見つかったインスタンスで、エージェント インストゥルメンテーション コードが HttpClient または Refit リクエストに挿入されます。
プロジェクトレベルまたはクラスレベルで自動インストゥルメンテーションをさらにカスタマイズできます(以下のセクションを参照してください)。たとえば、次のことができます。
FodyWeavers.xml
ファイルからプロジェクトレベルで自動インストゥルメンテーションを有効にして、DisableNetworkInstrumentation
属性を使用してクラスレベルで一部のファイルを除外する。FodyWeavers.xml
ファイルからプロジェクトレベルで自動インストゥルメンテーションを無効にして、EnableNetworkInstrumentation
属性を使用してクラスレベルで一部のファイルを含める。
HttpRequestTrackerHandler
を介した半自動ネットワーク リクエスト トラッキングを使用している場合は、ネットワークリクエストが 2 回報告されることはありません。
プロジェクトレベルでの有効化/無効化
FodyWeavers.xml
ファイル内の NetworkInstrumentationEnabled
フラグを使用して、プロジェクトレベルで自動インストゥルメンテーションを有効または無効にすることができます。
例:
<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 { ... }
C#[DisableNetworkInstrumentation]
[DisableNetworkInstrumentation] public class MyClass { ... }
C#
推奨事項
手動のネットワーク リクエスト トラッキングを使用している場合は、同じネットワークリクエストに対して重複したエントリが表示されます。 これを回避するには、手動インストゥルメンテーションを削除するか、そのクラスで
DisableNetworkInstrumentation
属性を使用します。- HTTP リクエストが別のプロジェクトで処理される場合は、インストゥルメンテーションを機能させるために、
AppDynamics.Agent
とAppDynamics.Agent.AutoInstrument.Fody
の両方をそのプロジェクトにも追加する必要があります。 - 別のライブラリで生成された
HttpClient
インスタンスを使用している場合は、インストゥルメンテーションを機能させるために必要なことは、同じプロジェクト内でインスタンスを作成して使用することのみです。自動インストゥルメンテーションは、プロジェクト内の新しい HttpClient インスタンスを対象とすることで機能します。
自動ページ トラッキング インストゥルメンテーションのカスタマイズ
自動ページ トラッキング インストゥルメンテーションが有効になっている場合、ウィーバはプロジェクト内のすべての Xamarin.Forms 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 : Xamarin.Forms.ContentPage { ... }
C#[DisableUITRacking]
[DisablePageTracking] public class MyPage : Xamarin.Forms.ContentPage { ... }
C#
自動 UI トラッキング インストゥルメンテーション
自動 UI トラッキング インストゥルメンテーションが有効になっている場合、ウィーバはプロジェクト内のすべての Xamarin.Forms
Button
、Entry
および ListView
のインスタンスを検索し、インストゥルメンテーション コードを挿入します。
プロジェクトレベルでの有効化/無効化
FodyWeavers.xml
ファイル内の 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 : Xamarin.Forms.ContentPage { ... }
C#[DisableUITRacking]
[DisableUITracking] public class MyPage : Xamarin.Forms.ContentPage { ... }
C#
自動 UI トラッキングと XAML
自動 UI トラッキングは、XAML と分離コード UI 要素の両方で機能します。ただし、分離コード UI は自動的にインストゥルメント化されますが、XAML を自動インストゥルメント化するには追加の手順が必要です。.csproj
ファイルに次の設定を追加します。
<PropertyGroup>
<FodyDependsOnTargets>
XamlC
</FodyDependsOnTargets>
</PropertyGroup>
自動 UI トラッキングは、事前にコンパイルされた XAML でのみ機能するため、XamlCompilationOptions.Compile
を使用する必要があります。
[XamlCompilation(XamlCompilationOptions.Compile)]
デフォルトでは、Visual Studio Xamarin.Forms テンプレートを使用して作成されたプロジェクトには、これがすでに含まれています。詳細については、「XAML Compilation in Xamarin.Forms」を参照してください。
コールの追跡
メソッドをインストゥルメント化すると、インストゥルメント化されたメソッドが呼び出される頻度と、実行にかかる時間を確認できます。これを行うには、インストゥルメント化するメソッドの開始時と終了時にコールを追加します。
次の例では、クラス 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
にユーザーデータを追加することで、特定のネットワークリクエストにカスタムユーザーデータ プロパティを追加できます。
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 でのトピックパスの表示場所が定義されます。mode
の値は次のいずれかにできます。
BreadcrumbVisibility.CrashesOnly
:トピックパスはクラッシュスナップショットにのみ表示されます。BreadcrumbVisibility.CrashesAndSessions
:トピックパスはクラッシュスナップショットとセッションに表示されます。
したがって、次のメソッドを使用すると、クラッシュレポートでのみ報告されるトピックパスを設定できます。
using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesOnly);
クラッシュレポートおよびセッションでトピックパスを表示するには、次のようにします。
using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesAndSessions);
アプリケーションキーの変更
Xamarin エージェント API を使用して、EUM アプリケーションキーを動的に変更できます。コントローラ UI でモバイルアプリケーションを作成する場合、EUM アプリケーションキーを受信します。EUM アプリケーションキーの取得については、「モバイル RUM を使ってみる」を参照してください。
アプリケーションキーを変更する API は、Instrumentation
クラスを介して使用できます。
Instrumentation.ChangeAppKey("NEW-APP-KEY");
コレクタへのユーザデータの送信を停止する場合のエージェントの無効化
エージェントの初期化中および実行中に、エージェントを無効にしてコレクタへのすべてのデータの送信を停止できます。たとえば、プライバシー上の理由でユーザがモニタリングをオプトアウトするオプションがアプリにある場合は、エージェントを無効にできます。
shutdownAgent
shutdownAgent
コールはコレクタへの発信データを停止し、デバイスにデータを保持しません。
using AppDynamics.Agent;
...
Instrumentation.shutdownAgent();
- このコールは、エージェントからのトラフィックのみを停止します。
- エージェントが初期化されると、コールは削除できず、ライセンスが消費されます。
- この状態をデバイスで永続的にする場合は、UserDefaults にコードを追加して状態を保存し、そのフラグを使用してコード内のエージェントを条件付きで初期化します。
restartAgent
エージェントを再度有効にして 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);
}
クラッシュとしての集約例外の報告
Xamarin エージェントを設定して、ブーリアン型のプロパティ EnableAggregateExceptionHandling
を true
に設定することで、(処理済みおよび未処理の)集約例外をクラッシュとして報告できます。プロパティが false
に設定されている場合は、未処理の例外のみが報告されます。デフォルト値は false
です。
次のコード例では、Xamarin エージェントを設定して、(処理済みおよび未処理の)集約例外をクラッシュとして報告します。
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 アナリティクスなど)が Xamarin エージェントにより収集されるクラッシュレポート情報を使用できるようにすることがあります。サマリークラッシュ情報を渡すことができるようにするには、クラッシュレポートのランタイムコールバックを設定します。
Xamarin エージェントがクラッシュを検出して報告したときにコールバックを取得するには、IAgentConfiguration インターフェイスの一部である次のイベントに登録します。
event EventHandler<IEnumerable<CrashReportSummary>> OnCrash;
C#OnCrash
イベントは、クラッシュ発生後の Xamarin エージェントの次の初期化中に発生します。このイベントはアプリケーションの UI スレッドで発生するため、作業は別の作業スレッドで実行する必要があります。Xamarin エージェントは、複数のクラッシュがあり、複数のクラッシュレポート概要が生成される場合、個々のコールバックではなく、一連のクラッシュレポート概要を送信します。
CrashReportSummary
それぞれに次のプロパティがあります。ExceptionName
:クラッシュをすばやく識別するのに役立ちます。ExceptionReason
:クラッシュをすばやく識別するのに役立ちます。ExceptionId
:コントローラ UI でクラッシュを調べるのに便利です。
Google Analytics などの別の分析ツールに情報を送信する場合は、次の 3 つのプロパティすべてを含めることをお勧めします。
public class CrashReportSummary { public string ExceptionId { get; } public string ExceptionName { get; } public string ExceptionReason { get; } }
C#
例
たとえば、クラッシュ情報をコンソールに出力するには、次のように 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 を過剰に使用すると、セッションが調整されます(過剰使用は Xamarin エージェントごとに 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
オブジェクトを使用してセッションフレームの名前を変更し、終了します。
クラス | メソッド/プロパティ | 説明 |
---|---|---|
Instrument | 方式:
C#
| セッションフレームを開始して名前を付けるには、これを使用します。 |
ISessionFrame | プロパティ:
C#
| セッションフレーム名の名前を変更します。 |
ISessionFrame | 方式:
C#
| セッションフレームを終了します。 |
セッションフレームの例
次の例では、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
メソッドで次の手順を実行する必要があります。
正規表現やパターンマッチングなどの手法を使用して、特定の URL を識別します。
すべてのネットワークリクエストの URL を変換することもできるので、この最初の手順はオプションです。
IHttpRequestTracker
オブジェクトの URL プロパティを変更します。url
プロパティに有効な URL を割り当てます。IHttpRequestTracker
オブジェクトのその他のプロパティの変更は無視されます。true
を返します。
次に例を示します。
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 の無視
onNetworkReques
t メソッドが false
を返した場合、ビーコンはドロップされます。一般に、ビーコンを無視するプロセスは次のとおりです。
- 正規表現やパターンマッチングなどの手法を使用して、特定の URL を識別します。
false
を返します。
特定の URL を無視するには、モニタしないネットワークリクエストを識別し、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;
}
ネットワークリクエストのコールバックの登録
ネットワークリクエストのコールバックを登録するには、次の手順を実行します。
コールバックを処理する独自のメソッドを定義します。
public static bool NetworkRequestCallback(IHttpRequestTracker tracker) { return true; }
C#AgentConfiguration
初期化フェーズでそれを渡します。IAgentConfiguration config = AgentConfiguration.Create(appKey); config.OnNetworkRequest += NetworkRequestCallback; //Register the Callback Instrumentation.InitWithConfiguration(config);
C#または、匿名関数を使用できます。
IAgentConfiguration config = AgentConfiguration.Create(appKey); config.OnNetworkRequest += (IHttpRequestTracker tracker) => { return true; }; Instrumentation.InitWithConfiguration(config);
C#
スクリーンショットの設定および作成
デフォルトでは、モバイルスクリーンショットはエージェント側で有効になりますが、コントローラ側では無効になります。これらのスクリーンショットはコントローラの [Sessions Details] ダイアログに表示されます。プログラムで手動でスクリーンショットを取得するには、コントローラ UI でスクリーンショットを有効にし、次のスクリーンショット API を追加する必要があります。
Instrumentation.TakeScreenshot();Disable Screenshots
takeScreenshot()
関数は、スクリーンショットを 10 秒あたり最大 1 つに制限します。
スクリーンショットの無効化
スクリーンショットは、コントローラ UI または Xamarin SDK を使用して無効にできます。Xamarin SDK でスクリーンショットを無効にするには、IAgentConfiguration
オブジェクトのプロパティ ScreenshotsEnabled
を false
に設定します。
IAgentConfiguration config = AgentConfiguration.Create(appKey); config.ScreenshotsEnabled = false; Instrumentation.InitWithConfiguration(config);
スクリーンショットのブロックとブロック解除
Xamarin SDK を使用すると、コードブロックの実行中にスクリーンショットが実行されないようにブロックすることもできます。これにより、スクリーンショットのブロックを解除するまで、スクリーンショットの作成が一時的にブロックされます。これにより、ユーザがログインやアカウント画面などで個人データを入力する状況でのスクリーンショットの作成を停止できます。
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);
注
WebView は、Xamarin iOS では自動的にインストゥルメント化されます。Xamarin Android で WebView インストゥルメンテーションを使用するには、次のオプションを使用します。
InstrumentedWebView
:AppDynamics.Agent.Forms.InstrumentedWebView
を使用します。Xamarin.Forms.WebView
またはカスタム WebView 用にレンダラをグローバルにエクスポートします。
[assembly: ExportRenderer(typeof(WebView), typeof(AppDynamics.Droid.InstrumentedWebViewRenderer))]
Android プロジェクトの MainActivity
の上でこれを行うことができます。
[assembly: ExportRenderer(typeof(WebView), typeof(AppDynamics.Droid.InstrumentedWebViewRenderer))]
namespace MyProject.Droid
{
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
...
}
}
フラグメントトラッキング
これは Android ネイティブにのみ適用されます。
Android アクティビティは自動的に追跡されますが、次を使用してフラグメントを追跡することもできます。
Instrumentation.TrackFragmentStart(this);
//and
Instrumentation.TrackFragmentEnd(this);
例
class MyFragment : Fragment
{
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
...
}
public override void OnStart()
{
base.OnStart();
Instrumentation.TrackFragmentStart(this);
}
public override void OnStop()
{
base.OnStop();
Instrumentation.TrackFragmentEnd(this);
}
}
コントローラトラッキングの表示
これは iOS ネイティブにのみ適用されます。
以下の API を使用して ViewControllers
を追跡できます。
Instrumentation.TrackViewControllerDidAppear(this);
//and
Instrumentation.TrackViewControllerDidDisappear(this);
例
public partial class MyViewController : UIViewController
{
...
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Instrumentation.TrackViewControllerDidAppear(this);
}
public override void ViewDidDisappear(bool animated)
{
base.ViewDidDisappear(animated);
Instrumentation.TrackViewControllerDidDisappear(this);
}
}
Xamarin.Forms のインストゥルメント化
AppDynamics.Agent.Forms を使用して Xamarin.Forms 要素をインストゥルメント化できるようになりました。NuGet パッケージの Xaram.Forms を追加する場合は、「Xamarin アプリケーションのインストゥルメンテーション」を参照してください。
ページトラッキング
Xamarin.Forms を使用すると、ページの使用状況をトラッキングし、セッションタイムラインでユーザがアプリケーションをどのように操作しているかを確認できます。
ページをトラッキングするには、モニタする各ページのコンストラクタから TrackPage
を呼び出す必要があります。
public partial class MyPage : ContentPage
{
public MyPage()
{
InitializeComponent();
AppDynamics.Agent.Forms.PageTracker.TrackPage(this);
}
}
UI 要素のトラッキング
次の UI 要素とのユーザインタラクションをトラッキングできます。
- ボタン
- エントリ(Entries)
- リストビュー
UI 要素をインストゥルメント化するには、次の手順を実行します。
ビューにプロパティをアタッチします。
appd:UiInstrumentation.IsInstrumented="True"
C#名前空間を追加します。
xmlns:appd="clr-namespace:AppDynamics.Agent.Forms;assembly=AppDynamics.Agent.Forms"
C#
例
インストゥルメント化された UI 要素を含む xaml
ファイルの例:
<ContentPage xmlns:appd="clr-namespace:AppDynamics.Agent.Forms;assembly=AppDynamics.Agent.Forms">
<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.Forms;
...
var button = new Button();
button.SetValue(UiInstrumentation.IsInstrumentedProperty, true);
IsInstrumented
プロパティは、次のイベントをトラッキングします。
- ボタン:ボタンがクリックされる
- リストビュー:項目が選択される
- エントリ:エントリがフォーカス/フォーカス解除される
Xamarin SDK のドキュメント
SDK API の完全なマニュアルについては、次に示す最新の Xamarin SDK ドキュメントまたは以前のバージョンを参照してください。
- https://sdkdocs.appdynamics.com/xamarin-sdk/23.2/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/22.10/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/22.4/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/22.3/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/22.2/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/21.9/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/21.8/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/21.6/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/21.5/html/
- https://sdkdocs.appdynamics.com/xamarin-sdk/21.2/html/