Можно ли исключить URL из приложения Insights?

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

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

Ответ 1

Из коробки это не поддерживается. Приближается функция выборки, но она не будет настраиваться по конкретному 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/

Ответ 2

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

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

Мы создали класс 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" />  

Ответ 3

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

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