Monitorando o Hub IoT do Azure

Quando você tem aplicativos e processos de negócios críticos que dependem de recursos do Azure, recomendamos monitorar a disponibilidade, o desempenho e a operação desses recursos. 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.

Visão geral do Monitor

A página de 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 de visão geral do Hub IoT.

Um valor correto de contagem de mensagens pode ser atrasado em um minuto. Devido à infraestrutura de serviço do Hub IoT, às vezes, o valor pode oscilar entre valores mais altos e mais baixos na atualização. Esse contador só deve estar incorreto em relação a 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 desses 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 algumas configurações.

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 os recursos do Azure e outros recursos locais ou de nuvem.

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

  • O que é o Azure Monitor?
  • Monitoramento de dados coletados no Azure
  • Configuração de coleta de dados
  • Métricas e logs
  • 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 os logs criados pelo Hub IoT do Azure, confira a referência de dados Monitoramento do Hub IoT do Azure.

Importante

Não há garantia de que os eventos emitidos pelo serviço Hub IoT usando logs de recursos do Azure Monitor sejam confiáveis ou estejam ordenados. Alguns eventos podem ser perdidos ou entregues fora de ordem. Os logs de recursos não se destinam a ser em tempo real. Portanto, pode levar vários minutos para que os eventos sejam registrados na sua opção de destino.

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

Coleta e roteamento

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 Log de atividades são coletados e armazenados automaticamente, mas podem ser roteados para outras localizações usando uma configuração de diagnóstico.

  • Os logs de recursos só são coletados e armazenados quando você cria uma configuração de diagnóstico e roteia-os para uma ou mais localizações.

  • As métricas e os logs podem ser encaminhados para vários locais, incluindo:

    • O armazenamento de logs do Azure Monitor por meio de um workspace do Log Analytics associado. Lá, eles podem ser analisados pelo 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, ferramentas SIEM (gerenciamento de eventos e informações de segurança) de terceiros.

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

Captura de tela mostrando como adicionar uma configuração de diagnóstico no hub IoT no portal do Azure.

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

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

Para mais informações sobre como criar uma configuração de diagnóstico usando o portal do Azure, a CLI ou o PowerShell, confira Criar uma configuração de diagnóstico para coletar logs e métricas de plataforma no Azure. Ao criar uma configuração de diagnóstico, você especifica quais categorias de logs coletar. As categorias do Hub IoT do Azure estão listadas em Logs de recursos na referência de dados Monitorando o Hub IoT do Azure. Os eventos são emitidos somente para erros em algumas categorias.

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

  • Essas métricas de plataforma não são exportáveis por meio de configurações de diagnóstico: dispositivos conectados e dispositivos Totais.

  • As métricas multidimensionais, por exemplo, algumas métricas de roteamento, são atualmente exportadas como métricas unidimensionais niveladas agregadas entre valores de dimensão. Para obter mais informações, confira Exportando métricas de plataforma para outros locais.

Analisando as métricas

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

Para abrir o Metrics Explorer, acesse o portal do Azure e abra o hub IoT e selecione Métricas em Monitoramento. Por padrão, o escopo desse gerenciador inclui as métricas de plataforma emitidas pelo hub IoT.

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

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

Para métricas da plataforma do Hub IoT que são coletadas em unidades de contagem, algumas agregações podem não estar disponíveis ou serem utilizáveis. Para saber mais, confira Agregações com suporte na referência de dados Monitoramento 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.

Análise de logs

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

Para encaminhar dados para os Logs do Azure Monitor, você precisa criar uma configuração de diagnóstico a fim de enviar logs de recursos ou métricas de plataforma para um workspace do Log Analytics. Para saber mais, confira Coleta e roteamento.

Para executar o Log Analytics, acesse o portal do Azure e abra o hub IoT e selecione Logs em Monitoramento. Por padrão, o escopo dessas consultas do Log Analytics inclui os logs e as métricas coletados nos logs do Azure Monitor para o hub IoT.

Página Logs de um hub IoT.

Para obter uma lista das tabelas usadas pelos Logs do Azure Monitor e passível de consulta pelo Log Analytics, confira Tabelas dos Logs do Azure Monitor na referência de dados Monitorando o Hub IoT do Azure.

Todos os logs de recursos no Azure Monitor têm os mesmos campos seguidos por campos específicos do serviço. O esquema comum está descrito em Esquema do 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 Monitorando o Hub IoT do Azure. Os eventos são emitidos somente para erros em algumas categorias.

O Log de atividades é um logon de plataforma do Azure que fornece insights sobre eventos de nível de assinatura. Você pode exibi-lo de modo independente ou roteá-lo para os Logs do Azure Monitor, nos quais você pode fazer consultas mais complexas usando o Log Analytics.

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

  • As seguintes métricas de plataforma não são exportáveis por meio de configurações de diagnóstico: dispositivos conectados e dispositivos Totais.

  • As métricas multidimensionais, por exemplo, algumas métricas de roteamento, são atualmente exportadas como métricas unidimensionais niveladas agregadas entre valores de dimensão. Para obter mais detalhes, confira Exportando métricas de plataforma para outros locais.

Para ver as consultas comuns com o Hub IoT, confira exemplos de consultas do Kusto. Para obter mais informações sobre como usar as consultas do Log Analytics, confira Visão geral das consultas de logs no Azure Monitor.

Versão do SDK nos logs do Hub IoT

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

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

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

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

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

Você pode extrair a propriedade de versão do SDK quando executa 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 de conexões. Essas duas propriedades são gravadas nos resultados junto com a hora da operação e a ID do recurso do Hub IoT ao qual o dispositivo está conectado.

// 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

Consultas de exemplo do Kusto

Use as consultas Kusto a seguir para ajudar a monitorar o hub IoT.

Importante

A seleção de logs no menu Hub IoT abre o Log Analytics e inclui somente os dados do recurso do 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, confira o Escopo da consulta de log e o intervalo de tempo no Log Analytics do Azure Monitor.

  • 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 inativos: identifique pontos de extremidade inativos ou não íntegros pelo número de vezes que o problema foi relatado e descubra 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 serem conectados 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 (test-device).

    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 do SDK dos dispositivos: lista de dispositivos e suas versões do SDK para conexões de dispositivo ou operações de gêmeo digital de dispositivo para 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, é possível criar aplicativos que leem logs de forma que você possa tomar uma ação com base nas informações neles. O seguinte código de exemplo recupera os 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 você proativamente quando condições importantes são encontradas nos dados de monitoramento. Eles permitem que você identifique e resolva problemas no seu sistema antes que os clientes os percebam. Você pode definir alertas em métricas, logs e log de atividades. Os diferentes tipos de alertas têm benefícios e desvantagens.

Ao criar uma regra de alerta baseada nas métricas da plataforma (coletadas em unidades de contagem), algumas agregações podem não estar disponíveis ou serem utilizáveis. Para saber mais, confira Agregações com suporte na referência de dados Monitoramento 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 fica abaixo de um valor limite. O Azure Monitor também emite eventos na categoria conexões que você pode usar para monitorar a conexão, desconexão e erros conexões do dispositivo. Embora esses eventos possa ser suficiente em alguns cenários, a Grade de Eventos do Azure fornece uma solução de monitoramento de baixa latência por dispositivo que você pode usar para rastrear conexões de dispositivo de dispositivos e infraestruturas críticos.

Com a Grade de Eventos, você pode assinar os eventos DeviceConnected e DeviceDisconnected do Hub IoT a fim de 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 a do Azure Monitor. Portanto, você pode monitorar por dispositivo em vez de por todos os dispositivos conectados. Esses fatores tornam a Grade de Eventos o método preferencial para monitorar conexões de dispositivos e infraestruturas críticos. Recomendamos bastante usar a Grade de Eventos para monitorar as conexões de dispositivos em ambientes de produção.

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

Próximas etapas