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

監視とテレメトリ機能をアクティブにすると、システムはテレメトリを Azure アプリケーション Insights に送信します。 システムは既定でテレメトリを送信しますが、独自のカスタム テレメトリ信号を追加することもできます。 これらのカスタム シグナルは、カスタム プロセスに関するより深い分析情報を提供できます。

テレメトリ ロガー

カスタム テレメトリをログに記録するには、 SysApplicationInsightsTelemetryLogger クラスを使用します。 このクラスは、Azure アプリケーション Insights テレメトリ クライアントをラップし、イベント、ページ ビュー、トレース、例外、メトリックを追跡するメソッドを提供します。

ロガーは 、静的コンストラクター パターン を使用して、ユーザー セッションごとに 1 つのインスタンスを確保します。 また、テレメトリ クライアントをキャッシュして、各 Application Object Server (AOS) インスタンスで使用されるテレメトリ クライアントが 1 つだけであることを確認します。

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

現在、Microsoft Dynamics 365 Finance と Microsoft Dynamics 365 Supply Chain Management では、次の種類のデータ コントラクトがサポートされています。

タイプ X++ クラス Application Insights データ型
Event SysApplicationInsightsEventTelemetry Microsoft.ApplicationInsights.DataContracts.EventTelemetry
ページビュー SysApplicationInsightsPageViewTelemetry Microsoft.ApplicationInsights.DataContracts.PageViewTelemetry
例外 SysApplicationInsightsExceptionTelemetry Microsoft.ApplicationInsights.DataContracts.ExceptionTelemetry
トレース SysApplicationInsightsTraceTelemetry Microsoft.ApplicationInsights.DataContracts.TraceTelemetry

Events

カスタム イベントを Azure アプリケーション Insights にログに記録するには、 SysApplicationInsightsEventTelemetry クラスのインスタンスを作成し、必要なペイロードを渡します。 次に、trackEvent クラスの SysApplicationInsightsTelemetryLogger メソッドを使用してイベントを送信します。

次の例は、 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 サプライ チェーン管理 では、 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 契約を使用して trackException クラスの SysApplicationInsightsTelemetryLogger メソッドを呼び出すことで、Azure アプリケーション 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);

Note

前の例は、 SysApplicationInsightsGlobalTelemetry クラスに由来しています。 このクラスは、Infolog に表示されるすべてのエラーを Azure アプリケーション Insights に自動的に送信します。

Traces

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

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

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

Metrics

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

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

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