Application Insights 和 Azure 流分析查询自定义 JSON 属性
Application Insights and Azure Stream Analytics Query a custom JSON property
我正在尝试使用流分析将我的 Application Insights 导出读取到 SQL Table。
这些是我试图捕获的自定义和度量事件,因此 JSON 的一部分是自定义或度量事件(例如 TestMethod1)的 "name" 和 JSON看起来像这样:
{
"metric": [ ],
"internal":
.. host of other json data...
"context": {
"custom": {
"metrics":
[
{
"TestMethod1":
{
"value": 42.8207,
"count": 1.0,
"min": 42.8207,
"max": 42.8207,
"stdDev": 0.0
}
}
]
}
}
}
使用分析 Sql 之类的语言,我尝试使用类似于下面的语法将我的数据传输到 SQL Table(这仍然是我尝试各种方式和方法来实现这个...)
SELECT A.internal.data.id as id
, dimensions.ArrayValue.EventName as eventName
, metrics.[value] as [value]
, A.context.data.eventTime as eventtime
, metrics.count as [count]
INTO
MetricsOutput
FROM AppMetrics A
CROSS APPLY GetElements(A.[context].[custom].[metrics[0]]) as metrics
CROSS APPLY GetElements(A.[context].[custom].[dimensions]) as dimensions
问题是,由于自定义事件名称,我的 [value] 和 [count] 列都没有被填充。目前我在 metrics.value.
上收到错误 "column with such name does not exist"
关于如何实现此目标的任何想法?
我想为几种不同的方法输出我的指标和自定义事件,列名并不重要。但是来自应用洞察导出的一个 blob 文件将包含 5 或 6 个不同的自定义事件和指标的事件。
所以我可以有一个包含 TestMethod1、TestMethod2 和 TestMethod3 的 blob 文件,并且想将该文件解析到 table 而不必求助于代码和辅助角色。
此致
您不想对维度使用 CROSS APPLY,因为这样会将每个维度放在不同的行中。您想要的是将所有内容展平成一行。为此,请使用下面演示的函数 GetRecordPropertyValue 和 GetArrayElement。
JSON 格式:
{
"event": [{...}],
"internal": {...},
"context": {
...
"data": {
"isSynthetic": false,
"eventTime": "2015-12-14T17:38:35.37Z",
"samplingRate": 100.0
},
...
"custom": {
"dimensions":
[
{ "MyDimension1": "foo" },
{ "MyDimension2": "bar" }
],
"metrics": [{
"MyMetric1": {
"value": 0.39340400471142523,
"count": 1.0,
"min": 0.39340400471142523,
"max": 0.39340400471142523,
"stdDev": 0.0
}
}]
},
...
}
}
查询:
SELECT
MySource.internal.data.id AS ID,
MySource.context.data.eventTime AS EventTime,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1') AS MyDimension1,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2') AS MyDimension2,
avg(CASE WHEN MyMetrics.arrayvalue.MyMetric1.value IS NULL THEN 0 ELSE MyMetrics.arrayvalue.MyMetric1.value END) as MetricAverage
INTO
[output-stream]
FROM
[input-stream] MySource
OUTER APPLY
GetElements(MySource.context.custom.metrics) as MyMetrics
GROUP BY
SlidingWindow(minute, 1),
MySource.internal.data.id AS ID,
MySource.context.data.eventTime AS EventTime,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1'),
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2')
要将自定义维度添加为单行中的列,这对我有用:
在流分析作业的 "Job Topology -> Functions" 部分下。
第一,
添加具有以下属性的自定义函数
- 函数别名 - flattenCustomDimensions(可以是任何东西)
- 函数类型 - Javascript UDF
- 输出类型 - 任意
并用以下内容替换主函数
function main(dimensions) {
let output = {};
for(let i in dimensions) {
let dim = dimensions[i];
for(let key in dim) {
output[key] = dim[key];
}
}
return output;
}
二、
形成查询如下:
如果我们有像
这样的自定义维度
第 1 行:
"context": {
...
"custom": {
"dimensions": [
{ "Dimension1": "Value1" },
{ "Dimension2": "Value2" }
]
}
}
第 2 行:
"context": {
...
"custom": {
"dimensions": [
{ "Dimension1": "Value1.2" },
{ "Dimension3": "Value3" }
]
}
}
查询将是
WITH temp as (
SELECT
*,
UDF.flattenCustomDimensions(I.context.custom.dimensions) as dim
FROM [Input] as I
)
SELECT
Dim1 = temp.dim.Dimension1,
Dim2 = temp.dim.Dimension2,
Dim3 = temp.dim.Dimension3
INTO [Output]
FROM temp
输出 table 将是
DIM1 | DIM2 | DIM3
----------------------------
Value1 | Value2 | null
Value1.2 | null | Value3
我正在尝试使用流分析将我的 Application Insights 导出读取到 SQL Table。
这些是我试图捕获的自定义和度量事件,因此 JSON 的一部分是自定义或度量事件(例如 TestMethod1)的 "name" 和 JSON看起来像这样:
{
"metric": [ ],
"internal":
.. host of other json data...
"context": {
"custom": {
"metrics":
[
{
"TestMethod1":
{
"value": 42.8207,
"count": 1.0,
"min": 42.8207,
"max": 42.8207,
"stdDev": 0.0
}
}
]
}
}
}
使用分析 Sql 之类的语言,我尝试使用类似于下面的语法将我的数据传输到 SQL Table(这仍然是我尝试各种方式和方法来实现这个...)
SELECT A.internal.data.id as id
, dimensions.ArrayValue.EventName as eventName
, metrics.[value] as [value]
, A.context.data.eventTime as eventtime
, metrics.count as [count]
INTO
MetricsOutput
FROM AppMetrics A
CROSS APPLY GetElements(A.[context].[custom].[metrics[0]]) as metrics
CROSS APPLY GetElements(A.[context].[custom].[dimensions]) as dimensions
问题是,由于自定义事件名称,我的 [value] 和 [count] 列都没有被填充。目前我在 metrics.value.
上收到错误 "column with such name does not exist"关于如何实现此目标的任何想法?
我想为几种不同的方法输出我的指标和自定义事件,列名并不重要。但是来自应用洞察导出的一个 blob 文件将包含 5 或 6 个不同的自定义事件和指标的事件。
所以我可以有一个包含 TestMethod1、TestMethod2 和 TestMethod3 的 blob 文件,并且想将该文件解析到 table 而不必求助于代码和辅助角色。
此致
您不想对维度使用 CROSS APPLY,因为这样会将每个维度放在不同的行中。您想要的是将所有内容展平成一行。为此,请使用下面演示的函数 GetRecordPropertyValue 和 GetArrayElement。
JSON 格式:
{
"event": [{...}],
"internal": {...},
"context": {
...
"data": {
"isSynthetic": false,
"eventTime": "2015-12-14T17:38:35.37Z",
"samplingRate": 100.0
},
...
"custom": {
"dimensions":
[
{ "MyDimension1": "foo" },
{ "MyDimension2": "bar" }
],
"metrics": [{
"MyMetric1": {
"value": 0.39340400471142523,
"count": 1.0,
"min": 0.39340400471142523,
"max": 0.39340400471142523,
"stdDev": 0.0
}
}]
},
...
}
}
查询:
SELECT
MySource.internal.data.id AS ID,
MySource.context.data.eventTime AS EventTime,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1') AS MyDimension1,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2') AS MyDimension2,
avg(CASE WHEN MyMetrics.arrayvalue.MyMetric1.value IS NULL THEN 0 ELSE MyMetrics.arrayvalue.MyMetric1.value END) as MetricAverage
INTO
[output-stream]
FROM
[input-stream] MySource
OUTER APPLY
GetElements(MySource.context.custom.metrics) as MyMetrics
GROUP BY
SlidingWindow(minute, 1),
MySource.internal.data.id AS ID,
MySource.context.data.eventTime AS EventTime,
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1'),
GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2')
要将自定义维度添加为单行中的列,这对我有用:
在流分析作业的 "Job Topology -> Functions" 部分下。
第一,
添加具有以下属性的自定义函数
- 函数别名 - flattenCustomDimensions(可以是任何东西)
- 函数类型 - Javascript UDF
- 输出类型 - 任意
并用以下内容替换主函数
function main(dimensions) {
let output = {};
for(let i in dimensions) {
let dim = dimensions[i];
for(let key in dim) {
output[key] = dim[key];
}
}
return output;
}
二、
形成查询如下:
如果我们有像
这样的自定义维度第 1 行:
"context": {
...
"custom": {
"dimensions": [
{ "Dimension1": "Value1" },
{ "Dimension2": "Value2" }
]
}
}
第 2 行:
"context": {
...
"custom": {
"dimensions": [
{ "Dimension1": "Value1.2" },
{ "Dimension3": "Value3" }
]
}
}
查询将是
WITH temp as (
SELECT
*,
UDF.flattenCustomDimensions(I.context.custom.dimensions) as dim
FROM [Input] as I
)
SELECT
Dim1 = temp.dim.Dimension1,
Dim2 = temp.dim.Dimension2,
Dim3 = temp.dim.Dimension3
INTO [Output]
FROM temp
输出 table 将是
DIM1 | DIM2 | DIM3
----------------------------
Value1 | Value2 | null
Value1.2 | null | Value3