カスタムイベント統合の設定

最終更新日: 19 年 2023 月 XNUMX 日

LM Cloudは、LogicMonitorでAWS、GCP、Azure固有のイベントを確認し、イベント(EC2インスタンスの状態変更通知、CloudTrailログ、Azureアクティビティログなど)をパフォーマンスデータと関連付けることができるカスタムイベント統合を提供します。

これらの統合の設定と詳細は GCP と Azure で大きく異なるため、追加情報については次のセクションを参照してください。

LogicMonitorでのAzureアクティビティログの視覚化

Azure関数を使用して、Azureアクティビティログを送信できます。 これは、Azureアカウントで発生した監視の傾向とイベントを相互に関連付けるのに役立つ場合があります。

セットアップ手順

イベントの統合は、Azure関数に基づいています。 具体的には、関数を追加し、目的のアクティビティログイベントに基づいて関数をトリガーするAzureアクティビティログアラートルールを設定する必要があります。 関数は、トリガーされると、LogicMonitorのREST APIを使用して、イベントが関連する特定のデバイスのOpsNotesとしてイベントを追加します。 イベントが関連付けられている監視対象リソースの運用メモが作成されると、それらのリソースのすべてのデバイスとダッシュボードのグラフに表示されます。 Ops Notesパネルを使用して、表示されるイベントをさらにフィルタリングできます。

LogicMonitorで既にAzureリソースを監視している場合は、統合をセットアップするために次の手順を実行する必要があります。

1.統合で使用する一連のAPIトークンをLogicMonitorアカウントに作成します。 詳細については、を参照してください。 APIトークン.

注: これらのAPIトークンを使用するには、ユーザーはOpsNotesを作成するためにすべてのデバイスを管理する権限を持っている必要があります。 統合用に指定されたAPIユーザーを作成することをお勧めします。

2.新しいAzureFunctionアプリを追加します。

Note:関数は、AppServicesセクション内から表示または作成できます。 作成したら、アプリ内にHTTPTriggerPowershell関数を追加する必要があります。

3.次のスクリプトをHTTPトリガーPowerShell関数に追加します。

# POST method: $req
$requestBody = Get-Content $req -Raw | ConvertFrom-Json

$caller = $requestBody.data.context.activityLog.caller
$source = $requestBody.data.context.activityLog.eventSource
$time = $requestBody.data.context.activityLog.eventTimestamp
$operation = $requestBody.data.context.activityLog.operationName
$resourceId = $requestBody.data.context.activityLog.resourceId 
$resourceGroup = $requestBody.data.context.activityLog.resourceGroupName

Write-Output $resourceId | Out-String

<# account info #>
$accessId = 'API_ID'
$accessKey = 'API_KEY'
$company = 'LM_ACCOUNT'

$encoded = [uri]::EscapeDataString($resourceId)

<# Get Devices request details #>
$httpVerb = 'GET'
$resourcePath = '/device/devices'
$queryParams = '?filter=systemProperties.name:system.azure.resourceid,systemProperties.value:' + $encoded

Write-Output $queryParams | Out-String

<# Construct URL #>
$url = 'https://' + $company + '.logicmonitor.com/santaba/rest' + $resourcePath + $queryParams

<# Get current time in milliseconds #>
$epoch = [Math]::Round((New-TimeSpan -start (Get-Date -Date "1/1/1970") -end (Get-Date).ToUniversalTime()).TotalMilliseconds)

<# Concatenate Request Details #>
$requestVars = $httpVerb + $epoch + $resourcePath

<# Construct Signature #>
$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($accessKey)
$signatureBytes = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($requestVars))
$signatureHex = [System.BitConverter]::ToString($signatureBytes) -replace '-'
$signature = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($signatureHex.ToLower()))

<# Construct Headers #>
$auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization",$auth)
$headers.Add("Content-Type",'application/json')

<# Make Request #>
$response = Invoke-RestMethod -Uri $url -Method $httpVerb -Header $headers 

<# Print status and body of response #>
$status = $response.status
$body = $response.data

Write-Output "Status:$status"

$deviceId = $body.items.id

Write-Output $deviceId | Out-String

If ($deviceId -ne $Null) {

#####################################

<# Add Ops Note request details #>
$httpVerb = 'POST'
$resourcePath = '/setting/opsnotes'
$data = '{"note":"caller:' + $caller + ', source:' + $source + ', operation:' + $operation + '","tags":[{"name":"Azure Activity Log"}],"scopes":[{"type":"device","deviceId":"' + $deviceId + '"}]}'

<# Construct URL #>
$url = 'https://' + $company + '.logicmonitor.com/santaba/rest' + $resourcePath

<# Get current time in milliseconds #>
$epoch = [Math]::Round((New-TimeSpan -start (Get-Date -Date "1/1/1970") -end (Get-Date).ToUniversalTime()).TotalMilliseconds)

<# Concatenate Request Details #>
$requestVars = $httpVerb + $epoch + $data + $resourcePath

<# Construct Signature #>
$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($accessKey)
$signatureBytes = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($requestVars))
$signatureHex = [System.BitConverter]::ToString($signatureBytes) -replace '-'
$signature = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($signatureHex.ToLower()))

<# Construct Headers #>
$auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization",$auth)
$headers.Add("Content-Type",'application/json')

<# Make Request #>
$response = Invoke-RestMethod -Uri $url -Method $httpVerb -Body $data -Header $headers 

<# Print status and body of response #>
$status = $response.status
$body = $response.data | ConvertTo-Json -Depth 5

Write-Output "Status:$status"
Write-Output "Response:$body"
}

4.関数のURL(関数テキストの右上)を取得します–これをAzureアクティビティログアラートルールに追加する必要があります。

5. Monitorサービス内で、[アラート]セクションを選択し、LogicMonitorに表示するイベントに一致するアクティビティログアラートを構成します。 Webhookタイプの新しいアクションを追加し、説明として関数URLを追加する必要があります。

手順が完了したら、手順5で構成したルールに一致するすべてのAzureアクティビティログを、関連する特定の監視対象リソースのLogicMonitor OpsNotesとして追加する必要があります。

記事上で