ADF V2 - веб-метод POST с использованием содержимого и переменной Dynami c - PullRequest
0 голосов
/ 03 марта 2020

Очень короткая версия

Как включить переменную ADF в запрос POST JSON, в веб-активность в ADF? Я чувствую, что это должна быть очень простая конкатенация строк, но я не могу заставить ее работать

Detail

У нас есть требование для запуска запроса / SPro c из ADF, который вернет строку, содержащую сообщение об ошибке. Затем эта строка должна быть передана через веб-активность в ADF в приложение Logi c, чтобы отключить электронное письмо с ошибкой.

Настройка приложения logi c скопирована отсюда:

https://www.mssqltips.com/sqlservertip/5718/azure-data-factory-pipeline-email-notification--part-1/

, а затем здесь (часть 2)

https://www.mssqltips.com/sqlservertip/5962/send-notifications-from-an-azure-data-factory-pipeline--part-2/

В ADF я использовал действие Lookup , чтобы выполнить запрос, который возвращает ошибку (кажется, работает, предварительный просмотр возвращает правильную строку) Затем я использую Set Variable активность, чтобы получить вывод поиска и сохранить его в переменной.

Последний шаг - отключить POST, используя Web Activity.

С этим код (слегка подправленный, чтобы удалить личные данные) в моей веб-активности, все работает нормально, и я получаю электронное письмо

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "Pipeline finished!",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}

Но любая попытка поместить содержимое переменной в субъектную часть не удалась.

Это (например) отправляет мне электронное письмо с темой буквально @ variable ('Emai lSubject ')

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@variables('EmailSubject')",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}

Но я также пробовал различные другие решения, которые приводят к ошибкам или к теме письма, в которой содержится только буквальная вещь, которую я там вставил (например, + @variables (' EmailSubject ') +).

Я также попытался сохранить всю переменную JSON в переменной, а затем в веб-операции использовал только переменную, которая не возвращала ошибок, но также не отправляла электронное письмо.

Это попытка:

{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@{variables('EmailSubject')}",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}   

В результате этого ввода в веб-активности - которая фактически включает в себя текст ошибки, который является бонусом ... (текст = Предупреждение о продолжительности работы):

{
    "url": "https://azureLogicAppsSiteHere",
    "method": "POST",
    "headers": {
        "Content-Type": "application/json"
    },
    "body": "{\n   \"DataFactoryName\": \"DFNAMEHERE\",\n   \"PipelineName\": \"pipeline1\",\n   \"Subject\": \"{\"firstRow\":{\"\":\"Job Duration Warning\"},\"effectiveIntegrationRuntime\":\"DefaultIntegrationRuntime (West Europe)\",\"billingReference\":{\"activityType\":\"PipelineActivity\",\"billableDuration\":[{\"meterType\":\"AzureIR\",\"duration\":0.016666666666666666,\"unit\":\"DIUHours\"}]},\"durationInQueue\":{\"integrationRuntimeQueue\":0}}\",\n   \"ErrorMessage\": \"Everything is okey-dokey!\",\n   \"EmailTo\": \"me@myEmail.com\"\n}\t"
}

Но затем возникла эта ошибка:

{
    "errorCode": "2108",
    "message": "{\"error\":{\"code\":\"InvalidRequestContent\",\"message\":\"The request content is not valid and could not be deserialized: 'After parsing a value an unexpected character was encountered: f. Path 'Subject', line 4, position 17.'.\"}}",
    "failureType": "UserError",
    "target": "Web1",
    "details": []
}

[Редактировать] ПРЕДПРОСМОТР из операции поиска - это текст: Предупреждение о продолжительности работы НО, когда я отладить конвейер, он позволяет мне увидеть фактический вывод, который выглядит следующим образом:

{
    "count": 1,
    "value": [
        {
            "": "Job Duration Warning"
        }
    ],
    "effectiveIntegrationRuntime": "DefaultIntegrationRuntime (West Europe)",
    "billingReference": {
        "activityType": "PipelineActivity",
        "billableDuration": [
            {
                "meterType": "AzureIR",
                "duration": 0.016666666666666666,
                "unit": "DIUHours"
            }
        ]
    },
    "durationInQueue": {
        "integrationRuntimeQueue": 0
    }
}

Так что, похоже, проблема в том, что вывод «Вывод» не тот, о котором я думал, поэтому переменная может не может использоваться в веб-активности, так как она содержит неподдерживаемые символы или что-то в этом духе.

Я только что проверил это, и все заработало:

  • Создайте строковый параметр со значением Предупреждение о продолжительности работы
  • Установите значение переменной равным @ pipeline (). Parameters.ParamSubject
  • Включите переменную в веб-активность с @ перед ней

Затем я получаю ожидаемое письмо с нужной темой. Я просто не знаю, как получить строковый вывод моего запроса в переменную / параметр, чтобы я мог использовать его в веб-активности.

1 Ответ

0 голосов
/ 04 марта 2020

Я не знаю, насколько хорошо это относится к проблемам других людей, но я нашел решение, которое сработало для меня.

  • В запросе SELECT в операции поиска - назовите выход ( в моем случае я назвал этот столбец «Subject», т. е. SELECT xyz AS Subject
  • В операции поиска включите параметр «Только первая строка»
  • В поле «Задание переменной» используйте код: @activity ('Lookup1'). output.firstRow.subject (где 'Lookup1' - имя вашей операции поиска, а Subject - имя столбца, который вы выводите)
  • В веб-операции ссылаться на переменную следующим образом:
{
   "DataFactoryName": "@{pipeline().DataFactory}",
   "PipelineName": "@{pipeline().Pipeline}",
   "Subject": "@{variables('EmailSubject')}",
   "ErrorMessage": "Everything is okey-dokey!",
   "EmailTo": "me@myEmail.com"
}
...