다음을 통해 공유


Azure Data Explorer 및 Azure Resource Graph의 데이터를 Log Analytics 작업 영역의 데이터와 상호 연결

Azure Data ExplorerAzure Resource Graph의 데이터를 Log Analytics 작업 영역 및 Application Insights의 데이터와 상호 연결하여 Azure Monitor 로그의 분석을 향상시킬 수 있습니다. Log Analytics 작업 영역에 데이터를 저장하는 Microsoft Sentinel은 Azure Data Explorer에 대한 서비스 간 쿼리를 지원하지만 Azure Resource Graph에 대한 쿼리는 지원하지 않습니다. 이 문서에서는 Log Analytics 작업 영역에 데이터를 저장하는 모든 서비스에서 서비스 간 쿼리를 실행하는 방법을 설명합니다.

Log Analytics 웹 UI, 통합 문서, PowerShell 및 REST API를 포함하여 KQL(Kusto 쿼리 언어) 쿼리를 지원하는 클라이언트 도구를 사용하여 서비스 간 쿼리를 실행합니다.

필수 사용 권한

Azure Data Explorer 또는 Azure Resource Graph의 데이터를 Log Analytics 작업 영역의 데이터와 연결하는 서비스 간 쿼리를 실행하려면 다음이 필요합니다.

  • 예를 들어, Log Analytics 읽기 권한자 기본 제공 역할에서 제공하는 대로 쿼리하는 Log Analytics 작업 영역에 대한 Microsoft.OperationalInsights/workspaces/query/*/read 권한입니다.
  • Azure Resource Graph에서 쿼리하는 리소스에 대한 읽기 권한자 권한입니다.
  • Azure Data Explorer에서 쿼리하는 테이블에 대한 뷰어 권한입니다.

adx()를 사용하여 Azure Data Explorer에서 데이터 쿼리

adx 패턴 내의 쿼리에 Azure Data Explorer 클러스터의 식별자와 데이터베이스 이름 및 테이블을 차례로 입력합니다.

adx('https://help.kusto.windows.net/Samples').StormEvents

Azure Data Explorer 클러스터 테이블과 Log Analytics 작업 영역을 결합합니다.

union 명령을 사용하여 클러스터 테이블을 Log Analytics 작업 영역과 결합합니다.

예시:

union customEvents, adx('https://help.kusto.windows.net/Samples').StormEvents
| take 10
let CL1 = adx('https://help.kusto.windows.net/Samples').StormEvents;
union customEvents, CL1 | take 10

줄임 형식은 허용됩니다. ClusterName/InitialCatalog. 예를 들어 adx('help/Samples')adx('help.kusto.windows.net/Samples')로 변환됩니다.

공용 구조체가 아니라 join 연산자를 사용하면 Azure Data Explorer 클러스터의 데이터를 Log Analytics Workspace와 결합하기 위해 hint를 사용해야 합니다. Hint.remote={Direction of the Log Analytics Workspace}을 사용합니다.

예시:

AzureDiagnostics
| join hint.remote=left adx("cluster=ClusterURI").AzureDiagnostics on (ColumnName)

다른 테넌트에서 Azure Monitor 리소스를 사용하여 한 테넌트의 Azure Data Explorer 클러스터에서 데이터 조인

서비스 사이에서 테넌트 간 쿼리는 지원되지 않습니다. 양쪽 리소스 모두로 확장되는 쿼리를 실행하기 위해 단일 테넌트에 로그인되어 있습니다.

Azure Data Explorer 리소스가 테넌트 A에 위치하고 Log Analytics 작업 영역이 테넌트 B에 위치한 경우, 다음 두 가지 방법 중 하나를 사용합니다.

  • Azure Data Explorer를 사용하면 다른 테넌트의 보안 주체에 대한 역할을 추가할 수 있습니다. 테넌트 B의 사용자 ID를 Azure Data Explorer 클러스터에 대한 권한이 있는 사용자로 추가합니다. Azure Data Explorer 클러스터의 TrustedExternalTenant 속성에 Tenant B가 포함되어 있는지 확인합니다. Tenant B에서 완전히 쿼리를 실행합니다.
  • Lighthouse를 사용하여 Azure Monitor 리소스를 테넌트 A에 프로젝션합니다.

다른 테넌트에서 Azure Data Explorer 클러스터에 연결

Kusto Explorer는 사용자 계정이 원래 속한 테넌트에 자동으로 로그인합니다. 동일한 사용자 계정을 사용하여 다른 테넌트의 리소스에 액세스하려면 다음과 같이 연결 문자열에서 TenantId을 명시적으로 지정해야 합니다.

Data Source=https://ade.applicationinsights.io/subscriptions/SubscriptionId/resourcegroups/ResourceGroupName;Initial Catalog=NetDefaultDB;AAD Federated Security=True;Authority ID=TenantId

arg()를 사용하여 Azure Resource Graph에서 데이터 쿼리(미리 보기)

arg("") 패턴을 입력하고 그 뒤에 Azure Resource Graph 테이블 이름을 입력합니다.

예시:

arg("").<Azure-Resource-Graph-table-name>

다음은 새로운 Azure Resource Graph 서비스 간 쿼리 기능을 사용하는 몇 가지 샘플 Azure Log Analytics 쿼리입니다.

  • Azure Resource Graph 쿼리 결과를 기반으로 Log Analytics 쿼리를 필터링합니다.

    arg("").Resources 
    | where type == "microsoft.compute/virtualmachines" and properties.hardwareProfile.vmSize startswith "Standard_D"
    | join (
        Heartbeat
        | where TimeGenerated > ago(1d)
        | distinct Computer
        )
        on $left.name == $right.Computer
    
  • ARG 쿼리에서 가져온 특정 리소스에만 적용되는 경고 규칙을 만듭니다.

    • 태그를 기준으로 리소스를 제외합니다. 예를 들어, "Test" 태그가 있는 VM에 대한 경고를 트리거하지 않습니다.

      arg("").Resources
      | where tags.environment=~'Test'
      | project name 
      
    • CPU 사용률과 관련된 성능 데이터를 검색하고 "prod" 태그를 사용하여 리소스를 필터링합니다.

      InsightsMetrics
      | where Name == "UtilizationPercentage"
      | lookup (
          arg("").Resources 
          | where type == 'microsoft.compute/virtualmachines' 
          | project _ResourceId=tolower(id), tags
          )
          on _ResourceId
      | where tostring(tags.Env) == "Prod"
      

더 많은 사용 사례:

  • 태그를 사용하여 VM을 연중무휴(24x7) 실행해야 하는지 아니면 밤에 종료해야 하는지 결정합니다.
  • 특정 개수의 코어가 포함된 모든 서버에 경고를 표시합니다.

Log Analytics 작업 영역의 서비스 간 쿼리를 기반으로 경고 만들기

Log Analytics 작업 영역에서 교차 서비스 쿼리를 기반으로 경고 규칙을 만들려면 범위 탭에서 Log Analytics 작업 영역을 선택하고 로그 검색 경고 규칙 만들기 또는 편집의 단계를 따릅니다.

참고 항목

관련 리소스를 경고 범위로 선택하여 Azure Data Explorer 및 Azure Resource Graph에서 Log Analytics 작업 영역으로 서비스 간 쿼리를 실행할 수도 있습니다.

제한 사항

일반적인 서비스 간 쿼리 제한 사항

  • 서비스 간 쿼리는 매개 변수가 있는 함수 및 해당 정의에 다른 작업 영역 간 또는 서비스 간 식을 포함하는 함수(예: adx(): , arg(), resource()workspace()app())를 지원하지 않습니다.
  • 서비스 간 쿼리는 ".show" 함수만 지원합니다. 이 기능을 사용하면 클러스터 간 쿼리가 Azure Monitor, Azure Data Explorer 또는 Azure Resource Graph 표 형식 함수를 직접 참조할 수 있습니다. 다음 명령은 서비스 간 쿼리에서 지원합니다.
    • .show functions
    • .show function {FunctionName}
    • .show database {DatabaseName} schema as json
  • 데이터베이스 이름은 대/소문자를 구분합니다.
  • 클러스터에서 타임스탬프 열 식별은 지원되지 않습니다. Log Analytics 쿼리 API는 시간 필터를 전달하지 않습니다.
  • 서비스 간 쿼리는 데이터 검색만 지원합니다.
  • Private Link(프라이빗 엔드포인트) 및 IP 제한은 서비스 간 쿼리를 지원하지 않습니다.
  • mv-expand는 2,000개의 레코드로 제한됩니다.
  • Azure Monitor 로그는 Azure Data Explorer에서 외부 테이블을 쿼리할 수 있는 external_table() 함수를 지원하지 않습니다. 외부 테이블을 쿼리하려면 external_table(<external-table-name>)을 Azure Data Explorer에서 매개 변수 없는 함수로 정의합니다. 그런 다음, 식 adx("").<function-name>을 사용하여 함수를 호출할 수 있습니다.

Azure Resource Graph 서비스 간 쿼리 제한 사항

  • Microsoft Sentinel은 Azure Resource Graph에 대한 서비스 간 쿼리를 지원하지 않습니다.
  • Azure Monitor에서 Azure Resource Graph 데이터를 쿼리하는 경우:
    • 쿼리는 처음 1000개 레코드만 반환합니다.
    • Azure Monitor는 Azure Resource Graph 쿼리 오류를 반환하지 않습니다.
    • Log Analytics 쿼리 편집기에서는 유효한 Azure Resource Graph 쿼리를 구문 오류로 표시합니다.
    • 힌트를 사용하지 않는 경우에는 조인이 지원되지 않습니다.
    • smv-apply(), rand(), arg_max(), arg_min(), avg(), avg_if(), countif(), sumif(), percentile(), percentiles(), percentilew(), percentilesw(), stdev(), stdevif(), stdevp(), variance(), variancep(), varianceif()와 같은 연산자는 지원되지 않습니다.

Azure Resource Graph 테이블을 Log Analytics 작업 영역과 결합

union 명령을 사용하여 클러스터 테이블을 Log Analytics 작업 영역과 결합합니다.

예시:

union AzureActivity, arg("").Resources
| take 10
let CL1 = arg("").Resources ;
union AzureActivity, CL1 | take 10

공용 구조체 대신 join 연산자를 사용하는 경우 hint를 사용하여 Azure Resource Graph의 데이터를 Log Analytics 작업 영역의 데이터와 결합해야 합니다. Hint.remote={Direction of the Log Analytics Workspace}을 사용합니다. 예시:

Perf | where ObjectName == "Memory" and (CounterName == "Available MBytes Memory")
| extend _ResourceId = replace_string(replace_string(replace_string(_ResourceId, 'microsoft.compute', 'Microsoft.Compute'), 'virtualmachines','virtualMachines'),"resourcegroups","resourceGroups")
| join hint.remote=left (arg("").Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project _ResourceId=id, tags) on _ResourceId | project-away _ResourceId1 | where tostring(tags.env) == "prod"

다음 단계