You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform配置Azure数据收集规则KQL查询报错求助

Azure DCR Terraform配置KQL查询"RawData未定义"问题解决

问题场景

通过Terraform创建包含自定义表数据源的Azure数据收集规则(DCR),使用transformKql参数的KQL查询格式化数据。Azure Portal中可正常运行的KQL查询,转义后写入Terraform文件或使用Heredoc格式均报错,提示Undefined symbol: RawData。

Portal中可用的KQL查询

source | extend d=todynamic(RawData) | extend TimeCreated = extract(@"\d*[-]\d*[-]\d*\s\d*[:]\d*[:]\d*[.]\d*",0,RawData) | extend AppPriority = tostring(split(d,"-",3)) | extend ReqId = tostring(split(d,"-",4)) | extend Prog = tostring(split(d,"-",5)) | extend Msg = tostring(split(d,"-",6))

Terraform中转义后的查询

source | extend d=todynamic(RawData) | extend TimeCreated = extract(@\"\\d*[-]\\d*[-]\\d*\\s\\d*[:]\\d*[:]\\d*[.]\\d*\",0,RawData) | extend AppPriority = tostring(split(d,\"-\",3)) | extend ReqId = tostring(split(d,\"-\",4)) | extend Prog = tostring(split(d,\"-\",5)) | extend Msg = tostring(split(d,\"-\",6))

报错信息(已翻译)

azurerm_monitor_data_collection_rule.dcr_name: Creating...
╷
│ Error: 创建数据收集规则(订阅: "11111111-2222-3333-4444-555555555555"
│ 资源组名称: "rg_name"
│ 数据收集规则名称: "dcr-name"): datacollectionrules.DataCollectionRulesClient#Create: 响应请求失败: StatusCode=400 -- 原始错误: autorest/azure: 服务返回错误. Status=400 Code="InvalidPayload" Message="数据收集规则无效" Details=[{"code":"InvalidTransformQuery","message":"编译查询时出错: SemanticError:0x00000006 at 1:30 : Undefined symbol: RawData","target":"properties.dataFlows[0]"}]
╵

解决方案

核心原因

在DCR的transformKql转换阶段,自定义日志数据源的原始内容字段是**Record**,而非RawData。RawData是日志数据写入Log Analytics表后才会生成的字段,转换阶段无法直接引用。

修正后的KQL查询

将所有RawData替换为Record:

source | extend d=todynamic(Record) | extend TimeCreated = extract(@"\d*[-]\d*[-]\d*\s\d*[:]\d*[:]\d*[.]\d*",0,Record) | extend AppPriority = tostring(split(d,"-",3)) | extend ReqId = tostring(split(d,"-",4)) | extend Prog = tostring(split(d,"-",5)) | extend Msg = tostring(split(d,"-",6))

Terraform中的推荐写法

使用Heredoc格式避免繁琐转义,同时保证代码可读性:

resource "azurerm_monitor_data_collection_rule" "dcr_name" {
  name                = "dcr-name"
  resource_group_name = "rg_name"
  location            = "eastus"

  data_flow {
    streams      = ["Custom-MyCustomTable_CL"]
    destinations = ["logAnalyticsDestination"]

    transform_kql = <<KQL
source | extend d=todynamic(Record) | extend TimeCreated = extract(@"\d*[-]\d*[-]\d*\s\d*[:]\d*[:]\d*[.]\d*",0,Record) | extend AppPriority = tostring(split(d,"-",3)) | extend ReqId = tostring(split(d,"-",4)) | extend Prog = tostring(split(d,"-",5)) | extend Msg = tostring(split(d,"-",6))
KQL
  }

  // 数据源、目标等其他配置省略...
}

验证要点

  • 确认transform_kql中使用Record而非RawData
  • Heredoc格式下无需额外转义双引号和反斜杠,Terraform会直接传递原始查询内容给Azure API
  • 确保streams字段与自定义表的流名称匹配(格式通常为Custom-<TableName>_CL)

内容的提问来源于stack exchange,提问作者Sean Brinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:52:41