在长时间运行的蔚蓝数据工厂管道上发出警报的方法

时间:2019-11-28 08:58:28

标签: azure-data-factory-2 azure-log-analytics azure-monitoring

我有一些数据工厂管道,当将数据从blob复制到SQL时,有时可能会运行2个小时以上。时间段是可变的,但是当任何管道运行时间超过2小时时,我希望得到通知/提醒。

有什么可能的方法?

到目前为止,我已经尝试过:

  • 探讨了可用于设置警报规则的adf指标。但是似乎没有人谈论主动跑步的持续时间。
  • 我希望获得在adf.azure.com的“监视器”选项卡上看到的Pipeline的持续时间值,并以此来发出某种警报。
  • 我还在想,如果我可以获得管道的开始时间,那么也许我可以从当前时间开始计算总运行时间,并在此之上发出一些警报。

enter image description here

2 个答案:

答案 0 :(得分:2)

我们这样做是为了跟踪正在运行的管道并管理执行并发。我发现Logic Apps和Azure Functions是创建此类解决方案的绝佳工具。这是我们如何处理此问题的粗略概述:

  1. 一组利用以下功能的Azure功能(AF): Microsoft.Azure.Management.DataFactory SDK。相关代码在本文的底部。
  2. SQL Server表中管道执行的日志。该表包括PipelineId 和状态,以及其他一些信息。每当您创建管道时,您都需要向该表插入。我们使用单独的逻辑应用程序,该逻辑应用程序在下面的代码中使用“ RunPipelineAsync”方法调用AF以执行管道,捕获新的PipelineId(RunId),并将其发送到存储过程以记录PipelineId。
  3. 在重复触发(每3分钟)上运行的Logic App a)调用一个存储过程,该存储过程轮询表(上面的#2),并返回所有状态为“ InProgress”的管道; b)遍历返回的列表,并调用以下代码中的“ GetPipelineInfoAsync”方法调用AF(上面的#1)来检查管道的当前状态; 和 c)调用另一个存储过程来更新表中的状态。

您可以执行类似的操作,并使用“ DurationInMS”根据状态=“进行中”和总运行时间> {所需警报阈值}来生成适当的操作。

这是我使用的DataFactoryHelper类:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest;
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.Azure.Management.DataFactory;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace AzureUtilities.DataFactory
{
    public class DataFactoryHelper
    {
        private ClientCredential Credentials { get; set; }
        private string KeyVaultUrl { get; set; }
        private string TenantId { get; set; }
        private string SubscriptionId { get; set; }

        private DataFactoryManagementClient _client = null;
        private DataFactoryManagementClient Client
        {
            get {
                if (_client == null)
                {
                    var context = new AuthenticationContext("https://login.windows.net/" + TenantId);
                    AuthenticationResult result = context.AcquireTokenAsync("https://management.azure.com/", Credentials).Result;
                    ServiceClientCredentials cred = new TokenCredentials(result.AccessToken);
                    _client = new DataFactoryManagementClient(cred) { SubscriptionId = SubscriptionId };
                }

                return _client;
            }
        }

        public DataFactoryHelper(string servicePrincipalId, string servicePrincipalKey, string tenantId, string subscriptionId)
        {
            Credentials = new ClientCredential(servicePrincipalId, servicePrincipalKey);
            TenantId = tenantId;
            SubscriptionId = subscriptionId;
        }

        public async Task<string> RunPipelineAsync(string resourceGroupName,
                                                   string dataFactoryName,
                                                   string pipelineName,
                                                   Dictionary<string, object> parameters = null,
                                                   Dictionary<string, List<string>> customHeaders = null)
        {
            var runResponse = await Client.Pipelines.CreateRunWithHttpMessagesAsync(resourceGroupName, dataFactoryName, pipelineName, parameters: parameters , customHeaders: customHeaders);
            return runResponse.Body.RunId;
        }

        public async Task<object> GetPipelineInfoAsync(string resourceGroup, string dataFactory, string runId)
        {
            var info = await Client.PipelineRuns.GetAsync(resourceGroup, dataFactory, runId);
            return new
            {
                RunId = info.RunId,
                PipelineName = info.PipelineName,
                InvokedBy = info.InvokedBy.Name,
                LastUpdated = info.LastUpdated,
                RunStart = info.RunStart,
                RunEnd = info.RunEnd,
                DurationInMs = info.DurationInMs,
                Status = info.Status,
                Message = info.Message
            };
        }
    }
}

答案 1 :(得分:1)

一种变通方法是在管道中作为第一步在SQL数据库中记录时间戳,然后通过监视数据库引擎中的会话来跟踪负载。