使用Terraform为Log Analytics工作区添加虚拟机性能计数器
使用Terraform为Log Analytics工作区添加Windows/Linux性能计数器
问题背景
需要通过Terraform给现有Log Analytics工作区添加虚拟机性能计数器,Windows有原生支持,但Linux没有,因此尝试用azapi provider实现。最初执行terraform apply成功后未添加任何计数器,还遇到了parent_id无效的错误。
尝试过程与问题
- 首次尝试用
azapi_update_resource更新工作区资源,使用类型Microsoft.OperationalInsights/workspaces@2020-08-01,执行后无效果:
resource "azapi_update_resource" "this" { type = "Microsoft.OperationalInsights/workspaces@2020-08-01" resource_id = azurerm_log_analytics_workspace.this.id body = jsonencode({ properties = { instanceName = "*" intervalInSeconds = 60 objectName = "Memory" counterName = "% Committed Bytes In Use" } }) }
- 改用
azapi_resource,指定类型为Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01,但错误将parent_id设置为资源组ID,触发错误:
parent_id is invalid: expect ID ofMicrosoft.OperationalInsights/workspaces
对应错误代码:
resource "azapi_resource" "windows_committed_bytes" { type = "Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01" name = "WindowsCommittedBytes" parent_id = azurerm_resource_group.this.id body = jsonencode({ kind = "WindowsPerformanceCounter" properties = { "objectName" : "Memory", "instanceName" : "*", "intervalSeconds" : 60, "counterName" : "% Committed Bytes in Use" } }) }
最终解决方案
核心修正:将azapi_resource的parent_id设置为Log Analytics工作区的ID,而非资源组ID;同时针对Windows和Linux性能计数器,分别配置正确的kind字段和属性结构。
完整配置
先配置所需provider:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "3.67.0" } azapi = { source = "Azure/azapi" version = "1.8.0" } } } provider "azurerm" { features { } } provider "azapi" { }
再定义资源(包含工作区、Windows和Linux性能计数器):
resource "azurerm_resource_group" "this" { name = "rg-eus2-law" location = "East US 2" } resource "azurerm_log_analytics_workspace" "this" { name = "law-eus2" resource_group_name = azurerm_resource_group.this.name location = azurerm_resource_group.this.location sku = "PerGB2018" depends_on = [azurerm_resource_group.this] } # Windows内存提交字节使用率计数器 resource "azapi_resource" "windows_committed_bytes" { type = "Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01" name = "WindowsCommittedBytes" parent_id = azurerm_log_analytics_workspace.this.id body = jsonencode( { kind = "WindowsPerformanceCounter" properties = { "objectName" : "Memory", "instanceName" : "*", "intervalSeconds" : 60, "counterName" : "% Committed Bytes in Use" } } ) } # Windows处理器时间计数器 resource "azapi_resource" "windows_processor_time" { type = "Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01" name = "WindowsProcessorTime" parent_id = azurerm_log_analytics_workspace.this.id body = jsonencode( { kind = "WindowsPerformanceCounter" properties = { "objectName" : "Processor", "instanceName" : "*", "intervalSeconds" : 60, "counterName" : "% Processor Time" } } ) } # Linux处理器时间计数器 resource "azapi_resource" "linux_processor_time" { type = "Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01" name = "LinuxProcessorTime" parent_id = azurerm_log_analytics_workspace.this.id body = jsonencode( { kind = "LinuxPerformanceObject" properties = { "objectName" : "Processor", "instanceName" : "*", "intervalSeconds" : 60, "performanceCounters" : [ { "counterName" : "% Processor Time" } ] } } ) } # Linux内存使用率计数器 resource "azapi_resource" "linux_used_memory" { type = "Microsoft.OperationalInsights/workspaces/dataSources@2020-08-01" name = "LinuxUsedMemory" parent_id = azurerm_log_analytics_workspace.this.id body = jsonencode( { kind = "LinuxPerformanceObject" properties = { "objectName" : "Memory", "instanceName" : "*", "intervalSeconds" : 60, "performanceCounters" : [ { "counterName" : "% Used Memory" } ] } } ) }
关键说明
- Windows计数器:
kind设为WindowsPerformanceCounter,直接在properties中指定counterName等属性 - Linux计数器:
kind设为LinuxPerformanceObject,通过performanceCounters数组定义计数器 - parent_id设置:必须指向Log Analytics工作区的ID,而非资源组ID,这是解决之前错误的核心
内容的提问来源于stack exchange,提问作者Vegas588
相关产品推荐
相关产品推荐

