从0到3的Azure实例不在WadPerformanceCountersTable中写入诊断数据

时间:2013-06-10 09:57:48

标签: c# azure azure-diagnostics

我正在尝试从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>

编辑:此外,我已将此代码部署在azure的测试环境中,并且工作正常。

编辑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&gt; 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

我必须将其放在真实账户上以查看结果。

最终编辑:显然整个配额都是问题,即使我无法保证。

最后,在新发布后我注意到了这一点:

  • 一个角色实例在wad-control-container中配置了XML,overall quota 1024MB ,BufferQuotaInMB 1024MB - &gt;这是对的,
  • 另外两个角色实例的总配额 4080MB ,BufferQuotaInMB 500MB - &gt;这是不正确的,他们没有写在WADPerformanceCounters表中。
  • 在新发布之前删除了属于每个角色实例的两个XML配置文件(位于wad-control-container中)。
  • 配置文件diagnostics.wadcfg配置正确: 1024MB everywere

所以我认为他们的出版商存在问题。

尝试了两种解决方案:

  1. 已删除来自'wad-control-container'的1个不正确的XML并重启了该计算机。 XML已被重写,角色实例开始在WADPerfCountTable中写入。

  2. 我在另一个不正确的实例上使用了下面的脚本,并且错误的角色实例开始在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);
                }
    
            }
    
  3. 另外,我会不时收到此错误The configuration file is missing a diagnostic connection string for one or more roles

    最后,我将选择当前的响应作为答案,因为我发现了问题。不幸的是,我还没有找到问题的原因。在每次发布时,我都有可能获得更改的配置XML。

1 个答案:

答案 0 :(得分:3)

在后面的实例中看到您的第一个实例如何不将数据传输到诊断程序,一个可能的原因如下:

服务器上的本地诊断存储充满了诊断数据,Azure无法再将数据从本地存储传输到存储。确保在Role配置(在Local Storage下)中分配给DiagnosticStore的空间大于在diagnostics.wadcfg中分配的缓冲区配额量

详细说明: 我亲身经历过许多客户,所以以下是基于Microsoft支持的评论我自己的解释。 Azure Diagnostics API不会根据BufferQuota清除本地存储,直到超出该配额。云项目中的DiagnosticStore默认大小与所有示例中使用的BufferQuota相同(4096)。发生的事情是您的BufferQuota非常接近4096megs但不等于限制,并且您的Diagnostic API不会启动清除过程。同时,您的诊断数据捕获无法再正常运行,因为本地存储几乎已满,Azure主机停止了应用程序写入DiagnosticStore的能力。

您的其他服务器应在其本地存储空间填满后立即停止写入诊断数据。

希望这是有道理的。

编辑我的回复以准确地指出稍后阅读的人的更改:

最简单的方法是降低对指定的OverallQuotaInMb的需求 diagnostics.wadcfg类似于4000(确保所有其他缓冲区组合不超过此数字)

或者,或者另外,可以使用.CSDEF文件中的LocalStorage设置手动指定在VM上分配给诊断存储的空间。此链接显示了如何:http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.diagnostics.diagnosticmonitorconfiguration.overallquotainmb.aspx