有啥方法可以为 Azure App Service 的磁盘空间不足设置警报

Posted

技术标签:

【中文标题】有啥方法可以为 Azure App Service 的磁盘空间不足设置警报【英文标题】:Is there any way to set up an alert on low disk space for Azure App Service有什么方法可以为 Azure App Service 的磁盘空间不足设置警报 【发布时间】:2017-11-02 09:10:34 【问题描述】:

我在标准应用服务计划上运行 Azure 应用服务,该计划允许使用最多 50 GB 的文件存储。该应用程序为图像缓存使用了相当多的磁盘空间。目前消耗水平在 15 GB 左右,但如果缓存清理策略由于某种原因失败,它会很快增长到顶部。

垂直自动缩放(向上扩展)不是一种常见的做法,因为根据这篇 Microsoft 文章,它通常需要一些服务停机时间:

https://docs.microsoft.com/en-us/azure/architecture/best-practices/auto-scaling

所以问题是:

有没有办法为 Azure App Service 设置磁盘空间不足的警报?

我在“警报”选项卡下的可用选项中找不到与磁盘空间相关的任何内容。

【问题讨论】:

有什么更新吗?如果您觉得我的回答有用/有帮助。请将其标记为答案,以便其他人可以从中受益。 @BrandoZhang-MSFT 即使我没有将其标记为答案,每个人都可以从您的帖子中受益。这很有帮助,但该解决方案并不真正适合我当前的需求,因为实施/维护的复杂性超过了所获得的好处。 【参考方案1】:

有没有办法为 Azure 应用服务设置磁盘空间不足的警报? 我在“警报”选项卡下的可用选项中找不到与磁盘空间相关的任何内容。

据我所知,alter 选项卡不包含网络应用程序的配额选择。所以我建议你可以编写自己的逻辑来为 Azure 应用服务设置磁盘空间不足的警报。

您可以使用 azure web 应用的 webjobs 运行后台任务来检查您的 web 应用的使用情况。

我建议您可以使用 webjob timertrigger(您需要从 nuget 安装 webjobs 扩展)来运行计划作业。然后,您可以向 azure management api 发送一个休息请求,以获取您的 Web 应用程序的当前使用情况。您可以根据您的网络应用当前使用情况发送电子邮件或其他内容。

更多细节,你可以参考下面的代码示例:

注意:如果要使用 rest api 获取当前 web 应用程序的使用情况,首先需要创建一个 Azure Active Directory 应用程序和服务主体。生成服务主体后,您可以获得应用程序ID、访问密钥和人才ID。更多细节,你可以参考这个article。

代码:

 // Runs once every 5 minutes
    public static void CronJob([TimerTrigger("0 */5 * * * *" ,UseMonitor =true)] TimerInfo timer,TextWriter log)
    
        if (GetCurrentUsage() > 25)
        
            // Here you could write your own code to do something when the file exceed the 25GB
            log.WriteLine("fired");
        

    

    private static double GetCurrentUsage()
    
        double currentusage = 0;

        string tenantId = "yourtenantId";
        string clientId = "yourapplicationid";
        string clientSecret = "yourkey";
        string subscription = "subscriptionid";
        string resourcegroup = "resourcegroupbane";
        string webapp = "webappname";
        string apiversion = "2015-08-01";
        string authContextURL = "https://login.windows.net/" + tenantId;
        var authenticationContext = new AuthenticationContext(authContextURL);
        var credential = new ClientCredential(clientId, clientSecret);
        var result = authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/", clientCredential: credential).Result;
        if (result == null)
        
            throw new InvalidOperationException("Failed to obtain the JWT token");
        
        string token = result.AccessToken;
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/0/resourceGroups/1/providers/Microsoft.Web/sites/2/usages?api-version=3", subscription, resourcegroup, webapp, apiversion));
        request.Method = "GET";
        request.Headers["Authorization"] = "Bearer " + token;
        request.ContentType = "application/json";

        //Get the response
        var httpResponse = (HttpWebResponse)request.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        
            string jsonResponse = streamReader.ReadToEnd();
            dynamic ob = JsonConvert.DeserializeObject(jsonResponse);
            dynamic re = ob.value.Children();

            foreach (var item in re)
            
                if (item.name.value == "FileSystemStorage")
                
                     currentusage = (double)item.currentValue / 1024 / 1024 / 1024;

                
            
        

        return currentusage;
    

结果:

【讨论】:

以上是关于有啥方法可以为 Azure App Service 的磁盘空间不足设置警报的主要内容,如果未能解决你的问题,请参考以下文章

Python app in Azure App Service on Linux初探

Azure Service Fabric 中的 NodeType 和 ScaleSet 有啥区别

Azure Web App Socket Number 有啥限制?

【Azure API 管理】APIM不能连接到 App Service (APIM cannot connect to APP service)

Azure App Service 存在于子目录中时,如何设置其默认文档?

Azure App Service 共享托管中断容器启动