모니터링 Azure IoT Hub

Azure 리소스를 사용하는 중요한 애플리케이션 및 비즈니스 프로세스가 있는 경우 이와 같은 리소스의 가용성, 성능 및 작업을 모니터링할 수 있습니다. 이 문서에서는 Azure 리소스에서 생성되는 모니터링 데이터와 Azure IoT Hub 기능을 사용하여 해당 데이터에 대해 분석하고 경고하는 방법을 설명합니다.

모니터 개요

각 IoT Hub에 대한 Azure Portal의 개요 페이지에는 사용되는 메시지 및 IoT Hub에 연결된 디바이스 수와 같은 일부 사용 현황 메트릭을 제공하는 차트가 포함되어 있습니다.

IoT Hub 개요 페이지의 기본 메트릭 차트

올바른 메시지 수 값이 1분 지연될 수 있습니다. IoT Hub 서비스 인프라로 인해 새로 고치게 되면 값이 더 높거나 낮은 값 사이를 바운스하는 경우가 있습니다. 해당 카운터는 최종 1분 간의 계산 값에 대해서만 부정확해야 합니다.

개요 창에 표시되는 정보는 유용하지만 IoT Hub에 사용할 수 있는 적은 양의 모니터링 데이터만 표시합니다. 이 모니터링 데이터 중 일부는 자동으로 수집되며, IoT Hub를 만드는 즉시 분석에 사용할 수 있습니다. 일부 구성으로 다른 형식의 데이터 수집을 사용하도록 설정할 수 있습니다.

Azure Monitor란?

Azure IoT Hub는 전체 스택 모니터링 서비스인 Azure Monitor를 사용하여 데이터를 모니터링합니다. Azure Monitor는 Azure 리소스 및 기타 클라우드 또는 온-프레미스 리소스를 모니터링할 수 있습니다.

다음 개념을 설명하는 Azure Monitor를 사용하여 Azure 리소스 모니터링 문서로 시작하세요.

  • Azure Monitor란?
  • Azure에서 수집된 데이터 모니터링
  • 데이터 수집 구성
  • 메트릭 및 로그
  • 분석 및 인사이트를 위한 Azure의 표준 도구
  • 데이터를 모니터링할 때 발생하는 경고

Azure IoT Hub에서 만든 메트릭 및 로그에 대한 자세한 내용은 Azure IoT Hub 모니터링 데이터 참조를 참조하세요.

Important

Azure Monitor 리소스 로그를 사용하여 IoT Hub 서비스에서 내보내는 이벤트는 안정 또는 정렬이 보장되지 않습니다. 일부 이벤트는 손실되거나 순서 없이 제공될 수 있습니다. 리소스 로그는 실시간으로 제공되지 않으므로, 사용자가 선택한 대상에 이벤트를 기록하기까지 몇 분 정도 걸릴 수 있습니다.

이 문서의 나머지 내용은 Azure Monitor를 사용하여 Azure 리소스 모니터링 문서를 토대로 Azure IoT Hub용으로 수집된 특정 데이터를 설명합니다. 데이터 수집을 구성하는 예제와 Azure 도구를 사용하여 이 데이터를 분석하는 방법을 확인할 수 있습니다.

수집 및 라우팅

플랫폼 메트릭, 활동 로그 및 리소스 로그에는 고유한 컬렉션, 스토리지 및 라우팅 사양이 있습니다.

  • 플랫폼 메트릭 및 활동 로그는 자동으로 수집되고 저장되지만 진단 설정을 사용하여 다른 위치로 라우팅할 수 있습니다.

  • 리소스 로그는 진단 설정을 만들고 하나 이상의 위치로 라우팅할 때까지 수집 및 저장되지 않습니다.

  • 메트릭 및 로그는 다음을 비롯한 여러 위치로 라우팅할 수 있습니다.

    • Azure Monitor 로그는 연결된 Log Analytics 작업 영역을 통해 저장됩니다. 거기서 Log Analytics를 사용하여 분석할 수 있습니다.
    • 보관 및 오프라인 분석을 위한 Azure Storage
    • 외부 애플리케이션(예: 타사 보안 정보 및 이벤트 관리(SIEM) 도구)에서 읽을 수 있는 Event Hubs 엔드포인트

Azure Portal에서 IoT Hub의 모니터링에서 진단 설정을 선택한 다음, 진단 설정 추가를 선택하여 IoT Hub에서 내보낸 로그 및 플랫폼 메트릭으로 범위가 지정된 진단 설정을 만들 수 있습니다.

Azure Portal IoT Hub에서 진단 설정을 추가하는 방법을 보여 주는 스크린샷

다음 스크린샷은 리소스 로그 형식 연결 작업 및 모든 플랫폼 메트릭을 Log Analytics 작업 영역으로 라우팅하는 진단 설정을 보여 줍니다.

IoT Hub 모니터링을 위한 진단 설정 양식의 스크린샷

Azure Portal, CLI 또는 PowerShell을 사용하여 진단 설정 만들기의 자세한 내용은 Azure에서 플랫폼 로그 및 메트릭을 수집하는 진단 설정 만들기를 참조하세요. 진단 설정을 만들 때 수집할 로그 범주를 지정합니다. Azure IoT Hub에 대한 범주는 Resource logs in the Monitoring Azure IoT Hub data reference(모니터링 Azure IoT Hub 데이터의 리소스 로그 참조)에 나열됩니다. 이벤트는 일부 범주의 오류에 대해서만 발생합니다.

IoT Hub 플랫폼 메트릭을 다른 위치로 라우팅하는 경우 다음에 유의하세요.

  • 이러한 플랫폼 메트릭은 진단 설정인 ‘연결된 디바이스’ 및 ‘총 디바이스’를 통해 내보낼 수 없습니다.

  • 다차원 메트릭(예: 일부 라우팅 메트릭)은 현재 차원 값에서 집계된 평면화된 단일 차원 메트릭으로 내보내게 됩니다. 세부 정보는 플랫폼 메트릭을 다른 위치로 내보내기를 참조하세요.

메트릭 분석

메트릭 탐색기를 사용하여 다른 Azure 서비스의 메트릭과 함께 Azure IoT Hub의 메트릭을 분석할 수 있습니다. 이 도구에 대한 자세한 내용은 Azure Monitor 메트릭 탐색기로 메트릭 분석을 참조하세요.

메트릭 탐색기를 열려면 Azure Portal로 이동하여 IoT Hub를 연 다음, 모니터링에서 메트릭을 선택합니다. 이 탐색기는 기본적으로 IoT Hub에서 내보낸 플랫폼 메트릭으로 범위가 지정됩니다.

IoT Hub에 대한 메트릭 탐색기 페이지를 보여 주는 스크린샷

Azure IoT Hub에 대해 수집되는 플랫폼 메트릭의 목록은 모니터링 Azure IoT Hub 데이터의 메트릭 참조를 확인하세요. 모든 Azure 서비스에 대해 수집되는 플랫폼 메트릭 목록은 Azure Monitor에서 지원되는 메트릭을 참조하세요.

카운트 단위로 수집되는 IoT Hub 플랫폼 메트릭의 경우 일부 집계를 사용하지 않거나 사용할 수 없는 경우도 있습니다. 자세한 정보는 모니터링 Azure IoT Hub 데이터에서 지원되는 집계 참조에 있습니다.

라우팅 메트릭과같은 일부 IoT Hub 메트릭은 다차원입니다. 해당 메트릭에서는 차원을 기반으로 하는 차트에 필터분할을 적용할 수 있습니다.

로그 분석

Azure Monitor Logs의 데이터는 테이블마다 고유한 자체 속성 집합이 있는 테이블에 저장됩니다. 해당 테이블의 데이터는 Log Analytics 작업 영역과 연결되며 Log Analytics에서 쿼리할 수 있습니다. Azure Monitor 로그에 대한 자세한 정보는 Azure Monitor 설명서의 Azure Monitor 로그 개요를 참조하세요.

Azure Monitor 로그에 데이터를 라우팅하려면 Log Analytics 작업 영역에 리소스 로그 또는 플랫폼 메트릭을 전송하는 진단 설정을 만들어야 합니다. 자세한 정보는 수집 및 라우팅을 참조하세요.

Log Analytics를 수행하려면 Azure Portal로 이동하여 IoT Hub를 연 다음, 모니터링에서 로그를 선택합니다. 이러한 Log Analytics 쿼리는 기본적으로 IoT Hub에 대해 Azure Monitor 로그에서 수집된 로그 및 메트릭으로 범위가 지정됩니다.

IoT Hub에 대한 로그 페이지.

Azure Monitor 로그 및 Log Analytics에서 쿼리할 때 사용하는 테이블 목록은 모니터링 Azure IoT Hub 데이터의 Azure Monitor 로그 테이블 참조에 있습니다.

Azure Monitor의 모든 리소스 로그에는 동일한 필드와 그 뒤에 오는 서비스별 필드가 있습니다. 공용 스키마는 Azure Monitor 리소스 로그 스키마에서 설명합니다. 모니터링 Azure IoT Hub 데이터의 리소스 로그 참조에서 Azure IoT Hub에 대해 수집된 리소스 로그의 스키마 및 범주를 찾을 수 있습니다. 이벤트는 일부 범주의 오류에 대해서만 발생합니다.

활동 로그는 구독 수준의 이벤트에 대한 인사이트를 제공하는 Azure의 플랫폼 로그입니다. 활동 로그는 독립적으로 보거나 Azure Monitor Logs로 라우팅할 수 있습니다. 여기서 Log Analytics를 사용하여 더 복잡한 쿼리를 수행할 수 있습니다.

IoT Hub 플랫폼 메트릭을 Azure Monitor 로그에 라우팅하는 경우 다음에 유의하세요.

  • 다음 플랫폼 메트릭은 진단 설정인 ‘연결된 디바이스’ 및 ‘총 디바이스’를 통해 내보낼 수 없습니다.

  • 다차원 메트릭(예: 일부 라우팅 메트릭)은 현재 차원 값에서 집계된 평면화된 단일 차원 메트릭으로 내보내게 됩니다. 세부 정보는 플랫폼 메트릭을 다른 위치로 내보내기를 참조하세요.

IoT Hub의 일반적인 쿼리는 샘플 Kusto 쿼리를 참조하세요. Log Analytics 쿼리 사용에 대한 자세한 내용은 Azure Monitor의 로그 쿼리 개요를 참조하세요.

IoT Hub 로그의 SDK 버전

IoT Hub 리소스 로그의 일부 작업은 properties 개체의 sdkVersion속성을 반환합니다. 해당 작업의 경우 디바이스 또는 백 엔드 앱이 Azure IoT SDK 중 하나를 사용할 때 해당 속성은 사용되는 SDK, SDK 버전 및 SDK가 실행되는 플랫폼에 대한 정보를 포함합니다.

다음 예제에서는 다음을 사용하여 deviceConnect 작업에 대해 내보낸 sdkVersion 속성을 보여 줍니다.

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

다음 표는 다양한 Azure IoT SDK에 사용되는 SDK 이름을 보여 줍니다.

sdkVersion 속성의 SDK 이름 언어
.NET .NET (C#)
microsoft.azure.devices .NET(C#) 서비스 SDK
microsoft.azure.devices.client .NET(C#) 디바이스 SDK
iothubclient C 또는 Python v1(사용 되지 않음) 디바이스 SDK
iothubserviceclient C 또는 Python v1(사용 되지 않음) 서비스 SDK
azure-iot-device-iothub-py Python 디바이스 SDK
azure-iot-device Node.js 디바이스 SDK
azure-iothub Node.js 서비스 SDK
com.microsoft.azure.iothub-java-client Java 디바이스 SDK
com.microsoft.azure.iothub.service.sdk Java 서비스 SDK
com.microsoft.azure.sdk.iot.iot-device-client Java 디바이스 SDK
com.microsoft.azure.sdk.iot.iot-service-client Java 서비스 SDK
C Embedded C
C +(OSSimplified = Eclipse ThreadX) Eclipse ThreadX

IoT Hub 리소스 로그에 대해 쿼리를 수행하는 경우 SDK 버전 속성을 추출할 수 있습니다. 예를 들어, 다음 쿼리는 연결 작업에서 반환된 속성에서 SDK 버전 속성(및 디바이스 ID)를 추출합니다. 이 두 속성은 디바이스가 연결되는 IoT Hub의 작업 시간 및 리소스 ID와 함께 결과에 기록됩니다.

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

샘플 Kusto 쿼리

다음 Kusto 쿼리를 사용하여 IoT Hub를 모니터링할 수 있습니다.

Important

IoT Hub 메뉴에서 로그를 선택하면 Log Analytics가 열리고 IoT Hub 리소스의 데이터만 포함됩니다. 다른 IoT Hub 또는 Azure 서비스의 데이터를 포함하는 쿼리의 경우 Azure Monitor 메뉴에서 로그를 선택합니다. 자세한 내용은 Azure Monitor Log Analytics Log 쿼리 범위 및 시간 범위를 참조하세요.

  • 연결 오류: 디바이스 연결 오류 식별하기

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" and Level == "Error"
    
  • 제한 오류: 제한 오류를 발생시키는 요청을 가장 많이 한 디바이스 식별하기

    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
    
  • 중지된 엔드포인트: 문제가 보고된 횟수에 따라 중지된 또는 비정상 엔드포인트를 식별하고 원인 파악하기.

    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
    
  • 오류 요약: 모든 작업에서 발생한 형식별 오류의 수

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Level == "Error"
    | summarize count() by ResultType, ResultDescription, Category, _ResourceId
    
  • 최근에 연결된 디바이스: IoT Hub 에서 지정된 기간 동안 연결한 디바이스 목록

    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
    
  • 특정 디바이스에 대한 연결 이벤트: 특정 디바이스(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"
    
  • 디바이스의 SDK 버전: 디바이스 연결 또는 디바이스-클라우드 쌍 작업을 위한 디바이스 및 해당 SDK 버전 목록

    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
    

Azure Event Hubs의 로그 읽기

진단 설정을 통해 이벤트 로깅을 설정한 후에는 로그의 정보를 기반으로 조치를 취할 수 있도록 로그를 읽는 애플리케이션을 만들 수 있습니다. 다음 샘플 코드는 이벤트 허브에서 로그를 검색합니다.

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

경고

Azure Monitor 경고는 모니터링 데이터에서 중요한 조건이 발견될 때 사용자에게 사전에 알립니다. 이를 통해 고객이 알기 전에 시스템 문제를 식별하고 해결할 수 있습니다. 메트릭, 로그활동 로그에서 경고를 설정할 수 있습니다. 서로 다른 형식의 경고에는 장점과 단점이 있습니다.

카운트 단위로 수집되는 플랫폼 메트릭을 기준으로 경고 규칙을 만드는 경우 일부 집계가 사용 가능하지 않거나 유용하지 않을 수 있습니다. 자세한 내용은 Azure IoT Hub 모니터링 데이터 참조지원되는 집계를 참조하세요.

Event Grid와 디바이스 당 모니터의 연결 끊김

Azure Monitor는 IoT Hub에 연결된 디바이스 수를 모니터링하는 데 사용할 수 있는 연결된 디바이스 메트릭을 제공합니다. 이 메트릭은 연결된 디바이스 수가 임계값 아래로 떨어지면 경고를 트리거합니다. 또한 Azure Monitor는 디바이스 연결, 연결 끊기 및 연결 오류를 모니터링하는 데 사용할 수 있는 연결 범주 의 이벤트를 내보냅니다. 일부 시나리오에서는 이러한 이벤트로 충분할 수도 있지만, Azure Event Grid는 낮은 대기 시간으로 중요한 디바이스 및 인프라에 대한 디바이스 연결을 추적하는 데 사용할 수 있는 디바이스 단위 모니터링 솔루션을 제공합니다.

Event Grid를 사용하면 IoT Hub DeviceConnectedDeviceDisconnected 이벤트를 구독하여 경고를 트리거하고 디바이스 연결 상태를 모니터링할 수 있습니다. Event Grid는 Azure Monitor보다 훨씬 짧은 이벤트 대기 시간을 제공하므로, 연결된 모든 디바이스가 아니라 각 디바이스별로 모니터링할 수 있습니다. 해당 요소들은 중요한 디바이스 및 인프라에 대한 연결을 모니터링하는 메서드로 Event Grid를 선호하게 만듭니다. 프로덕션 환경에서 디바이스 연결을 모니터링하려면 Event Grid를 사용하는 것이 좋습니다.

Event Grid 및 Azure Monitor를 사용하여 디바이스 연결을 모니터링하는 방법에 대한 자세한 내용은 Monitor, diagnose, and troubleshoot device connectivity to Azure IoT Hub(Azure IoT Hub에 대한 디바이스 연결 모니터링, 진단 및 문제 해결)를 참조하세요.

다음 단계