Исключения моей функции Azure регистрируются 3 раза в Application Insights.

Я создал функцию Azure Blob Trigger и хотел иметь возможность создавать почтовые оповещения, когда у меня есть исключение, и среди информации, отправляемой в почтовом оповещении, должно быть имя файла, в котором возникло исключение.

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

public class Function1
{
    private readonly IGremlinService _gremlinService;
    private readonly TelemetryClient _telemetryClient;
    public Function1(IGremlinService gremlinService, TelemetryConfiguration telemetryConfiguration)
    {
        this._gremlinService = gremlinService;
        this._telemetryClient = new TelemetryClient(telemetryConfiguration);
    }

    [FunctionName(nameof(Function1))]
    public async Task Run([BlobTrigger("files/{directory}/{name}.00.pdf", Connection = "AzureWebJobsStorage")] Stream myBlob, string name, ILogger logger)
    {
        try
        {
             //some code not related to the issue
        }
        catch (Exception e)
        {
            var properties = new Dictionary<string, string>
                {{"Filename", name}};
            _telemetryClient.TrackException(e, properties);
            if (e is ResponseException)
            {
                ResponseException re = (ResponseException) e;

                var statusCode = (long) re.StatusAttributes["x-ms-status-code"];
               
                _telemetryClient.TrackTrace("Error on file " + name + ". Status code: " + statusCode + " " + re.StackTrace, SeverityLevel.Error, properties);
            }
            else
            {
                _telemetryClient.TrackTrace("Error on file " + name, SeverityLevel.Error, properties);
            }
            throw;
        }
    }
}
  }   

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

Моя вторая проблема заключается в том, что мои исключения по-прежнему автоматически регистрируются в журнале службы телеметрии, и по какой-то причине я не могу понять, что они регистрируются дважды, как вы можете видеть на снимке экрана ниже из Application Insights:

введите описание изображения здесь

Есть ли способ отключить автоматическое ведение журнала исключений? Или есть способ настроить эти сообщения об исключениях, о которых я не знаю, вместо использования службы телеметрии?


person MarleneHE    schedule 14.01.2021    source источник
comment
Я ответил на ваш вопрос. Сводка состоит в том, чтобы использовать ILogger с ведением журнала структуры, и с его помощью вы можете регистрировать все соответствующие параметры, не имея TelemetryClient .   -  person user1672994    schedule 15.01.2021


Ответы (1)


Я считаю, что 3 исключения регистрируются по следующим причинам:

  1. Служба реализации IGremlinService выброса исключения, которое регистрируется.
  2. Вы входите через _telemetryClient.TrackException(e, properties);
  3. Инфраструктура Azure обрабатывается при вызове throw.

Теперь перейдем к вашему вопросу

Я не нашел способа настроить сообщение или информацию, отправляемую вместе с исключением

Я предлагаю вам использовать ILogger для LogException и использовать BeginScope (прочтите здесь), чтобы определить свойства области, которые будут регистрироваться как настраиваемые свойства в аналитических данных приложения для всех журналов, которые вызываются в течение времени существования созданной области.

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

[FunctionName(nameof(Function1))]
public async Task Run([BlobTrigger("files/{directory}/{name}.00.pdf", Connection = "AzureWebJobsStorage")] Stream myBlob, string name, ILogger logger)
{
    using (logger.BeginScope(new Dictionary<string, object>()
    {
            ["FileName"] = name,
     }))
     {
        try
        {
             //some code not related to the issue
        }
        catch (Exception e)
        {
            logger.LogError(e, "Error occurred with {StatusCode}", (long) re.StatusAttributes["x-ms-status-code"]);
            throw;
        }
    }
}

Ниже приводится краткое определение оператора logger.LogException(e, "Error occurred with {StatusCode}", (long) re.StatusAttributes["x-ms-status-code"]);.

  1. e представляет собой фактическое возникшее исключение.
  2. часть кода {StatusCode} будет регистрировать код состояния как настраиваемое свойство в аналитических данных приложения для зарегистрированного исключения, поэтому вам не нужно создавать какой-либо словарь.
  3. FileName будет зарегистрировано как настраиваемое свойство, как определено областью действия.

Вы можете просмотреть образец реализации по адресу здесь.

person user1672994    schedule 14.01.2021
comment
Спасибо ! Это очень помогло в ведении журнала и значительно облегчило мой код! Однако мое исключение по-прежнему регистрируется три раза, хотя я удалил вызов клиента телеметрии. - person MarleneHE; 15.01.2021
comment
Влияет ли это на что-нибудь, если он зарегистрирован 3 раза. В ответ я назвал возможную причину. Если вы хотите построить отчет на основе этого, вы можете использовать параметр EventId для Logger и с его помощью вы можете построить запрос на основе аналитических данных приложения. - person user1672994; 15.01.2021