Запрос Stream Analytics для ParsedStack исключения из непрерывного экспорта Azure Application Insights

У нас есть облачная служба Azure, которая регистрирует все исключения в Azure Application Insights. Мы настроили непрерывный экспорт всех исключений в таблицы хранения Azure. Кроме того, у нас есть Azure Stream Analytics, которая извлекает данные из больших двоичных объектов и отправляет их в базу данных SQL Azure. Теперь проблема в том, что мы не можем правильно отформатировать / отформатировать ParsedStack от исключения json до varchar(max), чтобы мы могли вставить его в базу данных.

Это запрос Stream Analytics, который мы использовали -

SELECT
     CASE 
        WHEN GetArrayLength(A.basicException) > 0
            THEN GetRecordPropertyValue(GetArrayElement(A.basicException, 0), 'assembly')
            ELSE ''
    END AS ExceptionAssembly 
    ,  
     CASE 
        WHEN GetArrayLength(A.basicException) > 0
            THEN GetRecordPropertyValue(GetArrayElement(A.basicException, 0), 'exceptionType')
            ELSE ''
    END AS ExceptionType 
   ,
     CASE 
        WHEN GetArrayLength(A.basicException) > 0
            THEN GetRecordPropertyValue(GetArrayElement(A.basicException, 0), 'parsedstack')
            ELSE ''
    END AS ParsedStack   
      ,A.context.device.id as DeviceId
      ,A.context.device.type as DeviceType
      ,A.context.device.browser as Browser
      ,A.context.device.browserVersion as BrowserVersion
      ,A.context.location.country as Country
      ,A.context.location.province as Province
      ,A.context.location.city as City
    INTO
      myexceptionsoutput
    FROM myexceptionsinput A

Все значения выглядят так, как ожидается в таблице SQL, но значение ParsedStack колонка всегда Microsoft.EventProcessing.SteamR.Sql.ValueArray

редактировать

Добавление объекта Exception json (полная версия очень длинная, поэтому обрезана, чтобы быть более понятной)-

"basicException": [{
        "assembly": "Anonymously Hosted DynamicMethods Assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
        "exceptionType": "System.ServiceModel.CommunicationObjectFaultedException",
        "outerExceptionType": "System.ServiceModel.CommunicationObjectFaultedException",
        "failedUserCodeAssembly": "Anonymously Hosted DynamicMethods Assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
        "exceptionGroup": "System.ServiceModel.CommunicationObjectFaultedException at lambda_method",
        "count": 1,
        "outerExceptionMessage": "The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state."
    },
    {
        "parsedStack": [{
            "method": "System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage",
            "assembly": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "level": 0,
            "line": 0
        },
        {
            "method": "System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke",
            "assembly": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "level": 1,
            "line": 0
        },
        {
            "method": "System.IDisposable.Dispose",
            "assembly": "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "level": 2,
            "line": 0
        }],
        "hasFullStack": true,
        "id": "22349146",
    }],
    "internal": {
        "data": {
            "id": "bd6f2355-ed02-4883-abb9-d8ed6ceba646",
            "documentVersion": "1.61"
        }
    }

1 ответ

В настоящее время невозможно выразить сериализацию массива в строку на языке запросов ASA. Если у вас все в порядке с извлечением разобранного стека в отдельные строки, вы можете сделать ниже

with T1 as
(
select 
  GetArrayElement(iotInput.basicException,0) HighLevelDetails,
  GetRecordPropertyValue (GetArrayElement(iotInput.basicException,1), 'parsedStack') ParsedStack,
  internal.data.id Id
from 
    iotInput 
)

 select
   T1.id,
   T1.HighLevelDetails.assembly,
   T1.HighLevelDetails.exceptionType,
   ParsedStackArray.ArrayValue.method ParsedStackMethod,
   ParsedStackArray.ArrayValue.assembly ParsedStackAssembly,
   ParsedStackArray.ArrayValue.level ParsedStackLevel,
   ParsedStackArray.ArrayValue.line ParsedStackLine
 from 
  T1
 cross apply
   GetArrayElements(T1.ParsedStack) as ParsedStackArray

Исходя из примера события, запись подробностей высокого уровня в таблицу и анализируемый стек в другую таблицу с "id" в качестве общего поля также может работать.

Другие вопросы по тегам