Изменить тип телеметрии в процессоре телеметрии - PullRequest
0 голосов
/ 05 ноября 2019

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

Однако TraceTelemetry, созданный этим кодом, никогдадостигает Application Insights. Я проверил обе метрики в реальном времени и подождал пару минут, пока записи не появятся в поиске.

Я думаю, что мне не хватает некоторых вещей, например, правильного контекста, но я не уверен, что копировать. Свойство Context доступно только для чтения, поэтому я не могу просто использовать его повторно.

public class ExceptionTelemetryProcessor : ITelemetryProcessor
    {
        private ITelemetryProcessor Next { get; set; }

        public ExceptionTelemetryProcessor(ITelemetryProcessor next)
        {
            Next = next;
        }

        public void Process(ITelemetry item)
        {
            if (item is ExceptionTelemetry exceptionTelemetry
                && exceptionTelemetry.Exception is Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException bhre
                    && bhre.StatusCode == 408)
            {
                // Track exception as warning instead
                var traceTelemetry = new TraceTelemetry(exceptionTelemetry.Exception.Message, SeverityLevel.Warning);
                Next.Process(traceTelemetry);
            }
            else
            {
                Next.Process(item);
            }
        }
    }

1 Ответ

1 голос
/ 06 ноября 2019

Причина здесь в том, что в нем отсутствует ключ контекстной аппаратуры, как указывает Питер.

Вы можете отлаживать свой код (установить контрольную точку в своем пользовательском классе процессора телеметрии) в Visual Studio, и в окне вывода вы можете увидеть, что ключ инструментария не настроен. Снимок экрана, как показано ниже:

enter image description here

Пожалуйста, измените свой код, как показано ниже:

    public void Process(ITelemetry item)
    {

        if (item is ExceptionTelemetry exceptionTelemetry
            && other_condition)
        {
            // Track exception as warning instead
            var traceTelemetry = new TraceTelemetry(exceptionTelemetry.Exception.Message, SeverityLevel.Warning);

            //add this line of code to send the trace message.
            new TelemetryClient().TrackTrace(traceTelemetry);

            //Note that, you should remove the Next.Process() method here, or it will reproduce another same message with the above line of code
            //Next.Process(traceTelemetry);
        }
        else
        {
            Next.Process(item);
        }

    }
...