Analyzing Report Telemetry

INTRODUCED IN: Business Central 2020 release wave 1

Note

Azure Active Directory is now Microsoft Entra ID. Learn more

Report telemetry gathers data about which reports are run on the environment. It provides information about whether the report succeeded, failed, or was canceled. For each report, it tells you how long it ran, how many SQL statements it executed, and how many rows it consumed.

You use this data to gather statistics on report usage, find failures in reports, or to help identify slow-running reports.

Tip

The time spent to run a report consists of two parts: generating the dataset and rendering the report (applying the layout). In report telemetry, you get two durations: serverExecutionTime and totalTime. The former is roughly the time it takes for the server to generate the dataset. To calculate the rendering time, simply subtract serverExecutionTime from totalTime: renderingTime = totalTime - serverExecutionTime.

Successful report generation

Occurs when a report dataset generates without any errors.

General dimensions

The following table explains the general dimensions of this trace.

Dimension Description or value
operation_Name Success report generation

Note: The use of the operation_Name column was deprecated in version 16.1. In future versions, data won't be stored in this column. So in version 16.1 and later, use the custom dimension column eventId column custom in Kusto queries instead of operation_Name.
message Version 16.1 and later:
Report rendered: {report ID} - {report name}

Before version 16.1:
The report {report ID} '{report name}' rendered successfully
severityLevel 1
user_Id The user telemetry ID for the user. From the user card, you can use user_Id to identify the user who triggered this telemetry event. For more information, see Assign a telemetry ID to users.

Custom dimensions

Dimension Description or value
aadTenantId Specifies the Microsoft Entra tenant ID used for Microsoft Entra authentication. For on-premises, if you aren't using Microsoft Entra authentication, this value is common.
alObjectId Specifies the ID of the report object that was run.
alObjectName Specifies the name of the report object that was run.
alObjectType Report.
alStackTrace The stack trace in AL.
clientType Specifies the type of client that executed the SQL Statement, such as Background or Web. For a list of the client types, see ClientType Option Type.
companyName Specifies the display name of the Business Central company for which the report was run.
component Dynamics 365 Business Central Server.
componentVersion Specifies the version number of the component that emits telemetry (see the component dimension.)
deprecatedKeys Specifies a comma-separated list of all the keys that have been deprecated. The keys in this list are still supported but will eventually be removed in the next major release. We recommend that update any queries that use these keys to use the new key name.
documentFormat Specifies the format of the report outputs as a result of the report action. See documentFormat. This dimension was added in version 20.0.
environmentName Specifies the name of the tenant environment. See Managing Environments.
environmentType Specifies the environment type for the tenant, such as Production, Sandbox, Trial. See Environment Types
eventId RT0006

This dimension was introduced in Business Central 2020 release wave 1, version 16.1.
extensionId Specifies the appID of the extension that the report object belongs to.
extensionName Specifies the name of the extension that the report object belongs to.
extensionVersion Specifies the version of the extension that the report object belongs to.
extensionPublisher Specifies the publisher of the extension that the report object belongs to.
numberOfRows Specifies the number of rows/records generated for the report dataset.
reportAction Specifies the action that was done on the report. See reportAction. This dimension was added in version 20.0.
reportingEngine Specifies the reporting engine used to generate the report, such as ProcessingOnly, Rdlc, or Word. This dimension was added in version 17.3
result Success
serverExecutionTime Specifies the amount of time it took the service to complete the request[1]. The time has the format hh:mm:ss.sssssss.
sqlDatabaseAccessIntent Specifies the database access intent used to read data for the report, such as ReadOnly, or ReadWrite. This dimension was added in version 19.1.
sqlExecutes Specifies the number of SQL statements that the report executed[1].
sqlRowsRead Specifies the number of table rows that were read by the SQL statements[1].
telemetrySchemaVersion Specifies the version of the Business Central telemetry schema.
totalTime Specifies the amount of time it took for the system to generate the dataset and render the report[1]. The time has the format hh:mm:ss.sssssss.

1From telemetrySchemaVersion 0.6 and onwards, this value also includes the CompanyOpen operation.

reportAction

The reportAction dimension shows actions taken to generate a report. The action can be taken from the report request page, for example, from the Send To menu, or from AL code.

Value Description
None There were no results from the request page, for example, the user canceled.
Print The user selected to print the report.
Preview The user selected to preview the report from the request page.
Save The report was saved to a file by a call to the SaveAs method in AL code.
Schedule The user selected to schedule the report from the request page.
Download The user downloaded the report as a file from the request page.
Parameters Parameters and filters were collected from the request page without rendering the output.

documentFormat

The documentFormat dimension shows the output of the generated report as a result of the report action. The action can be taken from the report request page, for example, from the Send To menu, or from AL code.

Value Description
None There was no output, for example, the user canceled.
Pdf The output was a .pdf file type.
Xml The outout was a .xml file type.
Word The output was a .docx file type.
Html The output was a .html file type.
Excel The output was a .xlsx file type that included the layout and dataset.
ExcelDataset The output was a .xlsx file type that contained the dataset only.
Custom The output was an custom file type.
ProcessingOnly The action was for processing report without any kind of layout.

layoutType

The layoutType shows the layout type that was used to generate the report in the current action. The action can be taken from the report request page, for example, from the Send To menu, or from AL code.

Value Description
None There was no layout specified.
Rdlc The layout was a .rdlc file type.
Word The layout was a .docx file type.
Excel The layout was a .xlsx file type.
Custom The layout was an custom file type.
ProcessingOnly The action was for processing report without any kind of layout.

Sample KQL code (successful report generation - usage)

This KQL code can help you get started analyzing which reports users run:

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions has 'RT0006'
| where customDimensions.eventId == 'RT0006' 
// | where operation_Name == "Success report generation" // use this instead of eventId clause for versions 16.0 or earlier
| where customDimensions.result == "Success"
| project timestamp
// in which environment/company did it happen
, aadTenantId = customDimensions.aadTenantId
, environmentName = customDimensions.environmentName
, environmentType = customDimensions.environmentType
, companyName = customDimensions.companyName
// in which extension/app
, extensionId = customDimensions.extensionId
, extensionName = customDimensions.extensionName
, extensionVersion = customDimensions.extensionVersion
, extensionPublisher = customDimensions.extensionPublisher
// in which object
, alObjectId = customDimensions.alObjectId
, alObjectName = customDimensions.alObjectName
, alObjectType = customDimensions.alObjectType
// what did the user do
, documentFormat = customDimensions.documentFormat   // documentFormat dimension added in version 20.0
, LayoutAppId = customDimensions.layoutAppId         // layout dimensions added in version 20.0
, LayoutName = customDimensions.layoutName           // layout dimensions added in version 20.0
, LayoutType = customDimensions.layoutType           // layout dimensions added in version 20.0
, reportAction = customDimensions.reportAction       // reportAction dimension added in version 20.0
, reportingEngine = customDimensions.reportingEngine // reportingEngine dimension was added in version 17.3
// which user ran the report
, usertelemetryId = case(
  toint( substring(customDimensions.componentVersion,0,2)) >= 20, user_Id // user telemetry id was introduced in the platform in version 20.0
, 'N/A'
)

If you want to summarize the data, keep the columns you want to group by in the project part of the KQL query above, and add a summarize command:

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions has 'RT0006'
| where customDimensions.eventId == 'RT0006' 
// | where operation_Name == "Success report generation" // use this instead of eventId clause for versions 16.0 or earlier
| where customDimensions.result == "Success"
| project timestamp
, alObjectName = customDimensions.alObjectName
, LayoutType = customDimensions.layoutType           
, reportAction = customDimensions.reportAction       
// calculate report count by ReportName, ReportAction (save/preview/download/...), and LayoutType (Word/Excel/RDLC/...)
| summarize ReportCount=count() 
by ReportName = tostring(customDimensions.alObjectName)
, ReportAction = tostring(customDimensions.reportAction)
, LayoutType = tostring(customDimensions.layoutType)

Sample KQL code (successful report generation - all dimensions)

This KQL code can help you get started analyzing report rendering:

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions has 'RT0006'
| where customDimensions.eventId == 'RT0006' 
// | where operation_Name == "Success report generation" // use this instead of eventId clause for versions 16.0 or earlier
| where customDimensions.result == "Success"
| project timestamp
// in which environment/company did it happen
, aadTenantId = customDimensions.aadTenantId
, environmentName = customDimensions.environmentName
, environmentType = customDimensions.environmentType
, companyName = customDimensions.companyName
// in which extension/app
, extensionId = customDimensions.extensionId
, extensionName = customDimensions.extensionName
, extensionVersion = customDimensions.extensionVersion
, extensionPublisher = customDimensions.extensionPublisher
// in which object
, alObjectId = customDimensions.alObjectId
, alObjectName = customDimensions.alObjectName
, alObjectType = customDimensions.alObjectType
// what did the user do
, documentFormat = customDimensions.documentFormat   // documentFormat dimension added in version 20.0
, LayoutAppId = customDimensions.layoutAppId         // layout dimensions added in version 20.0
, LayoutName = customDimensions.layoutName           // layout dimensions added in version 20.0
, LayoutType = customDimensions.layoutType           // layout dimensions added in version 20.0
, reportAction = customDimensions.reportAction       // reportAction dimension added in version 20.0
, reportingEngine = customDimensions.reportingEngine // reportingEngine dimension was added in version 17.3
// which user ran the report
, usertelemetryId = case(
  toint( substring(customDimensions.componentVersion,0,2)) >= 20, user_Id // user telemetry ID was introduced in the platform in version 20.0
, 'N/A'
)
// performance data
, numberOfRows = customDimensions.numberOfRows
// , serverExecutionTime = customDimensions.serverExecutionTime // the datatype for executionTime is timespan
, serverExecutionTimeInMS = toreal(totimespan(customDimensions.serverExecutionTime))/10000 // this shows how to convert timespan to milliseconds
, sqlDatabaseAccessIntent = customDimensions.sqlDatabaseAccessIntent  // sqlDatabaseAccessIntent dimension added in version 19.1
, sqlExecutes = customDimensions.sqlExecutes 
, sqlRowsRead = customDimensions.sqlRowsRead
// , totalTime = customDimensions.totalTime // the datatype for totalTime is timespan
, totalTimeInMS = toreal(totimespan(customDimensions.totalTime))/10000 // this shows how to convert timespan to milliseconds
| extend renderTimeInMS = totalTimeInMS - serverExecutionTimeInMS

Failed report generation

This operation occurs when the report dataset couldn't be generated because of an error.

General dimensions

The following table explains the general dimensions of the Failed report generation operation.

Dimension Description or value
message Version 16.1 and later:
Report rendering failed: {report ID} - {report name}

Before version 16.1:
The report {report ID} '{report name}' couldn't be rendered
operation_Name Failed report generation

Note: The use of the operation_Name column was deprecated in version 16.1. In future versions, data won't be stored in this column. So in version 16.1 and later, use the custom dimension column eventID column custom in Kusto queries instead of operation_Name.
severityLevel 3
user_Id The user telemetry ID for the user. From the user card, you can use user_Id to identify the user who triggered this telemetry event. For more information, see Assign a telemetry ID to users.

Custom dimensions

Dimension Description or value
aadTenantId Specifies the Microsoft Entra tenant ID used for Microsoft Entra authentication. For on-premises, if you aren't using Microsoft Entra authentication, this value is common.
alObjectId Specifies the ID of the report object that was run.
alObjectName Specifies the name of the report object that was run.
alObjectType Report.
alStackTrace The stack trace in AL.
cancelReason[2] Specifies why the report was canceled.
clientType Specifies the type of client that executed the SQL Statement, such as Background or Web. For a list of the client types, see ClientType Option Type.
companyName Specifies the display name of the Business Central company for which the report was run.
component Dynamics 365 Business Central Server.
componentVersion Specifies the version number of the component that emits telemetry (see the component dimension.)
deprecatedKeys Specifies a comma-separated list of all the keys that have been deprecated. The keys in this list are still supported but will eventually be removed in the next major release. We recommend that update any queries that use these keys to use the new key name.
documentFormat Specifies the format of the report outputs as a result of the report action. See documentFormat. This dimension was added in version 20.0.
environmentName Specifies the name of the tenant environment. See Managing Environments.
environmentType Specifies the environment type for the tenant, such as Production, Sandbox, Trial. See Environment Types
eventId RT0006

This dimension was introduced in Business Central 2020 release wave 1, version 16.1.
extensionId Specifies the appID of the extension that the report object belongs to.
extensionName Specifies the name of the extension that the report object belongs to.
extensionVersion Specifies the version of the extension that the report object belongs to.
numberOfRows Specifies the number of rows/records generated for the report dataset.
reportAction Specifies the action that was done on the report. See reportAction. This dimension was added in version 20.0.
reportingEngine Specifies the reporting engine used to generate the report, such as ProcessingOnly, Rdlc, or Word. This dimension was added in version 17.3
result Specifies the title of the exception that was thrown, such as NavNCLDialogException.
serverExecutionTime Specifies the amount of time used by service on the request. The time has the format hh:mm:ss.sssssss.
sqlExecutes Specifies the number of SQL statements that the report executed.
sqlRowsRead Specifies the number of table rows that were read by the SQL statements.
telemetrySchemaVersion Specifies the version of the Business Central telemetry schema.
totalTime Specifies the amount of time used to generate the dataset and render the report before it failed. The time has the format hh:mm:ss.sssssss.

2 Available in Business Central 2020 release wave 2 and later only.

Analyzing report generation failures

When a report fails to generate, the result column in the CustomDimensions for the event RT0006 will include the title of the exception that was thrown by the service or the AL code.

Sample KQL code (failed report generation)

This KQL code can help you get started analyzing report failures:

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions has 'RT0006'
| where customDimensions.eventId == 'RT0006' 
// | where operation_Name == "Success report generation" // use this instead of eventId clause for versions 16.0 or earlier
| where customDimensions.result <> "Success"
| project timestamp
// in which environment/company did it happen
, aadTenantId = customDimensions.aadTenantId
, environmentName = customDimensions.environmentName
, environmentType = customDimensions.environmentType
, companyName = customDimensions.companyName
// in which extension/app
, extensionId = customDimensions.extensionId
, extensionName = customDimensions.extensionName
, extensionVersion = customDimensions.extensionVersion
, extensionPublisher = customDimensions.extensionPublisher
// in which object
, alObjectId = customDimensions.alObjectId
, alObjectName = customDimensions.alObjectName
, alObjectType = customDimensions.alObjectType
// what did the user do
, documentFormat = customDimensions.documentFormat   // documentFormat dimension added in version 20.0
, LayoutAppId = customDimensions.layoutAppId         // layout dimensions added in version 20.0
, LayoutName = customDimensions.layoutName           // layout dimensions added in version 20.0
, LayoutType = customDimensions.layoutType           // layout dimensions added in version 20.0
, reportAction = customDimensions.reportAction       // reportAction dimension added in version 20.0
, reportingEngine = customDimensions.reportingEngine // reportingEngine dimension was added in version 17.3
// which user ran the report
, usertelemetryId = case(
  toint( substring(customDimensions.componentVersion,0,2)) >= 20, user_Id // user telemetry id was introduced in the platform in version 20.0
, 'N/A'
)
// what happened
, alStackTrace = customDimensions.alStackTrace
, failureReason = customDimensions.result

Cancellation report generation

This operation occurs when the report dataset generation was canceled. There are various conditions that can cancel a report. The Cancellation report generation operation emits different trace messages for each condition.

General dimensions

The following table explains the general dimensions of the Cancellation report generation operation.

Dimension Description or value
operation_Name Cancellation report generation

Note: The use of the operation_Name column was deprecated in version 16.1. In future versions, data won't be stored in this column. So in version 16.1 and later, use the custom dimension column eventID column custom in Kusto queries instead of operation_Name.
message Specifies the reason why the report was canceled. See Analyzing cancellation messages section for details.
severityLevel 2
user_Id The user telemetry ID for the user. From the user card, you can use user_Id to identify the user who triggered this telemetry event. For more information, see Assign a telemetry ID to users.

Custom dimensions

Dimension Description or value
aadTenantId Specifies the Microsoft Entra tenant ID used for Microsoft Entra authentication. For on-premises, if you aren't using Microsoft Entra authentication, this value is common.
alObjectId Specifies the ID of the report object that was run.
alObjectName Specifies the name of the report object that was run.
alObjectType Report.
alStackTrace The stack trace in AL.
clientType Specifies the type of client that executed the SQL Statement, such as Background or Web. For a list of the client types, see ClientType Option Type.
companyName Specifies the display name of the Business Central company for which the report was run.
component Dynamics 365 Business Central Server.
componentVersion Specifies the version number of the component that emits telemetry (see the component dimension.)
deprecatedKeys Specifies a comma-separated list of all the keys that have been deprecated. The keys in this list are still supported but will eventually be removed in the next major release. We recommend that update any queries that use these keys to use the new key name.
environmentName Specifies the name of the tenant environment. See Managing Environments.
environmentType Specifies the environment type for the tenant, such as Production, Sandbox, Trial. See Environment Types
eventId RT0007

This dimension was introduced in Business Central 2020 release wave 1, version 16.1.
extensionId Specifies the appID of the extension that the report object belongs to.
extensionName Specifies the name of the extension that the report object belongs to.
extensionVersion Specifies the version of the extension that the report object belongs to.
telemetrySchemaVersion Specifies the version of the Business Central telemetry schema.

Sample KQL code (cancelled report generation)

This KQL code can help you get started analyzing report that were cancelled by users or the platform.

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions has 'RT0007'
| where customDimensions.eventId == 'RT0007' 
// | where operation_Name == "Success report generation" // use this instead of eventId clause for versions 16.0 or earlier
| project timestamp
// in which environment/company did it happen
, aadTenantId = customDimensions.aadTenantId
, environmentName = customDimensions.environmentName
, environmentType = customDimensions.environmentType
, companyName = customDimensions.companyName
// in which extension/app
, extensionId = customDimensions.extensionId
, extensionName = customDimensions.extensionName
, extensionVersion = customDimensions.extensionVersion
, extensionPublisher = customDimensions.extensionPublisher
// in which object
, alObjectId = customDimensions.alObjectId
, alObjectName = customDimensions.alObjectName
, alObjectType = customDimensions.alObjectType
// what did the user do
, documentFormat = customDimensions.documentFormat   // documentFormat dimension added in version 20.0
, LayoutAppId = customDimensions.layoutAppId         // layout dimensions added in version 20.0
, LayoutName = customDimensions.layoutName           // layout dimensions added in version 20.0
, LayoutType = customDimensions.layoutType           // layout dimensions added in version 20.0
, reportAction = customDimensions.reportAction       // reportAction dimension added in version 20.0
, reportingEngine = customDimensions.reportingEngine // reportingEngine dimension was added in version 17.3
// which user ran the report
, usertelemetryId = case(
  toint( substring(customDimensions.componentVersion,0,2)) >= 20, user_Id // user telemetry ID was introduced in the platform in version 20.0
, 'N/A'
)
// why was the report cancelled
, cancelReason = tostring( customDimensions.cancelReason )
// 
, cancelReasonLong = case(
  message has "The number of processed rows exceeded", "MaxRowsExceeded"
, message has "The action took longer to complete", "MaxTimeExceeded"
, message has "Received a cancellation request from the user", "UserCancelled"
, "Unknown reason"
)

Analyzing report cancellations

The cancellation messages indicate events that caused the report to be canceled. The telemetry can help identify slow-running reports - reports that take longer than expected to run and generate a large number of rows.

Note

The service evaluates cancellation events in a specific order, and the evaluation is done every five seconds. For more information, see Report Generation and Cancellation Flow.

Cancellation event received. Requesting cancellation of the action.

This message occurs when the session canceled a report as it was being generated.

Received a cancellation request from the user. Requesting cancellation of the action.

This message occurs when a user canceled a report in the client as it was being generated.

The action took longer to complete ({0}) than the specified threshold ({1}). Requesting cancellation of the action.

The service is configured to cancel reports if they take longer to generate than a set amount of time. With Business Central online, you can't change the threshold. With Business Central on-premises, you change the threshold by setting the Max Execution Timeout parameter on the Business Central Server instance. There's no timeout for on-premises by default. For more information, see Configuring Business Central Server.

The rendering of the word report has been cancelled because it took longer than the specified threshold ({0})"

This message occurs when a report that based on a Word layout takes longer to generate than the specified threshold. The event is only relevant for Business Central online. There's no timeout for on-premises.

The number of processed rows exceeded ({0} rows) the maximum number of rows ({1} rows). Requesting cancellation of the action.

The service is configured to cancel reports if they generate more than a set number of rows. With Business Central online, you can't change this threshold. With Business Central on-premises, you change the threshold by setting the Max Rows parameter on the Business Central Server instance. There's no limit on rows for on-premises by default. For more information, see Configuring Business Central Server.

Report cancelled but a commit occurred

This operation occurs when the report dataset generation was canceled but a COMMIT operation occurred before the cancellation. This pattern isn't recommended. Reconsider the report design.

General dimensions

The following table explains the general dimensions of the Report cancelled but a commit occurred operation.

Dimension Description or value
message The report <ID> '<Name>' is being canceled, but a COMMIT() has been performed. This can lead to data inconsistency if the report is not idempotent
severityLevel 2
user_Id The user telemetry ID for the user. From the user card, you can use user_Id to identify the user who triggered this telemetry event. For more information, see Assign a telemetry ID to users.

Custom dimensions

Dimension Description or value
aadTenantId Specifies the Microsoft Entra tenant ID used for Microsoft Entra authentication. For on-premises, if you aren't using Microsoft Entra authentication, this value is common.
alObjectId Specifies the ID of the report object that was run.
alObjectName Specifies the name of the report object that was run.
alObjectType Report.
alStackTrace The stack trace in AL.
cancelReason The reason why the report was cancelled
clientType Specifies the type of client that executed the SQL Statement, such as Background or Web. For a list of the client types, see ClientType Option Type.
companyName Specifies the display name of the Business Central company for which the report was run.
component Dynamics 365 Business Central Server.
componentVersion Specifies the version number of the component that emits telemetry (see the component dimension.)
deprecatedKeys Specifies a comma-separated list of all the keys that have been deprecated. The keys in this list are still supported but will eventually be removed in the next major release. We recommend that update any queries that use these keys to use the new key name.
environmentName Specifies the name of the tenant environment. See Managing Environments.
environmentType Specifies the environment type for the tenant, such as Production, Sandbox, Trial. See Environment Types
eventId RT0011

This dimension was introduced in Business Central 2020 release wave 1, version 16.1.
extensionId Specifies the appID of the extension that the report object belongs to.
extensionName Specifies the name of the extension that the report object belongs to.
extensionPublisher Specifies the name of the extension publisher that the report object belongs to.
extensionVersion Specifies the version of the extension that the report object belongs to.
telemetrySchemaVersion Specifies the version of the Business Central telemetry schema.

Sample KQL code (cancelled report generation where commit occurred)

This KQL code can help you get started analyzing report that were cancelled by users or the platform but where a database commit occurred.

traces
| where timestamp > ago(60d) // adjust as needed
| where customDimensions.eventId == 'RT0011'
| project timestamp
// in which environment/company did it happen
, aadTenantId = customDimensions.aadTenantId
, environmentName = customDimensions.environmentName
, environmentType = customDimensions.environmentType
, companyName = customDimensions.companyName
// in which extension/app
, extensionId = customDimensions.extensionId
, extensionName = customDimensions.extensionName
, extensionVersion = customDimensions.extensionVersion
, extensionPublisher = customDimensions.extensionPublisher
// in which object
, alObjectId = customDimensions.alObjectId
, alObjectName = customDimensions.alObjectName
, alObjectType = customDimensions.alObjectType
// what did the user do
, documentFormat = customDimensions.documentFormat   // documentFormat dimension added in version 20.0
, LayoutAppId = customDimensions.layoutAppId         // layout dimensions added in version 20.0
, LayoutName = customDimensions.layoutName           // layout dimensions added in version 20.0
, LayoutType = customDimensions.layoutType           // layout dimensions added in version 20.0
, reportAction = customDimensions.reportAction       // reportAction dimension added in version 20.0
, reportingEngine = customDimensions.reportingEngine // reportingEngine dimension was added in version 17.3
// which user ran the report
, usertelemetryId = case(
  toint( substring(customDimensions.componentVersion,0,2)) >= 20, user_Id // user telemetry ID was introduced in the platform in version 20.0
, 'N/A'
)
// why was the report cancelled
, cancelReason = tostring( customDimensions.cancelReason )
, alStackTrace = customDimensions.alStackTrace

See also

Report performance
Troubleshooting report errors
Monitoring and Analyzing Telemetry