1

我对这个问题感到非常震惊。我请求你回答或给出提示。我的选择已经不多了。

我通过 WebHook 调用高 CPU 利用率的 azure Runbook。我的问题是内部运行手册数据未正确解码。例如,下面的行没有打印任何东西。

 Write-Output $WebHookData.RequestHeader

Wheras 如果我尝试将数据显式转换为 JSON,就像这样

*$WebhookData = ConvertFrom-Json $WebhookData*

那么这是一个抛出错误。

ConvertFrom-Json:无效的 JSON 原语:。在 line:6 char:31 + $WebhookData = $WebhookData | ConvertFrom-Json

顺便说一句,我正在尝试使用 Azure 库中提供的运行手册 {Vertically scale up an Azure Resource Manager VM with Azure Automation}

我的 Webhook 是从 VM 上创建的警报中调用的。

一个非常奇怪的观察:

工作 WebHood 示例(在示例中找到) {"WebhookName":"test1","RequestBody":" [ \r\n {\r\n \"Message\": \"Test Message\"\r\n } \r\n****]****"

不工作(从 VM 调用 runbook 时发送的数据):

{"WebhookName":"test2","RequestBody":" { \"schemaId\":\"AzureMonitorMetricAlert\" } }

谢谢

4

3 回答 3

1

我遇到了同样的错误。从我的测试来看,似乎在执行 Runbook 的“测试”时,Webhook 数据以纯文本形式接收,但在远程调用时,它通过已格式化为 JSON。这是我涵盖这两种情况的解决方案,到目前为止一直运行良好......

Param (
    [object] $WebhookData
)
# Structure Webhook Input Data
If ($WebhookData.WebhookName) {
    $WebhookName     =     $WebhookData.WebhookName
    $WebhookHeaders  =     $WebhookData.RequestHeader
    $WebhookBody     =     $WebhookData.RequestBody
} ElseIf ($WebhookData) {
    $WebhookJSON = ConvertFrom-Json -InputObject $WebhookData
    $WebhookName     =     $WebhookJSON.WebhookName
    $WebhookHeaders  =     $WebhookJSON.RequestHeader
    $WebhookBody     =     $WebhookJSON.RequestBody
} Else {
   Write-Error -Message 'Runbook was not started from Webhook' -ErrorAction stop
}
于 2021-02-04T15:54:08.957 回答
1

我尝试使用 webhook,脚本Write-Output $WebHookData.RequestHeader应该可以正常工作。

如果我使用ConvertFrom-Json $WebhookData,我可以重现你的问题,不知道为什么会发生,根据文档$WebhookData它也是 JSON 格式,如果被接受,你可以使用 ConvertFrom-Json -InputObject $WebhookData.RequestBody,它会正常工作。

我的运行手册

param
(
    [Parameter (Mandatory = $false)]
    [object] $WebhookData
)

if ($WebhookData) {

    Write-Output $WebhookData.RequestHeader

    $Body = ConvertFrom-Json -InputObject $WebhookData.RequestBody
    Write-Output $Body

} else
    {
        Write-Output "Missing information";
        exit;
    }

我用来发送 webhook 的 powershell 脚本

$uri = "https://s5events.azure-automation.net/webhooks?token=xxxxxxxxxxxx"

$vms  = @(
            @{ Name="vm01";ResourceGroup="vm01"},
            @{ Name="vm02";ResourceGroup="vm02"}
        )
$body = ConvertTo-Json -InputObject $vms
$header = @{ message="StartedbyContoso"}
$response = Invoke-WebRequest -Method Post -Uri $uri -Body $body -Headers $header
$jobid = (ConvertFrom-Json ($response.Content)).jobids[0]

输出

在此处输入图像描述

于 2019-03-04T06:33:29.783 回答
0

如果使用带有 Alert json 作为输入的测试窗格,我在使用以下获取 webhookdata 时遇到了同样的问题

if(-Not $WebhookData.RequestBody){

    $WebhookData = (ConvertFrom-Json -InputObject $WebhookData)
}
$RequestBody = ConvertFrom-JSON -InputObject $WebhookData.RequestBody
于 2019-05-15T22:14:27.260 回答