如何获取 Azure 数据工厂管道中错误消息的详细信息
How to get the details of an error message in an Azure Data Factory pipeline
我在 Azure 数据工厂中的管道的最后一步执行另一个管道,其中有一个笔记本步骤。作为我要求的一部分,我需要在此步骤失败时捕获错误消息的详细信息(将其存储在数据库中)。
然而,最后一步的输出并没有提供这个信息,只是link给了另外一个。我的挑战是我无法修改“内部”管道来获取该数据(我们对错误的 URL 感兴趣),我需要从我创建的管道开始做所有事情。
不幸的是,我无法找到任何可能的解决方案或文档来尝试解决这个问题。如果您能给我任何建议,我将不胜感激。
尝试按照此处所述将您的代码包含在 try-except 块中
在 except 块内,您还可以 return 使用
的错误消息
dbutils.notebook.exit(errmsg)
返回 ADF 并分配给像
这样的变量
@activity('Notebook1').output.runoutput
您可以从变量写入 table/file。
任何 activity 都将以如下格式存储输出。
@activity('*activityName*').output.*subfield1*.*subfield2*
要访问失败 activity 的输出,您可以 select 在 failure stream
上添加 activity 并使用设置变量。
然而,在这种情况下,由于正在执行另一个管道,其输出返回到 parent 管道 (ExecutePipeline
activity) 只是 Child PipelineName
和 PipelineRunId
.
所以让我们利用这个 PipelineRunId。让我们使用 WebActivity 来调用一个 REST APIActivity Runs - Query By Pipeline Run
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataFactory/factories/{factoryName}/pipelineruns/{runId}/queryActivityruns?api-version=2018-06-01
1. 从 ExecutePipeline activity 输出获取 PipelineRunId 并设置为变量。
错误输出: @activity('Execute Pipeline').output.pipelineRunId
2. 使用这个运行 id 动态形成url
url: https://management.azure.com/subscriptions/b83c1ed3-xxxx-xxxx-xxxx-2b83a074c23f/resourceGroups/myrg/providers/Microsoft.DataFactory/factories/ktestadf/pipelineruns/@{variables('pipelineRunId')}/queryActivityruns?api-version=2018-06-01
3. 现在准备调用 REST API。使用已经准备好的url
。设置方法 POST、header 和 body.
请求的Body是查询管道运行的时间运行ge。我们将在动态调用前后设置 1 小时 window。
方法: POST
Header: Content-Type:application/json
Body: {"lastUpdatedAfter":getPastTime(1, 'Hour'),"lastUpdatedBefore":getFutureTime(1, 'Hour')}
身份验证: 如果使用 MSI 集资源:https://management.azure.com/
4. 最后将该错误消息存储在另一个 Array 变量中,您可以从中解析数组并根据需要存储到 SQL sink。
这是它的内容。
{
"name": "ErrorMsg",
"value": [
{
"activityRunEnd": "2021-10-14T07:43:20.1291832Z",
"activityName": "Notebook",
"activityRunStart": "2021-10-14T07:43:18.3867797Z",
"activityType": "DatabricksNotebook",
"durationInMs": 1742,
"retryAttempt": null,
"error": {
"errorCode": "2011",
"message": "Caller was not found on any access policy in this key vault, secretName: databricksclientsecret, secretVersion: , vaultBaseUrl: https://ktestkeyvaults.vault.azure.net/. The error message is: The user, group or application 'name=Microsoft.DataFactory/factories;appid=3ecdccaf-xxxx-xxxx-8818-4f30b45856eb;oid=7ee614a9-xxxx-xxxx-a7cd-fbad1afc715b;iss=https://sts.windows.net/72f988bf-xxxx-41af-91ab-2d7cd011db47/' does not have secrets get permission on key vault 'ktestkeyvaultss;location=eastus'. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287.",
"failureType": "UserError",
"target": "Notebook",
"details": []
},
"activityRunId": "6c9519e1-b646-4d5b-a974-29bef371d7e5",
"iterationHash": "",
"input": {
"notebookPath": "https://adb-7020907718042127.7.azuredatabricks.net/?o=7020907718041127#notebook/171399934287251/command/171399934287255"
},
"linkedServiceName": "",
"output": {
"effectiveIntegrationRuntime": "DefaultIntegrationRuntime (Central US)",
"executionDuration": 0,
"durationInQueue": {
"integrationRuntimeQueue": 1
},
"billingReference": {
"activityType": "ExternalActivity",
"billableDuration": [
{
"meterType": "AzureIR",
"duration": 0.016666666666666666,
"unit": "Hours"
}
]
}
},
"userProperties": {},
"pipelineName": "error2",
"pipelineRunId": "6a717388-516e-46d7-883c-fdcf2d517bd8",
"status": "Failed",
"recoveryStatus": "None",
"integrationRuntimeNames": [
"defaultintegrationruntime"
],
"executionDetails": {
"integrationRuntime": [
{
"name": "DefaultIntegrationRuntime",
"type": "Managed",
"location": "Central US"
}
]
},
"id": "/SUBSCRIPTIONS/B83C2ED3-xxxx-xxxx-xxxx-2B80A074C23F/RESOURCEGROUPS/myrg/PROVIDERS/MICROSOFT.DATAFACTORY/FACTORIES/KTESTADF/pipelineruns/6a717388-516e-46d7-883c-fdcf2d517bd8/activityruns/6c9519e1-b646-4d5b-a974-29bef371d7e5"
}
]
}
我有一条不同的错误消息,您可以类似地找到所需的 URL。
我在 Azure 数据工厂中的管道的最后一步执行另一个管道,其中有一个笔记本步骤。作为我要求的一部分,我需要在此步骤失败时捕获错误消息的详细信息(将其存储在数据库中)。
然而,最后一步的输出并没有提供这个信息,只是link给了另外一个。我的挑战是我无法修改“内部”管道来获取该数据(我们对错误的 URL 感兴趣),我需要从我创建的管道开始做所有事情。
不幸的是,我无法找到任何可能的解决方案或文档来尝试解决这个问题。如果您能给我任何建议,我将不胜感激。
尝试按照此处所述将您的代码包含在 try-except 块中
在 except 块内,您还可以 return 使用
的错误消息dbutils.notebook.exit(errmsg)
返回 ADF 并分配给像
这样的变量@activity('Notebook1').output.runoutput
您可以从变量写入 table/file。
任何 activity 都将以如下格式存储输出。
@activity('*activityName*').output.*subfield1*.*subfield2*
要访问失败 activity 的输出,您可以 select 在 failure stream
上添加 activity 并使用设置变量。
然而,在这种情况下,由于正在执行另一个管道,其输出返回到 parent 管道 (ExecutePipeline
activity) 只是 Child PipelineName
和 PipelineRunId
.
所以让我们利用这个 PipelineRunId。让我们使用 WebActivity 来调用一个 REST APIActivity Runs - Query By Pipeline Run
POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DataFactory/factories/{factoryName}/pipelineruns/{runId}/queryActivityruns?api-version=2018-06-01
1. 从 ExecutePipeline activity 输出获取 PipelineRunId 并设置为变量。
错误输出: @activity('Execute Pipeline').output.pipelineRunId
2. 使用这个运行 id 动态形成url
url: https://management.azure.com/subscriptions/b83c1ed3-xxxx-xxxx-xxxx-2b83a074c23f/resourceGroups/myrg/providers/Microsoft.DataFactory/factories/ktestadf/pipelineruns/@{variables('pipelineRunId')}/queryActivityruns?api-version=2018-06-01
3. 现在准备调用 REST API。使用已经准备好的url
。设置方法 POST、header 和 body.
Body是查询管道运行的时间运行ge。我们将在动态调用前后设置 1 小时 window。
方法: POST
Header: Content-Type:application/json
Body: {"lastUpdatedAfter":getPastTime(1, 'Hour'),"lastUpdatedBefore":getFutureTime(1, 'Hour')}
身份验证: 如果使用 MSI 集资源:https://management.azure.com/
4. 最后将该错误消息存储在另一个 Array 变量中,您可以从中解析数组并根据需要存储到 SQL sink。
这是它的内容。
{
"name": "ErrorMsg",
"value": [
{
"activityRunEnd": "2021-10-14T07:43:20.1291832Z",
"activityName": "Notebook",
"activityRunStart": "2021-10-14T07:43:18.3867797Z",
"activityType": "DatabricksNotebook",
"durationInMs": 1742,
"retryAttempt": null,
"error": {
"errorCode": "2011",
"message": "Caller was not found on any access policy in this key vault, secretName: databricksclientsecret, secretVersion: , vaultBaseUrl: https://ktestkeyvaults.vault.azure.net/. The error message is: The user, group or application 'name=Microsoft.DataFactory/factories;appid=3ecdccaf-xxxx-xxxx-8818-4f30b45856eb;oid=7ee614a9-xxxx-xxxx-a7cd-fbad1afc715b;iss=https://sts.windows.net/72f988bf-xxxx-41af-91ab-2d7cd011db47/' does not have secrets get permission on key vault 'ktestkeyvaultss;location=eastus'. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287.",
"failureType": "UserError",
"target": "Notebook",
"details": []
},
"activityRunId": "6c9519e1-b646-4d5b-a974-29bef371d7e5",
"iterationHash": "",
"input": {
"notebookPath": "https://adb-7020907718042127.7.azuredatabricks.net/?o=7020907718041127#notebook/171399934287251/command/171399934287255"
},
"linkedServiceName": "",
"output": {
"effectiveIntegrationRuntime": "DefaultIntegrationRuntime (Central US)",
"executionDuration": 0,
"durationInQueue": {
"integrationRuntimeQueue": 1
},
"billingReference": {
"activityType": "ExternalActivity",
"billableDuration": [
{
"meterType": "AzureIR",
"duration": 0.016666666666666666,
"unit": "Hours"
}
]
}
},
"userProperties": {},
"pipelineName": "error2",
"pipelineRunId": "6a717388-516e-46d7-883c-fdcf2d517bd8",
"status": "Failed",
"recoveryStatus": "None",
"integrationRuntimeNames": [
"defaultintegrationruntime"
],
"executionDetails": {
"integrationRuntime": [
{
"name": "DefaultIntegrationRuntime",
"type": "Managed",
"location": "Central US"
}
]
},
"id": "/SUBSCRIPTIONS/B83C2ED3-xxxx-xxxx-xxxx-2B80A074C23F/RESOURCEGROUPS/myrg/PROVIDERS/MICROSOFT.DATAFACTORY/FACTORIES/KTESTADF/pipelineruns/6a717388-516e-46d7-883c-fdcf2d517bd8/activityruns/6c9519e1-b646-4d5b-a974-29bef371d7e5"
}
]
}
我有一条不同的错误消息,您可以类似地找到所需的 URL。