Examinar a solução de problemas de desconexão de dispositivo usando o Azure Monitor e a Grade de Eventos

Concluído

Problemas de conectividade para dispositivos IoT podem ser difíceis de solucionar porque há muitos pontos possíveis de falha. Lógica de aplicativos, redes físicas, protocolos, hardware, Hub IoT e outros serviços em nuvem podem causar problemas. A capacidade de detetar e identificar a origem de um problema é fundamental. No entanto, uma solução de IoT em escala pode ter milhares de dispositivos, por isso não é prático verificar dispositivos individuais manualmente. O Hub IoT integra-se com dois serviços do Azure que podem ajudá-lo:

  • Azure Monitor - O Azure Monitor permite coletar, analisar e agir na telemetria do Hub IoT. Para ajudá-lo a detetar, diagnosticar e solucionar esses problemas em escala, use os recursos de monitoramento que o Hub IoT fornece por meio do Azure Monitor. Isso inclui a configuração de alertas para disparar notificações e ações quando ocorrem desconexões e a configuração de logs que você pode usar para descobrir as condições que causaram desconexões.

  • Grade de Eventos do Azure - Para infraestrutura crítica e desconexão por dispositivo, use a Grade de Eventos do Azure para assinar eventos de conexão e desconexão de dispositivo emitidos pelo Hub IoT. A Grade de Eventos do Azure permite que você use qualquer um dos seguintes manipuladores de eventos:

    • Funções do Azure
    • Logic Apps
    • Azure Automation
    • WebHooks
    • Armazenamento de Filas
    • Ligações Híbridas
    • Hubs de Eventos

Grade de Eventos vs. Azure Monitor

A Grade de Eventos fornece uma solução de monitoramento por dispositivo de baixa latência que você pode usar para rastrear conexões de dispositivos para dispositivos e infraestrutura críticos. O Azure Monitor fornece uma métrica chamada Dispositivos conectados que você pode usar para monitorar o número de dispositivos conectados ao seu Hub IoT e disparar um alerta quando esse número cair abaixo de um limite estático.

Considere o seguinte ao decidir se deseja usar a Grade de Eventos ou o Azure Monitor para um cenário específico:

  • Latência de alerta: os eventos de conexão do Hub IoT são entregues muito mais rapidamente por meio da Grade de Eventos. Isso torna a Grade de Eventos uma escolha melhor para cenários onde a notificação rápida é desejável.

  • Notificações por dispositivo: a Grade de Eventos oferece a capacidade de rastrear conexões e desconexões para dispositivos individuais. Isso torna a Grade de Eventos uma escolha melhor para cenários em que você precisa monitorar as conexões para dispositivos críticos.

  • Configuração leve: os alertas de métrica do Azure Monitor fornecem uma experiência de configuração leve que não requer integração com outros serviços para entregar notificações por email, SMS, voz e outras notificações. Com a Grade de Eventos, você precisa se integrar a outros serviços do Azure para entregar notificações. Ambos os serviços podem integrar-se com outros serviços para desencadear ações mais complexas.

Grade de eventos: monitorar eventos de conexão e desconexão

Para monitorar eventos de conexão e desconexão de dispositivos em produção, recomendamos assinar os eventos DeviceConnected e DeviceDisconnected na Grade de Eventos para disparar alertas e monitorar o estado da conexão do dispositivo. A Grade de Eventos fornece latência de evento menor do que o Azure Monitor e você pode monitorar por dispositivo. Esses fatores tornam a Grade de Eventos o método preferido para monitorar dispositivos e infraestrutura críticos.

Ao usar a Grade de Eventos para monitorar ou disparar alertas sobre desconexões de dispositivos, certifique-se de criar uma maneira de filtrar as desconexões periódicas devido à renovação do token SAS em dispositivos que usam os SDKs do Azure IoT.

Azure Monitor: rotear eventos de conexão para logs

O hub IoT emite continuamente logs de recursos para várias categorias de operações. Para coletar esses dados de log, você precisa criar uma configuração de diagnóstico para roteá-los para um destino onde possam ser analisados ou arquivados. Um desses destinos é o Azure Monitor Logs por meio de um espaço de trabalho do Log Analytics, onde você pode analisar os dados usando consultas Kusto.

A categoria Conexões de logs de recursos do Hub IoT emite operações e erros relacionados a conexões de dispositivo.

{
   "records":
   [
        {
            "time": " UTC timestamp",
            "resourceId": "Resource Id",
            "operationName": "deviceConnect",
            "category": "Connections",
            "level": "Information",
            "properties": "{\"deviceId\":\"<deviceId>\",\"sdkVersion\":\"<sdkVersion>\",\"protocol\":\"<protocol>\",\"authType\":\"{\\\"scope\\\":\\\"device\\\",\\\"type\\\":\\\"sas\\\",\\\"issuer\\\":\\\"iothub\\\",\\\"acceptingIpFilterRule\\\":null}\",\"maskedIpAddress\":\"<maskedIpAddress>\"}",
            "location": "Resource location"
        }
    ]
}

A captura de tela a seguir mostra uma configuração de diagnóstico para rotear esses logs para um espaço de trabalho do Log Analytics.

Image showing a Log Analytics diagnostic setting.

Recomendamos criar uma configuração de diagnóstico o mais cedo possível após a criação do hub IoT. Embora o Hub IoT sempre emita logs de recursos, eles não são coletados pelo Azure Monitor até que você os encaminhe para um destino.

Azure Monitor: configurar alertas de métricas para desconexões de dispositivos

Você pode configurar alertas com base nas métricas da plataforma emitidas pelo Hub IoT. Com alertas métricos, você pode notificar os indivíduos de que uma condição de interesse ocorreu e também acionar ações que podem responder a essa condição automaticamente.

A métrica Dispositivos conectados informa quantos dispositivos estão conectados ao seu Hub IoT. Você pode criar alertas para disparar se essa métrica cair abaixo de um valor limite.

Image showing how to create an alert to trigger if a metric drops below a threshold value.

Você pode usar regras de alerta métrico para monitorar anomalias de desconexão do dispositivo em escala. Ou seja, use alertas para determinar quando um número significativo de dispositivos se desconecta inesperadamente. Quando isso é detetado, você pode examinar os logs para ajudar a solucionar o problema. No entanto, para monitorar desconexões e desconexões por dispositivo para dispositivos críticos quase em tempo real, você deve usar a Grade de Eventos.

Azure Monitor: Usar logs para resolver erros de conectividade

Ao detetar desconexões de dispositivos usando alertas de métricas do Azure Monitor ou Grade de Eventos, você pode usar logs para ajudar a solucionar o motivo. Esta seção descreve como procurar problemas comuns nos Logs do Azure Monitor. As etapas a seguir pressupõem que você já tenha criado uma configuração de diagnóstico para enviar logs do Hub IoT Connections para um espaço de trabalho do Log Analytics.

Depois de criar uma configuração de diagnóstico para rotear logs de recursos do Hub IoT para os Logs do Azure Monitor, siga estas etapas para exibir os logs no portal do Azure.

  1. Navegue até seu hub IoT no portal do Azure.

  2. Em Monitoramento , no painel esquerdo do hub IoT, selecione Logs.

  3. Para isolar os logs de erro de conectividade do Hub IoT, insira a seguinte consulta no editor de consultas e selecione Executar.

    AzureDiagnostics
    | where (ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. Se houver resultados, procure OperationName, ResultType (código de erro) e ResultDescription (mensagem de erro) para obter mais detalhes.

Use o guia de resolução de problemas para obter ajuda com os seguintes erros mais comuns:

  • 400027 ConnectionForcefullyClosedOnNewConnection

  • 404104 DeviceConnectionClosedRemotely

  • 401003 IoTHubUnauthorized

  • 409002 LinkCreationConflict

  • 500001 ServerError

  • 500008 GenericTimeout

Azure Monitor: usar logs para monitorar a conectividade de um dispositivo específico

Pode haver situações em que você queira usar o Azure Monitor para ver erros de conectividade e informações de um dispositivo específico. Para isolar eventos de conectividade para um dispositivo, você pode seguir as mesmas etapas da seção anterior, mas insira a consulta a seguir. Para usar a seguinte consulta, substitua test-device pelo nome do seu dispositivo:

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend DeviceId = tostring(parse_json(properties_s).deviceId)
| where DeviceId == "test-device"

A consulta retorna eventos de erro e informativos para o dispositivo de destino. O exemplo de saída a seguir mostra um evento deviceConnect informativo:

Image showing output of an informational deviceConnect event.

Comportamento de desconexão de dispositivo MQTT com SDKs do Azure IoT

Os SDKs de dispositivo IoT do Azure se desconectam do Hub IoT e se reconectam quando renovam tokens SAS pelo protocolo MQTT (e MQTT sobre WebSockets). Nos logs, isso aparece como eventos informativos de desconexão e conexão do dispositivo, às vezes acompanhados por eventos de erro.

Por padrão, a vida útil do token é de 60 minutos para todos os SDKs; no entanto, ele pode ser alterado por desenvolvedores em alguns dos SDKs. A tabela a seguir resume a vida útil do token, a renovação do token e o comportamento de renovação do token para cada um dos SDKs.

SDK

Tempo de vida do token

Renovação de tokens

Comportamento de renovação

.NET

60 minutos, configurável

85% da vida útil, configurável

O SDK desconecta e reconecta com a vida útil do token mais um período de carência de 10 minutos. Eventos informativos e erros gerados em logs.

Java

60 minutos, configurável

85% da vida útil, não configurável

O SDK desconecta e reconecta com a vida útil do token mais um período de carência de 10 minutos. Eventos informativos e erros gerados em logs.

Node.js

configurável

85% da vida útil, não configurável

O SDK desconecta e reconecta na renovação do token. Somente eventos informativos são gerados em logs.

Python

60 minutos, configurável

120 segundos antes da expiração

O SDK desconecta e reconecta na vida útil do token.

As capturas de tela a seguir mostram o comportamento de renovação de token nos Logs do Azure Monitor para diferentes SDKs. A vida útil do token e o limite de renovação foram alterados de seus padrões, conforme observado.

  • SDK do dispositivo .NET com uma vida útil e renovação de token de 1200 segundos (20 minutos) definida para acontecer em 90% da vida útil. As desconexões acontecem a cada 30 minutos: Image shows .NET device SDK with a 1200 second (20 minutes) token lifespan.
  • Java SDK com uma vida útil de token de 300 segundos (5 minutos) e 85% padrão de renovação de tempo de vida. As desconexões acontecem a cada 15 minutos: Image shows Java SDK with a 300 second (5 minutes) token lifespan and default 85% of lifespan renewal.
  • SDK do nó com uma vida útil do token de 300 segundos (5 minutos) e renovação do token definida para acontecer em 3 minutos. As desconexões acontecem na renovação do token. Além disso, não há erros, apenas eventos informativos de conexão e desconexão são emitidos: Image shows Node SDK with a 300 second (5 minutes) token lifespan and token renewal set to happen at 3 minutes.

A consulta a seguir foi usada para coletar os resultados. A consulta extrai o nome e a versão do SDK do pacote de propriedades.

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend parsed_json = parse_json(properties_s)
| extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId) , Protocol =  tostring(parsed_json.protocol)
| distinct TimeGenerated, OperationName, Level, ResultType, ResultDescription, DeviceId, Protocol, SDKVersion

Como desenvolvedor ou operador de soluções IoT, você precisa estar ciente desse comportamento para interpretar eventos de conexão e desconexão e erros relacionados em logs. Se você quiser alterar a vida útil do token ou o comportamento de renovação dos dispositivos, verifique se o dispositivo implementa uma configuração de dispositivo duplo ou um método de dispositivo que torna isso possível.

Se você estiver monitorando conexões de dispositivo com Hubs de Eventos, certifique-se de criar uma maneira de filtrar as desconexões periódicas devido à renovação do token SAS. Por exemplo, não acione ações com base em desconexões desde que o evento de desconexão seja seguido por um evento de conexão dentro de um determinado período de tempo.

Nota

O Hub IoT suporta apenas uma conexão MQTT ativa por dispositivo. Qualquer nova conexão MQTT em nome do mesmo ID de dispositivo faz com que o Hub IoT descarte a conexão existente. 400027 ConnectionForcefullyClosedOnNewConnection será conectado aos Logs do Hub IoT.

Se as orientações nesta página não ajudarem, tente o seguinte:

  • Se você tiver acesso aos dispositivos problemáticos, física ou remotamente (como SSH), siga o guia de solução de problemas do lado do dispositivo na próxima página da unidade para continuar a solução de problemas.

  • Verifique se seus dispositivos estão habilitados no portal > do Azure seus dispositivos IoT hub > IoT.

  • Se o seu dispositivo usa o protocolo MQTT, verifique se a porta 8883 está aberta. Para obter mais informações, consulte Conectando-se ao Hub IoT (MQTT).

  • Obtenha ajuda da página de perguntas e respostas da Microsoft para o suporte do Hub IoT do Azure, Estouro de Pilha ou Azure.