Я столкнулся с проблемой, с которой я не знаком.

Поэтому я пытаюсь регистрировать исключения из тестовой функции Azure, но когда я выкидываю исключение и возвращаю 400 неверных запросов, приложение распознает журнал как успешный запрос.

Насколько я понимаю, это, вероятно, регистрирует успешное выполнение функции, но я не понимаю, как мне тогда регистрировать исключение.

Так что я до сих пор сделал это.

(С этого момента я буду ссылаться на Application Insights как на AI)

Я начал с создания AI-ресурса.

Затем я взял инструментальную клавишу и применил ее к настройкам приложения моей функции.

После этого я установил AI NUGET в свою функцию, создав файл Project.json, а затем вставив нечто подобное, установив необходимые сборки и тому подобное.

{
  "frameworks": {
  "net46":{
  "dependencies": {
    "Microsoft.ApplicationInsights": "2.4.0"
      }
    }
  }
}

После этого я инициализирую TelemetryClient в функции и пытаюсь зарегистрировать и исключение в улове:

Инициирование :

    string key = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
    TelemetryClient telemetry = new TelemetryClient() { 
    InstrumentationKey = key 
    }; 

Поймать:

catch (Exception e)
{
    Dictionary<string,string> properties = new Dictionary<string,string>();

    properties.Add("Function Payload", data.ToString());
    properties.Add("Function Exception", e.ToString());

    telemetry.TrackException(e, properties);

    return req.CreateResponse(HttpStatusCode.BadRequest, e);
}

Проверьте выполнение функции, которую я получаю:

2018-03-07T14:24:36.171 [Info] Function started (Id=0292b455-314d-4c4c-872a-2b8137a72305)
2018-03-07T14:24:37.092 [Info] Function completed (Success, Id=0292b455-314d-4c4c-872a-2b8137a72305, Duration=931ms)

Test function result window

В «Приложениях» я могу видеть только неправильные запросы для StatusCode: 500, но 400 «плохих» запросов регистрируются как успешные запросы.

А также функция TrackException не регистрирует никаких пользовательских свойств ...

enter image description here

Так чего мне не хватает?

БОЛЬШЕ ДЕТАЛЕЙ ПО ИСКЛЮЧЕНИЮ:

enter image description here enter image description here

0
John 7 Мар 2018 в 18:43

3 ответа

Лучший ответ

@ Михаил прав, что мы относимся к этому как к успеху, потому что функция - это успех. Мы не хотели использовать коды состояния, чтобы угадать, была ли успешная операция или нет, поэтому мы ищем, вызвала ли функция исключение.

Ваше исключение не появляется на этом экране, потому что оно не было свойством, связанным с выполнением этой функции. Если вы зайдете в App Insights Analytics и запросите ExceptionTelemetry, вы должны увидеть его.

Чтобы связать его с определенной функцией, вам нужно установить OperationId, который совпадает с InvocationId функции. Существует пример, который показывает, как сделать это с событиями, метриками и зависимостями, но сделать это для исключений - то же самое (вы можете игнорировать назначение User.Id): https://docs.microsoft.com/en-us/azure / лазурное -функции / функции - мониторинга # заказ телеметрической - в - с- функций


Обновление: из того, что вы показали о своей функции выше, вы можете сойти с рук, выполнив что-то вроде:

catch (Exception e)
{    
    log.Error("Function Payload " + data.ToString());
    throw;
}

Это вернуло бы 500 (а не 400), и функции регистрировали бы трассировку в Application Insights, а затем регистрировали исключение и ошибку запроса. Если вы не используете TelemetryClient где-либо еще, вы можете удалить это из своего кода.

2
brettsam 9 Мар 2018 в 15:42

«для этой операции» не отображает исключения, подразумевает, что отправленное исключение не имеет тот же идентификатор операции, что и функция azure. id операции - это то, как приложение «связывает» связанную телеметрию вместе.

Ваш снимок экрана "регистрации исключений" - это не exception, а request, поэтому пользовательских свойств, зарегистрированных в вашем исключении, там не будет.

Если вы хотите, чтобы ваша функция Azure завершилась с ошибкой, и отображалась как неудавшийся запрос, и регистрировала исключение, почему вы перехватываете исключение и регистрируете его самостоятельно? не перехватывает ли тогда исключение, вызывает ли функция azure успешное выполнение? почему бы просто не допустить, чтобы исключение возникло, и время выполнения функции выполнило эту часть за вас? (не так ли?)

1
John Gardner 7 Мар 2018 в 22:17

Сервер (функция Azure) обработал запрос без ошибок, вы получили от него результат, поэтому с точки зрения времени выполнения приложения функции запрос был успешно обработан. Вы также можете увидеть это из журнала:

... Функция выполнена (Успех, ...

Таким образом, имеет смысл, что приложение Function регистрирует вызов как успешный в Application Insights. По крайней мере, именно так они решили это реализовать.

1
Mikhail Shilkov 7 Мар 2018 в 15:59