我正在尝试从 Azure WadPerformanceCountersTable 查询数据。
我正在尝试获取最后 5 分钟的数据。
问题是我只从实例 nr 中获取数据。4,5 和 6,但不是从 0,1,2 和 3。
我用来提取数据的脚本是这样的:
Microsoft.WindowsAzure.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.CloudStorageAccount.Parse(AppDefs.CloudStorageAccountConnectionString);
CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient();
TableServiceContext serviceContext = cloudTableClient.GetDataServiceContext();
IQueryable<PerformanceCountersEntity> traceLogsTable = serviceContext.CreateQuery<PerformanceCountersEntity>("WADPerformanceCountersTable");
var selection = from row in traceLogsTable
where row.PartitionKey.CompareTo("0" + DateTime.UtcNow.AddMinutes(-timespanInMinutes).Ticks) >= 0
&& row.DeploymentId == deploymentId
&& row.CounterName == @"\Processor(_Total)\% Processor Time"
select row;
CloudTableQuery<PerformanceCountersEntity> query = selection.AsTableServiceQuery<PerformanceCountersEntity>();
IEnumerable<PerformanceCountersEntity> result = query.Execute();
return result;
我的 diagnostics.wadcfg 文件是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<DiagnosticMonitorConfiguration xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration" configurationChangePollInterval="PT1M" overallQuotaInMB="4096">
<PerformanceCounters bufferQuotaInMB="0" scheduledTransferPeriod="PT5M">
<PerformanceCounterConfiguration counterSpecifier="\Memory\Available Bytes" sampleRate="PT60S" />
<PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT60S" />
</PerformanceCounters>
</DiagnosticMonitorConfiguration>
编辑:另外,我在天蓝色的测试环境中部署了这段代码,它工作得很好。
编辑 2:更新以包括服务定义 XML:
<ServiceDefinition name="MyApp.Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-05.1.7">
<WebRole name="MyApp.Website" vmsize="ExtraSmall">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
<WorkerRole name="MyApp.Cache" vmsize="ExtraSmall">
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="Caching" />
</Imports>
<LocalResources>
<LocalStorage name="Microsoft.WindowsAzure.Plugins.Caching.FileStore" sizeInMB="1000" cleanOnRoleRecycle="false" />
</LocalResources>
</WorkerRole>
</ServiceDefinition>
在我阅读了用户 @Igorek 的答案后,我已经包含了我的 ServiceDefinition.csdef 配置 XML。我仍然不知道我必须如何配置配置的 LocalResources > LocalStorage 部分。必须为“MyApp.Website”设置配置。
编辑 3:我对测试 azure 帐户进行了这些更改。
我在 ServiceDefinitions.csdef 中设置了这个
<LocalResources>
<LocalStorage name="DiagnosticStore" sizeInMB="4096" cleanOnRoleRecycle="false"/>
</LocalResources>
我已经降低了 diagnostics.wadcfg 中的OverallQuota 和 BufferQuota 最后,在 WAD-control-container 中,每个实例都有这个配置:http: //pastebin.com/aUywLUfE
我必须把它放在真实账户上才能看到结果。
最终编辑:显然,整体配额是问题所在,尽管我不能保证。
最后,在新发布后,我注意到了这一点:
- 角色实例的配置 XML
wad-control-container
为1024MB,BufferQuotaInMB 为overall quota
1024MB -- > 这是正确的, - 另外 2 个角色实例的总配额为4080MB,BufferQuotaInMB 为500MB --> 这是不正确的,它们没有写入 WADPerformanceCounters 表。
wad-control-container
属于每个角色实例的两个 XML 配置文件(位于 中)在新发布之前都已删除。- 配置文件
diagnostics.wadcfg
配置正确:1024MBeverywere
所以我认为他们的出版商有问题。
尝试了两种解决方案:
我从“wad-control-container”中删除了 1 个不正确的 XML 并重新启动了机器。XML 被重写,角色实例开始写入 WADPerfCountTable。
我在另一个不正确的实例上使用了下面的脚本,并且不正确的角色实例开始写入 WADPerfCountTable。
var storageAccount = CloudStorageAccount.Parse(AppDefs.CloudStorageAccountConnectionString); DeploymentDiagnosticManager diagManager = new DeploymentDiagnosticManager(storageAccount, deploymentId); IEnumerable<RoleInstanceDiagnosticManager> instanceManagers = diagManager.GetRoleInstanceDiagnosticManagersForRole(roleName); foreach (var roleInstance in instanceManagers) { DiagnosticMonitorConfiguration currentConfiguration = roleInstance.GetCurrentConfiguration(); TimeSpan configurationChangePollInterval = TimeSpan.FromSeconds(60); if (!IsCurrentConfigurationCorrect(currentConfiguration, overallQuotaInMb, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1))) { // Add a performance counter for processor time. PerformanceCounterConfiguration pccCPU = new PerformanceCounterConfiguration(); pccCPU.CounterSpecifier = @"\Processor(_Total)\% Processor Time"; pccCPU.SampleRate = TimeSpan.FromSeconds(60); // Add a performance counter for available memory. PerformanceCounterConfiguration pccMemory = new PerformanceCounterConfiguration(); pccMemory.CounterSpecifier = @"\Memory\Available Bytes"; pccMemory.SampleRate = TimeSpan.FromSeconds(60); currentConfiguration.ConfigurationChangePollInterval = TimeSpan.FromSeconds(60); currentConfiguration.OverallQuotaInMB = overallQuotaInMb; currentConfiguration.PerformanceCounters.BufferQuotaInMB = overallQuotaInMb; currentConfiguration.PerformanceCounters.DataSources.Add(pccCPU); currentConfiguration.PerformanceCounters.DataSources.Add(pccMemory); roleInstance.SetCurrentConfiguration(currentConfiguration); } }
此外,我不时收到此错误The configuration file is missing a diagnostic connection string for one or more roles
。
最后我会选择当前的响应作为答案,因为我找到了问题所在。不幸的是,我还没有找到问题的原因。在每次发布时,我都会冒更改配置 XML 的风险。