Geolocalização e manipulação de endereço IP

Este artigo explica como a pesquisa de localização geográfica e o tratamento de endereços IP funcionam em Application Insights juntamente com como modificar o comportamento padrão.

Comportamento padrão

Por padrão, os endereços IP são coletados temporariamente, mas não são armazenados em Application Insights. Esse processo segue algumas etapas básicas.

Quando a telemetria é enviada ao Azure, o Application Insights usa o endereço IP para fazer uma pesquisa de localização geográfica. O Application Insights usa os resultados dessa pesquisa para preencher os campos client_City, client_StateOrProvince e client_CountryOrRegion. Em seguida, o endereço é descartado e 0.0.0.0 gravado no campo client_IP.

Para remover os dados de geolocalização, confira os seguintes artigos:

Os tipos de telemetria são:

  • Telemetria do navegador: o Application Insights coleta o endereço IP do remetente. O ponto de extremidade de ingestão calcula o endereço IP.
  • Telemetria do servidor: o módulo Application Insights coleta o endereço IP do cliente. O endereço IP não é coletado localmente quando o X-Forwarded-For cabeçalho está definido. Quando a lista de endereço IP de entrada tiver mais de um item, o último endereço IP será usado para preencher os campos de geolocalização.

Esse comportamento é por design para ajudar a evitar a coleta desnecessária de dados pessoais e informações de localização de endereço IP. Sempre que possível, é recomendável evitar a coleta de dados pessoais.

Observação

Embora o padrão seja não coletar endereços IP, você pode substituir esse comportamento. Recomendamos verificar se a coleção não interrompe quaisquer requisitos de conformidade ou regulamentos locais.

Para saber mais sobre o tratamento de dados pessoais no Application Insights, veja Diretrizes para dados pessoais.

Quando os endereços IP não são coletados, a cidade e outros atributos de geolocalização preenchidos pelo pipeline usando o endereço IP também não são coletados. Você pode mascarar a coleção de IP na origem. Há duas maneiras de fazer isso. Você pode:

Armazenamento de dados de endereço IP

Para habilitar a coleta e o armazenamento de IP, a DisableIpMasking Propriedade do componente Application insights deve ser definida como true. Você pode definir essa propriedade por meio de modelos do ARM (Azure Resource Manager) ou chamando a API REST.

Modelo de 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
       }
}

Portal

Se você precisa modificar o comportamento de um só único recurso de Application Insights, use o portal do Azure.

  1. Acesse o recurso Application Insights e, em seguida, selecione Automação>Exportar modelo.

  2. Selecione Implantar.

    Captura de tela que mostra o botão Implantar.

  3. Selecione Editar modelo.

    Captura de tela que mostra o botão Editar, juntamente com um aviso sobre o grupo de recursos.

    Observação

    Se você enfrentar o erro mostrado na captura de tela anterior, poderá resolvê-lo. Ele informa: "O grupo de recursos está em um local sem suporte por um ou mais recursos no modelo. Escolha um grupo de recursos diferente." Selecione temporariamente um grupo de recursos diferente na lista suspensa e, em seguida, selecione mais uma vez o grupo de recursos original.

  4. No modelo JSON, localize properties dentro de resources. Adicione uma vírgula ao último campo JSON e, em seguida, adicione a seguinte nova linha: "DisableIpMasking": true. Selecione Salvar.

    Captura de tela que mostra a adição de uma vírgula e uma nova linha após a propriedade da origem da solicitação.

  5. Selecione Examinar + criar>Criar.

    Observação

    Se você vir "Sua implantação falhou", verifique os detalhes da implantação para aquela com o tipo microsoft.insights/components e verifique o status. Se essa for bem-sucedida, as alterações feitas em DisableIpMasking foram implantadas.

  6. Depois que a implantação for concluída, novos dados de telemetria serão registrados.

    Se você selecionar e editar o modelo novamente, só verá o modelo padrão sem a propriedade recém-adicionada. Se você não estiver vendo dados de endereço IP e quiser confirmar que "DisableIpMasking": true está definido, execute os seguintes comandos do 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
    

    Uma lista de propriedades é retornada como resultado. Uma das propriedades deve ler DisableIpMasking: true. Se você executar os comandos do PowerShell antes de implantar a nova propriedade com Azure Resource Manager, a propriedade não existirá.

API REST

O conteúdo da API REST a seguir faz as mesmas modificações:

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

O cmdlet 'Update-AzApplicationInsights' do Powershell pode desabilitar a máscara de IP com o parâmetro DisableIPMasking.

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

Para obter mais informações sobre o cmdlet 'Update-AzApplicationInsights', confira Update-AzApplicationInsights

Inicializador de telemetria

Se você precisar de uma alternativa mais flexível do que DisableIpMasking, poderá usar um inicializador de telemetria para copiar todo ou parte do endereço IP para um campo personalizado. O código dessa classe é o mesmo em versões do .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);
            }
        }
    } 
}

Observação

Se não conseguir acessar o ISupportProperties, verifique se você está executando a versão estável mais recente do SDK Application Insights. ISupportProperties é destinado a valores de alta cardinalidade. GlobalProperties é mais apropriado para valores de cardinalidade baixa, como nome da região e nome do ambiente.

 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;
        }
    }
});

Exibir os resultados do inicializador de telemetria

Se você enviar o novo tráfego para seu site e aguardar alguns minutos, você poderá executar uma consulta para confirmar se a coleção está funcionando:

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

Os endereços IP recentemente coletados aparecerão na customDimensions_client-ip coluna. A coluna client-ip padrão ainda terá os quatro octetos zerados.

Se você estiver testando do localhost e o valor para customDimensions_client-ip for ::1, esse valor será um comportamento esperado. O valor ::1 representa o endereço de loopback no IPv6. É equivalente a 127.0.0.1 no IPv4.

Perguntas frequentes

Esta seção fornece respostas para perguntas comuns.

Como os dados de cidade, país/região e outros dados de localização geográfica são calculados?

Procuramos o endereço IP (IPv4 ou IPv6) do cliente Web:

  • Telemetria do navegador: Coletamos o endereço IP do remetente.
  • Telemetria do servidor: O módulo Application Insights coleta o endereço IP do cliente. Ele não será coletado se X-Forwarded-For estiver configurado.
  • Para saber mais sobre como o endereço IP e os dados de localização geográfica são coletados no Application Insights, confira Manuseio de Geolocalização e endereço IP.

É possível configurar o ClientIpHeaderTelemetryInitializer para coletar o endereço IP de um cabeçalho diferente. Em alguns sistemas, por exemplo, ele é movido por um proxy, balanceador de carga ou CDN para X-Originating-IP. Saiba mais.

Você pode usar o Power BI para exibir sua telemetria de solicitação em um mapa se tiver migrado para um recurso baseado em workspace.

Próximas etapas

  • Saiba mais sobre a coleta de dados pessoais no Application insights.
  • Saiba mais sobre como funciona a coleta de endereços IP no Application Insights. Este artigo é uma postagem de blog externa mais antiga escrita por um de nossos engenheiros. Ele é anterior ao comportamento padrão atual em que o endereço IP é registrado como 0.0.0.0. O artigo aborda com mais detalhes a mecânica do inicializador de telemetria interno.