2

ストリーム分析を使用して、Application Insights エクスポートを SQL テーブルに読み込もうとしています。

これらは私がキャプチャしようとしているカスタム イベントとメトリック イベントであるため、JSON の一部はカスタム イベントまたはメトリック イベント (例: TestMethod1) の「名前」であり、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テーブルに転送しようとします(これは、これを達成するためにさまざまな方法と手段を試しています...)

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 で「そのような名前の列は存在しません」というエラーが発生しています。

どうすればこれを達成できるかについてのアイデアはありますか?

いくつかの異なるメソッドのメトリクスとカスタム イベントを出力したいのですが、列名は重要ではありません。ただし、アプリ インサイト エクスポートからの 1 つの BLOB ファイルには、5 つまたは 6 つの異なるカスタム イベントとメトリックのイベントが含まれます。

したがって、TestMethod1、TestMethod2、および TestMethod3 を含む 1 つの BLOB ファイルを作成し、その 1 つのファイルを解析してテーブルに入れることができます。コードやワーカー ロールに頼ることはありません。

よろしく

4

2 に答える 2

1

ディメンションに 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')
于 2015-12-17T22:21:22.277 に答える