Обработка геолокации и IP-адресов

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

Поведение по умолчанию

По умолчанию IP-адреса временно собираются, но не хранятся в Application Insights. Этот процесс выполняет некоторые основные шаги.

Когда данные телеметрии отправляются в Azure, Application Insights использует IP-адрес для поиска по географическому расположению. Application Insights использует результаты этого поиска для заполнения полей client_City, client_StateOrProvince и client_CountryOrRegion. Затем адрес удаляется, а 0.0.0.0 записывается в поле client_IP.

Сведения об удалении данных о географическом расположении см. в следующих статьях:

Типы данных телеметрии

  • Телеметрия браузера. Application Insights собирает IP-адрес отправителя. Конечная точка приема вычисляет IP-адрес.
  • Телеметрия сервера. Модуль телеметрии Application Insights временно собирает IP-адрес клиента. IP-адрес не определяется локально, если задан заголовок X-Forwarded-For. Если список входящих IP-адресов содержит несколько элементов, последний IP-адрес используется для заполнения полей географического расположения.

Это поведение позволяет избежать ненужного сбора персональных данных и сведений о расположении IP-адресов. По возможности рекомендуется избегать сбора персональных данных.

Примечание

Хотя по умолчанию IP-адреса не собираются, это поведение можно переопределить. Рекомендуется убедиться, что сбор этих данных не нарушает требования соответствия или местные нормы.

Дополнительные сведения об обработке персональных данных в Application Insights см. в статье Руководство по персональным данным.

Если IP-адреса не собираются, атрибуты города и других географических расположений, заполняемые конвейером на основе IP-адреса, также не собираются. Вы можете скрыть коллекцию IP-адресов в источнике. Это можно сделать двумя способами. Вы можете:

Хранение данных IP-адресов

Чтобы включить сбор и хранение IP-адресов, свойству DisableIpMasking компонента Application Insights необходимо присвоить значение true. Это свойство можно задать с помощью шаблонов Azure Resource Manager (шаблоны ARM) или путем вызова REST API.

Шаблон ARM

{
       "id": "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/microsoft.insights/components/<resource-name>",
       "name": "<resource-name>",
       "type": "microsoft.insights/components",
       "location": "westcentralus",
       "tags": {
              
       },
       "kind": "web",
       "properties": {
              "Application_Type": "web",
              "Flow_Type": "Redfield",
              "Request_Source": "IbizaAIExtension",
              // ...
              "DisableIpMasking": true
       }
}

Портал

Если необходимо изменить поведение только для одного ресурса Application Insights, используйте портал Azure.

  1. Перейдите к ресурсу Application Insights и выберите Шаблон экспорта службы автоматизации>.

  2. Выберите Развернуть.

    Снимок экрана с кнопкой

  3. Выберите Изменить шаблон.

    Снимок экрана: кнопка

    Примечание

    Если возникла ошибка, показанная на предыдущем снимке экрана, ее можно устранить. В нем говорится: "Группа ресурсов находится в расположении, которое не поддерживается одним или несколькими ресурсами в шаблоне. Выберите другую группу ресурсов", ее можно устранить. В этом случае временно выберите из раскрывающегося списка другую группу ресурсов, а затем повторно выберите исходную группу ресурсов.

  4. В шаблоне JSON найдите properties внутри resources. Добавьте запятую в последнее поле JSON, а затем добавьте следующую новую строку: "DisableIpMasking": true. Затем нажмите кнопку Save (Сохранить).

    Снимок экрана: добавление запятой и новой строки после свойства для источника запроса

  5. Выберите команду Просмотреть и создать>Создать.

    Примечание

    При появлении окна "Сбой развертывания" просмотрите сведения о развертывании, относящиеся к типу microsoft.insights/components, и проверьте состояние. Если эта операция выполнена успешно, значит, изменения, внесенные в DisableIpMasking, были развернуты.

  6. После завершения развертывания будут записаны новые данные телеметрии.

    Если выбрать и изменить шаблон еще раз, вы увидите только шаблон по умолчанию без добавленного свойства. Если вы не видите данные IP-адреса и хотите убедиться, что свойство "DisableIpMasking": true задано, выполните следующие команды PowerShell.

    # Replace `Fabrikam-dev` with the appropriate resource and resource group name.
    # If you aren't using Azure Cloud Shell, you need to connect to your Azure account
    # Connect-AzAccount 
    $AppInsights = Get-AzResource -Name 'Fabrikam-dev' -ResourceType 'microsoft.insights/components' -ResourceGroupName 'Fabrikam-dev'
    $AppInsights.Properties
    

    В результате будет возвращен список свойств. Одним из свойств должно быть DisableIpMasking: true. Если вы выполните команды PowerShell перед развертыванием нового свойства в Azure Resource Manager, свойство не будет существовать.

REST API

Следующие полезные данные REST API внесены в те же изменения:

PATCH https://management.azure.com/subscriptions/<sub-id>/resourceGroups/<rg-name>/providers/microsoft.insights/components/<resource-name>?api-version=2018-05-01-preview HTTP/1.1
Host: management.azure.com
Authorization: AUTH_TOKEN
Content-Type: application/json
Content-Length: 54

{
       "location": "<resource location>",
       "kind": "web",
       "properties": {
              "Application_Type": "web",
              "DisableIpMasking": true
       }
}

PowerShell

Командлет PoweShell Update-AzApplicationInsights может отключить маскирование IP-адресов с DisableIPMasking помощью параметра .

Update-AzApplicationInsights -Name "aiName" -ResourceGroupName "rgName" -DisableIPMasking:$true

Дополнительные сведения о командлете Update-AzApplicationInsights см. в разделе Update-AzApplicationInsights.

Инициализатор телеметрии

Если вам требуется более гибкая альтернатива DisableIpMasking, можно использовать инициализатор телеметрии, чтобы скопировать весь IP-адрес или его часть в настраиваемое поле. Код для этого класса одинаков в разных версиях .NET.

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

namespace MyWebApp
{
    public class CloneIPAddress : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            ISupportProperties propTelemetry = telemetry as ISupportProperties;

            if (propTelemetry !=null && !propTelemetry.Properties.ContainsKey("client-ip"))
            {
                string clientIPValue = telemetry.Context.Location.Ip;
                propTelemetry.Properties.Add("client-ip", clientIPValue);
            }
        }
    } 
}

Примечание

Если вам не удается получить доступ к ISupportProperties, убедитесь, что вы используете последний стабильный выпуск пакета SDK для Application Insights. Интерфейс ISupportProperties предназначен для значений более высокой кратности. GlobalProperties лучше подходит для значений меньшей кратности, таких как имя региона и имя среды.

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;

builder.services.AddSingleton<ITelemetryInitializer, CloneIPAddress>();

Node.js

appInsights.defaultClient.addTelemetryProcessor((envelope) => {
    const baseData = envelope.data.baseData;
    if (appInsights.Contracts.domainSupportsProperties(baseData)) {
        const ipAddress = envelope.tags[appInsights.defaultClient.context.keys.locationIp];
        if (ipAddress) {
            baseData.properties["client-ip"] = ipAddress;
        }
    }
});

Просмотр результатов инициализатора телеметрии

Если вы отправляете новый трафик на сайт и ждете несколько минут, можно затем выполнить запрос, чтобы убедиться, что коллекция работает.

requests
| where timestamp > ago(1h) 
| project appName, operation_Name, url, resultCode, client_IP, customDimensions.["client-ip"]

Новые собранные IP-адреса отобразятся в столбце customDimensions_client-ip. По умолчанию в столбце client-ip по-прежнему будут обнуляться все четыре октета.

Если проверка выполняется с localhost, а значение параметра customDimensions_client-ip — ::1, то это ожидаемое поведение. Значение ::1 — это петлевой адрес в формате IPv6. Он эквивалентен 127.0.0.1 в IPv4.

Часто задаваемые вопросы

В этом разделы приводятся ответы на часто задаваемые вопросы.

Как вычисляются данные о городе, стране или регионе и других данных о географическом расположении?

Мы ищем IP-адрес (IPv4 или IPv6) веб-клиента:

  • Телеметрия браузера: мы собираем сведения об IP-адресе отправителя.
  • Телеметрия сервера: модуль Application Insights собирает сведения об IP-адресе клиента. Он не собирается, если X-Forwarded-For задан.
  • Дополнительные сведения о сборе данных об IP-адресах и геолокации в Application Insights см. в статье Геолокация и обработка IP-адресов.

Вы можете настроить ClientIpHeaderTelemetryInitializer для получения IP-адреса из другого заголовка. В некоторых системах, например, он перемещается прокси-сервером, подсистемой балансировки нагрузки или CDN в X-Originating-IP. Подробнее.

Вы можете использовать Power BI для отображения данных телеметрии запроса на карте, если вы перешли на ресурс на основе рабочей области.

Следующие шаги

  • Узнайте больше о сборе персональных данных в Application Insights.
  • Узнайте больше о том, как работает сбор IP-адресов в Application Insights. Эта статья является более старой внешней записью блога, написанной одним из наших инженеров. Он предшествует текущему поведению по умолчанию, когда IP-адрес записывается как 0.0.0.0. В статье подробно рассматривается механика встроенного инициализатора телеметрии.