Azure Monitor 中的转换允许你在传入 Azure Monitor 数据上运行 KQL 查询,以在到该数据存储到 Log Analytics 工作区之前对其进行筛选或修改。 本文详细介绍了转换查询中的 KQL 注意事项和支持的功能,以及仅在转换中可用的特殊运算符。
由于转换会逐个应用于每个记录,因此它们不能使用任何对多个记录执行操作的 KQL 运算符。 只支持采用某一行作为输入并且返回结果不超过一行的运算符。 例如,不支持 summarize,因为它会汇总多个记录。
转换仅支持本文中列出的运算符。 转换不支持可用于其他日志查询的任何其他运算符。
由于性能原因,转换中的分析命令限制为每个语句 10 列。 如果转换需要分析超过 10 列,请将其拆分为多个语句,如拆分大型分析命令中所述。
请考虑以下包含动态数据的输入:
{
"TimeGenerated" : "2021-11-07T09:13:06.570354Z",
"Message": "Houston, we have a problem",
"AdditionalContext": {
"Level": 2,
"DeviceID": "apollo13"
}
}
要访问 AdditionalContext 中的属性,请将它定义为输入流中的动态类型的列:
"columns": [
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "Message",
"type": "string"
},
{
"name": "AdditionalContext",
"type": "dynamic"
}
]
现在,可以在 KQL 转换中分析和使用 AdditionalContext 列的内容了:
source
| extend parsedAdditionalContext = parse_json(AdditionalContext)
| extend Level = toint (parsedAdditionalContext.Level)
| extend DeviceId = tostring(parsedAdditionalContext.DeviceID)
使用 parse_json
函数来处理动态文本。
例如,以下查询提供相同的功能:
print d=dynamic({"a":123, "b":"hello", "c":[1,2,3], "d":{}})
print d=parse_json('{"a":123, "b":"hello", "c":[1,2,3], "d":{}}')
以下函数仅可用于转换。 不能在其他日志查询中使用它们。
给定一个包含 CEF 消息的字符串,parse_cef_dictionary
将消息的 Extension 属性解析为动态键/值对象。 分号是一个保留字符,应在将原始消息传递给方法之前替换,如示例所示。
| extend cefMessage=iff(cefMessage contains_cs ";", replace(";", " ", cefMessage), cefMessage)
| extend parsedCefDictionaryMessage =parse_cef_dictionary(cefMessage)
| extend parsecefDictionaryExtension = parsedCefDictionaryMessage["Extension"]
| project TimeGenerated, cefMessage, parsecefDictionaryExtension
给定包含 IP 地址的字符串的情况下(支持 IPv4 和 IPv6),geo_location
函数会返回近似地理位置,其中包含以下属性:
- 国家/地区
- 区域
- State
- City
- 纬度
- 经度
| extend GeoLocation = geo_location("1.0.0.5")
重要
由于此函数使用的 IP 地理位置服务的性质,如果过度使用,它可能会导致数据引入延迟。 每次转换过多使用此函数时,请谨慎操作。
let
的右边可以是标量表达式、表格表达式或用户定义的函数。 只支持使用标量参数的用户定义的函数。
转换中 KQL 语句的唯一受支持的数据源如下所示:
source,它表示源数据。 例如:
source | where ActivityId == "383112e4-a7a8-4b94-a701-4266dfc18e41" | project PreciseTimeStamp, Message
print
运算符,它始终生成一行。 例如:print x = 2 + 2, y = 5 | extend z = exp2(x) + exp2(y)
extend
project
print
where
parse
project-away
project-rename
datatable
columnifexists
(请使用 columnifexists,而不是 column_ifexists)
- 所有数值运算符都受支持。
- 所有的 Datetime 和 Timespan 算术运算符都受支持。
- 支持以下字符串运算符。
- `=
!=
=~
!~
contains
!contains
contains_cs
!contains_cs
has
!has
has_cs
!has_cs
startswith
!startswith
startswith_cs
!startswith_cs
endswith
!endswith
endswith_cs
!endswith_cs
matches regex
in
!in
- 支持以下位运算符。
binary_and()
binary_or()
binary_xor()
binary_not()
binary_shift_left()
binary_shift_right()
- 位函数
- 转换函数
- DateTime 和 TimeSpan 函数
- 动态和数组函数
- 数学函数
- 条件函数
- 字符串函数
base64_encodestring
(请使用 base64_encodestring,而不是 base64_encode_tostring)base64_decodestring
(请使用 base64_decodestring,而不是 base64_decode_tostring)countof
extract
extract_all
indexof
isempty
isnotempty
parse_json
replace
split
strcat
strcat_delim
strlen
substring
tolower
toupper
hash_sha256
- 类型函数
请根据需要使用标识符引用。
- 使用 Azure Monitor 代理创建数据收集规则以及与虚拟机的关联。