Xamarin インストルメンテーションのカスタマイズ

以下のセクションでは、Xamarin SDK を使用してインストルメンテーションをカスタマイズする方法について説明します。

注: エージェントは報告する前に

ローカルバッファにイベントに関するデータを保存するため、

慎重に API を使用することをお勧めします。

Xamarin 自動インストルメンテーションのカスタマイズ

次の自動インストルメンテーションをカスタマイズできます。

自動インストゥルメンテーションをカスタマイズするには、AppDynamics.Agent.AutoInstrument.Fody パッケージがプロジェクトに追加されていることを確認してください。「自動ネットワーク リクエスト インストルメンテーションの設定」を参照してください。

ネットワークリクエストの自動インストルメンテーションのカスタマイズ

自動ネットワーク リクエスト インストルメンテーションが有効になっている場合、ウィーバはプロジェクトで HttpClient または Refit 使用のすべての新しいインスタンスを検索します。見つかったインスタンスで、エージェント インストルメンテーション コードが HttpClient または Refit リクエストに挿入されます。

プロジェクトレベルまたはクラスレベルで自動インストルメンテーションをさらにカスタマイズできます(以下のセクションを参照してください)。たとえば、次のようにすることができます。

  1. FodyWeavers.xml ファイルからプロジェクトレベルで自動インストゥルメンテーションを有効にして、DisableNetworkInstrumentation 属性を使用してクラスレベルで一部のファイルを除外する。

  2. FodyWeavers.xmlEnableNetworkInstrumentationファイルからプロジェクトレベルで自動インストゥルメンテーションを無効にして、属性を使用してクラスレベルで一部のファイルを含める。

注: 使用バージョン

半自動ネットワーク リクエスト トラッキング

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>

クラスレベルでの有効化/無効化

クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。

  1. [EnableNetworkInstrumentation]

    [EnableNetworkInstrumentation]
    public class MyClass
    {
    ...
    }
  2. [DisableNetworkInstrumentation]

    [DisableNetworkInstrumentation]
    public class MyClass
    {
    ...
    }

推奨事項

  • 手動のネットワーク リクエスト トラッキングを使用している場合は、同じネットワークリクエストに対して重複したエントリが表示されます。手動 HTTP トラッキングこれを回避するには、手動インストルメンテーションを削除するか、そのクラスで 属性を使用します。

  • HTTP リクエストが別のプロジェクトで処理される場合は、インストゥルメンテーションを機能させるために、AppDynamics.AgentAppDynamics.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>

クラスレベルでの有効化/無効化

クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。

  1. [EnablePageTracking]

    [EnablePageTracking]
    public class MyPage : Xamarin.Forms.ContentPage
    {
    ...
    }
  2. [DisableUITRacking]

    [DisablePageTracking]
    public class MyPage : Xamarin.Forms.ContentPage
    {
    ...
    }

自動 UI トラッキング インストルメンテーション

自動 UI トラッキング インストゥルメンテーションが有効になっている場合、ウィーバはプロジェクト内のすべての Xamarin.Forms ButtonEntry および 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>

クラスレベルでの有効化/無効化

クラスごとに次の属性のいずれかを使用して、クラスレベルで自動インストルメンテーションを有効または無効にすることができます。

  1. [EnableUITracking]

    [EnableUITracking]
    public class MyPage : Xamarin.Forms.ContentPage
    {
    ...
    }
  2. [DisableUITRacking]

    [DisableUITracking]
    public class MyPage : Xamarin.Forms.ContentPage
    {
    ...
    }

自動 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);
注: HttpClientHttpMessageHandler がすでに渡されている場合(たとえば、ロギングハンドラの追加)、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 でのトピックパスの表示場所が定義されます。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 エージェントにより収集されるクラッシュレポート情報を使用できるようにすることがあります。サマリークラッシュ情報を渡すことができるようにするには、クラッシュレポートのランタイムコールバックを設定します。

  1. Xamarin エージェントがクラッシュを検出して報告したときにコールバックを取得するには、[The OnCrash IAgentConfiguration] インターフェイスの一部である次のイベントに登録します。
    event EventHandler<IEnumerable<CrashReportSummary>> OnCrash;
    イベントは、クラッシュ発生後の Xamarin エージェントの次の初期化中に発生します。このイベントはアプリケーションの UI スレッドで発生するため、作業は別の作業スレッドで実行する必要があります。
  2. Xamarin エージェントは、複数のクラッシュがあり、複数のクラッシュレポート概要が生成される場合、個々のコールバックではなく、一連のクラッシュレポート概要を送信します。各 CrashReportSummary に次のプロパティがあります。
    • ExceptionName:クラッシュをすばやく識別するのに役立ちます。
    • ExceptionReason:クラッシュをすばやく識別するのに役立ちます。
    • ExceptionId:コントローラ UI でクラッシュを調べるのに便利です。
    注: Google Analytics などの別の分析ツールに情報を送信する場合は、次の 3 つのプロパティすべてを含めることをお勧めします。
    public class CrashReportSummary
    {
    public string ExceptionId { get; }
    public string ExceptionName { get; }
    public string ExceptionReason { get; }
    }

たとえば、クラッシュ情報をコンソールに出力するには、次のように 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 を使用しない場合、セッションは、ユーザが非アクティブになった後、デフォルトの終了にフォールバックします。

Example of a Programmatically Controlled Session

Example of a Programmatically Controlled Session

In the example below, the current session ends and a new one begins when an item is bought.

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

方式:

static ISessionFrame StartSessionFrame(string sessionFrameName)

セッションフレームを開始して名前を付けるには、これを使用します。セッションフレームに名前を付けると、[Sessions Details] ダイアログでフレームを簡単に識別して追跡できます。

ISessionFrame

プロパティ:

string Name

ISessionFrame更新されたセッションフレーム名を、 から返された StartSessionFrame オブジェクトのこのプロパティに割り当てます。

ISessionFrame

方式:

static void End()

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; }

Transforming URLs

To transform URLs, the OnNetworkRequest

  1. Identify specific URLs using techniques such as regex or pattern matching.

    Note: This first step is optional because you can choose to transform the URLs of all network requests.
  2. Modify the URL property of theIHttpRequestTracker object.

  3. Assign a valid URL to the url property. Modifying other properties of the IHttpRequestTracker object will be ignored.

  4. Return true .

For example:

public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
var maskUrl = new Uri("http://networkrequest-mask.com/");
tracker.Uri = maskUrl;
return true;
}

Transforming Sensitive URLs

You may want to identify and transform URLs that contain sensitive information.

For example:

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;
}

Ignoring URLs

If the onNetworkRequest method returns false, the beacon is dropped. Generally, the process for ignoring beacons is:

  1. Identify specific URLs using techniques such as regex or pattern matching.

  2. Return false .

To ignore specific URLs, you would identify network requests that you didn't want to monitor and return false to ignore the network request.

For example:

public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
if (tracker.Uri.ToString().Contains("avatar"))
{
//ignore calls for avatars
return false;
}
return true;
}

To ignore all network requests, implement the following:

public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
return false;
}

ネットワークリクエストのコールバックの登録

ネットワークリクエストのコールバックを登録するには、次の手順を実行します。

  1. コールバックを処理する独自のメソッドを定義します。
    public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
    {
    return true;
    }
  2. AgentConfiguration 初期化フェーズでそれを渡します。
    IAgentConfiguration config = AgentConfiguration.Create(appKey);
    config.OnNetworkRequest += NetworkRequestCallback; //Register the Callback
    Instrumentation.InitWithConfiguration(config);
  3. または、匿名関数を使用できます。
    IAgentConfiguration config = AgentConfiguration.Create(appKey);
    config.OnNetworkRequest += (IHttpRequestTracker tracker) =>
    {
    return true;
    };
    Instrumentation.InitWithConfiguration(config);

スクリーンショットの設定および作成

デフォルトでは、モバイルスクリーンショットはエージェント側で有効になりますが、コントローラ側では無効になります。これらのスクリーンショットは、コントローラの [セッションの詳細(Sessions Details)] ダイアログに表示されます。Session Detailsプログラムで手動でスクリーンショットを取得するには、コントローラ UI でスクリーンショットを有効にし、次のスクリーンショット API を追加する必要があります。

Instrumentation.TakeScreenshot();Disable Screenshots
注: takeScreenshot() 関数は、スクリーンショットを 10 秒あたり最大 1 つに制限します。

スクリーンショットの無効化

スクリーンショットは、コントローラ UI または Xamarin SDK を使用して無効にできます。Xamarin SDK でスクリーンショットを無効にするには、IAgentConfiguration オブジェクトのプロパティ ScreenshotsEnabledfalse に設定します。

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 インストルメンテーションを使用するには、次のオプションを使用します。

  1. InstrumentedWebViewAppDynamics.Agent.Forms.InstrumentedWebView を使用します。
  2. 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 アプリケーションのインストルメンテーション」を参照してください。[NO TITLE FOUND]

ページトラッキング

Xamarin.Forms を使用すると、ページの使用状況をトラッキングし、セッションタイムラインでユーザがアプリケーションをどのように操作しているかを確認できます。

ページをトラッキングするには、モニタする各ページのコンストラクタから TrackPage を呼び出す必要があります。

public partial class MyPage : ContentPage
{
public MyPage()
{
InitializeComponent();
AppDynamics.Agent.Forms.PageTracker.TrackPage(this);
}
}

UI 要素のトラッキング

次の UI 要素とのユーザインタラクションをトラッキングできます。

  • ボタン
  • エントリ(Entries)
  • リストビュー

UI 要素をインストゥルメント化するには、次の手順を実行します。

  1. ビューにプロパティをアタッチします。

    appd:UiInstrumentation.IsInstrumented="True"
  2. 名前空間を追加します。

    xmlns:appd="clr-namespace:AppDynamics.Agent.Forms;assembly=AppDynamics.Agent.Forms"

インストゥルメント化された 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 プロパティは、次のイベントをトラッキングします。

  1. ボタン:ボタンがクリックされる
  2. リストビュー:項目が選択される
  3. エントリ:エントリがフォーカス/フォーカス解除される

Xamarin SDK のドキュメント