Monitorando o Hub IoT do Azure

Quando tem aplicações críticas e processos de negócio que dependem dos recursos do Azure, deverá querer monitorizar esses recursos quanto à disponibilidade, ao desempenho e à operação. Este artigo descreve os dados de monitoramento gerados pelo Hub IoT do Azure e como você pode usar os recursos do Azure Monitor para analisar e alertar sobre esses dados.

Descrição geral do Monitor

A página Visão geral no portal do Azure para cada hub IoT inclui gráficos que fornecem algumas métricas de uso, como o número de mensagens usadas e o número de dispositivos conectados ao hub IoT.

Gráficos de métricas padrão na página Visão geral do hub IoT.

Um valor correto de contagem de mensagens pode ser atrasado em 1 minuto. Devido à infraestrutura de serviço do Hub IoT, o valor às vezes pode saltar entre valores mais altos e mais baixos na atualização. Este contador deve estar incorreto apenas para valores acumulados no último minuto.

As informações apresentadas no painel Visão geral são úteis, mas representam apenas uma pequena quantidade de dados de monitoramento disponíveis para um hub IoT. Alguns dados de monitoramento são coletados automaticamente e ficam disponíveis para análise assim que você cria seu hub IoT. Você pode habilitar outros tipos de coleta de dados com alguma configuração.

O que é o Azure Monitor?

O Hub IoT do Azure monitora dados usando o Azure Monitor, um serviço de monitoramento de pilha completa. O Azure Monitor pode monitorar seus recursos do Azure e outros recursos locais ou na nuvem.

Comece com o artigo Monitorando recursos do Azure com o Azure Monitor, que descreve os seguintes conceitos:

  • O que é o Azure Monitor?
  • Dados de monitorização recolhidos no Azure
  • Configurando a coleta de dados
  • Métricas e registos
  • Ferramentas padrão no Azure para análise e insights
  • Alertas disparados ao monitorar dados

Para obter mais informações sobre as métricas e logs criados pelo Hub IoT do Azure, consulte Monitorando a referência de dados do Hub IoT do Azure.

Importante

Não é garantido que os eventos emitidos pelo serviço Hub IoT usando os logs de recursos do Azure Monitor sejam confiáveis ou ordenados. Alguns eventos podem ser perdidos ou entregues fora de ordem. Os logs de recursos não devem ser em tempo real, portanto, pode levar vários minutos para que os eventos sejam registrados no destino escolhido.

O restante deste artigo se baseia no artigo Monitorando recursos do Azure com o Azure Monitor descrevendo os dados específicos coletados para o Hub IoT do Azure. Você verá exemplos para configurar sua coleta de dados e como analisar esses dados com as ferramentas do Azure.

Recolha e encaminhamento

As métricas da plataforma, o log de atividades e os logs de recursos têm especificações exclusivas de coleta, armazenamento e roteamento.

  • As métricas de plataforma e o Registo de atividades são recolhidos e armazenados automaticamente, mas podem ser encaminhados para outras localizações através de uma definição de diagnóstico.

  • Os registos de recursos não são recolhidos e armazenados até que crie uma definição de diagnóstico e os encaminhe para uma ou mais localizações.

  • As métricas e os registos podem ser encaminhados para várias localizações, incluindo:

    • Os Registos do Azure Monitor armazenados através de uma área de trabalho do Log Analytics associada. Aí, podem ser analisados com o Log Analytics.
    • Armazenamento do Microsoft Azure para arquivamento e análise offline
    • Um ponto de extremidade de Hubs de Eventos onde eles podem ser lidos por aplicativos externos, por exemplo, informações de segurança de terceiros e ferramentas de gerenciamento de eventos (SIEM).

No portal do Azure a partir do seu hub IoT em Monitoramento, você pode selecionar Configurações de diagnóstico seguidas de Adicionar configuração de diagnóstico para criar configurações de diagnóstico com escopo para os logs e métricas de plataforma emitidos pelo seu hub IoT.

Captura de ecrã a mostrar como adicionar uma definição de diagnóstico no seu hub IoT no portal do Azure.

A captura de tela a seguir mostra uma configuração de diagnóstico para rotear o tipo de log de recursos Operações de Conexão e todas as métricas da plataforma para um espaço de trabalho do Log Analytics.

Captura de tela do formulário Configurações de diagnóstico para monitorar um hub IoT.

Para obter mais informações sobre como criar uma configuração de diagnóstico usando o portal do Azure, CLI ou PowerShell, consulte Criar configuração de diagnóstico para coletar logs e métricas da plataforma no Azure. Ao criar uma definição de diagnóstico, especifica as categorias de registos que devem ser recolhidas. As categorias para o Hub IoT do Azure estão listadas em Logs de recursos na referência de dados do Hub IoT do Azure de Monitoramento. Os eventos são emitidos apenas para erros em algumas categorias.

Ao rotear métricas da plataforma do Hub IoT para outros locais:

  • Essas métricas da plataforma não podem ser exportadas por meio de configurações de diagnóstico: dispositivos conectados e dispositivos Total.

  • Métricas multidimensionais, por exemplo, algumas métricas de roteamento, são atualmente exportadas como métricas unidimensionais achatadas agregadas em valores de dimensão. Para obter mais informações, consulte Exportando métricas da plataforma para outros locais.

Análise de métricas

Você pode analisar métricas para o Hub IoT do Azure com métricas de outros serviços do Azure usando o explorador de métricas. Para obter mais informações sobre essa ferramenta, consulte Analisar métricas com o explorador de métricas do Azure Monitor.

Para abrir o explorador de métricas, aceda ao portal do Azure e abra o seu hub IoT e, em seguida, selecione Métricas em Monitorização. Esse explorador tem como escopo, por padrão, as métricas da plataforma emitidas pelo seu hub IoT.

Captura de tela mostrando a página do explorador de métricas para um hub IoT.

Para obter uma lista das métricas de plataforma coletadas para o Hub IoT do Azure, consulte Métricas na referência de dados do Hub IoT do Azure. Para obter uma lista das métricas da plataforma coletadas para todos os serviços do Azure, consulte Métricas suportadas com o Azure Monitor.

Para métricas da plataforma do Hub IoT coletadas em unidades de contagem, algumas agregações podem não estar disponíveis ou utilizáveis. Para saber mais, consulte Agregações com suporte na referência de dados do Hub IoT do Azure.

Algumas métricas do Hub IoT, como métricas de roteamento, são multidimensionais. Para essas métricas, você pode aplicar filtros e divisão aos seus gráficos com base em uma dimensão.

Analisando logs

Os dados nos Logs do Azure Monitor são armazenados em tabelas onde cada tabela tem seu próprio conjunto de propriedades exclusivas. Os dados nessas tabelas estão associados a um espaço de trabalho do Log Analytics e podem ser consultados no Log Analytics. Para saber mais sobre os Logs do Azure Monitor, consulte Visão geral dos Logs do Azure Monitor na documentação do Azure Monitor.

Para rotear dados para os Logs do Azure Monitor, você deve criar uma configuração de diagnóstico para enviar logs de recursos ou métricas da plataforma para um espaço de trabalho do Log Analytics. Para saber mais, consulte Coleção e roteamento.

Para executar o Log Analytics, vá para o portal do Azure e abra seu hub IoT e, em seguida, selecione Logs em Monitoramento. Essas consultas do Log Analytics têm como escopo, por padrão, os logs e métricas coletados nos Logs do Azure Monitor para seu hub IoT.

Página de logs para um hub IoT.

Para obter uma lista das tabelas usadas pelos Logs do Azure Monitor e consultáveis pelo Log Analytics, consulte Tabelas de Logs do Azure Monitor na referência de dados do Hub IoT do Azure de Monitoramento.

Todos os registos de recursos no Azure Monitor têm os mesmos campos seguidos de campos específicos do serviço. O esquema comum é descrito no esquema de log de recursos do Azure Monitor. Você pode encontrar o esquema e as categorias de logs de recursos coletados para o Hub IoT do Azure em Logs de recursos na referência de dados do Hub IoT do Azure. Os eventos são emitidos apenas para erros em algumas categorias.

O log de atividades é um logon de plataforma do Azure que fornece informações sobre eventos no nível de assinatura. Você pode exibi-lo independentemente ou roteá-lo para os Logs do Azure Monitor, onde pode fazer consultas mais complexas usando o Log Analytics.

Ao rotear métricas da plataforma do Hub IoT para os Logs do Azure Monitor:

  • As seguintes métricas de plataforma não podem ser exportadas por meio de configurações de diagnóstico: Dispositivos conectados e Dispositivos Totais.

  • Métricas multidimensionais, por exemplo, algumas métricas de roteamento, são atualmente exportadas como métricas unidimensionais achatadas agregadas em valores de dimensão. Para obter mais detalhes, consulte Exportando métricas da plataforma para outros locais.

Para consultas comuns com o Hub IoT, consulte Exemplos de consultas Kusto. Para obter mais informações sobre como usar consultas do Log Analytics, consulte Visão geral das consultas de log no Azure Monitor.

Versão do SDK nos logs do Hub IoT

Algumas operações nos logs de recursos do Hub IoT retornam uma sdkVersion propriedade em seu properties objeto. Para essas operações, quando um dispositivo ou aplicativo de back-end está usando um dos SDKs do Azure IoT, essa propriedade contém informações sobre o SDK que está sendo usado, a versão do SDK e a plataforma na qual o SDK está sendo executado.

Os exemplos a seguir mostram a sdkVersion propriedade emitida para uma deviceConnect operação usando:

  • O Node.js SDK do dispositivo: "azure-iot-device/1.17.1 (node v10.16.0; Windows_NT 10.0.18363; x64)"
  • O SDK ".NET/1.21.2 (.NET Framework 4.8.4200.0; Microsoft Windows 10.0.17763 WindowsProduct:0x00000004; X86)".NET (C#): .

A tabela a seguir mostra o nome do SDK usado para diferentes SDKs do Azure IoT:

Nome do SDK na propriedade sdkVersion Linguagem
.NET .NET (C#)
microsoft.azure.devices SDK do serviço .NET (C#)
microsoft.azure.devices.client SDK do dispositivo .NET (C#)
iothubclient SDK do dispositivo C ou Python v1 (preterido)
iothubserviceclient SDK do serviço C ou Python v1 (preterido)
azure-iot-device-iothub-py SDK do dispositivo Python
azure-iot-device SDK do dispositivo Node.js
azure-iothub SDK do serviço Node.js
com.microsoft.azure.iothub-java-client SDK do dispositivo Java
com.microsoft.azure.iothub.service.sdk SDK do serviço Java
com.microsoft.azure.sdk.iot.iot-device-client SDK do dispositivo Java
com.microsoft.azure.sdk.iot.iot-service-client SDK do serviço Java
C C incorporado
C + (OSSsimplificado = Eclipse ThreadX) Eclipse ThreadX

Você pode extrair a propriedade de versão do SDK ao executar consultas em logs de recursos do Hub IoT. Por exemplo, a consulta a seguir extrai a propriedade de versão do SDK (e a ID do dispositivo) das propriedades retornadas pelas operações Connections. Essas duas propriedades são gravadas nos resultados, juntamente com a hora da operação e o ID do recurso do hub IoT ao qual o dispositivo está se conectando.

// SDK version of devices
// List of devices and their SDK versions that connect to IoT Hub
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)
| distinct DeviceId, SDKVersion, TimeGenerated, _ResourceId

Exemplos de consultas Kusto

Use as seguintes consultas Kusto para ajudá-lo a monitorar seu hub IoT.

Importante

Selecionar Logs no menu Hub IoT abre o Log Analytics e inclui dados exclusivamente do seu recurso de hub IoT. Para consultas que incluem dados de outros hubs IoT ou serviços do Azure, selecione Logs no menu Azure Monitor. Para obter mais informações, consulte Escopo e intervalo de tempo da consulta de log no Azure Monitor Log Analytics.

  • Erros de conectividade: identifique erros de conexão do dispositivo.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" and Level == "Error"
    
  • Erros de limitação: identifique os dispositivos que fizeram mais solicitações, resultando em erros de limitação.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where ResultType == "429001"
    | extend DeviceId = tostring(parse_json(properties_s).deviceId)
    | summarize count() by DeviceId, Category, _ResourceId
    | order by count_ desc
    
  • Pontos de extremidade mortos: identifique pontos de extremidade mortos ou não íntegros pelo número de vezes que o problema foi relatado e saiba o motivo.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Routes" and OperationName in ("endpointDead", "endpointUnhealthy")
    | extend parsed_json = parse_json(properties_s)
    | extend Endpoint = tostring(parsed_json.endpointName), Reason = tostring(parsed_json.details) 
    | summarize count() by Endpoint, OperationName, Reason, _ResourceId
    | order by count_ desc
    
  • Resumo do erro: Contagem de erros em todas as operações por tipo.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Level == "Error"
    | summarize count() by ResultType, ResultDescription, Category, _ResourceId
    
  • Dispositivos conectados recentemente: lista de dispositivos que o Hub IoT viu se conectar no período de tempo especificado.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" and OperationName == "deviceConnect"
    | extend DeviceId = tostring(parse_json(properties_s).deviceId)
    | summarize max(TimeGenerated) by DeviceId, _ResourceId
    
  • Eventos de conexão para um dispositivo específico: todos os eventos de conexão registrados para um dispositivo específico (dispositivo de teste).

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections"
    | extend DeviceId = tostring(parse_json(properties_s).deviceId)
    | where DeviceId == "test-device"
    
  • Versão SDK de dispositivos: Lista de dispositivos e suas versões SDK para conexões de dispositivo ou operações de dispositivo para gêmeo na nuvem.

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" or Category == "D2CTwinOperations"
    | extend parsed_json = parse_json(properties_s)
    | extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId)
    | distinct DeviceId, SDKVersion, TimeGenerated, _ResourceId
    

Ler logs de Hubs de Eventos do Azure

Depois de configurar o log de eventos por meio das configurações de diagnóstico, você pode criar aplicativos que leem os logs para que você possa agir com base nas informações neles contidas. O código de exemplo a seguir recupera logs de um hub de eventos.

class Program
{ 
    static string connectionString = "{your AMS eventhub endpoint connection string}";
    static string monitoringEndpointName = "{your AMS event hub endpoint name}";
    static EventHubClient eventHubClient;
    //This is the Diagnostic Settings schema
    class AzureMonitorDiagnosticLog
    {
        string time { get; set; }
        string resourceId { get; set; }
        string operationName { get; set; }
        string category { get; set; }
        string level { get; set; }
        string resultType { get; set; }
        string resultDescription { get; set; }
        string durationMs { get; set; }
        string callerIpAddress { get; set; }
        string correlationId { get; set; }
        string identity { get; set; }
        string location { get; set; }
        Dictionary<string, string> properties { get; set; }
    };

    static void Main(string[] args)
    {
        Console.WriteLine("Monitoring. Press Enter key to exit.\n");
        eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, monitoringEndpointName);
        var d2cPartitions = eventHubClient.GetRuntimeInformationAsync().PartitionIds;
        CancellationTokenSource cts = new CancellationTokenSource();
        var tasks = new List<Task>();
        foreach (string partition in d2cPartitions)
        {
            tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
        }
        Console.ReadLine();
        Console.WriteLine("Exiting...");
        cts.Cancel();
        Task.WaitAll(tasks.ToArray());
    }

    private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
    {
        var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
        while (true)
        {
            if (ct.IsCancellationRequested)
            {
                await eventHubReceiver.CloseAsync();
                break;
            }
            EventData eventData = await eventHubReceiver.ReceiveAsync(new TimeSpan(0,0,10));
            if (eventData != null)
            {
                string data = Encoding.UTF8.GetString(eventData.GetBytes());
                Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data);
                var deserializer = new JavaScriptSerializer();
                //deserialize json data to azure monitor object
                AzureMonitorDiagnosticLog message = new JavaScriptSerializer().Deserialize<AzureMonitorDiagnosticLog>(result);
            }
        }
    }
}

Alertas

Os alertas do Azure Monitor notificam proativamente quando as condições importantes são encontradas nos dados de monitorização. Permitem-lhe identificar e resolver problemas no seu sistema antes que os seus clientes reparem neles. Você pode definir alertas em métricas, logs e no registro de atividades. Diferentes tipos de alertas têm vantagens e desvantagens.

Quando você cria uma regra de alerta com base em métricas da plataforma (coletadas em unidades de contagem), algumas agregações podem não estar disponíveis ou utilizáveis. Para obter mais informações, consulte Agregações com suporte na referência de dados do Hub IoT do Azure.

Monitorar desconexões por dispositivo com a Grade de Eventos

O Azure Monitor fornece uma métrica, Dispositivos conectados, que você pode usar para monitorar o número de dispositivos conectados ao seu Hub IoT. Essa métrica dispara um alerta quando o número de dispositivos conectados cai abaixo de um valor limite. O Azure Monitor também emite eventos na categoria de conexões que você pode usar para monitorar conexões, desconexões e erros de conexão do dispositivo. Embora esses eventos possam ser suficientes para alguns cenários, a Grade de Eventos do Azure fornece uma solução de monitoramento por dispositivo de baixa latência que você pode usar para rastrear conexões de dispositivo para dispositivos e infraestrutura críticos.

Com a Grade de Eventos, você pode assinar os eventos DeviceConnected e DeviceDisconnected do Hub IoT para disparar alertas e monitorar o estado da conexão do dispositivo. A Grade de Eventos fornece uma latência de eventos muito menor do que o Azure Monitor, para que você possa monitorar por dispositivo, em vez de para todos os dispositivos conectados. Esses fatores tornam a Grade de Eventos o método preferido para monitorar conexões para dispositivos e infraestrutura críticos. É altamente recomendável usar a Grade de Eventos para monitorar conexões de dispositivos em ambientes de produção.

Para obter mais informações sobre como monitorar a conectividade do dispositivo com a Grade de Eventos e o Azure Monitor, consulte Monitorar, diagnosticar e solucionar problemas de conectividade de dispositivo com o Hub IoT do Azure.

Próximos passos