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

エージェントは情報を報告する前にローカルバッファにイベントに関するデータを保存するため、慎重に API を使用することをお勧めします。

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

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

プロジェクトレベルまたはクラスレベルで自動インストゥルメンテーションをさらにカスタマイズできます。たとえば、次のことができます。

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

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

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

プロジェクトレベルでの有効化/無効化

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>
C#

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

2 つの異なる属性を使用して、クラスごとにネットワーク インストゥルメンテーションを有効または無効にすることができます。

  1. [EnableNetworkInstrumentation]

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

    [DisableNetworkInstrumentation]
    public class MyClass
    {
        ...
    }  
    C#

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

    HttpRequestTrackerHandler を介した半自動ネットワーク リクエスト トラッキングを使用している場合は、リクエストが 2 回報告されることはありません。 

自動ネットワーク リクエスト インストゥルメンテーションの既知の制限事項

  1. HTTP リクエストが別のプロジェクトで処理される場合は、インストゥルメンテーションを機能させるために、AppDynamics.Agent AppDynamics.Agent.AutoInstrument.Fody の両方をそのプロジェクトにも追加する必要があります。 
  2. 別のライブラリで生成された HttpClient インスタンスを使用している場合は、インストゥルメンテーションを機能させるために必要なことは、同じプロジェクト内でインスタンスを作成して使用することのみです。自動インストゥルメンテーションは、プロジェクト内の新しい HttpClient インスタンスを対象とすることで機能します。  


コールの追跡

メソッドをインストゥルメント化すると、インストゥルメント化されたメソッドが呼び出される頻度と、実行にかかる時間を確認できます。これを行うには、インストゥルメント化するメソッドの開始時と終了時にコールを追加します。

次の例では、クラス 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();
    }
}
C#

イベントの時間

複数のメソッドにまたがるアプリケーション内のイベントの時間を計る必要がある場合があります。これを行うには、イベントの開始時に 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");
} 
C#

レポート メトリック(Report Metrics)

他のタイプのデータを報告するには、メトリックを使用できます。メトリック名には、英数字とスペースのみを使用します。不正な文字は、ASCII 16 進値に置き換えられます。メトリック値は整数である必要があります。

次のスニペットは、メトリックを報告する方法を示しています。

using AppDynamics.Agent;
...
Instrumentation.ReportMetricWithName("Database Rows", 5123);
C#

HTTP リクエストへのトラッキングの追加

半自動 HTTP トラッキング

HttpMessageHandler は、すべてのトラッキングとエラー処理を処理します。ロギングなどの他の目的ですでにカスタム HttpMessageHandler を使用している場合は、他の内部ハンドラを含めることもできます。

半自動トラッキングを追加するには、HttpClient をインスタンス化し、HttpRequestTrackerHandler を渡します。

var client = new HttpClient(new HttpRequestTrackerHandler());
C#


その後、クライアントを使用して送信されたすべてのリクエストがインストゥルメント化されます。

 response = await client.GetAsync(uri); 
C#

HttpClient HttpMessageHandler がすでに渡されている場合(たとえば、ロギングハンドラの追加)、HttpRequestTrackerHandler をインスタンス化して、既存のハンドラをコンストラクタに渡す必要があります。

var loggingHandler = new MyLoggingHandler();
var client = new HttpClient(new HttpRequestTrackerHandler(loggingHandler)); 
C#

手動 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;
}
C#

トピックパスを残す

トピックパスを残して関心のあるイベントにマークを付けることができます。たとえば、アプリケーションがクラッシュした場合に、残したトピックパスがクラッシュレポートに表示され、コンテキストを提供できます。また、トピックパスがセッションに表示されるように構成することもできます。

次に、トピックパスを残すためのメソッドの署名を示します。

static void AppDynamics.Agent.Instrumentation.LeaveBreadcrumb(string breadcrumb, BreadcrumbVisibility mode)
C#

トピックパスの可視性を設定するには、モードを使用します。可視性によって、コントローラ UI でのトピックパスの表示場所が定義されます。modeの値は次のいずれかにできます。

  • BreadcrumbVisibility.CrashesOnly:トピックパスはクラッシュスナップショットにのみ表示されます。
  • BreadcrumbVisibility.CrashesAndSessions:トピックパスはクラッシュスナップショットとセッションに表示されます。

したがって、次のメソッドを使用すると、クラッシュレポートでのみ報告されるトピックパスを設定できます。

using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesOnly);
C#

クラッシュレポートおよびセッションでトピックパスを表示するには、次のようにします。

using AppDynamics.Agent;
...
Instrumentation.LeaveBreadcrumb("GetUserInfo", BreadcrumbVisibility.CrashesAndSessions);
C#


アプリケーションキーの変更

Xamarin エージェント API を使用して、EUM アプリケーションキーを動的に変更できます。コントローラ UI でモバイルアプリケーションを作成する場合、EUM アプリケーションキーを受信します。EUM アプリケーションキーの取得については、「Get Started with Mobile RUM」を参照してください。

アプリケーションキーを変更する API は、Instrumentation クラスを介して使用できます。 

Instrumentation.ChangeAppKey("NEW-APP-KEY");
C#

コレクタへのユーザデータの送信を停止する場合のエージェントの無効化

エージェントの初期化中および実行中に、エージェントを無効にしてコレクタへのすべてのデータの送信を停止できます。たとえば、プライバシー上の理由でユーザがモニタリングをオプトアウトするオプションがアプリにある場合は、エージェントを無効にできます。

shutdownAgent

shutdownAgent  コールはコレクタへの発信データを停止し、デバイスにデータを保持しません。

using AppDynamics.Agent; 
...
Instrumentation.shutdownAgent();
C#


  • このコールは、エージェントからのトラフィックのみを停止します。
  • エージェントが初期化されると、コールは削除できず、ライセンスが消費されます。
  • この状態をデバイスで永続的にする場合は、UserDefaults にコードを追加して状態を保存し、そのフラグを使用してコード内のエージェントを条件付きで初期化します。

restartAgent

エージェントを再度有効にして shutdownAgent を無効にする場合は、restartAgent を使用します。

using AppDynamics.Agent; 
...
Instrumentation.restartAgent();
C#


  • このコールは、同様にリモートでエージェントをシャットダウンできるサーバ側のコールにも対応します。 
  • コールは、アプリケーションの実行中にのみ有効です。
  • エージェントがリモートで無効になっている場合、コールは無視されます。
  • コールがメモリから削除され、アプリケーションが再起動されるか、デバイスが再起動されると、エージェントは通常どおり初期化されます。

エラーと例外のレポート

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

クラッシュとしての集約例外の報告

Xamarin エージェントを設定して、ブーリアン型のプロパティ EnableAggregateExceptionHandlingtrue に設定することで、(処理済みおよび未処理の)集約例外をクラッシュとして報告できます。プロパティが 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);
...
C#

クラッシュレポートの無効化

クラッシュレポートはデフォルトで有効になっていますが、インストゥルメンテーション構成を使用して手動でクラッシュレポートを無効にできます。他のクラッシュレポートツールを使用している場合、競合を最小限に抑え、クラッシュレポートの結果を最適化するために、クラッシュレポートを無効にする場合があります。 

次に示すように、crashReportingEnabled プロパティを使用してインストゥルメンテーションを構成することにより、クラッシュレポートを無効にできます。

var config = AgentConfiguration.Create(<EUM_APP_KEY>);
config.CrashReportingEnabled = false;
Instrumentation.InitWithConfiguration(config);
C#

クラッシュ レポート コールバックの追加

コードの他の部分(Google アナリティクスなど)が Xamarin エージェントにより収集されるクラッシュレポート情報を使用できるようにすることがあります。サマリークラッシュ情報を渡すことができるようにするには、クラッシュレポートのランタイムコールバックを設定します。

  1. Xamarin エージェントがクラッシュを検出して報告したときにコールバックを取得するには、IAgentConfiguration インターフェイスの一部である次のイベントに登録します。

    event EventHandler<IEnumerable<CrashReportSummary>> OnCrash; 
    C#

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

たとえば、クラッシュ情報をコンソールに出力するには、次のように OnCrash イベントに登録できます。

IAgentConfiguration config = AgentConfiguration.Create(appKey);
config.OnCrash += (sender, crashReportSummaries) =&gt;
{
    foreach (var crashReportSummary in crashReportSummaries) {
        Console.WriteLine($"Crash Detected: {crashReportSummary.ExceptionName}: {crashReportSummary.ExceptionReason} ({crashReportSummary.ExceptionId})");
    }
};
Instrumentation.InitWithConfiguration(config); 
C#


プログラムによるセッションの制御

デフォルトでは、ユーザが非アクティブになってからモバイルセッションが終了します。たとえば、ユーザがアプリケーションを開くと、セッションは開始され、ユーザが設定した期間にアプリケーションを使用しなくなった後にのみ終了します。ユーザがアプリケーションの再使用を開始すると、新しいセッションが開始されます。 

ただし、セッションの期間を定義するのに非アクティブな期間を設定する代わりに、次の API を使用して、セッションの開始と終了をプログラムで制御できます。


static void AppDynamics.Agent.Instrumentation.StartNextSession()
C#

メソッド 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);
    }
}
C#

セッションフレームの開始と終了

ISessionFrame API を使用して、セッションアクティビティに表示されるセッションフレームを作成できます。セッションフレームは、セッション中にユーザが実行している内容のコンテキストを提供します。この API を使用すると、ユーザ画面の命名方法が向上し、ビジネスコンテキスト内のユーザフローを記録できます。 

使用例

次に、ISessionFrame API の一般的な使用例を示します。

  • 1 つの画面で複数の関数を実行し、個々の関数をより詳細に追跡する必要があります。
  • ユーザフローは、複数の画面またはユーザのインタラクションに及びます。たとえば、API を使用してセッションフレーム「Login」、「Product Selection」、および「Purchase」を作成して、ユーザが購入のためにフローを記録することができます。
  • ユーザの操作に基づいて動的情報をキャプチャし、オーダー ID などのセッションフレームに名前を付けることができます。

ISessionFrame API

次の表に、セッションフレームで使用できる 2 つのメソッドと 1 つのプロパティを示します。つまり、StartSessionFrame を使用してセッションフレームを開始してから、返された ISessionFrame オブジェクトを使用してセッションフレームの名前を変更し、終了します。 

クラスメソッド/プロパティ説明
Instrument

方式:

static ISessionFrame StartSessionFrame(string sessionFrameName)
C#

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

ISessionFrame

プロパティ:

string Name
C#

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

ISessionFrame

方式:

static void End()
C#

セッションフレームを終了します。
StartSessionFrame から返された ISessionFrame オブジェクトからこのメソッドを呼び出すことができます。

セッションフレームの例

次の例では、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();
        }
    }
}
CPP


ユーザデータの追加

重要なイベントや情報を記録するために、文字列のキー/値ペアを設定できます。ユーザデータを設定するためのメソッドの署名を以下に示します。


static void AppDynamics.Agent.Instrumentation.SetUserData(string key, string value)
C#

たとえば、ユーザのログインのためのメソッドが呼び出されたときにユーザ ID をログに記録することができます。

using AppDynamics.Agent;
...
void LogInUser(UserCredentials) {
   // Log in user
   ...
   // Set user data with the user name.
   Instrumentation.SetUserData("user_id", UserCredentials.ID);
}
C#

この情報は、[Network Request Analyze] で確認でき、取得可能なクラッシュスナップショットに追加されます。キーと値はそれぞれ 2048 文字に制限されています。

また、次のメソッドを使用して、他のタイプ(long、boolean、double、DateTime)の値をユーザデータに設定することもできます。

ユーザデータを削除するには、次のメソッドを使用します。

ログレベルの設定(オプション)

クラス AgentConfiguration の一部として、設定 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); 
C#

ネットワークリクエストに対応した URL の変換

ネットワーク要求のコールバックの実装

特定の URL を変更または無視するコールバックは、以下の Func デリゲートに割り当てる必要があります。 

コールバックメソッド OnNetworkRequest は同期されているため、関数からすばやく戻ることをお勧めします。

public Func<IHttpRequestTracker, bool> OnNetworkRequest { get; set; } 
C#

URL の変換

URL を変換するには、OnNetworkRequest メソッドで次の手順を実行する必要があります。

  1. 正規表現やパターンマッチングなどの手法を使用して、特定の URL を識別します。

    すべてのネットワークリクエストの URL を変換することもできるので、この最初の手順はオプションです。

  2. IHttpRequestTracker オブジェクトの URL プロパティを変更します。
  3. url プロパティに有効な URL を割り当てます。IHttpRequestTracker オブジェクトのその他のプロパティの変更は無視されます。
  4. true を返します。

次に例を示します。

public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
{
    var maskUrl = new Uri("http://networkrequest-mask.com/");
    tracker.Uri = maskUrl;
    return true;
}
C#
機密 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; 
}
C#

URL の無視

onNetworkRequest メソッドが false を返した場合、ビーコンはドロップされます。一般に、ビーコンを無視するプロセスは次のとおりです。

  1. 正規表現やパターンマッチングなどの手法を使用して、特定の URL を識別します。
  2. false を返します。

特定の URL を無視するには、モニタしないネットワークリクエストを識別し、false を返して、ネットワークリクエストを無視します。

次に例を示します。

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


すべてのネットワークリクエストを無視するには、次を実装します。

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

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

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

  1. コールバックを処理する独自のメソッドを定義します。

    public static bool NetworkRequestCallback(IHttpRequestTracker tracker)
    {
        return true; 
    }
    C#
  2. AgentConfiguration 初期化フェーズでそれを渡します。

    IAgentConfiguration config = AgentConfiguration.Create(appKey);
    config.OnNetworkRequest += NetworkRequestCallback; //Register the Callback
    Instrumentation.InitWithConfiguration(config);
    C#
  3. または、匿名関数を使用できます。

    IAgentConfiguration config = AgentConfiguration.Create(appKey);
    config.OnNetworkRequest += (IHttpRequestTracker tracker) =&gt;
    {
        return true; 
    };
    Instrumentation.InitWithConfiguration(config);
    C#

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

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

Instrumentation.TakeScreenshot();Disable Screenshots
C#

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

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

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

IAgentConfiguration config = AgentConfiguration.Create(appKey); config.ScreenshotsEnabled = false; Instrumentation.InitWithConfiguration(config);
C#

スクリーンショットのブロックとブロック解除

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(); 
	} 
}
C#

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);
    }
}
C#

UI 要素のトラッキング

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

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

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

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

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

    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>
TEXT

また、コードビハインド(xaml.cs ファイル)からプロパティをインストゥルメント化することもできます。

using AppDynamics.Agent.Forms;


...

var button = new Button();
button.SetValue(UiInstrumentation.IsInstrumentedProperty, true);
TEXT

IsInstrumented プロパティは、次のイベントをトラッキングします。

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

Xamarin SDK のドキュメント

SDK API の完全なマニュアルについては、次に示す最新の Xamarin SDK ドキュメントまたは以前のバージョンを参照してください。