我在标准应用服务计划上运行Azure应用服务,允许使用最多50 GB的文件存储空间。该应用程序使用相当多的磁盘空间进行图像缓存。目前消费水平约为15 GB,但如果缓存清理策略由于某种原因失败,它将非常快速地增长到顶部。
垂直自动缩放(按比例放大)并不常见,因为根据Microsoft的这篇文章,它通常需要一些服务停机时间:
https://docs.microsoft.com/en-us/azure/architecture/best-practices/auto-scaling
所以问题是:
有没有办法在Azure App Service的磁盘空间不足的情况下设置警报?
我在“提醒”标签下的选项中找不到与磁盘空间相关的任何内容。
答案 0 :(得分:1)
有没有办法在Azure App Service的磁盘空间不足的情况下设置警报? 我在“警报”选项卡下的可用选项中找不到与磁盘空间相关的任何内容。
据我所知,alter选项卡不包含Web应用程序的配额选择。因此,我建议您编写自己的逻辑,以便在Azure App Service的低磁盘空间上设置警报。
您可以使用azure web app的webjobs来运行后台任务来检查您的网络应用的使用情况。
我建议您使用webjob timertrigger(您需要从nuget安装webjobs扩展程序)来运行预定作业。然后,您可以向Azure管理API发送休息请求,以使您的Web应用程序当前使用。您可以根据您的网络应用当前使用情况发送电子邮件或其他内容。
更多细节,您可以参考下面的代码示例:
注意:如果要使用rest api来获取当前Web应用程序的使用情况,首先需要创建Azure Active Directory应用程序和服务主体。生成服务主体后,您可以获取applicationid,访问密钥和talentid。更多细节,您可以参考此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;
}