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

[经验分享] [博客迁移]探索Windows Azure 监控和自动伸缩系列2

[复制链接]

尚未签到

发表于 2017-6-30 19:45:24 | 显示全部楼层 |阅读模式
  上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html
  本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据。
  有人会问,Azure Portal上已经有了监控数据,通过代码获取有意思吗?我们计划基于性能计数器的监控数据来实现应用的自动伸缩,因此可以获取到监控指标定义和监控数据应该是第一步。
  在Azure的管理Portal中我们可以看到虚拟机的监控数据,目前,提供的主要有以下监控指标:
  CPU Percentage;Disk Read; Disk Write; Network in;NetWork Out。
  Azure中监控的Nuget主要是这个:Microsoft Azure Management Libraries
  核心的几个namespace有:
DSC0000.png

  我们本篇用的是Metric这个命名空间,核心类MetricClient:



namespace AzureTest
{
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Management.Monitoring.Metrics;
using Microsoft.WindowsAzure.Management.Monitoring.Metrics.Models;
using Microsoft.WindowsAzure.Management.Monitoring.Utilities;
/// <summary>
/// 监控客户端
/// </summary>
class MonitorClient
{
private SubscriptionCloudCredentials credentials;
public MonitorClient(SubscriptionCloudCredentials credentials)
{
this.credentials = credentials;
}
/// <summary>
/// 获取所有的监控指标
/// </summary>
public void GetMetricDefinitions()
{
var metricsClient = new MetricsClient(credentials);
// Build the resource ID string.
var resourceId = ResourceIdBuilder.BuildVirtualMachineResourceId("cloudServiceName", "deploymentName");
Console.WriteLine("Resource Id: {0}", resourceId);
//Get the metric definitions.
var metricListResponse=
metricsClient.MetricDefinitions.List(resourceId, null, null);34
MetricDefinitionCollection metricDefinitions = metricListResponse.MetricDefinitionCollection;           
// Display the metric definitions.
int count = 0;
foreach (MetricDefinition metricDefinition in metricDefinitions.Value)
{
Console.WriteLine("MetricDefinitio: " + count++);
Console.WriteLine("Display Name: " + metricDefinition.DisplayName);
Console.WriteLine("Metric Name: " + metricDefinition.Name);               
Console.WriteLine("Metric Namespace: " + metricDefinition.Namespace);               
Console.WriteLine("Is Altertable: " + metricDefinition.IsAlertable);
Console.WriteLine("Min. Altertable Time Window: " + metricDefinition.MinimumAlertableTimeWindow);
Console.WriteLine();
}
}
}
}
  使用上一篇我们的Azure 凭据验证器,获取一个令牌凭据TokenCloudCredentials,然后构造一个MonitorClient,获取指定虚拟机的监控数据。



static void Main(string[] args)
{            
var credential = Authorizator.GetCredentials();
var client = new MonitorClient(credential);
client.GetMetricDefinitions();
Console.ReadLine();
}
  第一块代码中:
  var resourceId = ResourceIdBuilder.BuildVirtualMachineResourceId("cloudServiceName", "deploymentName");
  这个地方通ResourceIDBuilder获取虚拟机的资源ID,对应的参数分别为:cloudServiceName和deploymentName,第一个是虚拟机使用的云服务名称,第二个是虚拟机名称即可。
  Run...
  出错了:
  {"ForbiddenError: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription."}
  一番Google后未果,咋整,再分析下错误信息:
DSC0001.png

  可以看到,请求的Uri:
  {https://management.core.windows.net/37*****-5107-*****-*******6/services/monitoring/metricdefinitions/query?&resourceId=%2Fhostedservices%2Fteldptapp%2Fdeployments%2Fteldptapp}
  请求又跑到Azure Global那去了。
  这个错误困扰了好久,还在StackOverflow上发了英文咨询贴,不知道洋人们如何回答了。在此多谢鞠强老大的指导,想办法将请求的Uri定位到中国区的Azure。
  重新分析了代码,找到了Monitor的构造函数中,可以指定Uri,将中国区Azure的Uri指定一下:https://management.core.chinacloudapi.cn



MetricsClient metricsClient = new MetricsClient(credentials, new Uri("https://management.core.chinacloudapi.cn/"));
  测试通过,ok。
  获取到了监控指标定义,接下来我们获取监控数据:



namespace AzureTest
{
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Management.Monitoring.Metrics;
using Microsoft.WindowsAzure.Management.Monitoring.Metrics.Models;
using Microsoft.WindowsAzure.Management.Monitoring.Utilities;
/// <summary>
/// 监控客户端
/// </summary>
class MonitorClient
{
private SubscriptionCloudCredentials credentials;
public MonitorClient(SubscriptionCloudCredentials credentials)
{
this.credentials = credentials;
}
/// <summary>
/// 获取所有的监控指标数据
/// </summary>
public void GetMetricData()
{
var metricsClient = new MetricsClient(credentials, new Uri("https://management.core.chinacloudapi.cn/"));
// Build the resource ID string.
var resourceId = ResourceIdBuilder.BuildVirtualMachineResourceId("cloudServiceName", "deploymentName");
Console.WriteLine("Resource Id: {0}", resourceId);
//Get the metric definitions.
var metricListResponse = metricsClient.MetricDefinitions.List(resourceId, null, null);
MetricDefinitionCollection metricDefinitions = metricListResponse.MetricDefinitionCollection;
var metricNamespace = "";
var metricNames = new List<string>();
// Display the metric definitions.
int count = 0;
foreach (MetricDefinition metricDefinition in metricDefinitions.Value)
{
Console.WriteLine("MetricDefinitio: " + count++);
Console.WriteLine("Display Name: " + metricDefinition.DisplayName);
Console.WriteLine("Metric Name: " + metricDefinition.Name);
if (!metricNames.Contains(metricDefinition.Name))
metricNames.Add(metricDefinition.Name);
Console.WriteLine("Metric Namespace: " + metricDefinition.Namespace);
metricNamespace = metricDefinition.Namespace;
Console.WriteLine("Is Altertable: " + metricDefinition.IsAlertable);
Console.WriteLine("Min. Altertable Time Window: " + metricDefinition.MinimumAlertableTimeWindow);
Console.WriteLine();
}
// timeGrain must be 5, 60 or 720 minutes.
TimeSpan timeGrain = TimeSpan.FromMinutes(5);
DateTime startTime = DateTime.UtcNow.AddHours(-1);
DateTime endTime = DateTime.UtcNow;
MetricValueListResponse response = metricsClient.MetricValues.List(resourceId, metricNames, metricNamespace, timeGrain, startTime, endTime);
foreach (MetricValueSet value in response.MetricValueSetCollection.Value)
{
String valueName = value.Name;
Console.WriteLine("MetricValue:{0}", valueName);
foreach (MetricValue metricValue in value.MetricValues)
{
Console.WriteLine("Maximum:{0}{1}", metricValue.Maximum, value.Unit);
Console.WriteLine("Average:{0}{1}", metricValue.Average, value.Unit);
Console.WriteLine("Minimum:{0}{1}", metricValue.Minimum, value.Unit);
}
}
}
}
}
  Run...
  程序在metricsClient.MetricValues.List(resourceId, metricNames, metricNamespace, timeGrain, startTime, endTime);
  出错了:
Additional information: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">{"Code":"InvalidRequest","Message":"Could not retrieve metrics."}</string>
  为啥不能获取监控指标呢?
  这个错误,Google一番依旧未果,咨询了微软的技术工程师,给了如下指导,resouceID必须执行RoleName:



var resourceId = ResourceIdBuilder.BuildVirtualMachineResourceId("cloudService", "deploymentName", "roleName");
  修改之后,问题解决。
  至此,我们已经可以获取到监控指标和监控数据,下一步我们要获取自定义的性能计数器,基于自定义的性能计数器来实现自动伸缩。
  周国庆
  2016/3

运维网声明 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-389798-1-1.html 上篇帖子: 在微服务系统开发部署中使用Azure RBAC自定义角色 下篇帖子: Windows Azure 故障转移模式及高可用个模式探讨!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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