├── DeveloperSamples ├── MonitoringAndTelemetryExtensionSample │ ├── obj │ │ └── Debug │ │ │ ├── TelemetryExtensionExample.rnrproj.FileListAbsolute.txt │ │ │ ├── TelemetryExtensionExample.rnrproj.AssemblyReference.cache │ │ │ └── MonitoringAndTelemetryExampleUsage.rnrproj.AssemblyReference.cache │ ├── UpgradeLog.htm │ ├── ScreenShots │ │ ├── BuildModel.png │ │ ├── RefreshAOT.png │ │ ├── MyTelemetryBase.png │ │ ├── LoggingTelemetry.png │ │ ├── ProjectStructure.png │ │ ├── ApplicationInsights.png │ │ ├── BuildRelevantModel.png │ │ ├── SynchronizeDatabase.png │ │ ├── TelemetryLogSettings.png │ │ ├── ConcreteTelemetryClass.png │ │ ├── HowToDisableParticularTelemetry.png │ │ └── FineGrainedControlwithinTheTelemetryClass.png │ ├── .vs │ │ ├── MonitoringAndTelemetryExampleUsage │ │ │ ├── v16 │ │ │ │ └── .suo │ │ │ ├── v17 │ │ │ │ ├── .suo │ │ │ │ └── DocumentLayout.json │ │ │ └── FileContentIndex │ │ │ │ ├── 118bd515-df8f-4dab-b780-fafbc7beed17.vsidx │ │ │ │ ├── b21a2757-388f-414e-93d6-1b4cebc6a290.vsidx │ │ │ │ ├── cd5ba14b-e4ef-43b2-84d3-eec1f6a38196.vsidx │ │ │ │ ├── e76af3b5-4af1-4c3e-bf6f-3842aff5fb07.vsidx │ │ │ │ └── fff87483-d25e-417e-9289-4d88e7bc2eec.vsidx │ │ └── TelemetryExtensionExample │ │ │ └── FileContentIndex │ │ │ └── 2a02b599-fb93-4df8-8af9-72a672677170.vsidx │ ├── bin │ │ ├── AxEdt │ │ │ └── MyTelemetryClass.xml │ │ ├── AxClass │ │ │ ├── MyApplicationInsightsEventIds.xml │ │ │ ├── MyApplicationInsightsEventNames.xml │ │ │ ├── MyApplicationInsightsProperty.xml │ │ │ ├── TelemetryPurchaseOrderConfirm.xml │ │ │ ├── TelemetryShipConfirm.xml │ │ │ ├── TelemetrySalesOrderConfirm.xml │ │ │ ├── DMFDefinitionGroupExecutionHistory_Extension.xml │ │ │ ├── WhsShipConfirm_Extension.xml │ │ │ ├── MyApplicationInsightsEventProperties.xml │ │ │ ├── MySysIntParametersFormEventHandler.xml │ │ │ ├── TelemetryDataManagementImport.xml │ │ │ └── MyTelemetryBase.xml │ │ ├── AxEnum │ │ │ └── MyTelemetrySeverityLevel.xml │ │ ├── AxTable │ │ │ └── MyTelemetryParameters.xml │ │ └── AxFormExtension │ │ │ └── SysIntParameters.MyExtension.xml │ ├── MonitoringAndTelemetryExampleUsage.sln │ ├── readme.md │ └── MonitoringAndTelemetryExampleUsage.rnrproj ├── README.md └── LICENSE ├── Dashboards └── AzureDataExplorer │ ├── img │ ├── 2EditName.png │ ├── 3Datasource.png │ ├── 1ImportSample.png │ ├── 5DatasourceSet.png │ └── 4DatasourceEdit.png │ ├── Errors │ ├── img │ │ ├── 2EditName.png │ │ ├── 3Datasource.png │ │ ├── 1ImportSample.png │ │ ├── 5DatasourceSet.png │ │ ├── 4DatasourceEdit.png │ │ └── ErrorsDashboard.png │ ├── readme.md │ └── dashboard-D365FO-Monitoring-Errors.json │ ├── Forms │ ├── img │ │ ├── 1ImportSample.png │ │ ├── 3Datasource.png │ │ ├── 2EditNameForms.png │ │ ├── 4DatasourceEdit.png │ │ ├── 5DatasourceSet.png │ │ └── FormsUsageDashboard.png │ ├── readme.md │ └── ADE-Dashboard-D365FO-Monitoring-Forms.json │ ├── DMF Errors │ ├── img │ │ ├── Dashboard.png │ │ ├── Datasources.png │ │ ├── EditDatasources.png │ │ ├── ImportDashboard.png │ │ ├── SubscriptionId.png │ │ └── SubscriptionIdAndDatasource.png │ ├── readme.md │ └── dashboard-DMF Errors.json │ ├── SlowQueries │ ├── img │ │ ├── 2EditName.png │ │ ├── 3Datasource.png │ │ ├── 1ImportSample.png │ │ ├── 5DatasourceSet.png │ │ ├── 4DatasourceEdit.png │ │ └── SlowQueriesDashboard1.png │ ├── readme.md │ └── ADE-Dashboard-D365FO-Monitoring-SlowQueries.json │ ├── readme.md │ └── Batch │ └── ADE-Dashboard-D365FO-Monitoring-Batch.json ├── SampleXppExtensions ├── readme.md ├── Metadata │ └── FTApplicationInsightsTelemetry │ │ ├── FTApplicationInsightsTelemetry │ │ └── AxClass │ │ │ ├── TestClass.xml │ │ │ └── SecondTestClass.xml │ │ └── Descriptor │ │ └── FTApplicationInsightsTelemetry.xml └── Projects │ └── FastTrackFscmTelemetrySamples │ ├── FastTrackFscmTelemetrySamples.sln │ └── Order2Cash │ └── Order2Cash.rnrproj ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── SUPPORT.md ├── SECURITY.md ├── README.md ├── FAQ.md └── KustoQueries └── SlowQueries.kql /DeveloperSamples/MonitoringAndTelemetryExtensionSample/obj/Debug/TelemetryExtensionExample.rnrproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /DeveloperSamples/README.md: -------------------------------------------------------------------------------- 1 | # D365-FO-MonitoringAndTelemetry-Samples 2 | This repository provides samples for utilizing D365 F&O Monitoring and Telemetry feature 3 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/img/2EditName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/img/2EditName.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/img/3Datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/img/3Datasource.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/img/1ImportSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/img/1ImportSample.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/img/5DatasourceSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/img/5DatasourceSet.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/2EditName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/2EditName.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/img/4DatasourceEdit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/img/4DatasourceEdit.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/3Datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/3Datasource.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/1ImportSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/1ImportSample.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/3Datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/3Datasource.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/Dashboard.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/1ImportSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/1ImportSample.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/5DatasourceSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/5DatasourceSet.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/2EditNameForms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/2EditNameForms.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/4DatasourceEdit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/4DatasourceEdit.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/5DatasourceSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/5DatasourceSet.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/2EditName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/2EditName.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/Datasources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/Datasources.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/4DatasourceEdit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/4DatasourceEdit.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/img/ErrorsDashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Errors/img/ErrorsDashboard.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/3Datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/3Datasource.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/EditDatasources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/EditDatasources.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/ImportDashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/ImportDashboard.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/SubscriptionId.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/SubscriptionId.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/img/FormsUsageDashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/Forms/img/FormsUsageDashboard.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/1ImportSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/1ImportSample.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/5DatasourceSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/5DatasourceSet.png -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/4DatasourceEdit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/4DatasourceEdit.png -------------------------------------------------------------------------------- /SampleXppExtensions/readme.md: -------------------------------------------------------------------------------- 1 | # FastTrack Dynamics 365 Finance and Supply Chain Management Monitoring and Telemetry extensions 2 | FastTrack Dynamics 365 Finance and Supply Chain Management Monitoring and Telemetry extensions -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/img/SlowQueriesDashboard1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/SlowQueries/img/SlowQueriesDashboard1.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/UpgradeLog.htm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/UpgradeLog.htm -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/img/SubscriptionIdAndDatasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/Dashboards/AzureDataExplorer/DMF Errors/img/SubscriptionIdAndDatasource.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/BuildModel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/BuildModel.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/RefreshAOT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/RefreshAOT.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/MyTelemetryBase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/MyTelemetryBase.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/LoggingTelemetry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/LoggingTelemetry.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ProjectStructure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ProjectStructure.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ApplicationInsights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ApplicationInsights.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/BuildRelevantModel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/BuildRelevantModel.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/SynchronizeDatabase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/SynchronizeDatabase.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/TelemetryLogSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/TelemetryLogSettings.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ConcreteTelemetryClass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/ConcreteTelemetryClass.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/v16/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/v16/.suo -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/v17/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/v17/.suo -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/HowToDisableParticularTelemetry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/HowToDisableParticularTelemetry.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/FineGrainedControlwithinTheTelemetryClass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/ScreenShots/FineGrainedControlwithinTheTelemetryClass.png -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/obj/Debug/TelemetryExtensionExample.rnrproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/obj/Debug/TelemetryExtensionExample.rnrproj.AssemblyReference.cache -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/obj/Debug/MonitoringAndTelemetryExampleUsage.rnrproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/obj/Debug/MonitoringAndTelemetryExampleUsage.rnrproj.AssemblyReference.cache -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/TelemetryExtensionExample/FileContentIndex/2a02b599-fb93-4df8-8af9-72a672677170.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/TelemetryExtensionExample/FileContentIndex/2a02b599-fb93-4df8-8af9-72a672677170.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/118bd515-df8f-4dab-b780-fafbc7beed17.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/118bd515-df8f-4dab-b780-fafbc7beed17.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/b21a2757-388f-414e-93d6-1b4cebc6a290.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/b21a2757-388f-414e-93d6-1b4cebc6a290.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/cd5ba14b-e4ef-43b2-84d3-eec1f6a38196.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/cd5ba14b-e4ef-43b2-84d3-eec1f6a38196.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/e76af3b5-4af1-4c3e-bf6f-3842aff5fb07.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/e76af3b5-4af1-4c3e-bf6f-3842aff5fb07.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/fff87483-d25e-417e-9289-4d88e7bc2eec.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples/HEAD/DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/FileContentIndex/fff87483-d25e-417e-9289-4d88e7bc2eec.vsidx -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxEdt/MyTelemetryClass.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | MyTelemetryClass 5 | 8 | 9 | 10 | 11 | 100 12 | -------------------------------------------------------------------------------- /SampleXppExtensions/Metadata/FTApplicationInsightsTelemetry/FTApplicationInsightsTelemetry/AxClass/TestClass.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TestClass 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /SampleXppExtensions/Metadata/FTApplicationInsightsTelemetry/FTApplicationInsightsTelemetry/AxClass/SecondTestClass.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SecondTestClass 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /SampleXppExtensions/Projects/FastTrackFscmTelemetrySamples/.vs 6 | /SampleXppExtensions/Projects/FastTrackFscmTelemetrySamples/Order2Cash/obj/Debug 7 | /SampleXppExtensions/Metadata/FTApplicationInsightsTelemetry/XppMetadata 8 | /.vs 9 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MyApplicationInsightsEventIds.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyApplicationInsightsEventIds 4 | 5 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MyApplicationInsightsEventNames.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyApplicationInsightsEventNames 4 | 5 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /SampleXppExtensions/Projects/FastTrackFscmTelemetrySamples/FastTrackFscmTelemetrySamples.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.8.34322.80 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FC65038C-1B2F-41E1-A629-BED71D161FFF}") = "Order2Cash (USR) [FTApplicationInsightsTelemetry]", "Order2Cash\Order2Cash.rnrproj", "{A24B055C-A29A-4198-AA06-F62C9471F635}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | EndGlobalSection 12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 13 | {A24B055C-A29A-4198-AA06-F62C9471F635}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 14 | {A24B055C-A29A-4198-AA06-F62C9471F635}.Debug|Any CPU.Build.0 = Debug|Any CPU 15 | EndGlobalSection 16 | GlobalSection(SolutionProperties) = preSolution 17 | HideSolutionNode = FALSE 18 | EndGlobalSection 19 | GlobalSection(ExtensibilityGlobals) = postSolution 20 | SolutionGuid = {A9A4A4C2-DD6A-4001-9B15-90EA91FCF4A4} 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/MonitoringAndTelemetryExampleUsage.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.10.35004.147 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FC65038C-1B2F-41E1-A629-BED71D161FFF}") = "MonitoringAndTelemetryExampleUsage (SYS) [Application Suite]", "MonitoringAndTelemetryExampleUsage.rnrproj", "{7A2363FB-28BD-4203-BDDC-661CC58FBC68}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | EndGlobalSection 12 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 13 | {7A2363FB-28BD-4203-BDDC-661CC58FBC68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 14 | {7A2363FB-28BD-4203-BDDC-661CC58FBC68}.Debug|Any CPU.Build.0 = Debug|Any CPU 15 | EndGlobalSection 16 | GlobalSection(SolutionProperties) = preSolution 17 | HideSolutionNode = FALSE 18 | EndGlobalSection 19 | GlobalSection(ExtensibilityGlobals) = postSolution 20 | SolutionGuid = {86B94DEA-DDB4-40C8-89F3-6F762E52161C} 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /DeveloperSamples/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 HemanthKumar-H 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxEnum/MyTelemetrySeverityLevel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyTelemetrySeverityLevel 4 | 5 | MyTelemetrySeverityLevelHelp 6 | 7 | 10 | 11 | 12 | Verbose 13 | 16 | 1 17 | 18 | 19 | Information 20 | 23 | 2 24 | 25 | 26 | Warning 27 | 30 | 3 31 | 32 | 33 | Error 34 | 37 | 4 38 | 39 | 40 | Critical 41 | 44 | 5 45 | 46 | 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MyApplicationInsightsProperty.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyApplicationInsightsProperty 4 | 5 | 7 | /// Concrete class for Application Insights message payload properties. 8 | /// 9 | public final class MyApplicationInsightsProperty extends SysApplicationInsightsProperty 10 | { 11 | private str key; 12 | private SysApplicationInsightsComplianceDataType dataType; 13 | 14 | } 15 | ]]> 16 | 17 | 18 | new 19 | 29 | 30 | 31 | initialize 32 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/readme.md: -------------------------------------------------------------------------------- 1 | # AOS Slow Query Telemetry dasboard 2 | This dashboard shows information about slow queries that are reported by the AOS. Using this dashboard, it is possible to: 3 | - Measure the number of slow queries over time. 4 | - List slow by their duration. 5 | - Investigate slow queries based on location. 6 | 7 | ## Dashboard overview 8 | 9 |
10 | 11 | ## Steps to import the sample dashboard: 12 | 1. Import the file "ADE-Dashboard-D365FO-Monitoring-SlowQueries.json". 13 | 14 |
15 | 16 | 2. Name the dashboard appropriately. 17 | 18 |
19 | 20 | 3. Click to select datasources. 21 | 22 |
23 | 24 | 4. There is a templated datasource with dummy placeholders. You need to replace with your Azure subscription, resource group and Application Insights instance. 25 | 26 |
27 |
-------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/readme.md: -------------------------------------------------------------------------------- 1 | # Azure Data Explorer sample dashboards 2 | 3 | 4 | | Dashboard | Description | Take me there (use CTRL+click to open in a new tab) | 5 | | ------ | ------ | ------ | 6 | | Slow queries | Slow queries reported by the AOS. | [Slow Queries](SlowQueries) | 7 | | Form usage | Form usage telemetry. | [Form Usage](Forms) | 8 | | Errors | Errors reported by the envioronments. | [Errors](Errors) | 9 | 10 | ## Steps to import the sample dashboard: 11 | 1. Import the file (e.g "ADE-Dashboard-D365FO-Monitoring-SlowQueries.json"). 12 | 13 |
14 | 15 | 2. Name the dashboard appropriately. 16 | 17 |
18 | 19 | 3. Click to select datasources. 20 | 21 |
22 | 23 | 4. There is a templated datasource with dummy placeholders. You need to replace with your Azure subscription, resource group and Application Insights instance. 24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # TODO: The maintainer of this repo has not yet edited this file 2 | 3 | **REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? 4 | 5 | - **No CSS support:** Fill out this template with information about how to file issues and get help. 6 | - **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. 7 | - **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. 8 | 9 | *Then remove this first heading from this SUPPORT.MD file before publishing your repo.* 10 | 11 | # Support 12 | 13 | ## How to file issues and get help 14 | 15 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 16 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 17 | feature request as a new Issue. 18 | 19 | For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE 20 | FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER 21 | CHANNEL. WHERE WILL YOU HELP PEOPLE?**. 22 | 23 | ## Microsoft Support Policy 24 | 25 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 26 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/readme.md: -------------------------------------------------------------------------------- 1 | # Errors Telemetry dasboard 2 | This dashboard shows information about errors that are reported by the environments. Using this dashboard, it is possible to: 3 | - Investigate the nature and distributiion of the errors over time. 4 | - Review the errors in the envirionemnts 5 | - Revire the source of errors, gruppong them by legal entity, reer type and users 6 | 7 | ## Dashboard overview 8 | 9 |
10 | 11 | ## Steps to import the sample dashboard: 12 | 1. Import the file "dashboard-D365FO-Monitoring-Errors.json". 13 | 14 |
15 | 16 | 2. Name the dashboard appropriately. 17 | 18 |
19 | 20 | 3. Click to select datasources. 21 | 22 |
23 | 24 | 4. There is a templated datasource with dummy placeholders. You need to replace with your Azure subscription, resource group and Application Insights instance. 25 | 26 |
27 |
28 | -------------------------------------------------------------------------------- /SampleXppExtensions/Metadata/FTApplicationInsightsTelemetry/Descriptor/FTApplicationInsightsTelemetry.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Allow 5 | 6 | FTApplicationInsightsTelemetry 7 | 896000533 8 | 9 | 14 10 | false 11 | FTApplicationInsightsTelemetry 12 | 14 | 15 | ApplicationCommon 16 | ApplicationFoundation 17 | ApplicationPlatform 18 | ApplicationSuite 19 | 20 | FTApplicationInsightsTelemetry 21 | Microsoft Dynamics 365 FastTrack 22 | 00000000-0000-0000-0000-000000000000 23 | 0 24 | 1 25 | 0 26 | 0 27 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/readme.md: -------------------------------------------------------------------------------- 1 | # Form Load and Plugin Dashboard 2 | This dashboard shows information about DMF errors and distribution of DMF errors in your solution. Using this dashboard, it is possible to identify: 3 | - Distribution of different eror types in your solution. error code description here : https://review.learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/data-entities/dm-error-descriptions 4 | - ExecutionId, ActivityId and other details for the errors in DMF 5 | - Error message 6 | 7 | ## Dashboard overview 8 | 9 |
10 | 11 | ## Steps to import the sample dashboard: 12 | 1. Import the file "dashboard-DMF Errors.json". 13 | 14 |
15 | 16 | 2. Name the dashboard appropriately and then click to select datasources 17 | 18 |
19 | 20 | 3. In the Datasource selection pane you have to put your Azure Application Insights subscriptionID in the placeholder . 21 | 22 |
23 |
24 | 25 | 4. After updating the correct subscriptionID. click on connect. 26 | 27 | 5. You will get a list of databases. Select your ApplicationInsights name from that list and save changes. 28 | 29 | 6. your dashboard should have data now. Feel free to edit the queries to suit your needs. 30 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/readme.md: -------------------------------------------------------------------------------- 1 | # Forms usage dashboard 2 | This dashboard shows information about form usage in Dynacmis 365 Finance and SCM. Using this dashboard, it is possible to: 3 | - Investigate the most used forms in the environment with the ability to filter on a specific user, form name or activity id. 4 | - Review the opening times of the forms and find out what forms are slowest. 5 | - Review trends of the curent form loading times over the last 14 / 30 days. 6 | - Review individual opening times based on specific activities. 7 | 8 | ## Dashboard overview 9 | Note: the "Interaction difference" column can be used to identify forms that never complete the initialization. 10 |
11 | 12 | ## Steps to import the sample dashboard: 13 | 1. Import the file "ADE-Dashboard-D365FO-Monitoring-Forms.json". 14 | 15 |
16 | 17 | 2. Name the dashboard appropriately. 18 | 19 |
20 | 21 | 3. Click to select datasources. 22 | 23 |
24 | 25 | 4. There is a templated datasource with dummy placeholders. You need to replace with your Azure subscription, resource group and Application Insights instance. 26 | 27 |
28 |
29 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/TelemetryPurchaseOrderConfirm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TelemetryPurchaseOrderConfirm 4 | 5 | 7 | /// TelemetryPurchaseOrderConfirm class extending methods of MyTelemetryBase class 8 | /// 9 | final class TelemetryPurchaseOrderConfirm extends MyTelemetryBase 10 | { 11 | private PurchTable purchTable; 12 | 13 | } 14 | ]]> 15 | 16 | 17 | new 18 | 26 | 27 | 28 | shouldLogEvent 29 | 36 | 37 | 38 | populateProperties 39 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/TelemetryShipConfirm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TelemetryShipConfirm 4 | 5 | 7 | /// TelemetryShipConfirm class extending methods of MyTelemetryBase class 8 | /// 9 | final class TelemetryShipConfirm extends MyTelemetryBase 10 | { 11 | private WHSLoadTable load; 12 | 13 | } 14 | ]]> 15 | 16 | 17 | new 18 | 27 | 28 | 29 | shouldLogEvent 30 | 37 | 38 | 39 | populateProperties 40 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/TelemetrySalesOrderConfirm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TelemetrySalesOrderConfirm 4 | 5 | 7 | /// TelemetrySalesOrderConfirm class extending methods of MyTelemetryBase class 8 | /// 9 | final class TelemetrySalesOrderConfirm extends MyTelemetryBase 10 | { 11 | private SalesTable salesTable; 12 | private str error; 13 | } 14 | ]]> 15 | 16 | 17 | new 18 | 32 | 33 | 34 | shouldLogEvent 35 | MyTelemetrySeverityLevel::Information) 39 | { 40 | return false; 41 | } 42 | 43 | return true; 44 | } 45 | 46 | ]]> 47 | 48 | 49 | populateProperties 50 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/DMFDefinitionGroupExecutionHistory_Extension.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | DMFDefinitionGroupExecutionHistory_Extension 4 | 5 | 7 | /// DMFDefinitionGroupExecutionHistory_Extension Table extension 8 | /// 9 | [ExtensionOf(tableStr(DMFDefinitionGroupExecutionHistory))] 10 | final class DMFDefinitionGroupExecutionHistory_Extension 11 | { 12 | } 13 | ]]> 14 | 15 | 16 | insertExecutionHistory 17 | 19 | /// Insert execution history 20 | /// 21 | /// DMFDefinitionGroupExecution record 22 | public void insertExecutionHistory(DMFDefinitionGroupExecution _definitionGroupExecution) 23 | { 24 | next insertExecutionHistory(_definitionGroupExecution); 25 | 26 | DMFDefinitionGroupExecution dmfDefinitionGroupExecution = DMFDefinitionGroupExecution::find(_definitionGroupExecution.DefinitionGroup,_definitionGroupExecution.Entity,_definitionGroupExecution.ExecutionId); 27 | DMFDefinitionGroupExecutionHistory dmfDefinitionGroupExecutionHistory = DMFDefinitionGroupExecutionHistory::find(dmfDefinitionGroupExecution.DefinitionGroup, dmfDefinitionGroupExecution.Entity, 28 | dmfDefinitionGroupExecution.ExecutionId, dmfDefinitionGroupExecution.WriteStartDateTime, true); 29 | 30 | // Add any other conditions to log only for the entities you want here. 31 | if (dmfDefinitionGroupExecutionHistory.RecId) 32 | { 33 | new TelemetryDataManagementImport(dmfDefinitionGroupExecutionHistory.WriteStartDateTime, dmfDefinitionGroupExecutionHistory.WriteEndDateTime, dmfDefinitionGroupExecutionHistory).processEvent(MyApplicationInsightsEventNames::DMFDefinitionGroupExecutionHistory); 34 | } 35 | } 36 | 37 | ]]> 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/WhsShipConfirm_Extension.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | WhsShipConfirm_Extension 4 | 5 | 7 | /// Extension for the class WhsShipConfirm. 8 | /// 9 | [ExtensionOf(classStr(WhsShipConfirm))] 10 | final class WhsShipConfirm_Extension 11 | { 12 | } 13 | ]]> 14 | 15 | 16 | shipConfirm 17 | 19 | /// Wrapper to WhsShipConfirm.shipConfirm(WHSLoadId loadId). Insert your logic around shipConfirm here. 20 | /// 21 | /// loadId value 22 | public void shipConfirm(WHSLoadId loadId) 23 | { 24 | // Generate telemetry after the shipConfirm operation 25 | WHSLoadTable loadTable = WHSLoadTable::find(loadId); 26 | var telemetry = new TelemetryShipConfirm(loadTable); 27 | 28 | try 29 | { 30 | // Call the original shipConfirm method 31 | next shipConfirm(loadId); 32 | } 33 | catch (Exception::Deadlock) 34 | { 35 | retry; 36 | } 37 | catch (Exception::UpdateConflict) 38 | { 39 | if (appl.ttsLevel() == 0) 40 | { 41 | // Define the retry count globally. 42 | var retryCount = 3; 43 | if (xSession::currentRetryCount() >= retryCount) 44 | { 45 | throw Exception::UpdateConflictNotRecovered; 46 | } 47 | else 48 | { 49 | retry; 50 | } 51 | } 52 | else 53 | { 54 | throw Exception::UpdateConflict; 55 | } 56 | } 57 | catch (Exception::Error) 58 | { 59 | throw Exception::Error; 60 | } 61 | 62 | telemetry.processEvent(MyApplicationInsightsEventNames::WHSShipConfirm); 63 | } 64 | 65 | ]]> 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MyApplicationInsightsEventProperties.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyApplicationInsightsEventProperties 4 | 5 | 7 | /// The MyApplicationInsightsEventProperties class contains all available event properties that can be used in the Application Insights telemetry. 8 | /// 9 | /// 10 | /// The names must be unique. 11 | /// Please keep the list sorted alphabetically in ascending order. 12 | /// 13 | internal static final class MyApplicationInsightsEventProperties 14 | { 15 | internal static const str InventLocationId = 'inventLocationId'; 16 | internal static const str LoadId = 'loadId'; 17 | internal static const str LoadStatus = 'loadStatus'; 18 | internal static const str NumOfLines = 'numOfLines'; 19 | internal static const str SalesId = 'salesId'; 20 | internal static const str CustAccount = 'custAccount'; 21 | internal static const str SalesStatus = 'salesStatus'; 22 | internal static const str DeliveryDate = 'deliveryDate'; 23 | internal static const str PurchId = 'PurchId'; 24 | internal static const str VendorName = 'vendorName'; 25 | internal static const str PurchStatus = 'PurchStatus'; 26 | internal static const str ElapsedMilliseconds = 'ElapsedMilliseconds'; 27 | internal static const str DefinitionGroup = 'DefinitionGroup'; 28 | internal static const str Entity = 'Entity'; 29 | internal static const str ExecutionId = 'ExecutionId'; 30 | internal static const str NoOfRecords = 'NoOfRecords'; 31 | internal static const str NumOfTargetNew = 'NumOfTargetNew'; 32 | internal static const str NumOfTargetUpdated = 'NumOfTargetUpdated'; 33 | 34 | } 35 | ]]> 36 | 37 | 38 | -------------------------------------------------------------------------------- /SampleXppExtensions/Projects/FastTrackFscmTelemetrySamples/Order2Cash/Order2Cash.rnrproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | $(MSBuildProgramFiles32)\MSBuild\Microsoft\Dynamics\AX 7 | FTApplicationInsightsTelemetry 8 | v4.6 9 | bin 10 | 2.0 11 | True 12 | False 13 | False 14 | False 15 | {a24b055c-a29a-4198-aa06-f62c9471f635} 16 | Order2Cash 17 | Order2Cash 18 | 19 | 20 | Debug 21 | False 22 | False 23 | 24 | 25 | initial 26 | AnyCPU 27 | False 28 | False 29 | 30 | 31 | true 32 | false 33 | 34 | 35 | 36 | 37 | 38 | 39 | Content 40 | SecondTestClass 41 | Classes\SecondTestClass 42 | 43 | 44 | Content 45 | TestClass 46 | Classes\TestClass 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MySysIntParametersFormEventHandler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MySysIntParametersFormEventHandler 4 | 5 | 10 | 11 | 12 | SysIntParameters_OnInitializing 13 | 15 | /// 16 | /// 17 | /// 18 | /// 19 | [FormEventHandler(formStr(SysIntParameters), FormEventType::Initializing)] 20 | public static void SysIntParameters_OnInitializing(xFormRun sender, FormEventArgs e) 21 | { 22 | 23 | #define.ClassPath(@"\Classes\%1") 24 | 25 | SysDictClass dictClass; 26 | List extendedClassList; 27 | ListEnumerator listEnumerator; 28 | ClassName className; 29 | // MethodName methodName; 30 | ClassId childClass; 31 | TreeNode childClassNode; 32 | TreeNode methodNode; 33 | int numberofMethods; 34 | MyTelemetryParameters param; 35 | 36 | //set parent class and method you want to investigate 37 | className = classStr(MyTelemetryBase); 38 | //methodName = "DefaultDimension"; 39 | 40 | dictClass = new SysDictClass(className2Id(classname)); 41 | extendedClassList = dictClass.extendedBy(); 42 | 43 | //loop through all child classes 44 | if (extendedClassList.elements()) 45 | { 46 | listEnumerator = extendedClassList.getEnumerator(); 47 | 48 | setprefix(strfmt("Class %1 extended by %2 classes.", className, int2str(extendedClassList.elements()))); 49 | 50 | while (listEnumerator.moveNext()) 51 | { 52 | childClass = listEnumerator.current(); 53 | childClassNode = TreeNode::findNode(strFmt(#ClassPath, classId2Name(childClass))); 54 | 55 | param = MyTelemetryParameters::find(childClassNode.AOTname()); 56 | 57 | if(!param) 58 | { 59 | ttsbegin; 60 | param.clear(); 61 | param.TelemetryClass = childClassNode.AOTname(); 62 | param.IsEnabled = NoYes::Yes; 63 | param.SeverityLevel = MyTelemetrySeverityLevel::Information; 64 | param.insert(); 65 | ttscommit; 66 | } 67 | 68 | } 69 | 70 | } 71 | 72 | } 73 | 74 | ]]> 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/TelemetryDataManagementImport.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TelemetryDataManagementImport 4 | 5 | 7 | /// TelemetryDataManagementImport class log monitoring and telemetry custom events/metrics 8 | /// 9 | internal final class TelemetryDataManagementImport extends MyTelemetryBase 10 | { 11 | private DMFDefinitionGroupExecutionHistory dmfDefinitionGroupExecutionHistory; 12 | private TransDateTime executionStartTime; 13 | private TransDateTime executionEndTime; 14 | } 15 | ]]> 16 | 17 | 18 | new 19 | 29 | 30 | 31 | shouldLogEvent 32 | 39 | 40 | 41 | populateProperties 42 | 44 | /// populate telemetry entries to a map 45 | /// 46 | protected void populateProperties() 47 | { 48 | // We don't have to call the SetElapsedMilliSeconds() because we are getting the execution time from the table entry 49 | // this.setElapsedMilliseconds(); 50 | this.addBaseProperty(MyApplicationInsightsEventProperties::ElapsedMilliseconds, int642Str(DateTimeUtil::getDifference(executionEndTime, executionStartTime))); 51 | this.addBaseProperty(MyApplicationInsightsEventProperties::DefinitionGroup, dmfDefinitionGroupExecutionHistory.DefinitionGroup); 52 | this.addBaseProperty(MyApplicationInsightsEventProperties::Entity, dmfDefinitionGroupExecutionHistory.Entity); 53 | this.addBaseProperty(MyApplicationInsightsEventProperties::ExecutionId,dmfDefinitionGroupExecutionHistory.ExecutionId); 54 | this.addBaseProperty(MyApplicationInsightsEventProperties::NoOfRecords, int2Str(dmfDefinitionGroupExecutionHistory.NoOfRecords)); 55 | this.addBaseProperty(MyApplicationInsightsEventProperties::NumOfTargetNew,int2Str(dmfDefinitionGroupExecutionHistory.NumOfTargetNew)); 56 | this.addBaseProperty(MyApplicationInsightsEventProperties::NumOfTargetUpdated, int2Str(dmfDefinitionGroupExecutionHistory.NumOfTargetUpdated)); 57 | } 58 | 59 | ]]> 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/DMF Errors/dashboard-DMF Errors.json: -------------------------------------------------------------------------------- 1 | {"$schema":"https://dataexplorer.azure.com/static/d/schema/52/dashboard.json","id":"89761c3b-a802-4534-aa7d-e7cb2db490d5","eTag":"3bf0e6bb-a64d-4b2b-b57a-3a05db82696f","schema_version":"52","title":"DMF Errors","tiles":[{"id":"2f74841a-4b62-4aef-8aac-2df41a21efb5","title":"Error Details","visualType":"table","pageId":"07635b92-9701-4700-9ae6-03bc525ab964","layout":{"x":0,"y":0,"width":24,"height":6},"queryRef":{"kind":"query","queryId":"c8611372-c4f8-4a36-ad38-3bfc551d0d5a"},"visualOptions":{"table__enableRenderLinks":true,"colorRulesDisabled":true,"colorStyle":"light","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[],"colorRules":[]}},{"id":"69a806cc-6c58-46aa-906b-f93085c93be1","title":"ErrorCode distribution","visualType":"pie","pageId":"07635b92-9701-4700-9ae6-03bc525ab964","layout":{"x":0,"y":6,"width":24,"height":6},"queryRef":{"kind":"query","queryId":"7be0a00e-e0cf-4929-9547-17d6cf130eb4"},"visualOptions":{"hideLegend":false,"legendLocation":"bottom","xColumn":null,"yColumns":null,"seriesColumns":null,"crossFilterDisabled":false,"drillthroughDisabled":false,"labelDisabled":false,"pie__label":["name","percentage"],"tooltipDisabled":false,"pie__tooltip":["name","percentage","value"],"pie__orderBy":"size","pie__kind":"pie","pie__topNSlices":null,"crossFilter":[],"drillthrough":[]}}],"baseQueries":[],"parameters":[{"kind":"duration","id":"143d3262-e5e4-4679-982f-0d6d6cf7e017","displayName":"Time range","description":"","beginVariableName":"_startTime","endVariableName":"_endTime","defaultValue":{"kind":"dynamic","count":1,"unit":"hours"},"showOnPages":{"kind":"all"}}],"dataSources":[{"id":"06857df7-cec1-4268-8039-f1c5d0168189","kind":"manual-kusto","scopeId":"kusto","name":"DMF-Errors","clusterUri":"https://ade.applicationinsights.io/subscriptions/","database":""}],"pages":[{"name":"Page 1","id":"07635b92-9701-4700-9ae6-03bc525ab964"}],"queries":[{"dataSource":{"kind":"inline","dataSourceId":"06857df7-cec1-4268-8039-f1c5d0168189"},"text":"customEvents\n| where customDimensions.JsonAttributes contains \"DMF\" and customDimensions.Message startswith \"Message:\"\n| extend cd = parse_json(tostring(customDimensions))\n| extend jsonAttrs = parse_json(tostring(cd.JsonAttributes))\n| project\n timestamp,\n name,\n DataProjectId = cd.DataProjectId,\n EntityName = cd.EntityName,\n ExecutionId = cd.ExecutionId,\n Message = cd.Message,\n ActivityId = cd.activityId,\n dixfActivityId = cd.dixfActivityId,\n ErrorCode = jsonAttrs.ErrorCode\n","id":"c8611372-c4f8-4a36-ad38-3bfc551d0d5a","usedVariables":[]},{"dataSource":{"kind":"inline","dataSourceId":"06857df7-cec1-4268-8039-f1c5d0168189"},"text":"customEvents\n| where customDimensions.JsonAttributes contains \"DMF\" and customDimensions.Message startswith \"Message:\"\n| extend cd = parse_json(tostring(customDimensions))\n| extend jsonAttrs = parse_json(tostring(cd.JsonAttributes))\n| summarize Count = count() by ErrorCode = tostring(jsonAttrs.ErrorCode)\n| order by Count desc\n| render piechart\n\n\n","id":"7be0a00e-e0cf-4929-9547-17d6cf130eb4","usedVariables":[]}]} -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxTable/MyTelemetryParameters.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyTelemetryParameters 4 | 5 | 6 | 11 | 12 | 13 | 14 | find 15 | 16 | 36 | 37 | 38 | 39 | 40 | 43 | 44 | Allow 45 | 46 | TelemetryClass 47 | Yes 48 | FoundAndEmpty 49 | 50 | 51 | 52 | AutoReport 53 | 54 | 55 | 56 | AutoLookup 57 | 58 | 59 | 60 | AutoIdentification 61 | Yes 62 | 63 | 64 | 65 | AutoSummary 66 | 67 | 68 | 69 | AutoBrowse 70 | 71 | 72 | 73 | TelemetryFields 74 | 75 | 76 | TelemetryClass 77 | 78 | 79 | IsEnabled 80 | 81 | 82 | SeverityLevel 83 | 84 | 85 | 86 | 87 | 88 | 90 | TelemetryClass 91 | MyTelemetryClass 92 | Yes 93 | 94 | 96 | IsEnabled 97 | NoYes 98 | 99 | 101 | SeverityLevel 102 | MyTelemetrySeverityLevel 103 | 104 | 105 | 106 | 107 | 108 | TelemetryClass 109 | 110 | 111 | TelemetryClass 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dynamics-365-FastTrack-FSCM-Telemetry-Samples 2 | Sample extensions for Dynamics 365 Finance and Supply Chain Management to bootstrap teams wanting to start emitting telemetry for SCM related processes. 3 | 4 | # Finance and Supply Chain Management Monitoring and Telemetry using Application Insights 5 | The monitoring and telemetry feature in finance and operations apps is a direct, point-to-point integration between an instance of a 6 | finance and operations app and the target Application Insights destination. This feature lets developers and admins triage and resolve 7 | application issues in near-real time. The telemetry that's generated isn't collected by Microsoft for support or other operational reporting. 8 | Instead, the data is customer owned and customer driven. 9 | 10 | Get started by following the documentation on MSLearn: [Monitoring and telemetry using Application Insights](https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/sysadmin/monitoring-and-telemetry-appinsights) 11 | 12 | For specific guidelines on Warehouse Management telemetry, documentation can be found on MSLearn: 13 | - [Enable warehousing telemetry with Application Insights](https://learn.microsoft.com/en-us/dynamics365/supply-chain/warehousing/application-insights-warehousing) 14 | - [Monitor Warehouse Management usage and performance](https://learn.microsoft.com/en-us/dynamics365/supply-chain/warehousing/application-insights-monitor-usage-performance) 15 | 16 | # What resources can I find in this repository? 17 | This repository contains instructions on how to gather telemetry from Dynamics 365 Supply Chain Management product. 18 | 19 | | Area | Description | Take me there (use CTRL+click to open in a new tab) | 20 | | ------ | ------ | ------ | 21 | | SampleXppExtensions | Root folder for the Dynamics 365 X++ artifacts providing sample source code emitting telemetry | [Sample Xpp Extensions ](SampleXppExtensions) | 22 | | Kusto queries | A repository of queries to consult Application Insights telemetry | [Kusto queries](KustoQueries) | 23 | | Dashboards\Azure Data Explorer | Making interactive dashboards in Azure Data Explorer with data from Azure Application Insights | [Azure Data Explorer dashboards](Dashboards/AzureDataExplorer/) | 24 | 25 | ## Contributing 26 | 27 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 28 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 29 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 30 | 31 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 32 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 33 | provided by the bot. You will only need to do this once across all repos using our CLA. 34 | 35 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 36 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 37 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 38 | 39 | ## Trademarks 40 | 41 | This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft 42 | trademarks or logos is subject to and must follow 43 | [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). 44 | Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. 45 | Any use of third-party trademarks or logos are subject to those third-party's policies. -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/readme.md: -------------------------------------------------------------------------------- 1 | # Dynamics 365 FastTrack FSCM Telemetry Samples - TelemetryExtensionExample 2 | 3 | This folder contains sample code and guidelines for implementing telemetry in Dynamics 365 Finance and Supply Chain Management (FSCM). The samples are intended to help customers utilize telemetry to monitor and optimize their D365 applications. The code is provided As-is to customer usage. No gaurentees are provided 4 | 5 | ## Table of Contents 6 | 7 | - [Introduction](#introduction) 8 | - [Prerequisites](#prerequisites) 9 | - [Installation](#installation) 10 | - [Usage](#usage) 11 | - [Contributing](#contributing) 12 | - [License](#license) 13 | 14 | ## Introduction 15 | 16 | This project provides sample implementations of telemetry in D365 FSCM. It includes creation of a telemetry Base class to demonstrate how to utilize SysApplicationInsightsTelemetryLogger to log Events/metrics/traces with properties to ApplicationInsights. It also includes an extension to the MonitoringAndTelemetry module to control the granularity of logging to Application Insights. 17 | 18 | ## Prerequisites 19 | 20 | - Dynamics 365 Finance and Supply Chain Management environment 21 | - Visual Studio 2019 or later 22 | - .NET Framework 4.7.2 or later 23 | - Access to Azure Application Insights 24 | 25 | ## Installation 26 | 27 | 1. Clone the repository: 28 | 29 | ```bash 30 | git clone https://github.com/microsoft/Dynamics-365-FastTrack-FSCM-Telemetry-Samples.git 31 | cd Dynamics-365-FastTrack-FSCM-Telemetry-Samples\SampleXppExtensions\Projects\FastTrackFscmTelemetrySamples 32 | ``` 33 | 34 | 2. Open the solution in Visual Studio in adminstrator mode and open FastTrackFscmTelemetrySamples.sln: 35 | 36 | Create the classes, enums, tables for the code under "\TelemetryExtensionExample\bin" 37 | The project structure will look like 38 | ![My project structure](ScreenShots/ProjectStructure.png) 39 | 40 | 3. Once you create all the dependencies of the project, build the project. Once the Project is successfully build, Synchronize the database as we are adding new tables and then refresh AOT 41 | ![Refresh AOT](ScreenShots/SynchronizeDatabase.png) 42 | ![Refresh AOT](ScreenShots/RefreshAOT.png) 43 | 44 | if all the classes are built fine, you should see the Cost control configuration ('My Telemetry Log Settings' feel free to rename it as appropriate in your project)in Monitoring and Telemetry settings in your D365 F&O 45 | ![Cost control settings](ScreenShots/TelemetryLogSettings.png) 46 | 47 | 4. If you see build errors indicating you need to rebuild other components in the model. proceed to build the model from 'Extensions-> D365 -> Build model' 48 | ![Build Model Option](ScreenShots/BuildModel.png) 49 | ![Build Relevant Models](ScreenShots/BuildRelevantModel.png) 50 | 51 | ## Usage 52 | 53 | 1. `MyTelemetryBase` class is the base class which provides structured access to SysApplicationInsightsTelemetryLogger. In this class you can aggregare Properties as your product code is executing and call the ProcessEvent, ProcessTrace, ProcessException etc methods at appropriate points to send those events to ApplicationInsights 54 | 55 | ![MyTelemetryBase Class](ScreenShots/MyTelemetryBase.png) 56 | 57 | 2. For each different event/metric/Trace you want to log to AppInsights create a concrete class extending from MyTelemetryBase. Here's an example 58 | ![My copncrete telemetry Class](ScreenShots/ConcreteTelemetryClass.png) 59 | 60 | 3. Use the telemetry class to log telemetry. 61 | ![My copncrete telemetry Class](ScreenShots/LoggingTelemetry.png) 62 | 63 | 4. Monitor the telemetry data in Azure Application Insights. Depending on whether you have logged an event, trace or exception etc, your data will be available in that respective table 64 | 65 | ![Azure Application Insights](ScreenShots/ApplicationInsights.png) 66 | 67 | 5. As you implement telemetry classes and log data into AppInsights, you can control the which events and which severity levels are logged in AppInsights by 2 different ways. 68 | a> You can disable particular kind of event sall together in the Extension UI 69 | ![How to disable particular events](ScreenShots/HowToDisableParticularTelemetry.png) 70 | 71 | b> within the event class itself you can set a particular condition for the event to be logged. For example, in this class I have set only severity level above Information to be logged 72 | ![fine grained control within the telemetry class](ScreenShots/FineGrainedControlwithinTheTelemetryClass.png) 73 | 74 | ## Contributing 75 | 76 | We welcome contributions to this project. To contribute: 77 | 78 | 1. Fork the repository. 79 | 2. Create a new branch for your feature or bugfix. 80 | 3. Make your changes and commit them. 81 | 4. Push your changes to your fork. 82 | 5. Open a pull request to the main repository. 83 | 84 | ## License 85 | 86 | This project is licensed under the MIT License. See the [LICENSE](../LICENSE) file for more details. 87 | 88 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxFormExtension/SysIntParameters.MyExtension.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SysIntParameters.MyExtension 4 | 5 | 6 | 7 | FormExtensionControl 8 | 10 | MySettings 11 | TabPage 12 | 14 | 15 | 17 | MyTelemetryTitleGroup 18 | Yes 19 | Group 20 | SizeToAvailable 21 | 23 | 24 | 26 | MyTelemetryLogSettingsText 27 | Yes 28 | StaticText 29 | SizeToAvailable 30 | 32 | 33 | 34 | MyTelemetryLogSettings 35 | 36 | 37 | 38 | No 39 | None 40 | 41 | 42 | 44 | MyTelemetryGrid 45 | SizeToAvailable 46 | ToolbarList 47 | 1.2 48 | Group 49 | SizeToAvailable 50 | 52 | 53 | 55 | MyTelemetryLogParam 56 | Grid 57 | 59 | 60 | 62 | MyTelemetryLogParam_TelemetryClass 63 | No 64 | String 65 | 67 | TelemetryClass 68 | MyTelemetryParameters 69 | 70 | 72 | MyTelemetryLogParam_IsEnabled 73 | CheckBox 74 | 76 | IsEnabled 77 | MyTelemetryParameters 78 | 79 | 81 | MyTelemetryLogParam_SeverityLevel 82 | ComboBox 83 | 85 | SeverityLevel 86 | MyTelemetryParameters 87 | 88 | 89 | 90 | TelemetryFields 91 | MyTelemetryParameters 92 | 93 | 94 | None 95 | 96 | 97 | 98 | MyTelemetryLogSettings 99 | 100 | 101 | TableOfContents 102 | 103 | 104 | 105 | 106 | 107 | 108 | MyTelemetryParameters 109 | MyTelemetryParameters
110 | 111 | 112 | DataAreaId 113 | 114 | 115 | IsEnabled 116 | 117 | 118 | Partition 119 | 120 | 121 | RecId 122 | 123 | 124 | SeverityLevel 125 | 126 | 127 | TableId 128 | 129 | 130 | TelemetryClass 131 | 132 | 133 | 134 | 135 | 136 |
137 |
138 | 139 | 140 |
-------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | # Telemetry Frequently Asked Questions 2 | 3 | # What is telemetry? 4 | Microsoft Power Platform and Dynamics 365 products continuously emit telemetry about events that happen in the customer environment. 5 | This telemetry can be useful for troubleshooting an issue or to gain insights into what is happening in the application. 6 | 7 | ## What does it cost? 8 | Application Insights is billed based on the volume of telemetry data that your application sends. Currently, the first 5 GB of data per month is free. Regarding data retention, every GB of data ingested can be retained at no charge for up to first 90 days. 9 | 10 | Please check the documentation for up-to-date information on pricing. 11 | 12 | Azure monitor alerts are billed separately. 13 | 14 | ## How can I reduce cost? 15 | To reduce ingestion cost, you can 16 | * set limits on daily data ingestion 17 | * reduce data ingestion by sampling to only ingest a percentage of the inbound data (see https://docs.microsoft.com/en-us/azure/azure-monitor/app/sampling#ingestion-sampling) 18 | * set a daily limit of how much data that can be ingested 19 | * purge data from your Application Insights resource (see _How do I delete data from Application Insights?_ below) 20 | * set alerts on cost thresholds being exceeded to get notified if this happens 21 | * use Data Collection Rules on Azure Log Analytics (the backend of Azure Application Insights) 22 | 23 | ## Where can I learn more about Kusto Query Language (KQL) and Azure Data Studio? 24 | Please visit the [KQL README page](KQL/README.md) for learning resources on KQL and the [Trouble Shooting Guides README page](TroubleShootingGuides/README.md) for learning resources on Azure Data Studio. 25 | 26 | ## What is the data retention policy in Application Insights? 27 | The default retention for Application Insights resources is 90 days. Different retention periods can be selected for each Application Insights resource. The full set of available retention periods is 30, 60, 90, 120, 180, 270, 365, 550 or 730 days. 28 | 29 | See 30 | 31 | ## How do I delete data from Application Insights? 32 | Purge data in an Application Insights component by a set of user-defined filters. 33 | 34 | See 35 | 36 | You can use Powershell to setup a purge process, see an example here: [How do I use Powershell to delete telemetry data?](Powershell/README.md) 37 | 38 | ## Can I grant read-only access to Application Insights? 39 | To grant a person read-only access to Application Insights, go to the Access control (IAM) page in the Application Insights portal, and then add the role assignment "Reader" to the person. 40 | 41 | You might also need to add the role assignment "Reader" to the person on the Resource Group for the Application Insights subscription. 42 | 43 | ## What about Privacy regulations such as GDPR? 44 | The Microsoft products do not emit any End User Identifiable Information (EUII) to Application Insights. So the telemetry is born GDPR compliant. The service only emits data that is classified as either System Metadata or Organization Identifiable Information (OII). The meaning of these classifications are described here: [DataClassification Option Type](https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/dataclassification/dataclassification-option) 45 | 46 | 47 | # Disclaimer 48 | Microsoft Corporation (“Microsoft”) grants you a nonexclusive, perpetual, royalty-free right to use and modify the software code provided by us for the purposes of illustration ("Sample Code") and to reproduce and distribute the object code form of the Sample Code, provided that you agree: (i) to not use our name, logo, or trademarks to market your software product in which the Sample Code is embedded; (ii) to include a valid copyright notice on your software product in which the Sample Code is embedded; and (iii) to indemnify, hold harmless, and defend us and our suppliers from and against any claims or lawsuits, whether in an action of contract, tort or otherwise, including attorneys’ fees, that arise or result from the use or distribution of the Sample Code or the use or other dealings in the Sample Code. Unless applicable law gives you more rights, Microsoft reserves all other rights not expressly granted herein, whether by implication, estoppel or otherwise. 49 | 50 | THE SAMPLE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL MICROSOFT OR ITS LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SAMPLE CODE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51 | -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/MonitoringAndTelemetryExampleUsage.rnrproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | $(MSBuildProgramFiles32)\MSBuild\Microsoft\Dynamics\AX 7 | Foundation 8 | v4.6 9 | bin 10 | 2.0 11 | True 12 | False 13 | False 14 | False 15 | {7a2363fb-28bd-4203-bddc-661cc58fbc68} 16 | MonitoringAndTelemetryExampleUsage 17 | TelemetryExtensionExample 18 | Class 19 | 20 | 21 | Debug 22 | False 23 | False 24 | 25 | 26 | initial 27 | AnyCPU 28 | False 29 | False 30 | 31 | 32 | true 33 | false 34 | 35 | 36 | 37 | Content 38 | DMFDefinitionGroupExecutionHistory_Extension 39 | DMFDefinitionGroupExecutionHistory_Extension 40 | 41 | 42 | Content 43 | MyApplicationInsightsEventIds 44 | MyApplicationInsightsEventIds 45 | 46 | 47 | Content 48 | MyApplicationInsightsEventNames 49 | MyApplicationInsightsEventNames 50 | 51 | 52 | Content 53 | MyApplicationInsightsEventProperties 54 | MyApplicationInsightsEventProperties 55 | 56 | 57 | Content 58 | MyApplicationInsightsProperty 59 | MyApplicationInsightsProperty 60 | 61 | 62 | Content 63 | MySysIntParametersFormEventHandler 64 | MySysIntParametersFormEventHandler 65 | 66 | 67 | Content 68 | MyTelemetryBase 69 | MyTelemetryBase 70 | 71 | 72 | Content 73 | TelemetryDataManagementImport 74 | TelemetryDataManagementImport 75 | 76 | 77 | Content 78 | TelemetryPurchaseOrderConfirm 79 | TelemetryPurchaseOrderConfirm 80 | 81 | 82 | Content 83 | TelemetrySalesOrderConfirm 84 | TelemetrySalesOrderConfirm 85 | 86 | 87 | Content 88 | TelemetryShipConfirm 89 | TelemetryShipConfirm 90 | 91 | 92 | Content 93 | WhsShipConfirm_Extension 94 | WhsShipConfirm_Extension 95 | 96 | 97 | Content 98 | MyTelemetryClass 99 | MyTelemetryClass 100 | 101 | 102 | Content 103 | MyTelemetrySeverityLevel 104 | MyTelemetrySeverityLevel 105 | 106 | 107 | Content 108 | SysIntParameters.MyExtension 109 | SysIntParameters.MyExtension 110 | 111 | 112 | Content 113 | MyTelemetryParameters 114 | MyTelemetryParameters 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /KustoQueries/SlowQueries.kql: -------------------------------------------------------------------------------- 1 | // SLow queries over time (bucketsize = 1 hour) 2 | let _city = dynamic(null); 3 | let _startTime = ago(7d); 4 | let _endTime = now(); 5 | let _queryType = dynamic(null); 6 | customEvents 7 | | where timestamp between (_startTime .. _endTime) 8 | | where name == "LongRunningQuery" 9 | | where isempty(['_city']) or client_City in (['_city']) 10 | | extend LegalEntity = customDimensions.LegalEntity 11 | , ExecutionMode = customDimensions.ExecutionMode 12 | , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds 13 | , CallStack = customDimensions.CallStack 14 | , QueryType = customDimensions.QueryType 15 | , Success = customDimensions.Success 16 | , JoinCount = customDimensions.JoinCount 17 | , ReturnedRowCount = customDimensions.ReturnedRowCount 18 | | where isempty(['_queryType']) or QueryType in (['_queryType']) 19 | | project ["Timestamp"] = timestamp 20 | , ["Name"] = name 21 | , ["Session ID"] = session_Id 22 | , ["User ID"] = user_Id 23 | , ["Legal Entity"] = LegalEntity 24 | , ["Execution Mode"] = ExecutionMode 25 | , ["Query Type"] = QueryType 26 | , ["Execution Time (s)"] = ExecutionTimeSeconds 27 | , ["Join Count"] = JoinCount 28 | , ["Returned Row Count"] = ReturnedRowCount 29 | , Success, CallStack 30 | , ["Client City"] = client_City 31 | , ["Client Country"] = client_CountryOrRegion 32 | | summarize ["Slow Queries"] = count() by bin(Timestamp, 1h) 33 | 34 | // Slow queries by query type 35 | let _startTime = ago(7d); 36 | let _endTime = now(); 37 | customEvents 38 | | where timestamp between (_startTime .. _endTime) 39 | | where name == "LongRunningQuery" 40 | | extend LegalEntity = customDimensions.LegalEntity 41 | , ExecutionMode = customDimensions.ExecutionMode 42 | , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds 43 | , CallStack = customDimensions.CallStack 44 | , QueryType = customDimensions.QueryType 45 | , Success = customDimensions.Success 46 | , JoinCount = customDimensions.JoinCount 47 | , ReturnedRowCount = customDimensions.ReturnedRowCount 48 | | project ["Timestamp"] = timestamp 49 | , ["Name"] = name 50 | , ["Session ID"] = session_Id 51 | , ["User ID"] = user_Id 52 | , ["Legal Entity"] = LegalEntity 53 | , ["Execution Mode"] = ExecutionMode 54 | , ["Query Type"] = tostring(QueryType) 55 | , ["Execution Time (s)"] = ExecutionTimeSeconds 56 | , ["Join Count"] = JoinCount 57 | , ["Returned Row Count"] = ReturnedRowCount 58 | , Success, CallStack 59 | , ["Client City"] = client_City 60 | , ["Client Country"] = client_CountryOrRegion 61 | | summarize ["Slow Queries"] = count() by ['Query Type'] 62 | 63 | // Slow queries by client country and city 64 | let _startTime = ago(7d); 65 | let _endTime = now(); 66 | customEvents 67 | | where timestamp between (_startTime .. _endTime) 68 | | where name == "LongRunningQuery" 69 | | extend LegalEntity = customDimensions.LegalEntity 70 | , ExecutionMode = customDimensions.ExecutionMode 71 | , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds 72 | , CallStack = customDimensions.CallStack 73 | , QueryType = customDimensions.QueryType 74 | , Success = customDimensions.Success 75 | , JoinCount = customDimensions.JoinCount 76 | , ReturnedRowCount = customDimensions.ReturnedRowCount 77 | | project ["Timestamp"] = timestamp 78 | , ["Name"] = name 79 | , ["Session ID"] = session_Id 80 | , ["User ID"] = user_Id 81 | , ["Legal Entity"] = LegalEntity 82 | , ["Execution Mode"] = ExecutionMode 83 | , ["Query Type"] = tostring(QueryType) 84 | , ["Execution Time (s)"] = ExecutionTimeSeconds 85 | , ["Join Count"] = JoinCount 86 | , ["Returned Row Count"] = ReturnedRowCount 87 | , Success, CallStack 88 | , ["Client City"] = client_City 89 | , ["Client Country"] = client_CountryOrRegion 90 | | summarize ["Slow Queries"] = count() by ['Client Country'], ['Client City'] 91 | 92 | // Top 50 slow queries by duration 93 | let _startTime = ago(7d); 94 | let _endTime = now(); 95 | customEvents 96 | | where timestamp between (_startTime .. _endTime) 97 | | where name == "LongRunningQuery" 98 | | extend LegalEntity = tostring(customDimensions.LegalEntity) 99 | , ExecutionMode = tostring(customDimensions.ExecutionMode) 100 | , ExecutionTimeSeconds = tostring(customDimensions.ExecutionTimeSeconds) 101 | , CallStack = tostring(customDimensions.CallStack) 102 | , QueryType = tostring(customDimensions.QueryType) 103 | , Success = tostring(customDimensions.Success) 104 | , JoinCount = tostring(customDimensions.JoinCount) 105 | , ReturnedRowCount = tostring(customDimensions.ReturnedRowCount) 106 | | order by ExecutionTimeSeconds desc 107 | | limit 50 108 | | project ["Timestamp"] = timestamp 109 | , ["Session ID"] = session_Id 110 | , ["User ID"] = user_Id 111 | , ["Legal Entity"] = LegalEntity 112 | , ["Execution Mode"] = ExecutionMode 113 | , ["Query Type"] = QueryType 114 | , ["Execution Time (s)"] = ExecutionTimeSeconds 115 | , ["Join Count"] = JoinCount 116 | , ["Returned Row Count"] = ReturnedRowCount 117 | , Success, CallStack 118 | , ["Client City"] = client_City 119 | , ["Client Country"] = client_CountryOrRegion -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/.vs/MonitoringAndTelemetryExampleUsage/v17/DocumentLayout.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 1, 3 | "WorkspaceRootPath": "C:\\OpenSource\\Dynamics-365-FastTrack-FSCM-Telemetry-Samples\\DeveloperSamples\\MonitoringAndTelemetryExtensionSample\\", 4 | "Documents": [ 5 | { 6 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_DMFDefinitionGroupExecutionHistory_Extension.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 7 | }, 8 | { 9 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryShipConfirm.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 10 | }, 11 | { 12 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyTelemetryBase.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 13 | }, 14 | { 15 | "AbsoluteMoniker": "D:0:0:{7A2363FB-28BD-4203-BDDC-661CC58FBC68}|MonitoringAndTelemetryExampleUsage.rnrproj|C:\\AOSService\\PackagesLocalDirectory\\ApplicationSuite\\Foundation\\AxEdt\\MyTelemetryClass.xml||{7DCB09FF-3066-475F-9286-662C3C505513}|" 16 | }, 17 | { 18 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryDataManagementImport.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 19 | }, 20 | { 21 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_WhsShipConfirm_Extension.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 22 | }, 23 | { 24 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventNames.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 25 | }, 26 | { 27 | "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventIds.xpp||{8B382828-6202-11D1-8870-0000F87579D2}" 28 | } 29 | ], 30 | "DocumentGroupContainers": [ 31 | { 32 | "Orientation": 0, 33 | "VerticalTabListWidth": 256, 34 | "DocumentGroups": [ 35 | { 36 | "DockedWidth": 200, 37 | "SelectedChildIndex": 7, 38 | "Children": [ 39 | { 40 | "$type": "Bookmark", 41 | "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" 42 | }, 43 | { 44 | "$type": "Bookmark", 45 | "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" 46 | }, 47 | { 48 | "$type": "Bookmark", 49 | "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" 50 | }, 51 | { 52 | "$type": "Bookmark", 53 | "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" 54 | }, 55 | { 56 | "$type": "Document", 57 | "DocumentIndex": 1, 58 | "Title": "TelemetryShipConfirm.xpp", 59 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryShipConfirm.xpp", 60 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryShipConfirm.xpp", 61 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryShipConfirm.xpp", 62 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryShipConfirm.xpp", 63 | "ViewState": "AQIAAAUAAAAAAAAAAABgvQ4AAAAmAAAA", 64 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 65 | "WhenOpened": "2024-09-11T00:06:09.522Z" 66 | }, 67 | { 68 | "$type": "Document", 69 | "DocumentIndex": 2, 70 | "Title": "MyTelemetryBase.xpp", 71 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyTelemetryBase.xpp", 72 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyTelemetryBase.xpp", 73 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyTelemetryBase.xpp", 74 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyTelemetryBase.xpp", 75 | "ViewState": "AQIAAEwAAAAAwMzMzMwqwDIAAAAJAAAA", 76 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 77 | "WhenOpened": "2024-06-25T14:29:29.636Z" 78 | }, 79 | { 80 | "$type": "Document", 81 | "DocumentIndex": 5, 82 | "Title": "WhsShipConfirm_Extension.xpp", 83 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_WhsShipConfirm_Extension.xpp", 84 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_WhsShipConfirm_Extension.xpp", 85 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_WhsShipConfirm_Extension.xpp", 86 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_WhsShipConfirm_Extension.xpp", 87 | "ViewState": "AQIAAA4AAAAAAAAAAAAAwCsAAAANAAAA", 88 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 89 | "WhenOpened": "2024-06-25T23:26:20.431Z" 90 | }, 91 | { 92 | "$type": "Document", 93 | "DocumentIndex": 0, 94 | "Title": "DMFDefinitionGroupExecutionHistory_Extension.xpp", 95 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_DMFDefinitionGroupExecutionHistory_Extension.xpp", 96 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_DMFDefinitionGroupExecutionHistory_Extension.xpp", 97 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_DMFDefinitionGroupExecutionHistory_Extension.xpp", 98 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_DMFDefinitionGroupExecutionHistory_Extension.xpp", 99 | "ViewState": "AQIAAAAAAAAAAAAAAAAAABgAAAAAAAAA", 100 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 101 | "WhenOpened": "2024-06-25T17:14:30.055Z", 102 | "EditorCaption": "" 103 | }, 104 | { 105 | "$type": "Document", 106 | "DocumentIndex": 4, 107 | "Title": "TelemetryDataManagementImport.xpp", 108 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryDataManagementImport.xpp", 109 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryDataManagementImport.xpp", 110 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryDataManagementImport.xpp", 111 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_TelemetryDataManagementImport.xpp", 112 | "ViewState": "AQIAAAAAAAAAAAAAAAAAABwAAAAEAAAA", 113 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 114 | "WhenOpened": "2024-06-25T23:31:31.664Z" 115 | }, 116 | { 117 | "$type": "Document", 118 | "DocumentIndex": 3, 119 | "Title": "MyTelemetryClass", 120 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\ApplicationSuite\\Foundation\\AxEdt\\MyTelemetryClass.xml", 121 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\ApplicationSuite\\Foundation\\AxEdt\\MyTelemetryClass.xml", 122 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\ApplicationSuite\\Foundation\\AxEdt\\MyTelemetryClass.xml\r\nType: EdtString\r\nModel: Foundation", 123 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003576|", 124 | "OverriddenToolTip": "C:\\AOSService\\PackagesLocalDirectory\\ApplicationSuite\\Foundation\\AxEdt\\MyTelemetryClass.xml\r\nType: EdtString\r\nModel: Foundation", 125 | "WhenOpened": "2024-06-26T18:56:59.776Z" 126 | }, 127 | { 128 | "$type": "Document", 129 | "DocumentIndex": 6, 130 | "Title": "MyApplicationInsightsEventNames.xpp", 131 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventNames.xpp", 132 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventNames.xpp", 133 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventNames.xpp", 134 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventNames.xpp", 135 | "ViewState": "AQIAAAAAAAAAAAAAAAAAAAQAAAABAAAA", 136 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 137 | "WhenOpened": "2024-06-25T14:22:53.492Z" 138 | }, 139 | { 140 | "$type": "Document", 141 | "DocumentIndex": 7, 142 | "Title": "MyApplicationInsightsEventIds.xpp", 143 | "DocumentMoniker": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventIds.xpp", 144 | "RelativeDocumentMoniker": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventIds.xpp", 145 | "ToolTip": "C:\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventIds.xpp", 146 | "RelativeToolTip": "..\\..\\..\\..\\AOSService\\PackagesLocalDirectory\\bin\\XppSource\\Foundation\\AxClass_MyApplicationInsightsEventIds.xpp", 147 | "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 148 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 149 | "WhenOpened": "2024-06-25T14:22:42.734Z" 150 | } 151 | ] 152 | } 153 | ] 154 | } 155 | ] 156 | } -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Errors/dashboard-D365FO-Monitoring-Errors.json: -------------------------------------------------------------------------------- 1 | {"$schema":"https://dataexplorer.azure.com/static/d/schema/50/dashboard.json","id":"7f76b28d-40d3-4784-92e0-8846879191eb","eTag":"670a9830-3038-4a08-a873-f751c8732e03","schema_version":"50","title":"D365FO-Monitoring-Errors","baseQueries":[],"tiles":[{"id":"8b318973-c302-49c3-a92f-06dd35652d4c","title":"Sum of errors per Execution Mode","visualType":"column","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":0,"y":0,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime"],"text":"exceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"outerMessage\"] = outerMessage\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , CallStack \n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Errors\"] = count() by [\"Execution Mode\"]//, bin([\"Timestamp\"],1h) \n\n\n"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"dad00a71-980a-46cd-9777-941acd2b77b6","title":"Sum of errors by Time Span","visualType":"column","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":12,"y":0,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime","_time_span"],"text":"\nexceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"outerMessage\"] = outerMessage\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , CallStack \n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Errors\"] = count() by bin([\"Timestamp\"], totimespan(_time_span)) \n\n\n"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"67a1c6ad-2279-4d09-b741-e7970301ec1a","title":"Errors by outer message","visualType":"column","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":0,"y":7,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime"],"text":"\nexceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"Outer Message\"] = outerMessage\n , [\"Outer Message (short)\"] = tostring( split(tostring( split(outerMessage, \"\\\\\")[0]), \".\")[0]) //substring( outerMessage,0,50)\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , CallStack \n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Errors\"] = count() by [\"Outer Message (short)\"] // bin([\"Timestamp\"], totimespan(_time_span)) \n\n\n"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"ce797f9c-2eda-4d29-a066-9ae1de1717d7","title":"Errors by Legal Entity","visualType":"bar","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":12,"y":7,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime"],"text":"\nexceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"Outer Message\"] = outerMessage\n , [\"Outer Message (short)\"] = tostring( split(tostring( split(outerMessage, \"\\\\\")[0]), \".\")[0]) //substring( outerMessage,0,50)\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] =toupper( tostring( LegalEntity))\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , CallStack \n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Errors\"] = count() by ['Legal Entity'] , ['Execution Mode'] // bin([\"Timestamp\"], totimespan(_time_span)) \n\n\n"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"d8c67cd1-5354-4666-9902-891c60151c58","title":"Errors per user","visualType":"column","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":0,"y":14,"width":24,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime"],"text":"\nexceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"Outer Message\"] = outerMessage\n , [\"Outer Message (short)\"] = tostring( split(tostring( split(outerMessage, \"\\\\\")[0]), \".\")[0]) //substring( outerMessage,0,50)\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] =toupper( tostring( LegalEntity))\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , CallStack \n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Errors\"] = count() by [\"User ID\"] , ['Execution Mode'] // bin([\"Timestamp\"], totimespan(_time_span)) \n\n\n"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"f405ecc6-0553-492c-b865-e4e29717ae6c","title":"All errors","visualType":"table","pageId":"54d4ff07-74a9-48e7-b5f3-25db46df8620","layout":{"x":0,"y":21,"width":24,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"2c9a039f-f73b-4f79-a329-981fa438ff43"},"usedVariables":["_endTime","_startTime"],"text":"\nexceptions\n| where timestamp between (_startTime .. _endTime)\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , BatchJobId = customDimensions.BatchJobId\n , CallStack = customDimensions.CallStack\n| project [\"Timestamp\"] = timestamp\n , [\"Outer Message (short)\"] = tostring( split(tostring( split(outerMessage, \"\\\\\")[0]), \".\")[0]) //substring( outerMessage,0,50)\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] =toupper( tostring( LegalEntity))\n , [\"Execution Mode\"] = tostring(ExecutionMode)\n , [\"Client Type\"] = client_Type\n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n , [\"Outer Message\"] = outerMessage\n , CallStack \n| order by Timestamp desc \n\n\n"},"visualOptions":{"table__enableRenderLinks":true,"colorRules":[],"colorRulesDisabled":true,"colorStyle":"light","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[]}}],"parameters":[{"kind":"duration","id":"2f9ab838-dea5-47f2-a936-c6bb30dc81ed","displayName":"Time range","description":"","beginVariableName":"_startTime","endVariableName":"_endTime","defaultValue":{"kind":"dynamic","count":1,"unit":"hours"},"showOnPages":{"kind":"all"}},{"kind":"string","id":"6830b1ec-568b-4fb6-a453-1bae2e9744b6","displayName":"Time span","description":"","variableName":"_time_span","selectionType":"scalar","includeAllOption":false,"defaultValue":{"kind":"value","value":"10m"},"dataSource":{"kind":"static","values":[{"displayText":"1 minute","value":"1m"},{"displayText":"10 minutes","value":"10m"},{"displayText":"1 hour","value":"1h"},{"displayText":"3 hours","value":"3h"},{"displayText":"6 hours","value":"6h"},{"displayText":"12 hours","value":"12h"},{"displayText":"1 day","value":"1d"},{"displayText":"1 week","value":"7d"},{"displayText":"2 weeks","value":"14d"}]},"showOnPages":{"kind":"all"}}],"dataSources":[{"id":"2c9a039f-f73b-4f79-a329-981fa438ff43","name":"perfsf_AppInsights","clusterUri":"https://ade.applicationinsights.io/subscriptions/79def5f1-f626-479f-8db5-b1272680adc1/resourcegroups/perfsf_AppInsights_RG/providers/microsoft.insights/components/perfsf_AppInsights","database":"perfsf_AppInsights","kind":"manual-kusto","scopeId":"kusto"}],"pages":[{"name":"Page 1","id":"54d4ff07-74a9-48e7-b5f3-25db46df8620"}]} -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Forms/ADE-Dashboard-D365FO-Monitoring-Forms.json: -------------------------------------------------------------------------------- 1 | {"$schema":"https://dataexplorer.azure.com/static/d/schema/50/dashboard.json","id":"936a42b0-3e29-4700-9bc3-e799208f686e","eTag":"05ece293-75e6-442a-a346-23e9d072b1e7","schema_version":"50","title":"D365FO-Monitoring-Forms","baseQueries":[],"tiles":[{"id":"5809a22f-397a-4bd8-9ca2-70c06894ba39","title":"Top 20 most opened forms","visualType":"bar","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":0,"width":9,"height":9},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_activityId","_endTime","_startTime","_userId"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| where name !in (\"SysOperationSandboxForm\", \"SysBoxForm\", \"Dialog\")\n| extend ['Activity Id'] = customDimensions.activityId \n| where isempty(['_userId']) or user_Id == ['_userId']\n| where isempty(['_activityId']) or ['Activity Id'] in (['_activityId'])\n| summarize [\"Form Opens\"] = count() by name \n| top 20 by [\"Form Opens\"] desc"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[{"interaction":"dragX","disabled":false}],"drillthrough":[]}},{"id":"82e3f98d-f79f-4611-8b7e-c559d88927f0","title":"Form usage by longest average duration","description":"Shows executions time statistics grouped by form name. Execution times include the averages, min and max durations and accumulated total time.","visualType":"table","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":9,"width":12,"height":8},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_activityId","_endTime","_formName","_startTime","_userId"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| where duration > 0\n| extend ['Activity Id'] = customDimensions.activityId \n| where isempty(['_userId']) or user_Id == ['_userId']\n| where isempty(['_activityId']) or ['Activity Id'] in (['_activityId'])\n| where isempty(['_formName']) or name == ['_formName']\n| project ['Form name'] = name, duration\n| summarize ['Number of executions'] = count()\n , ['Avg duration (s)'] = round(avg(duration)/1000,2)\n , ['Min duration (s)'] = round(min(duration)/1000,2)\n , ['Max duration (s)'] = round(max(duration)/1000,2)\n , ['Percentile 95 (s)'] = round(percentile(duration,95)/1000,2)\n , ['Accumulated total duration (s)'] = round(sum(duration)/1000,2) by ['Form name'] \n| order by ['Avg duration (s)'] desc"},"visualOptions":{"table__enableRenderLinks":true,"colorRules":[{"id":"5e243c32-c33a-40b6-8156-a0b757c9b332","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"rows","conditions":[{"operator":">","column":"Avg duration (s)","values":["5"]}],"chainingOperator":"and","visualType":"table","colorStyle":"bold","color":"yellow","tag":"","icon":null,"ruleName":""},{"id":"47995495-a9cf-459e-82ef-97df2165f3f3","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"rows","conditions":[{"operator":">","column":"Avg duration (s)","values":["10"]}],"chainingOperator":"and","visualType":"table","colorStyle":"bold","color":"red","tag":"","icon":null,"ruleName":""}],"colorRulesDisabled":false,"colorStyle":"light","crossFilterDisabled":false,"drillthroughDisabled":true,"crossFilter":[{"interaction":"column","property":"Query Type","parameterId":"f9cae1c1-10c8-4ab1-ada6-e1a7b0cb675d","disabled":false}],"drillthrough":[],"table__renderLinks":[]}},{"id":"2a656524-2915-42e7-a42f-7e5ba60da28e","title":"Form execution spread","visualType":"line","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":9,"y":0,"width":9,"height":9},"description":"Shows the form usage taking into account the time range, user, activity and form name.","query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_activityId","_endTime","_formName","_startTime","_userId"],"text":"pageViews\n| extend ['Activity Id'] = customDimensions.activityId\n| where timestamp between (_startTime .. _endTime)\n| where isempty(['_userId']) or user_Id == ['_userId']\n| where isempty(['_activityId']) or ['Activity Id'] in (['_activityId'])\n| where isempty(['_formName']) or name == ['_formName']\n| summarize Count = count() by bin(timestamp,1h)"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":true,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"f65d127d-8ee6-4a56-b286-0f773382ecf8","title":"Form execution by Legal Entity","visualType":"pie","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":18,"y":0,"width":6,"height":9},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_endTime","_startTime"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| extend ['Legal entity'] = toupper((customDimensions.LegalEntity))\n| summarize count() by ['Legal entity']\n"},"visualOptions":{"hideLegend":true,"xColumn":null,"yColumns":null,"seriesColumns":null,"crossFilterDisabled":false,"drillthroughDisabled":false,"labelDisabled":false,"pie__label":["name","percentage","value"],"tooltipDisabled":false,"pie__tooltip":["name","percentage","value"],"pie__orderBy":"size","pie__kind":"donut","pie__topNSlices":null,"crossFilter":[],"drillthrough":[]}},{"id":"6f0db31d-4dbe-4e25-8ff3-cc48049dcd55","title":"Form instance execution times","description":"Shows the individual instances of this form and the respective opening times.","visualType":"table","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":17,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_activityId","_endTime","_formName","_startTime","_userId"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| where duration > 0\n| extend ['Activity Id'] = customDimensions.activityId \n| where isempty(['_userId']) or user_Id == ['_userId']\n| where isempty(['_activityId']) or ['Activity Id'] in (['_activityId'])\n| where isempty(['_formName']) or name == ['_formName']\n| project ['Time stamp'] = timestamp, ['Activity Id'], ['Form Name'] = name, ['Duration (s)'] = round(duration/1000,2)"},"visualOptions":{"table__enableRenderLinks":true,"colorRules":[],"colorRulesDisabled":true,"colorStyle":"light","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[]}},{"id":"7db39b31-fb44-4655-bebb-13711268eef7","title":"Form duration trend","description":"Shows executions time statistics grouped by form name. Execution times include the averages, min and max durations and accumulated total time.","visualType":"table","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":12,"y":9,"width":12,"height":8},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_formName"],"text":"let _startTime30Days = ago(30d);\nlet _startTime14Days = ago(14d);\nlet _startTime7Days = ago(7d);\nlet _pageViews30Days = pageViews\n | where timestamp between (_startTime30Days .. now())\n | where duration > 0\n | where isempty(['_formName']) or name == ['_formName']\n | project ['Form name'] = name, duration,timestamp;\nlet _pageViews30DaysAgg = _pageViews30Days\n | summarize ['30 days average (s)'] = round(avg(duration)/1000,2) by ['Form name']\n | order by ['30 days average (s)'] desc;\nlet _pageViews14DaysAgg = _pageViews30Days\n | where timestamp between (_startTime14Days .. now())\n | summarize ['14 days average (s)'] = round(avg(duration)/1000,2) by ['Form name']\n | order by ['14 days average (s)'] desc;\nlet _pageViews7DaysAgg = _pageViews30Days\n | where timestamp between (_startTime7Days .. now())\n | summarize ['7 days executions'] = count()\n , ['7 days average (s)'] = round(avg(duration)/1000,2) by ['Form name']\n | order by ['7 days average (s)'] desc; \n_pageViews7DaysAgg\n| lookup kind=leftouter _pageViews14DaysAgg on ['Form name']\n| lookup kind=leftouter _pageViews30DaysAgg on ['Form name']\n| extend ['14 Day trend'] = round(100 - ((['7 days average (s)'] / ['14 days average (s)'])*100),2)\n| extend ['30 Day trend'] = round(100 - ((['7 days average (s)'] / ['30 days average (s)'])*100),2)\n| project ['Form name'], ['7 days executions'], ['7 days average (s)'], ['14 Day trend'], ['30 Day trend']"},"visualOptions":{"table__enableRenderLinks":true,"colorRules":[{"id":"5e243c32-c33a-40b6-8156-a0b757c9b332","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"rows","conditions":[{"operator":">","column":"Avg duration (s)","values":["5"]}],"chainingOperator":"and","visualType":"table","colorStyle":"bold","color":"yellow","tag":"","icon":null,"ruleName":""},{"id":"47995495-a9cf-459e-82ef-97df2165f3f3","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"rows","conditions":[{"operator":">","column":"Avg duration (s)","values":["10"]}],"chainingOperator":"and","visualType":"table","colorStyle":"bold","color":"red","tag":"","icon":null,"ruleName":""},{"id":"43bcecb4-6ad8-4c04-a997-f02a19e8e60b","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"cells","conditions":[{"operator":">=","column":"14 Day trend","values":["0"]}],"chainingOperator":"and","visualType":"table","colorStyle":"light","color":"green","tag":"%","icon":"arrowUp","ruleName":""},{"id":"f26d87b6-fdd8-4832-9f32-d612860689a9","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"cells","conditions":[{"values":["0"],"operator":"<","column":"14 Day trend"}],"chainingOperator":"and","visualType":"table","colorStyle":"light","color":"red","tag":"%","icon":"arrowDown","ruleName":""},{"id":"aafe8163-7368-45ba-a436-8695df9ff75d","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"cells","conditions":[{"operator":">=","column":"30 Day trend","values":["0"]}],"chainingOperator":"and","visualType":"table","colorStyle":"light","color":"green","tag":"%","icon":"arrowUp","ruleName":""},{"id":"ba0248c4-c29e-43ef-aa5c-d8c6ffb52b30","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"cells","conditions":[{"operator":"<","column":"30 Day trend","values":["0"]}],"chainingOperator":"and","visualType":"table","colorStyle":"light","color":"red","tag":"%","icon":"arrowDown","ruleName":""}],"colorRulesDisabled":false,"colorStyle":"light","crossFilterDisabled":false,"drillthroughDisabled":true,"crossFilter":[{"interaction":"column","property":"Query Type","parameterId":"f9cae1c1-10c8-4ab1-ada6-e1a7b0cb675d","disabled":false}],"drillthrough":[],"table__renderLinks":[]}},{"id":"4d1611f0-5a0d-4608-9adb-1d4e46c230b3","title":"Form instance execution times","description":"Shows the individual instances of this form and the respective opening times.","visualType":"column","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":12,"y":17,"width":12,"height":7},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_activityId","_endTime","_formName","_startTime","_userId"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| where duration > 0\n| extend ['Activity Id'] = customDimensions.activityId \n| where isempty(['_userId']) or user_Id == ['_userId']\n| where isempty(['_activityId']) or ['Activity Id'] in (['_activityId'])\n| where isempty(['_formName']) or name == ['_formName']\n| project ['Time stamp'] = timestamp, ['Form Name'] = name, ['Duration (s)'] = round(duration/1000,2)"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}}],"parameters":[{"kind":"duration","id":"42794f52-6782-487c-b413-b6b565549995","displayName":"Time range","description":"","beginVariableName":"_startTime","endVariableName":"_endTime","defaultValue":{"kind":"dynamic","count":24,"unit":"hours"},"showOnPages":{"kind":"all"}},{"kind":"string","id":"379e468b-9382-4f21-8f56-8dc14c874c04","displayName":"User Id","description":"User identification","variableName":"_userId","selectionType":"scalar","includeAllOption":true,"defaultValue":{"kind":"all"},"dataSource":{"kind":"query","columns":{"value":"user_Id"},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_endTime","_startTime"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| project user_Id\n| distinct user_Id"}},"showOnPages":{"kind":"selection","pageIds":["57b9f821-760e-45d0-82ee-71fb8dc71d79"]}},{"kind":"string","id":"cd512fb6-641a-4c45-8fa5-5cca92f53f95","displayName":"Activity Id","description":"Identification of the activity interacting with forms","variableName":"_activityId","selectionType":"array","includeAllOption":true,"defaultValue":{"kind":"all"},"dataSource":{"kind":"query","columns":{"value":"ActivityId"},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":[],"text":"pageViews\n| extend ActivityId = tostring(customDimensions.activityId)\n| distinct ActivityId"}},"showOnPages":{"kind":"selection","pageIds":["57b9f821-760e-45d0-82ee-71fb8dc71d79"]}},{"kind":"string","id":"ec9cee90-e7bf-4674-92db-e3f122b53c23","displayName":"Form name","description":"","variableName":"_formName","selectionType":"scalar","includeAllOption":true,"defaultValue":{"kind":"all"},"dataSource":{"kind":"query","columns":{"value":"name"},"query":{"kind":"inline","dataSource":{"kind":"inline","dataSourceId":"99f48c40-4d08-4070-af47-32e2e6e0fda7"},"usedVariables":["_endTime","_startTime"],"text":"pageViews\n| where timestamp between (_startTime .. _endTime)\n| distinct name\n"}},"showOnPages":{"kind":"all"}}],"dataSources":[{"id":"99f48c40-4d08-4070-af47-32e2e6e0fda7","name":"KSAppInsightsDemo","clusterUri":"https://ade.applicationinsights.io/subscriptions/79def5f1-f626-479f-8db5-b1272680adc1/resourcegroups/KSAppInsights/providers/microsoft.insights/components/KSAppInsightsDemo","database":"KSAppInsightsDemo","kind":"manual-kusto","scopeId":"kusto"}],"pages":[{"name":"Form Telemetry","id":"57b9f821-760e-45d0-82ee-71fb8dc71d79"}]} -------------------------------------------------------------------------------- /DeveloperSamples/MonitoringAndTelemetryExtensionSample/bin/AxClass/MyTelemetryBase.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyTelemetryBase 4 | 5 | 7 | /// MyTelemetryBase class 8 | /// 9 | /// 10 | 11 | using DataContracts = Microsoft.ApplicationInsights.DataContracts; 12 | 13 | abstract class MyTelemetryBase 14 | { 15 | protected Map basePropertyMap = new Map(Types::String, Types::string); 16 | protected Map runtimePropertyMap = new Map(Types::String, Types::string); 17 | 18 | System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); 19 | 20 | protected MyTelemetryParameters telemetryLoggingParams; 21 | //you can fill this field or not, if you dont fill it, it will be set to 0 22 | protected str eventId = "0"; 23 | } 24 | ]]> 25 | 26 | 27 | new 28 | 39 | 40 | 41 | telemetryName 42 | 44 | /// Class telemetryName 45 | /// 46 | /// Telemetry 47 | protected ClassName telemetryName() 48 | { 49 | return classId2Name(classIdGet(this)); 50 | } 51 | 52 | ]]> 53 | 54 | 55 | setElapsedMilliseconds 56 | 66 | 67 | 68 | addBaseProperty 69 | 84 | 85 | 86 | addRuntimeProperty 87 | 114 | 115 | 116 | clearRuntimeProperties 117 | 131 | 132 | 133 | shouldSkipLogging 134 | 149 | 150 | 151 | shouldSkipOnSeverityLevel 152 | severity) 156 | return true; 157 | 158 | return false; 159 | } 160 | 161 | ]]> 162 | 163 | 164 | processMetric 165 | 167 | /// Method ProcessMetric 168 | /// 169 | public final void processMetric(real _value) 170 | { 171 | try 172 | { 173 | this.logMetric(_value); 174 | } 175 | catch 176 | { 177 | warning(strFmt("Telemetry Metric Processing Error - className : %1",classId2Name(classIdGet(this)))); 178 | } 179 | } 180 | 181 | ]]> 182 | 183 | 184 | processEvent 185 | 187 | /// Method processEvent 188 | /// 189 | public final void processEvent(str _name) 190 | { 191 | try 192 | { 193 | 194 | if(this.shouldSkipLogging()) 195 | return; 196 | 197 | if(!_name) 198 | _name = this.telemetryName(); 199 | 200 | this.populateProperties(); 201 | this.logEvent(this.eventId, _name); 202 | } 203 | catch 204 | { 205 | warning(strFmt("Telemetry Event Processing Error: className : %1 - EventName: %2", classId2Name(classIdGet(this)), _name)); 206 | } 207 | } 208 | 209 | ]]> 210 | 211 | 212 | processTrace 213 | 215 | /// Method processTrace 216 | /// 217 | public final void processTrace(str traceMessage, MyTelemetrySeverityLevel severity = MyTelemetrySeverityLevel::Information) 218 | { 219 | try 220 | { 221 | if(this.shouldSkipLogging()) 222 | return; 223 | 224 | if(this.shouldSkipOnSeverityLevel(severity)) 225 | return; 226 | 227 | this.populateProperties(); 228 | this.logTrace(traceMessage, severity); 229 | } 230 | catch 231 | { 232 | warning(strFmt("Telemetry Trace Processing Error: className : %1 - TraceMessage: %2", classId2Name(classIdGet(this)), traceMessage)); 233 | } 234 | } 235 | 236 | ]]> 237 | 238 | 239 | populateProperties 240 | 242 | /// Method Populate properties. This housld be implemented by the concrete class that extends this base. 243 | /// 244 | protected abstract void populateProperties() 245 | { 246 | } 247 | 248 | ]]> 249 | 250 | 251 | metricName 252 | 254 | /// Class metricName 255 | /// 256 | /// Telemetry 257 | protected ClassName metricName() 258 | { 259 | return classId2Name(classIdGet(this)); 260 | } 261 | 262 | ]]> 263 | 264 | 265 | logMetric 266 | 268 | /// 269 | protected void logMetric(real _value) 270 | { 271 | SysApplicationInsightsTelemetryLogger::instance().trackMetric(this.metricName(), _value); 272 | } 273 | 274 | ]]> 275 | 276 | 277 | logMetricWithDimensions 278 | 280 | /// 281 | protected void logMetricWithDimensions(real _value, str _dimension1Name, str _dimension1Value, str _dimension2Name = "", str _dimension2Value = '', str _dimension3Name = '', str _dimension3Value = '') 282 | { 283 | SysApplicationInsightsTelemetryLogger::instance().trackMetricWithDimensions(this.metricName(), _value, _dimension1Name, _dimension1Value, _dimension2Name, _dimension2Value, _dimension3Name, _dimension3Value); 284 | } 285 | 286 | ]]> 287 | 288 | 289 | logEvent 290 | 292 | /// Method Log 293 | /// 294 | protected void logEvent(str _eventId, str _name) 295 | { 296 | SysApplicationInsightsEventTelemetry eventTelemetry = SysApplicationInsightsEventTelemetry::newFromEventIdName(_eventId, _name); 297 | 298 | MapIterator iterator; 299 | str key, value; 300 | 301 | // Get an iterator for the map 302 | iterator = new MapIterator(basePropertyMap); 303 | 304 | // Loop through the map & add base properties 305 | while (iterator.more()) 306 | { 307 | key = iterator.key(); 308 | value = iterator.value(); 309 | 310 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 311 | eventTelemetry.addProperty(property); 312 | iterator.next(); 313 | } 314 | 315 | //add runtime properties: 316 | iterator = new MapIterator(runtimePropertyMap); 317 | 318 | // Loop through the map & add base properties 319 | while (iterator.more()) 320 | { 321 | key = iterator.key(); 322 | value = iterator.value(); 323 | 324 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 325 | eventTelemetry.addProperty(property); 326 | iterator.next(); 327 | } 328 | 329 | SysApplicationInsightsTelemetryLogger::instance().trackEvent(eventTelemetry); 330 | } 331 | 332 | ]]> 333 | 334 | 335 | shouldLogEvent 336 | 344 | 345 | 346 | logTrace 347 | 349 | /// Method Log 350 | /// 351 | protected void logTrace(str traceMessage, MyTelemetrySeverityLevel severity = MyTelemetrySeverityLevel::Information) 352 | { 353 | DataContracts.SeverityLevel dotNetSeverity; 354 | switch(severity) 355 | { 356 | case MyTelemetrySeverityLevel::Critical: 357 | dotNetSeverity = DataContracts.SeverityLevel::Critical; 358 | break; 359 | case MyTelemetrySeverityLevel::Error: 360 | dotNetSeverity = DataContracts.SeverityLevel::Error; 361 | break; 362 | case MyTelemetrySeverityLevel::Warning: 363 | dotNetSeverity = DataContracts.SeverityLevel::Warning; 364 | break; 365 | case MyTelemetrySeverityLevel::Information: 366 | dotNetSeverity = DataContracts.SeverityLevel::Information; 367 | break; 368 | case MyTelemetrySeverityLevel::Verbose: 369 | dotNetSeverity = DataContracts.SeverityLevel::Verbose; 370 | break; 371 | default: 372 | dotNetSeverity = DataContracts.SeverityLevel::Information; 373 | break; 374 | } 375 | SysApplicationInsightsTraceTelemetry traceTelemetry = SysApplicationInsightsTraceTelemetry::newFromEventIdName(traceMessage, dotNetSeverity); 376 | 377 | MapIterator iterator; 378 | str key, value; 379 | 380 | // Get an iterator for the map 381 | iterator = new MapIterator(basePropertyMap); 382 | 383 | // Loop through the map & add base properties 384 | while (iterator.more()) 385 | { 386 | key = iterator.key(); 387 | value = iterator.value(); 388 | 389 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 390 | traceTelemetry.addProperty(property); 391 | iterator.next(); 392 | } 393 | 394 | //add runtime properties: 395 | iterator = new MapIterator(runtimePropertyMap); 396 | 397 | // Loop through the map & add base properties 398 | while (iterator.more()) 399 | { 400 | key = iterator.key(); 401 | value = iterator.value(); 402 | 403 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 404 | traceTelemetry.addProperty(property); 405 | iterator.next(); 406 | } 407 | 408 | SysApplicationInsightsTelemetryLogger::instance().trackTrace(traceTelemetry); 409 | } 410 | 411 | ]]> 412 | 413 | 414 | logException 415 | 417 | /// Method Log 418 | /// 419 | protected void logException(str message) 420 | { 421 | SysApplicationInsightsExceptionTelemetry exceptionTelemetry = SysApplicationInsightsExceptionTelemetry::newFromExceptionMessage(message); 422 | 423 | MapIterator iterator; 424 | str key, value; 425 | 426 | // Get an iterator for the map 427 | iterator = new MapIterator(basePropertyMap); 428 | 429 | // Loop through the map & add base properties 430 | while (iterator.more()) 431 | { 432 | key = iterator.key(); 433 | value = iterator.value(); 434 | 435 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 436 | exceptionTelemetry.addProperty(property); 437 | iterator.next(); 438 | } 439 | 440 | //add runtime properties: 441 | iterator = new MapIterator(runtimePropertyMap); 442 | 443 | // Loop through the map & add base properties 444 | while (iterator.more()) 445 | { 446 | key = iterator.key(); 447 | value = iterator.value(); 448 | 449 | var property = new MyApplicationInsightsProperty(key, value, SysApplicationInsightsComplianceDataType::CustomerContent); 450 | exceptionTelemetry.addProperty(property); 451 | iterator.next(); 452 | } 453 | 454 | SysApplicationInsightsTelemetryLogger::instance().trackException(exceptionTelemetry); 455 | } 456 | 457 | ]]> 458 | 459 | 460 | 461 | -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/SlowQueries/ADE-Dashboard-D365FO-Monitoring-SlowQueries.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://dataexplorer.azure.com/static/d/schema/46/dashboard.json", 3 | "id": "2178d083-6209-4c51-9d90-2559930a4305", 4 | "eTag": "7ac01f31-bb32-447a-b391-b8a8def2d58b", 5 | "schema_version": "46", 6 | "title": "D365FO-Monitoring-SlowQueries", 7 | "autoRefresh": { 8 | "enabled": false 9 | }, 10 | "baseQueries": [], 11 | "tiles": [ 12 | { 13 | "id": "e2c8ac0b-7ccb-4a47-9930-a1214ff41d44", 14 | "title": "Slow queries reported by AOS (Top 100)", 15 | "description": "", 16 | "visualType": "table", 17 | "pageId": "57b9f821-760e-45d0-82ee-71fb8dc71d79", 18 | "layout": { 19 | "x": 0, 20 | "y": 9, 21 | "width": 24, 22 | "height": 8 23 | }, 24 | "query": { 25 | "kind": "inline", 26 | "dataSource": { 27 | "kind": "inline", 28 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 29 | }, 30 | "usedVariables": [ 31 | "_city", 32 | "_endTime", 33 | "_queryType", 34 | "_startTime" 35 | ], 36 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| where isempty(['_city']) or client_City in (['_city'])\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds\n , CallStack = customDimensions.CallStack\n , QueryType = customDimensions.QueryType\n , Success = customDimensions.Success\n , JoinCount = customDimensions.JoinCount\n , ReturnedRowCount = customDimensions.ReturnedRowCount\n| where isempty(['_queryType']) or QueryType in (['_queryType'])\n| limit 100\n| project [\"Timestamp\"] = timestamp\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = ExecutionMode\n , [\"Query Type\"] = QueryType\n , [\"Execution Time (s)\"] = ExecutionTimeSeconds\n , [\"Join Count\"] = JoinCount\n , [\"Returned Row Count\"] = ReturnedRowCount\n , Success, CallStack \n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion" 37 | }, 38 | "visualOptions": { 39 | "table__enableRenderLinks": true, 40 | "colorRules": [], 41 | "colorRulesDisabled": true, 42 | "colorStyle": "light", 43 | "crossFilterDisabled": false, 44 | "drillthroughDisabled": false, 45 | "crossFilter": [], 46 | "drillthrough": [], 47 | "table__renderLinks": [] 48 | } 49 | }, 50 | { 51 | "id": "5809a22f-397a-4bd8-9ca2-70c06894ba39", 52 | "title": "Slow queries over time", 53 | "description": "", 54 | "visualType": "timechart", 55 | "pageId": "57b9f821-760e-45d0-82ee-71fb8dc71d79", 56 | "layout": { 57 | "x": 0, 58 | "y": 0, 59 | "width": 8, 60 | "height": 9 61 | }, 62 | "query": { 63 | "kind": "inline", 64 | "dataSource": { 65 | "kind": "inline", 66 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 67 | }, 68 | "usedVariables": [ 69 | "_city", 70 | "_endTime", 71 | "_queryType", 72 | "_startTime" 73 | ], 74 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| where isempty(['_city']) or client_City in (['_city'])\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds\n , CallStack = customDimensions.CallStack\n , QueryType = customDimensions.QueryType\n , Success = customDimensions.Success\n , JoinCount = customDimensions.JoinCount\n , ReturnedRowCount = customDimensions.ReturnedRowCount\n| where isempty(['_queryType']) or QueryType in (['_queryType'])\n| project [\"Timestamp\"] = timestamp\n , [\"Name\"] = name\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = ExecutionMode\n , [\"Query Type\"] = QueryType\n , [\"Execution Time (s)\"] = ExecutionTimeSeconds\n , [\"Join Count\"] = JoinCount\n , [\"Returned Row Count\"] = ReturnedRowCount\n , Success, CallStack \n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Slow Queries\"] = count() by bin(Timestamp, 1h)" 75 | }, 76 | "visualOptions": { 77 | "multipleYAxes": { 78 | "base": { 79 | "id": "-1", 80 | "label": "", 81 | "columns": [], 82 | "yAxisMaximumValue": null, 83 | "yAxisMinimumValue": null, 84 | "yAxisScale": "linear", 85 | "horizontalLines": [] 86 | }, 87 | "additional": [], 88 | "showMultiplePanels": false 89 | }, 90 | "hideLegend": false, 91 | "xColumnTitle": "", 92 | "xColumn": null, 93 | "yColumns": null, 94 | "seriesColumns": null, 95 | "xAxisScale": "linear", 96 | "verticalLine": "", 97 | "crossFilterDisabled": false, 98 | "drillthroughDisabled": false, 99 | "crossFilter": [], 100 | "drillthrough": [] 101 | } 102 | }, 103 | { 104 | "id": "82e3f98d-f79f-4611-8b7e-c559d88927f0", 105 | "title": "Slow queries by query type", 106 | "description": "", 107 | "visualType": "column", 108 | "pageId": "57b9f821-760e-45d0-82ee-71fb8dc71d79", 109 | "layout": { 110 | "x": 8, 111 | "y": 0, 112 | "width": 8, 113 | "height": 9 114 | }, 115 | "query": { 116 | "kind": "inline", 117 | "dataSource": { 118 | "kind": "inline", 119 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 120 | }, 121 | "usedVariables": [ 122 | "_city", 123 | "_endTime", 124 | "_startTime" 125 | ], 126 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| where isempty(['_city']) or client_City in (['_city'])\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds\n , CallStack = customDimensions.CallStack\n , QueryType = customDimensions.QueryType\n , Success = customDimensions.Success\n , JoinCount = customDimensions.JoinCount\n , ReturnedRowCount = customDimensions.ReturnedRowCount\n| project [\"Timestamp\"] = timestamp\n , [\"Name\"] = name\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = ExecutionMode\n , [\"Query Type\"] = tostring(QueryType)\n , [\"Execution Time (s)\"] = ExecutionTimeSeconds\n , [\"Join Count\"] = JoinCount\n , [\"Returned Row Count\"] = ReturnedRowCount\n , Success, CallStack \n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Slow Queries\"] = count() by ['Query Type']\n" 127 | }, 128 | "visualOptions": { 129 | "multipleYAxes": { 130 | "base": { 131 | "id": "-1", 132 | "label": "Number of queries", 133 | "columns": [], 134 | "yAxisMaximumValue": null, 135 | "yAxisMinimumValue": null, 136 | "yAxisScale": "linear", 137 | "horizontalLines": [] 138 | }, 139 | "additional": [], 140 | "showMultiplePanels": false 141 | }, 142 | "hideLegend": false, 143 | "xColumnTitle": "Query Type", 144 | "xColumn": null, 145 | "yColumns": null, 146 | "seriesColumns": null, 147 | "xAxisScale": "linear", 148 | "verticalLine": "", 149 | "crossFilterDisabled": false, 150 | "drillthroughDisabled": true, 151 | "crossFilter": [ 152 | { 153 | "interaction": "column", 154 | "property": "Query Type", 155 | "parameterId": "f9cae1c1-10c8-4ab1-ada6-e1a7b0cb675d", 156 | "disabled": false 157 | } 158 | ], 159 | "drillthrough": [] 160 | } 161 | }, 162 | { 163 | "id": "06cc23e1-c57c-401e-977b-c6b22b9d7963", 164 | "title": "Slow queries by client country / city", 165 | "description": "", 166 | "visualType": "column", 167 | "pageId": "57b9f821-760e-45d0-82ee-71fb8dc71d79", 168 | "layout": { 169 | "x": 16, 170 | "y": 0, 171 | "width": 8, 172 | "height": 9 173 | }, 174 | "query": { 175 | "kind": "inline", 176 | "dataSource": { 177 | "kind": "inline", 178 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 179 | }, 180 | "usedVariables": [ 181 | "_endTime", 182 | "_queryType", 183 | "_startTime" 184 | ], 185 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| extend LegalEntity = customDimensions.LegalEntity\n , ExecutionMode = customDimensions.ExecutionMode\n , ExecutionTimeSeconds = customDimensions.ExecutionTimeSeconds\n , CallStack = customDimensions.CallStack\n , QueryType = customDimensions.QueryType\n , Success = customDimensions.Success\n , JoinCount = customDimensions.JoinCount\n , ReturnedRowCount = customDimensions.ReturnedRowCount\n| where isempty(['_queryType']) or QueryType in (['_queryType'])\n| project [\"Timestamp\"] = timestamp\n , [\"Name\"] = name\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = ExecutionMode\n , [\"Query Type\"] = tostring(QueryType)\n , [\"Execution Time (s)\"] = ExecutionTimeSeconds\n , [\"Join Count\"] = JoinCount\n , [\"Returned Row Count\"] = ReturnedRowCount\n , Success, CallStack \n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion\n| summarize [\"Slow Queries\"] = count() by ['Client Country'], ['Client City']\n" 186 | }, 187 | "visualOptions": { 188 | "multipleYAxes": { 189 | "base": { 190 | "id": "-1", 191 | "label": "Number of queries", 192 | "columns": [], 193 | "yAxisMaximumValue": null, 194 | "yAxisMinimumValue": null, 195 | "yAxisScale": "linear", 196 | "horizontalLines": [] 197 | }, 198 | "additional": [], 199 | "showMultiplePanels": false 200 | }, 201 | "hideLegend": false, 202 | "xColumnTitle": "Query Type", 203 | "xColumn": null, 204 | "yColumns": null, 205 | "seriesColumns": null, 206 | "xAxisScale": "linear", 207 | "verticalLine": "", 208 | "crossFilterDisabled": false, 209 | "drillthroughDisabled": false, 210 | "crossFilter": [ 211 | { 212 | "interaction": "column", 213 | "property": "Client City", 214 | "parameterId": "b1c9bd85-d46b-4eb4-981f-e3489fb7c4a1", 215 | "disabled": false 216 | }, 217 | { 218 | "disabled": false 219 | } 220 | ], 221 | "drillthrough": [] 222 | } 223 | }, 224 | { 225 | "id": "b053ab8c-0996-410b-92a0-84c625fe1135", 226 | "title": "Top 25 slow queries by duration", 227 | "description": "", 228 | "visualType": "table", 229 | "pageId": "57b9f821-760e-45d0-82ee-71fb8dc71d79", 230 | "layout": { 231 | "x": 0, 232 | "y": 17, 233 | "width": 24, 234 | "height": 8 235 | }, 236 | "query": { 237 | "kind": "inline", 238 | "dataSource": { 239 | "kind": "inline", 240 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 241 | }, 242 | "usedVariables": [ 243 | "_city", 244 | "_endTime", 245 | "_queryType", 246 | "_startTime" 247 | ], 248 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| where isempty(['_city']) or client_City in (['_city'])\n| extend LegalEntity = tostring(customDimensions.LegalEntity)\n , ExecutionMode = tostring(customDimensions.ExecutionMode)\n , ExecutionTimeSeconds = tostring(customDimensions.ExecutionTimeSeconds)\n , CallStack = tostring(customDimensions.CallStack)\n , QueryType = tostring(customDimensions.QueryType)\n , Success = tostring(customDimensions.Success)\n , JoinCount = tostring(customDimensions.JoinCount)\n , ReturnedRowCount = tostring(customDimensions.ReturnedRowCount)\n| where isempty(['_queryType']) or QueryType in (['_queryType'])\n| order by ExecutionTimeSeconds desc\n| limit 25\n| project [\"Timestamp\"] = timestamp\n , [\"Session ID\"] = session_Id\n , [\"User ID\"] = user_Id\n , [\"Legal Entity\"] = LegalEntity\n , [\"Execution Mode\"] = ExecutionMode\n , [\"Query Type\"] = QueryType\n , [\"Execution Time (s)\"] = ExecutionTimeSeconds\n , [\"Join Count\"] = JoinCount\n , [\"Returned Row Count\"] = ReturnedRowCount\n , Success, CallStack \n , [\"Client City\"] = client_City\n , [\"Client Country\"] = client_CountryOrRegion" 249 | }, 250 | "visualOptions": { 251 | "table__enableRenderLinks": true, 252 | "colorRules": [], 253 | "colorRulesDisabled": true, 254 | "colorStyle": "light", 255 | "crossFilterDisabled": false, 256 | "drillthroughDisabled": false, 257 | "crossFilter": [], 258 | "drillthrough": [], 259 | "table__renderLinks": [] 260 | } 261 | } 262 | ], 263 | "parameters": [ 264 | { 265 | "kind": "duration", 266 | "id": "42794f52-6782-487c-b413-b6b565549995", 267 | "displayName": "Time range", 268 | "description": "", 269 | "beginVariableName": "_startTime", 270 | "endVariableName": "_endTime", 271 | "defaultValue": { 272 | "kind": "dynamic", 273 | "count": 1, 274 | "unit": "hours" 275 | }, 276 | "showOnPages": { 277 | "kind": "all" 278 | } 279 | }, 280 | { 281 | "kind": "string", 282 | "id": "f9cae1c1-10c8-4ab1-ada6-e1a7b0cb675d", 283 | "displayName": "Query Type", 284 | "description": "", 285 | "variableName": "_queryType", 286 | "selectionType": "array", 287 | "includeAllOption": true, 288 | "defaultValue": { 289 | "kind": "all" 290 | }, 291 | "dataSource": { 292 | "kind": "query", 293 | "columns": { 294 | "value": "QueryType" 295 | }, 296 | "query": { 297 | "kind": "inline", 298 | "dataSource": { 299 | "kind": "inline", 300 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 301 | }, 302 | "usedVariables": [ 303 | "_endTime", 304 | "_startTime" 305 | ], 306 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"LongRunningQuery\"\n| project QueryType = tostring(customDimensions.QueryType)\n| distinct QueryType" 307 | } 308 | }, 309 | "showOnPages": { 310 | "kind": "selection", 311 | "pageIds": [ 312 | "57b9f821-760e-45d0-82ee-71fb8dc71d79" 313 | ] 314 | } 315 | }, 316 | { 317 | "kind": "string", 318 | "id": "b1c9bd85-d46b-4eb4-981f-e3489fb7c4a1", 319 | "displayName": "City", 320 | "description": "", 321 | "variableName": "_city", 322 | "selectionType": "array", 323 | "includeAllOption": true, 324 | "defaultValue": { 325 | "kind": "all" 326 | }, 327 | "dataSource": { 328 | "kind": "query", 329 | "columns": { 330 | "value": "client_City" 331 | }, 332 | "query": { 333 | "kind": "inline", 334 | "dataSource": { 335 | "kind": "inline", 336 | "dataSourceId": "99f48c40-4d08-4070-af47-32e2e6e0fda7" 337 | }, 338 | "usedVariables": [ 339 | "_endTime", 340 | "_startTime" 341 | ], 342 | "text": "customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == 'LongRunningQuery'\n| distinct client_City\n" 343 | } 344 | }, 345 | "showOnPages": { 346 | "kind": "selection", 347 | "pageIds": [ 348 | "57b9f821-760e-45d0-82ee-71fb8dc71d79" 349 | ] 350 | } 351 | } 352 | ], 353 | "dataSources": [ 354 | { 355 | "id": "99f48c40-4d08-4070-af47-32e2e6e0fda7", 356 | "name": "KSAppInsights1037", 357 | "clusterUri": "https://ade.applicationinsights.io/subscriptions/47620b96-6792-4a5d-9c55-d719e70721c1/resourcegroups/KSAppInsights1037/providers/microsoft.insights/components/KSAppInsights1037", 358 | "database": "KSAppInsights1037", 359 | "kind": "manual-kusto", 360 | "scopeId": "kusto" 361 | } 362 | ], 363 | "pages": [ 364 | { 365 | "name": "Slow Queries", 366 | "id": "57b9f821-760e-45d0-82ee-71fb8dc71d79" 367 | } 368 | ] 369 | } -------------------------------------------------------------------------------- /Dashboards/AzureDataExplorer/Batch/ADE-Dashboard-D365FO-Monitoring-Batch.json: -------------------------------------------------------------------------------- 1 | {"$schema":"https://dataexplorer.azure.com/static/d/schema/63/dashboard.json","id":"1df107d0-bb4d-4625-b635-e09ac34673f6","eTag":"9e06855e-754b-41df-8c20-d2f17e73fa8d","title":"D365FO-Monitoring-Batch","schema_version":63,"tiles":[{"id":"5809a22f-397a-4bd8-9ca2-70c06894ba39","title":"Batch server configuration","visualType":"table","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":18,"y":9,"width":5,"height":7},"queryRef":{"kind":"query","queryId":"915bc00f-4243-49a8-ab11-c28bc17bbeaf"},"description":"Shows the batch server configuration settings","visualOptions":{"table__enableRenderLinks":false,"colorRulesDisabled":false,"crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[{"interaction":"dragX","disabled":false}],"drillthrough":[],"table__renderLinks":[],"colorRules":[{"id":"06bbb9fb-ebf8-4b7d-8b47-8180d6336e21","ruleType":"colorByCondition","ruleName":"","applyTo":"cells","conditions":[{"operator":">=","column":"Max Threads","values":["8"]}],"chainingOperator":"and","colorStyle":"light","applyToColumn":null,"hideText":false,"color":"blue","tag":"","icon":"completed","visualType":"table"},{"id":"3a82f827-c785-4834-9b69-7df10333958d","ruleType":"colorByCondition","applyToColumn":null,"hideText":false,"applyTo":"cells","conditions":[{"operator":"<=","column":"Max Threads","values":["4"]}],"chainingOperator":"and","colorStyle":"light","color":"green","tag":"","icon":"completed","ruleName":"","visualType":"table"}]}},{"id":"8b523026-32a5-45ed-8102-0561ad7a5beb","title":"Batch server #tasks execution spread","visualType":"pie","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":5,"y":0,"width":5,"height":9},"queryRef":{"kind":"query","queryId":"86f56460-5c5a-4105-a10e-16d5a34bc912"},"description":"Shows the number of tasks that are picked up by the different batch AOS instances.","visualOptions":{"hideLegend":false,"legendLocation":"bottom","xColumn":null,"yColumns":null,"seriesColumns":null,"crossFilterDisabled":false,"drillthroughDisabled":false,"labelDisabled":false,"pie__label":["name","percentage"],"tooltipDisabled":false,"pie__tooltip":["name","percentage","value"],"pie__orderBy":"size","pie__kind":"pie","pie__topNSlices":null,"crossFilter":[{"interaction":"dragX","disabled":false}],"drillthrough":[]}},{"id":"5ee5d98e-db2b-4979-a2d6-a07f57518aef","title":"Throttled batch tasks","description":"Shows the running tasks in a 10 minute timeslice, along with the throttled tasks.","visualType":"area","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":10,"y":0,"width":13,"height":9},"queryRef":{"kind":"query","queryId":"a9656546-bff9-4bde-8c49-caf800235f67"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"selectedDataOnLoad":{"all":true,"limit":10},"dataPointsTooltip":{"all":false,"limit":1}}},{"id":"b2e65dce-2f9d-4004-a78b-f45e352bab1c","title":"Priority distribution","description":"Shows the number of tasks by priority.","visualType":"pie","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":0,"width":5,"height":9},"queryRef":{"kind":"query","queryId":"4845ae22-5309-4710-a873-920df4d85319"},"visualOptions":{"hideLegend":false,"legendLocation":"bottom","xColumn":null,"yColumns":null,"seriesColumns":null,"crossFilterDisabled":false,"drillthroughDisabled":false,"labelDisabled":false,"pie__label":["name","percentage"],"tooltipDisabled":false,"pie__tooltip":["name","percentage","value"],"pie__orderBy":"size","pie__kind":"donut","pie__topNSlices":null,"crossFilter":[],"drillthrough":[]}},{"id":"e7f096de-893d-4576-aeab-5dfbc9a3f8e4","title":"Available batch threads","description":"Shows the number of threads available per AOS over time.","visualType":"timechart","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":9,"width":10,"height":7},"queryRef":{"kind":"query","queryId":"acfe99c3-8266-4de0-bd9d-c4426ed4e563"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"selectedDataOnLoad":{"all":true,"limit":10},"dataPointsTooltip":{"all":false,"limit":1}}},{"id":"efcb2bdf-58e4-4f72-86ea-cbe1f3688c16","title":"Batch execution history","description":"Shows batch jobs execution information. Information available includes starting time, completion time, class information and activity ids","visualType":"table","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":0,"y":16,"width":23,"height":7},"queryRef":{"kind":"query","queryId":"5296991b-e95d-4fed-9bba-7cbfb8c1c59c"},"visualOptions":{"table__enableRenderLinks":true,"colorRulesDisabled":false,"crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[],"colorRules":[]}},{"id":"c833576d-243f-4d5b-9c88-e70ffb64e07d","title":"Throttled batch tasks","description":"Shows the running tasks in a 10 minute timeslice, along with the throttled tasks.","visualType":"area","pageId":"d87df241-867d-4f16-88c2-4f6eb842ca85","layout":{"x":0,"y":0,"width":24,"height":9},"queryRef":{"kind":"query","queryId":"512083ba-d96a-48b1-8830-eab3d687556e"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"selectedDataOnLoad":{"all":true,"limit":10},"dataPointsTooltip":{"all":false,"limit":1}}},{"id":"854e98b4-a14d-423e-af65-a472cf35c144","title":"Throttled batch tasks","description":"Shows the running tasks in a 10 minute timeslice, along with the throttled tasks.","visualType":"table","pageId":"d87df241-867d-4f16-88c2-4f6eb842ca85","layout":{"x":0,"y":9,"width":24,"height":9},"queryRef":{"kind":"query","queryId":"8749e43e-4770-4aac-ab51-a6bfa0298c16"},"visualOptions":{"table__enableRenderLinks":true,"colorRulesDisabled":true,"crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[],"colorRules":[]}},{"id":"ff2668e7-ae04-430b-8152-311a0b8b56df","title":"Batch exceptions","description":"This shows the exceptions encountered during batch scheduling or execution. This contains also platform level exceptions that don't reach the Infolog error messages.","visualType":"table","pageId":"e8a9e639-50cb-4687-af2d-d0b581ab247e","layout":{"x":0,"y":18,"width":24,"height":9},"queryRef":{"kind":"query","queryId":"3d117aab-4634-4d52-9edf-68ee424a15d0"},"visualOptions":{"table__enableRenderLinks":true,"colorRulesDisabled":true,"crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[],"colorRules":[]}},{"id":"18c18664-4bdc-4f17-8fd3-b702f676f4bc","title":"Batch Infolog Errors","description":"This shows Infolog error messages coming from batch workloads.","visualType":"table","pageId":"e8a9e639-50cb-4687-af2d-d0b581ab247e","layout":{"x":0,"y":9,"width":24,"height":9},"queryRef":{"kind":"query","queryId":"e3d91e62-cfd6-4506-906f-6a1c72e8b5a1"},"visualOptions":{"table__enableRenderLinks":true,"colorRulesDisabled":true,"crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[],"table__renderLinks":[],"colorRules":[]}},{"id":"2f68faa8-f41d-489a-be59-62b7571936bd","title":"Batch exceptions over time","description":"This shows the exceptions encountered during batch scheduling or execution. This contains also platform level exceptions that don't reach the Infolog error messages.","visualType":"area","pageId":"e8a9e639-50cb-4687-af2d-d0b581ab247e","layout":{"x":12,"y":0,"width":12,"height":9},"queryRef":{"kind":"query","queryId":"64db031b-4a5e-4394-b5d1-d439e70aeabf"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"8742946a-c80c-4a0b-ad8c-3a9af76473a8","title":"Batch Infolog Errors","description":"This shows Infolog error messages coming from batch workloads.","visualType":"area","pageId":"e8a9e639-50cb-4687-af2d-d0b581ab247e","layout":{"x":0,"y":0,"width":12,"height":9},"queryRef":{"kind":"query","queryId":"6cc07939-e1a6-44ce-b8f0-6c4b718ea046"},"visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[],"drillthrough":[]}},{"id":"d6c6ad89-c7bd-416c-8ce3-90837ae1297d","title":"PBS Queue sizes","visualType":"line","pageId":"57b9f821-760e-45d0-82ee-71fb8dc71d79","layout":{"x":10,"y":9,"width":8,"height":7},"queryRef":{"kind":"query","queryId":"8e682fff-dd0b-41dc-bed4-7dcc383176b2"},"description":"Shows the PBS queues and how many tasks are waiting in those specific queues at any given point in time.","visualOptions":{"multipleYAxes":{"base":{"id":"-1","label":"","columns":[],"yAxisMaximumValue":null,"yAxisMinimumValue":null,"yAxisScale":"linear","horizontalLines":[]},"additional":[],"showMultiplePanels":false},"hideLegend":false,"legendLocation":"bottom","xColumnTitle":"","xColumn":null,"yColumns":null,"seriesColumns":null,"xAxisScale":"linear","verticalLine":"","crossFilterDisabled":false,"drillthroughDisabled":false,"crossFilter":[{"interaction":"dragX","disabled":false}],"drillthrough":[]}}],"baseQueries":[],"parameters":[{"kind":"duration","id":"42794f52-6782-487c-b413-b6b565549995","displayName":"Time range","description":"","beginVariableName":"_startTime","endVariableName":"_endTime","defaultValue":{"kind":"dynamic","count":24,"unit":"hours"},"showOnPages":{"kind":"all"}},{"kind":"string","id":"cd512fb6-641a-4c45-8fa5-5cca92f53f95","displayName":"Activity Id","description":"Identification of the activity interacting with forms","variableName":"_activityId","selectionType":"array","includeAllOption":true,"defaultValue":{"kind":"all"},"dataSource":{"kind":"query","columns":{"value":"ActivityId"},"queryRef":{"kind":"query","queryId":"ad733dd1-eb39-4e3c-86e6-3ea16b4a77fe"}},"showOnPages":{"kind":"selection","pageIds":["57b9f821-760e-45d0-82ee-71fb8dc71d79"]}},{"kind":"string","id":"9125b7b6-ab87-42d1-aa8a-f7279be866b5","displayName":"Batch Job Id","description":"","variableName":"_batchJobId","selectionType":"scalar","includeAllOption":true,"defaultValue":{"kind":"all"},"dataSource":{"kind":"query","columns":{"value":"BatchJobId"},"queryRef":{"kind":"query","queryId":"d0c728f6-b6de-495d-981c-55c56e53f139"}},"showOnPages":{"kind":"all"}}],"dataSources":[{"id":"6f2edf23-11b6-48a1-ad15-81660c55ff77","kind":"manual-kusto","scopeId":"kusto","name":"D365FSCM-Dev","clusterUri":"https://ade.applicationinsights.io/subscriptions/79def5f1-f626-479f-8db5-b1272680adc1/resourcegroups/ksappinsightsahiad/","database":"D365FSCM-AppInsights-AHAID","queryResultsCacheMaxAge":10000}],"pages":[{"name":"Batch Overview","id":"57b9f821-760e-45d0-82ee-71fb8dc71d79"},{"name":"Batch Throttling","id":"d87df241-867d-4f16-88c2-4f6eb842ca85"},{"name":"Batch Errors","id":"e8a9e639-50cb-4687-af2d-d0b581ab247e"}],"queries":[{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchThreadInfo\"\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend infoMessageParsed = parse_json(tostring(customDimensionsParsed.InfoMessage))\n| extend CurrentBatchTasks = infoMessageParsed.CurrentBatchTasks\n| extend TaskQueueCount = infoMessageParsed.TaskQueueCount\n| extend MaxThreadCount = infoMessageParsed.MaxThreadCount\n| extend ReservedNumberOfThreads = infoMessageParsed.ReservedNumberOfThreads\n| summarize arg_max(timestamp, MaxThreadCount)\n , arg_max(timestamp, ReservedNumberOfThreads) by cloud_RoleInstance\n| project [\"Batch AOS\"] = cloud_RoleInstance\n , [\"Max Threads\"] = MaxThreadCount\n , [\"Reserved Threads\"] = ReservedNumberOfThreads\n| order by [\"Batch AOS\"] asc","id":"915bc00f-4243-49a8-ab11-c28bc17bbeaf","usedVariables":["_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchTaskStart\"\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend batchJobId = customDimensionsParsed.batchJobId\n| where isempty(_batchJobId) or tostring(batchJobId) in (_batchJobId)\n| extend batchAOSArray = split(cloud_RoleInstance, \"-\")\n| extend batchAOS = strcat(batchAOSArray[0])\n| project batchAOS\n| summarize count() by batchAOS\n| order by batchAOS asc\n","id":"86f56460-5c5a-4105-a10e-16d5a34bc912","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"let _scale = '10m';\ncustomEvents\n| where timestamp between (_startTime .. _endTime)\n| where name in (\"BatchThrottled\", \"BatchTaskStart\")\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend batchJobId = customDimensionsParsed.BatchJobId\n| where isempty(_batchJobId) or tostring(batchJobId) in (_batchJobId)\n| summarize ThrottledTasks = countif(name == \"BatchThrottled\"), RunningTasks = countif(name == \"BatchTaskStart\") by TimeSum=bin(timestamp, totimespan(_scale))\n| project TimeSum, RunningTasks, ThrottledTasks\n| order by TimeSum asc","id":"a9656546-bff9-4bde-8c49-caf800235f67","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchTaskStart\"\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend InfoMessageParsed = parse_json(tostring(CustomDimensionsParsed.InfoMessage))\n| extend Priority = iif(isnotempty(tostring(CustomDimensionsParsed.Priority)), tostring(CustomDimensionsParsed.Priority), 'Normal') // Ensuring that when enabling the telemetry to test, we account for potential missing initial values)\n| extend BatchTaskId = tostring(CustomDimensionsParsed.BatchTaskId)\n| distinct BatchTaskId, Priority\n| summarize count() by Priority","id":"4845ae22-5309-4710-a873-920df4d85319","usedVariables":["_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchThreadInfo\"\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend infoMessageParsed = parse_json(tostring(customDimensionsParsed.InfoMessage))\n| extend CurrentBatchTasks = infoMessageParsed.CurrentBatchTasks\n| extend TaskQueueCount = infoMessageParsed.TaskQueueCount\n| extend MaxThreadCount = infoMessageParsed.MaxThreadCount\n| extend ReservedNumberOfThreads = infoMessageParsed.ReservedNumberOfThreads\n| project timestamp, Batch = tostring(split(cloud_RoleInstance, \"-\")[0]), AvailableThreads = todecimal(MaxThreadCount) - todecimal(CurrentBatchTasks) - todecimal(ReservedNumberOfThreads)","id":"acfe99c3-8266-4de0-bd9d-c4426ed4e563","usedVariables":["_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name in (\"BatchTaskStart\",\"BatchTaskFinished\",\"BatchTaskFailure\")\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend InfoMessageParsed = parse_json(tostring(CustomDimensionsParsed.InfoMessage))\n| extend ActivityId = tostring(CustomDimensionsParsed.activityId)\n| extend ClassName = tostring(CustomDimensionsParsed.ClassName)\n| extend BatchJobId = tostring(CustomDimensionsParsed.BatchJobId)\n| extend BatchJobTaskId1 = tostring(CustomDimensionsParsed.BatchJobTaskId)\n| extend BatchJobTaskId2 = tostring(CustomDimensionsParsed.BatchTaskId)\n| extend BatchJobTaskId = iif(isnotempty(BatchJobTaskId1), BatchJobTaskId1, BatchJobTaskId2) // Temporary trick until the batch team synchronizes the field names across events\n//| where isempty(_batchAOS) or cloud_RoleInstance in(_batchAOS)\n| extend StartTime = iff(name == \"BatchTaskStart\" , timestamp, datetime(null))\n| extend EndTime = iff(name == \"BatchTaskFinished\" , timestamp, datetime(null))\n| extend ErrorTime = iff(name == \"BatchTaskFailure\" , timestamp, datetime(null))\n| extend RetryCount = iff(name == \"BatchTaskStart\" , InfoMessageParsed.RetryCount, \"\")\n| project StartTime, EndTime,ErrorTime,RetryCount, ActivityId, ClassName, BatchJobId, RoleInstance = cloud_RoleInstance, BatchJobTaskId\n| where isempty(_batchJobId) or tostring(BatchJobId) in (_batchJobId)\n| summarize StartTime = min(StartTime),\n CompletionTime = max(EndTime),\n ErrorTime = max(ErrorTime),\n RetryCount = take_any(RetryCount),\n ClassName = any(ClassName), \n BatchJobId = any(BatchJobId),\n BatchJobTaskId = any(BatchJobTaskId),\n RoleInstance = any(RoleInstance)\nby ActivityId\n| where isnotempty(StartTime)\n| extend BatchAOS = strcat(split(RoleInstance, \"-\")[0])\n| extend ElapsedTime = iif(isnotempty(CompletionTime), CompletionTime, now()) - StartTime\n| project ActivityId, BatchAOS, BatchJobId, BatchJobTaskId, ClassName, StartTime, CompletionTime, ElapsedTime, RetryCount","id":"5296991b-e95d-4fed-9bba-7cbfb8c1c59c","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"let _scale = '10m';\ncustomEvents\n| where timestamp between (_startTime .. _endTime)\n| where name in (\"BatchThrottled\", \"BatchTaskStart\")\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend batchJobId = customDimensionsParsed.BatchJobId\n| where isempty(_batchJobId) or tostring(batchJobId) in (_batchJobId)\n| summarize ThrottledTasks = countif(name == \"BatchThrottled\"), RunningTasks = countif(name == \"BatchTaskStart\") by TimeSum=bin(timestamp, totimespan(_scale))\n| project TimeSum, RunningTasks, ThrottledTasks\n| order by TimeSum asc","id":"512083ba-d96a-48b1-8830-eab3d687556e","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"let _scale = '10m';\ncustomEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchThrottled\"\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend BatchJobId = customDimensionsParsed.BatchJobId // this is actually always 0\n| extend EventId = customDimensionsParsed.eventId\n| extend EnvironmentId = customDimensionsParsed.environmentId\n| extend LegalEntity = customDimensionsParsed.LegalEntity\n| extend ActivityId = customDimensionsParsed.activityId\n| extend EventMessage = customDimensionsParsed.EventMessage\n| extend InfoMessage = customDimensionsParsed.InfoMessage\n| extend InfoMessageParsed = parse_json(tostring(InfoMessage))\n| extend CurrentMachineCPU = round(toreal(InfoMessageParsed.CurrentMachineCpu), 0)\n| extend CurrentMachineMemory = InfoMessageParsed.CurrentMachineMemory\n| extend CurrentSqlDtu = InfoMessageParsed.CurrentSqlDtu\n| project timestamp, EventId, name, user_Id, session_Id, cloud_RoleInstance, EnvironmentId, LegalEntity, ActivityId, EventMessage, CurrentMachineCPU, CurrentMachineMemory, CurrentSqlDtu","id":"8749e43e-4770-4aac-ab51-a6bfa0298c16","usedVariables":["_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"// BatchTaskFailure is providing Exceptions in the batch execution. \n// These events are providing exception information that is often not covered by infolog errors, but exceptions that are thrown during batch processing and batch scheduling.\ncustomEvents\n| where timestamp between (_startTime .. _endTime)\n| where name in (\"BatchTaskFailure\")\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend BatchJobCaption = tostring(CustomDimensionsParsed.BatchJobCaption)\n| extend ActivityId = tostring(CustomDimensionsParsed.activityId)\n| extend ClassName = iif((tostring(CustomDimensionsParsed.ClassName) == \"\"), \"\", tostring(CustomDimensionsParsed.ClassName))\n| extend BatchJobId = tostring(CustomDimensionsParsed.BatchJobId)\n| extend BatchTaskId = tostring(CustomDimensionsParsed.BatchTaskId)\n| extend EventMessage = tostring(CustomDimensionsParsed.EventMessage)\n| extend ExceptionType = tostring(CustomDimensionsParsed.ExceptionType)\n| extend ExceptionMessage = tostring(CustomDimensionsParsed.ExceptionMessage)\n| extend CallStack = tostring(CustomDimensionsParsed.CallStack)\n| where isempty(_batchJobId) or tostring(BatchJobId) in (_batchJobId)\n| project TimeStamp = timestamp, RoleInstance = cloud_RoleInstance, ActivityId, BatchJobCaption, ClassName, BatchJobId, BatchTaskId, EventMessage, ExceptionType, ExceptionMessage, CallStack\n\n","id":"3d117aab-4634-4d52-9edf-68ee424a15d0","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"exceptions\n| where timestamp between (_startTime .. _endTime)\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend ExecutionMode = tostring(CustomDimensionsParsed.ExecutionMode)\n| extend BatchJobId = tostring(CustomDimensionsParsed.BatchJobId)\n| extend BatchJobCaption = tostring(CustomDimensionsParsed.BatchJobCaption)\n| extend ActivityId = tostring(CustomDimensionsParsed.activityId)\n| extend MethodName = tostring(CustomDimensionsParsed.MethodName)\n| extend ClassName = tostring(CustomDimensionsParsed.ClassName)\n| extend CallStack = tostring(CustomDimensionsParsed.CallStack)\n| where ExecutionMode == \"Batch\"\n| where isempty(_batchJobId) or tostring(BatchJobId) in (_batchJobId)\n| project TimeStamp = timestamp, ActivityId, BatchJobId, BatchJobCaption, OuterMessage = outerMessage, CallStack","id":"e3d91e62-cfd6-4506-906f-6a1c72e8b5a1","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"// BatchTaskFailure is providing Exceptions in the batch execution. \n// These events are providing exception information that is often not covered by infolog errors, but exceptions that are thrown during batch processing and batch scheduling.\ncustomEvents\n| where timestamp between (_startTime .. _endTime)\n| where name in (\"BatchTaskFailure\")\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend BatchJobId = tostring(CustomDimensionsParsed.BatchJobId)\n| where isempty(_batchJobId) or tostring(BatchJobId) in (_batchJobId)\n| summarize TotalFailures = count() by bin(timestamp, 10m)\n\n","id":"64db031b-4a5e-4394-b5d1-d439e70aeabf","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"exceptions\n| where timestamp between (_startTime .. _endTime)\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend ExecutionMode = tostring(CustomDimensionsParsed.ExecutionMode)\n| extend BatchJobId = tostring(CustomDimensionsParsed.BatchJobId)\n| where ExecutionMode == \"Batch\"\n| where isempty(_batchJobId) or tostring(BatchJobId) in (_batchJobId)\n| summarize TotalErrors = count() by bin(timestamp, 10m)","id":"6cc07939-e1a6-44ce-b8f0-6c4b718ea046","usedVariables":["_batchJobId","_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| where name == \"BatchQueuesDetails\"\n| extend CustomDimensionsParsed = parse_json(customDimensions)\n| extend InfoMessageParsed = parse_json(tostring(CustomDimensionsParsed.InfoMessage))\n| extend BatchLowSchedulingQueue = toint(InfoMessageParsed.BatchLowSchedulingQueue)\n| extend BatchNormalSchedulingQueue = toint(InfoMessageParsed.BatchNormalSchedulingQueue)\n| extend BatchHighSchedulingQueue = toint(InfoMessageParsed.BatchHighSchedulingQueue)\n| extend BatchCriticalSchedulingQueue = toint(InfoMessageParsed.BatchCriticalSchedulingQueue)\n| extend BatchReservedCapacitySchedulingQueue = toint(InfoMessageParsed.BatchReservedCapacitySchedulingQueue)\n| extend ReadyTasksBuffer = toint(InfoMessageParsed.ReadyTasksBuffer)\n| extend ReadyTasksBufferWithPriorities = toint(InfoMessageParsed.ReadyTasksBufferWithPriorities)\n| project timestamp, BatchLowSchedulingQueue, BatchNormalSchedulingQueue, BatchHighSchedulingQueue, BatchReservedCapacitySchedulingQueue, ReadyTasksBuffer, ReadyTasksBufferWithPriorities","id":"8e682fff-dd0b-41dc-bed4-7dcc383176b2","usedVariables":["_endTime","_startTime"]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"pageViews\n| extend ActivityId = tostring(customDimensions.activityId)\n| distinct ActivityId","id":"ad733dd1-eb39-4e3c-86e6-3ea16b4a77fe","usedVariables":[]},{"dataSource":{"kind":"inline","dataSourceId":"6f2edf23-11b6-48a1-ad15-81660c55ff77"},"text":"customEvents\n| where timestamp between (_startTime .. _endTime)\n| extend customDimensionsParsed = parse_json(customDimensions)\n| extend BatchJobId = tostring(customDimensionsParsed.BatchJobId)\n| distinct BatchJobId\n| order by BatchJobId asc\n","id":"d0c728f6-b6de-495d-981c-55c56e53f139","usedVariables":["_endTime","_startTime"]}]} --------------------------------------------------------------------------------