Please note that this article is valid exclusively for the self-hosted version of Configuration Manager
Integrating Configuration Manager with Azure Log Analytics allows you to collect, monitor, and analyze Sync data for advanced reporting and automation. In Configuration Manager, the Log Analytics integration can be installed automatically via the Reports page.
If you cannot use the automated installer, or wish to utilize custom resources in your tenant, you can follow the steps outlined below. This guide walks you through creating an Azure App Registration, configuring a resource group with the necessary analytics infrastructure, assigning permissions, and updating Pipeline variables.
Create an App Registration
- Go to Azure Active Directory > App registrations > New registration.
- Name:
Suggested:Simeon Cloud Reporting
- Register the application.
- Create a Client Secret:
In the app registration, go to Certificates & secrets > New client secret.
Provision Azure Resources
Create a dedicated Resource Group that includes the following:
- Log Analytics Workspace
- Data Collection Endpoint (DCE)
- Data Collection Rule (DCR)
These resources can be provisioned using ARM templates or through the Azure Portal.
Expand to view the ARM Template
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workspaceName": {
"type": "string"
},
"streamName": {
"type": "string"
},
"dataCollectionRuleName": {
"type": "string",
"defaultValue": "SyncLogCollectionRule"
},
"dataCollectionEndpointName": {
"type": "string",
"defaultValue": "SyncLogCollectionEndpoint"
},
"retentionInDays": {
"type": "int",
"defaultValue": 120
}
},
"resources": [
{
"type": "Microsoft.OperationalInsights/workspaces",
"apiVersion": "2022-10-01",
"name": "[parameters('workspaceName')]",
"location": "[resourceGroup().location]",
"properties": {
"sku": {
"name": "pergb2018"
},
"retentionInDays": "[parameters('retentionInDays')]",
"features": {
"enableLogAccessUsingOnlyResourcePermissions": true
},
"workspaceCapping": {
"dailyQuotaGb": -1
},
"publicNetworkAccessForIngestion": "Enabled",
"publicNetworkAccessForQuery": "Enabled"
}
},
{
"type": "Microsoft.Insights/dataCollectionEndpoints",
"apiVersion": "2022-06-01",
"name": "[parameters('dataCollectionEndpointName')]",
"location": "[resourceGroup().location]",
"properties": {
"networkAcls": {
"publicNetworkAccess": "Enabled"
}
}
},
{
"type": "Microsoft.OperationalInsights/workspaces/tables",
"apiVersion": "2021-12-01-preview",
"name": "[concat(parameters('workspaceName'), '/SyncLogs_CL')]",
"dependsOn": [
"[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
],
"properties": {
"totalRetentionInDays": "[parameters('retentionInDays')]",
"plan": "Analytics",
"schema": {
"name": "SyncLogs_CL",
"columns": [
{ "name": "Action", "type": "string" },
{ "name": "Baseline_Name", "type": "string" },
{ "name": "Baseline_Property_Value", "type": "string" },
{ "name": "Change_Type", "type": "string" },
{ "name": "Configuration", "type": "string" },
{ "name": "Configuration_Description", "type": "string" },
{ "name": "Configuration_Full_Name", "type": "string" },
{ "name": "Configuration_Reconciliation_Type","type": "string" },
{ "name": "Configuration_Type", "type": "string" },
{ "name": "Configuration_Type_Description", "type": "string" },
{ "name": "Error_Message", "type": "string" },
{ "name": "Old_Property_Value", "type": "string" },
{ "name": "Organization", "type": "string" },
{ "name": "Property_Name", "type": "string" },
{ "name": "Property_Reconciliation_Type", "type": "string" },
{ "name": "Property_Value", "type": "string" },
{ "name": "Sync_Comment", "type": "string" },
{ "name": "Sync_Date_Time", "type": "datetime" },
{ "name": "Sync_Run_Name", "type": "string" },
{ "name": "Tenant", "type": "string" },
{ "name": "TimeGenerated", "type": "datetime" }
]
},
"retentionInDays": "[parameters('retentionInDays')]"
}
},
{
"type": "Microsoft.Insights/dataCollectionRules",
"apiVersion": "2021-09-01-preview",
"name": "[parameters('dataCollectionRuleName')]",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]",
"[resourceId('Microsoft.Insights/dataCollectionEndpoints', parameters('dataCollectionEndpointName'))]",
"[resourceId('Microsoft.OperationalInsights/workspaces/tables', parameters('workspaceName'), 'SyncLogs_CL')]"
],
"properties": {
"dataCollectionEndpointId": "[resourceId('Microsoft.Insights/dataCollectionEndpoints', parameters('dataCollectionEndpointName'))]",
"streamDeclarations": {
"[parameters('streamName')]": {
"columns": [
{ "name": "Action", "type": "string" },
{ "name": "Baseline_Name", "type": "string" },
{ "name": "Baseline_Property_Value", "type": "string" },
{ "name": "Change_Type", "type": "string" },
{ "name": "Configuration", "type": "string" },
{ "name": "Configuration_Description", "type": "string" },
{ "name": "Configuration_Full_Name", "type": "string" },
{ "name": "Configuration_Reconciliation_Type","type": "string" },
{ "name": "Configuration_Type", "type": "string" },
{ "name": "Configuration_Type_Description", "type": "string" },
{ "name": "Error_Message", "type": "string" },
{ "name": "Old_Property_Value", "type": "string" },
{ "name": "Organization", "type": "string" },
{ "name": "Property_Name", "type": "string" },
{ "name": "Property_Reconciliation_Type", "type": "string" },
{ "name": "Property_Value", "type": "string" },
{ "name": "Sync_Comment", "type": "string" },
{ "name": "Sync_Date_Time", "type": "datetime" },
{ "name": "Sync_Run_Name", "type": "string" },
{ "name": "Tenant", "type": "string" }
]
}
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]",
"name": "[parameters('workspaceName')]"
}
]
},
"dataFlows": [
{
"streams": [
"[parameters('streamName')]"
],
"destinations": [
"[parameters('workspaceName')]"
],
"transformKql": "source\n| extend TimeGenerated = todatetime(Sync_Date_Time)\n",
"outputStream": "Custom-SyncLogs_CL"
}
]
}
}
],
"outputs": {
"dataCollectionEndpointId": {
"type": "string",
"value": "[resourceId('Microsoft.Insights/dataCollectionEndpoints', parameters('dataCollectionEndpointName'))]"
},
"dataCollectionRuleId": {
"type": "string",
"value": "[resourceId('Microsoft.Insights/dataCollectionRules', parameters('dataCollectionRuleName'))]"
},
"logAnalyticsResourceId": {
"type": "string",
"value": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
}
}
}
Assign Required Role
- Assign the Monitoring Metrics Publisher role to your App Registration:
Update Pipeline variables in DevOps
Navigate to your Configuration Manager project in Azure DevOps > Pipelines > Library > Variable Groups and select the variable group named “Sync”.
If there is no variable group, you should create a new one.
Update/define the following variables:
-
LogAnalyticsEndpointUrl
- Constructed in the following format:
{Data collection endpoint injestion URL}/dataCollectionRules/{dcr-id}/streams/Custom-SimeonSync
- Example
https://simeoncloud-simeoncloud-com-0xzf.eastus-1.ingest.monitor.azure.com/dataCollectionRules/dcr-bcf4176c6571489bdfgdf1de778781988b6/streams/Custom-SimeonSync
- Constructed in the following format:
-
SimeonSyncIntegrationAppId
App ID -
SimeonSyncIntegrationAppSecret
: the client secret value you created earlier. -
SimeonSyncIntegrationTenant:
the tenant domain name