次の方法で共有


カスタム テレメトリ シグナルを追加する

監視とテレメトリ機能が有効になっていると、テレメトリは Azure Application Insights に送信されます。 一部のテレメトリは初期設定で送信されます。 ただし、独自のカスタム テレメトリ シグナルを追加するための拡張機能を提供することもできます。 これらの信号は、カスタム プロセスに関するより多くの情報を提供できます。

テレメトリ ロガー

カスタム テレメトリをログするための主要なエントリ ポイントは、SysApplicationInsightsTelemetryLoggerクラスを使います。 このクラスは、Azure Application Insights テレメトリ クライアントをカプセル化し、イベント、ページ ビュー、追跡、例外、またはメトリックを追跡するために必要な操作へのアクセスを提供します。

ロガーは、静的コンストラクターパターンを使用して、ユーザー セッションごとに 1 つのシングルトン インスタンスを確保します。 カプセル化された Azure Application Insights テレメトリ クライアントはさらにキャッシュされ、Application Object Server (AOS) インスタンスごとに 1 つのテレメトリ クライアントしか作成されないようにします。

テレメトリ データ コントラクトのタイプ

現在、Microsoft Dynamics 365 Finance および Microsoft Dynamics 365 Supply Chain Management は、次のタイプのデータ コントラクトをサポートします。

タイプ X++ クラス Application Insights データ型
イベント SysApplicationInsightsEventTelemetry Microsoft.ApplicationInsights.DataContracts.EventTelemetry
PageView SysApplicationInsightsPageViewTelemetry Microsoft.ApplicationInsights.DataContracts.PageViewTelemetry
例外 SysApplicationInsightsExceptionTelemetry Microsoft.ApplicationInsights.DataContracts.ExceptionTelemetry
追跡 SysApplicationInsightsTraceTelemetry Microsoft.ApplicationInsights.DataContracts.TraceTelemetry

イベント

Azure Application Insights にカスタム イベントをログするには、SysApplicationInsightsEventTelemetry クラスのインスタンスを作成して必要なペイロードを渡すことができます。 その後、SysApplicationInsightsTelemetryLogger クラスの trackEvent メソッドを使用して、イベントを送信します。

次の例では、SysUserLog テーブルでレコードが作成された際にイベントを送信する方法を示します。

[PostHandlerFor(tableStr(SysUserLog), tableMethodStr(SysUserLog, insert))]
internal static void logUserLogOn(XppPrePostArgs _args)
{
    if(     SysIntParameters::Find().CaptureUserSessions
        &&  SysApplicationInsightsTelemetryHelper::useSysApplicationInsightsTelemetryLogger())
    {
        SysUserLog  sysUserLog = _args.getThis();
        UserInfo    userInfo;

        select firstonly RecId, ObjectId 
            from    userInfo 
            where   userInfo.id == sysUserLog.UserId;

        SysApplicationInsightsEventTelemetry eventTelemetry = SysApplicationInsightsEventTelemetry::newFromEventIdName('Admin001', 'UserLogOn');
        eventTelemetry.addProperty(SysApplicationInsightsUserIdProperty::newFromValue(sysUserLog.UserId));
        eventTelemetry.addProperty(SysApplicationInsightsUserObjectIdProperty::newFromValue(guid2Str(userInfo.ObjectId)));
        eventTelemetry.addProperty(SysApplicationInsightsUserLogBuildNumberProperty::newFromValue(sysUserLog.BuildNum));
        eventTelemetry.addProperty(SysApplicationInsightsUserLogSessionIdProperty::newFromValue(int2Str(sysUserLog.SessionId)));
        eventTelemetry.addProperty(SysApplicationInsightsUserLogBuildNumberProperty::newFromValue(sysUserLog.BuildNum));
        eventTelemetry.addProperty(SysApplicationInsightsComputerNameProperty::newFromValue(sysUserLog.Computername));

        SysApplicationInsightsTelemetryLogger::instance().trackEvent(eventTelemetry);
    }
}

ページ ビュー

既定で、Finance and Supply Chain Management は、アプリケーションで開かれたすべてのフォームをログする pageView エントリを使用しています。

[SubscribesTo(classStr(FormRun), staticDelegateStr(FormRun, onFormRunCompleted))]
public static void FormRun_onFormRunCompleted(FormRun _formInstance)
{
    if(     SysIntParameters::Find().CaptureFormRun
        &&  _formInstance.args()
        &&  _formInstance.args().menuItemName()
        &&  SysApplicationInsightsTelemetryHelper::useSysApplicationInsightsTelemetryLogger())
    {
        SysApplicationInsightsPageViewTelemetry pageTelemetry = SysApplicationInsightsPageViewTelemetry::newFromPageIdName(_formInstance.instanceId(), _formInstance.args().menuItemName(), _formInstance.lifecycleHelper().GetFormLoadingDuration());
        SysApplicationInsightsTelemetryLogger::instance().trackPageView(pageTelemetry);
    }
}

例外

次の例は、SysApplicationInsightsExceptionTelemetry 契約を使用して SysApplicationInsightsTelemetryLogger クラスの trackException メソッドを呼び出すことで、Azure Application Insights の例外を追跡する方法を示しています。

SysApplicationInsightsExceptionTelemetry exceptionTelemetry = SysApplicationInsightsExceptionTelemetry::newFromExceptionMessage(Args.getArg('txt'));
exceptionTelemetry.addProperty(SysApplicationInsightsClassNameProperty::newFromValue(classStr(Global)));
exceptionTelemetry.addProperty(SysApplicationInsightsMethodNameProperty::newFromValue(staticmethodStr(Global, Error)));
exceptionTelemetry.addProperty(SysApplicationInsightsCallStackProperty::newFromCurrentCallStack());

SysApplicationInsightsTelemetryLogger::instance().trackException(exceptionTelemetry);

メモ

前の例は SysApplicationInsightsGlobalTelemetry クラスのもので、情報ログに表示されるすべてのエラーは自動的に Azure Application Insights に送信されます。

トレース

次の例は、SysApplicationInsightsTraceTelemetry 契約を使用して SysApplicationInsightsTelemetryLogger クラスの trackTrace メソッドを呼び出すことで、Azure Application Insights の例外を追跡する方法を示しています。

SysApplicationInsightsTraceTelemetry traceTelemetry = SysApplicationInsightsTraceTelemetry::newFromMessageAndSeverity('My custom trace message', Microsoft.ApplicationInsights.DataContracts.SeverityLevel::Information);

SysApplicationInsightsTelemetryLogger::instance().trackTrace(traceTelemetry);

メトリック

メトリックとの対話は、前の例と異なります。 メトリックの場合は、特定のデータ契約を使用する必要はありません。 代わりに、trackMetric メソッドを使用して、SysApplicationInsightsTelemetryLogger クラスと直接対話できます。 ロガーは、最初に Azure Application Insights から既存のメトリック インスタンスを取得し、値を更新します。 trackMetricWithDimensions を使用して、分析コードとして使用するプロパティを追加できます。 その後、これらの分析コードに基づいて値をスライスできます。

パフォーマンス上の理由から、メトリックはローカルの事前集計を使用します。 この方法により、1 分の間に特定のメトリックに対する更新が Azure Application Insights に送信されます。 ローカルの事前集計の使用は、特定のメトリックに対する多くの更新が発生するバッチ処理シナリオで有益です。

メトリックの完全な概要は、Azure Monitor メトリックの概要で確認できます。