设为首页 收藏本站
查看: 957|回复: 0

[经验分享] Azure虚机磁盘容量警报(邮件提醒)

[复制链接]

尚未签到

发表于 2017-6-30 18:07:09 | 显示全部楼层 |阅读模式
  上周有个客户提出这样的需求:根据虚拟机磁盘的实际使用量,当达到某一阈值时设置邮件提醒。
  在这个需求中我们只需要解决两点问题:


  • 计算虚拟机磁盘实际使用量
  • 发送邮件
  使用VS新建一个名为CalculatePageBlobActualUsage控制台应用程序,使用Nuget搜索“WindowsAzure.Storage”并安装
DSC0000.png

  配置存储账号信息:
DSC0001.png


计算虚机磁盘实际使用量
  虚机磁盘是以Page Blob文件形式存储在Storage中的,而我们付给Azure的存储费用是按实际使用量计算的,而并非是按磁盘大小计算的,那么如何知道我们虚机磁盘的实际使用量?
  通过下面的代码就可以获取到使用量,只需要传入指定的PageBlob。



        private static long GetActualDiskSize(CloudPageBlob pageBlob)
{
pageBlob.FetchAttributes();
return 124 + pageBlob.Name.Length * 2
+ pageBlob.Metadata.Sum(m => m.Key.Length + m.Value.Length + 3)
+ pageBlob.GetPageRanges().Sum(r => 12 + (r.EndOffset - r.StartOffset));
}
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]
public static extern long StrFormatByteSize(long fileSize, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder buffer, int bufferSize);
public static string GetFormattedDiskSize(long size)
{
var sb = new StringBuilder(11);
StrFormatByteSize(size, sb, sb.Capacity);
return sb.ToString();
}
发送邮件
  关于发送邮件本身就没有任何技术难度,我们只需要做一个逻辑判断,假设我们需要当虚机磁盘使用量超过10GB就给用户发送邮件警报。



        private static void SendMail(string toMailAddress, string body, string subject, string path="")
{
SmtpClient smtpClient = new SmtpClient("smtp.qq.com");
smtpClient.EnableSsl = true;
//Credentials登陆SMTP服务器的身份验证
smtpClient.Credentials = new NetworkCredential("username", "password");
MailMessage message = new MailMessage(new MailAddress("from email"), new MailAddress(toMailAddress));
// message.Bcc.Add(new MailAddress("tst@qq.com")); //可以添加多个收件人
message.Body = body;
message.Subject = subject;
if (path != "")
{
Attachment att = new Attachment(@path);
message.Attachments.Add(att);
}
smtpClient.Send(message);
}
根据阈值发送警报邮件



        private static string _storageConnectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
private static string _containerName = ConfigurationManager.AppSettings["ContainerName"];
private static string _vhdName = ConfigurationManager.AppSettings["VHDName"];
static void Main(string[] args)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(_storageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(_containerName);
CloudPageBlob pageBlob = blobContainer.GetPageBlobReference(_vhdName);
long size = GetActualDiskSize(pageBlob);
string actualSize = GetFormattedDiskSize(size);
string toMailAddress = "huzc@nysoftland.com.cn";
string body = "您的虚机磁盘当前实际使用量为" + actualSize;
string subject = "磁盘容量警报";
//阈值为10GB
long threshold = (long)1024 * 1024 * 1024 * 10;
if (size > threshold)
{
//当磁盘实际使用量大于10GB时,发送邮件警告
                SendMail(toMailAddress, body, subject);
}
Console.ReadKey();
}
收到警报邮件
  如下图所示,我们已经收到了警报邮件
DSC0002.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389731-1-1.html 上篇帖子: 超大文件上传到Azure Linux虚拟机最佳实践 下篇帖子: DW(四):Azure域控服务器配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表