Azure容器实例成功/失败时的电子邮件警报/日志

时间:2019-12-06 18:51:49

标签: azure azure-container-instances

是否有任何方法可以为单个Azure容器实例成功或失败(或基本上更改状态)设置电子邮件警报?我有一些定期启动的一次性容器,希望它们完成时得到通知,并告知完成状态。如果电子邮件中也可以包含来自容器的日志,则将获得奖励。使用内置警报是否可以实现?

到目前为止,我还无法使其与所提供的信号一起使用。

1 个答案:

答案 0 :(得分:0)

不要相信有一种自动方式,所以我做了一个基于计时器的小型函数,该函数每5分钟运行一次,并获取所有容器的列表并检查状态。如果任何状态为失败,则使用SendGrid发送警报电子邮件。

Dan的更新

我在函数中使用托管服务标识,所以我有一个类似于以下的容器任务类,不记得确切地在哪里得到了生成GetAzure函数的帮助,因为在进行本地调试时显然不能使用MSI凭据和应在Visual Studio上正常工作的本地帐户似乎没有。但是我认为可能是在这里-https://github.com/Azure/azure-sdk-for-net/issues/4968

public static class ContainerTasks
{
    private static readonly IAzure azure = GetAzure();

    private static IAzure GetAzure()
    {
        var tenantId = Environment.GetEnvironmentVariable("DevLocalDbgTenantId");
        var clientId = Environment.GetEnvironmentVariable("DevLocalDbgClientId");
        var clientSecret = Environment.GetEnvironmentVariable("DevLocalDbgClientSecret");
        AzureCredentials credentials;

        if (!string.IsNullOrEmpty(tenantId) &&
            !string.IsNullOrEmpty(clientId) &&
            !string.IsNullOrEmpty(clientSecret))
        {
            var sp = new ServicePrincipalLoginInformation
            {
                ClientId = clientId,
                ClientSecret = clientSecret
            };
            credentials = new AzureCredentials(sp, tenantId, AzureEnvironment.AzureGlobalCloud);
        }
        else
        {
            credentials = SdkContext
                .AzureCredentialsFactory
                .FromMSI(new MSILoginInformation(MSIResourceType.AppService), AzureEnvironment.AzureGlobalCloud);
        }
        var authenticatedAzure = Azure
            .Configure()
            .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
            .Authenticate(credentials);
        var subscriptionId = Environment.GetEnvironmentVariable("DevLocalDbgSubscriptionId");
        if (!string.IsNullOrEmpty(subscriptionId))
            return authenticatedAzure.WithSubscription(subscriptionId);
        return authenticatedAzure.WithDefaultSubscription();
    }

    public static IEnumerable<IContainerGroup> ListTaskContainers(string resourceGroupName, ILogger log)
    {
        log.LogInformation($"Getting a list of all container groups in Resource Group '{resourceGroupName}'");

        return azure.ContainerGroups.ListByResourceGroup(resourceGroupName);
    }
}

然后我的监视功能就是

public static class MonitorACIs
{
    [FunctionName("MonitorACIs")]
    public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"MonitorACIs Timer trigger function executed at: {DateTime.Now}");
        foreach(var containerGroup in ContainerTasks.ListTaskContainers(Environment.GetEnvironmentVariable("ResourceGroupName"), log))
        {
            if(String.Equals(containerGroup.State, "Failed"))
            {
                log.LogInformation($"Container Group {containerGroup.Name} has failed please investigate");
                Notifications.FailedTaskACI(containerGroup.Name, log);
            }
        }
    }
}

Notifications.FailedTaskACI只是一种将电子邮件发送到我们的团队渠道之一的类方法

这并不完美,但目前可以完成工作!