Azure的DiagnosticMonitorConfiguration的生命周期是多少?

时间:2012-10-30 09:26:00

标签: azure azure-diagnostics

在我尝试清除DiagnosticMonitorConfiguration时,我尝试了以下内容:

  • 电源循环(仅)webrole实例
  • 重新启动IIS应用程序池(通过RDP => IIS管理器)
  • 重新部署了网络角色
  • 修改了global.asax代码=>重新部署

但我仍然在DiagnosticMonitorConfiguration的目录数据源中看到DirectoryConfiguration成员的额外副本。每当IIS线程退役(空闲时间为20分钟)时调用global.asax的Application_Start()时,会意外添加这些额外的副本。我已经复制粘贴了BUGGY代码,显示了它们的添加方式(最终我得到了OverallQuotaInMB is 150MB but sum of requested sub-quotas is 850MB之类的异常。)

问题 :我理解为什么会有重复。但是,尽管尝试了上述项目符号列表中的操作,为什么DiagnosticMonitorConfiguration不会被清除?究竟是什么状态被坚持下去?我只能认为它必须是Azure表或Azure SQL - 但这只是猜测。

// called from global.asax's Application_Start()
    public bool Initialize()
    {

        RoleInstanceDiagnosticManager roleInstanceDiagnosticManager = getRoleInstanceDiagnosticManager();
        config = roleInstanceDiagnosticManager.GetCurrentConfiguration();

        if (config == null) 
            config = DiagnosticMonitor.GetDefaultInitialConfiguration();


        LocalResource localResource = RoleEnvironment.GetLocalResource("MyAppLogFolder");
        DirectoryConfiguration dirConfig = new DirectoryConfiguration();
        dirConfig.Container = "myapplog-blob";
        dirConfig.DirectoryQuotaInMB = localResource.MaximumSizeInMegabytes;
        dirConfig.Path = localResource.RootPath;

        // This is a BUG, keeps adding duplicate entries
        config.Directories.DataSources.Add(dirConfig);

        limitOtherDefaultDirSizes(config); // limits overall quota to 150MB
        config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(10.0);

        roleInstanceDiagnosticManager.SetCurrentConfiguration(config); 

        return true;
    }

远程调试显示DiagnosticMonitorConfiguration数据结构如下所示。你可以在这里清楚地看到重复,保证例外。

- config    {Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorConfiguration}
-  Directories  {Microsoft.WindowsAzure.Diagnostics.DirectoriesBufferConfiguration}
-    DataSources Count = 85 System.Collections.Generic.IList<Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration> 
+     [0] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
+     [1] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
+     [2] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
-     [3] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
        Container   "myapplog-blob" string
        DirectoryQuotaInMB  10  int
        Path    "C:\\Resources\\directory\\73c8a6bf9a5e434ab3d0c44034e7b7e9.MyAPP.API.MyAppLogFolder\\" string
-     [4] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}   
        Container   "myapplog-blob" string
        DirectoryQuotaInMB  10  int
        Path    "C:\\Resources\\directory\\73c8a6bf9a5e434ab3d0c44034e7b7e9.MyAPP.API.MyAppLogFolder\\" string
+     [5] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}   
...
+     [84] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}

1 个答案:

答案 0 :(得分:5)

请查看MSDN上的以下文章:Overview of Windows Azure Diagnostics

  

在实施Windows Azure时,您应该考虑以下事项   诊断:

     
      
  • 配置信息存储在Windows Azure blob存储下的XML文件中   的 / WAD-控制容器/ deploymentID /角色名/ roleinstance
  •   

配置保存在当前部署的blob存储中的XML文件中。在您的代码中,您正在调用GetCurrentConfiguration,它将加载此XML文件。然后你会一遍又一遍地追加目录(这意味着每个回收都会尝试将目录添加到当前配置中)。

当您尝试远程修改设置时,

GetCurrentConfiguration非常棒(例如:您希望在部署应用程序后添加一些性能计数器)。如果你总是打电话给 GetDefaultInitialConfiguration(); ,你将从干净的名单开始。

PS:尝试将此代码放在WebRole.cs中,这样它只会在您的实例启动时执行一次,而不会在每次启动时减慢应用程序池的速度。