Можно ли исключить URL из Application Insights?

У нас развернута веб-роль Azure, которая использует Application Insights (версия 1.0.0.4220), однако мы превышаем нашу квоту данных. Можно ли настроить Application Insights на игнорирование определенного URL-адреса?

У нас есть статусный веб-сервис, который получает огромное количество трафика, но никогда не выдает ошибок. Если бы я мог исключить этот URL-адрес одной службы, я бы сократил использование данных вдвое.


person Greg Enslow    schedule 30.06.2015    source источник


Ответы (3)


Из коробки не поддерживается. Функция выборки приближается, но ее нельзя будет настроить по конкретному URL-адресу. Вы можете реализовать свой собственный канал, который будет иметь настраиваемую фильтрацию. В основном ваш канал будет получать событие для отправки, вы проверяете, хотите ли вы его отправить или нет, а затем, если да, переходите на стандартный канал AI. Здесь вы можете узнать больше о клиентских каналах.

С момента написания этого сообщения в блоге изменились две вещи:

  • канал должен реализовывать только интерфейс ITelemetryChannel (ISupportConfiguration был удален)
  • а вместо PersistenceChannel следует использовать Microsoft.ApplicationInsights.Extensibility.Web.TelemetryChannel

ОБНОВЛЕНИЕ: последняя версия поддерживает фильтрацию: https://azure.microsoft.com/en-us/blog/request-filtering-in-application-insights-with-telemetry-processor/

person Anastasia Black    schedule 30.06.2015

У моей команды была похожая ситуация, когда нам нужно было отфильтровать URL-адреса, которые были успешными запросами изображений (у нас их было много, из-за чего мы достигли предела 30 тыс. Точек данных / мин).

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

Мы создали класс RequestFilterChannel, который является экземпляром ServerTelemetryChannel, и расширили метод Send. В этом методе мы проверяем каждый отправляемый элемент телеметрии, чтобы узнать, является ли он запросом изображения, и если да, мы предотвращаем его отправку.

public class RequestFilterChannel : ITelemetryChannel, ITelemetryModule
{
    private ServerTelemetryChannel channel;

    public RequestFilterChannel()
    {
        this.channel = new ServerTelemetryChannel();
    }

    public void Initialize(TelemetryConfiguration configuration)
    {
        this.channel.Initialize(configuration);
    }

    public void Send(ITelemetry item)
    {
        if (item is RequestTelemetry)
        {
            var requestTelemetry = (RequestTelemetry) item;

            if (requestTelemetry.Success && isImageRequest((RequestTelemetry) item))
            {
                // do nothing
            }
            else
            {
                this.channel.Send(item); 
            }
        }
        else
        {
            this.channel.Send(item);
        }
    }

    public bool? DeveloperMode
    {
        get { return this.channel.DeveloperMode; }
        set { this.channel.DeveloperMode = value; }
    }

    public string EndpointAddress
    {
        get { return this.channel.EndpointAddress; }
        set { this.channel.EndpointAddress = value; }
    }

    public void Flush()
    {
        this.channel.Flush();
    }

    public void Dispose()
    {
        this.channel.Dispose();
    }

    private bool IsImageRequest(RequestTelemetry request)
    {
        if (request.Url.AbsolutePath.StartsWith("/image.axd"))
        {
            return true;
        }

        return false;
    }
}

После создания класса вам необходимо добавить его в файл ApplicationInsights.config.

Замените эту строку:

<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>

со ссылкой на ваш класс:

<TelemetryChannel Type="XXX.RequestFilterChannel, XXX" />  
person Rune Vejen Petersen    schedule 30.10.2015
comment
Хороший совет, спасибо Руне. Я использую код из блога Сергея уже пару месяцев, и он хорошо работает. Но я могу улучшить его с помощью вашей техники, применив большее значение дроссельной заслонки к нашему единственному сервисному вызову, который получает основную часть трафика. - person Greg Enslow; 30.10.2015
comment
Есть ли преимущество в использовании адаптера ITelemetryChannel по сравнению с реализацией ITelemetryProcessor (docs.microsoft.com/en-us/azure/azure-monitor/app/)? Обновление: Nevermind, похоже, эта функция только что была выпущена: azure.microsoft.com/en-us/blog/. - person dahlbyk; 02.03.2020

В качестве альтернативы вы можете отключить автоматический сбор запросов и оставить только автоматический сбор исключений, просто удалите строку RequestTrackingModule из applicationinsights.config.

Если вам все еще нужно собрать некоторые запросы, а не просто отфильтровать все, вы можете затем вызвать TrackRequest () (в объекте класса TelemetryClient) из своего кода в соответствующем месте после того, как вы узнаете, что вам обязательно нужно зарегистрировать этот запрос. к AI.

Обновление: Функция фильтрации была выпущена некоторое время назад и позволяет значительно упростить исключение определенных элементов телеметрии.

person Dmitry Matveev    schedule 30.06.2015
comment
Интересный вариант, хотя метод выборки, предложенный Анастасией, похоже, может быть проще в реализации. Мне пришлось бы вставлять вызовы TrackRequest () по всему моему приложению. Тем не менее, полезно знать об этом варианте. Спасибо. - person Greg Enslow; 01.07.2015
comment
Не лучшая идея, удаление отслеживания запросов удаляет все важные функции отслеживания зависимостей, вы не узнаете, какой sql привязан очень долго и т. Д. - person Akash Kava; 14.05.2018