Example #1
0
        public async Task <DeploymentDetail> GetDeploymentDetail(int id, string deploymentId)
        {
            var deployment = this.GetDeployments().Result.First(t => t.Id.Equals(id));
            var detail     = new DeploymentDetail
            {
                Id           = id,
                RoleName     = deployment.RoleName,
                DeploymentId = deploymentId
            };
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(_connectionString, deploymentId);
            var instanceIds = deploymentDiagnosticManager.GetRoleInstanceIdsForRole(deployment.RoleName);
            var instances   = new List <DeploymentInstance>();

            foreach (string instanceId in instanceIds)
            {
                var manager = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManager(deployment.RoleName, instanceId);
                var config  = manager.GetCurrentConfiguration();
                instances.Add(new DeploymentInstance
                {
                    Id            = instanceId,
                    Configuration = config
                });
            }
            detail.Instances = instances;
            return(detail);
        }
        private void pushLogs(DataBufferName bufferName, string age)
        {
            if (IsTransferInProgress())
            {
                TransferErrorMessage.Text    = "Another transfer is in progress. Please wait for this transfer to complete before requesting another.";
                TransferErrorMessage.Visible = true;

                return;
            }

            var queueName = "hellofabric-" + Guid.NewGuid().ToString().ToLowerInvariant();

            var manager = new DeploymentDiagnosticManager(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"),
                                                          RoleEnvironment.DeploymentId);

            foreach (var role in manager.GetRoleNames())
            {
                foreach (var instanceManager in manager.GetRoleInstanceDiagnosticManagersForRole(role))
                {
                    var guid = instanceManager.BeginOnDemandTransfer(bufferName, getTransferParameters(age, queueName));
                    System.Diagnostics.Trace.WriteLine(string.Format("data transfer started for role {0}...", role));
                }
            }

            TransferProgressPanel.Visible = true;
            TransferSetupPanel.Visible    = false;
        }
        public async Task<DeploymentDetail> GetDeploymentDetail(int id, string deploymentId)
        {
            var deployment = this.GetDeployments().Result.First(t => t.Id.Equals(id));
            var detail = new DeploymentDetail
            {
                Id = id,
                RoleName = deployment.RoleName,
                DeploymentId = deploymentId
            };
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(_connectionString, deploymentId);
            var instanceIds = deploymentDiagnosticManager.GetRoleInstanceIdsForRole(deployment.RoleName);
            var instances = new List<DeploymentInstance>();
            foreach (string instanceId in instanceIds)
            {

                var manager = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManager(deployment.RoleName, instanceId);
                var config = manager.GetCurrentConfiguration();
                instances.Add(new DeploymentInstance
                {
                    Id = instanceId,
                    Configuration = config
                });

            }
            detail.Instances = instances;
            return detail;
        }
        public String GetConfigurationBlob(String deploymentId, String roleName, String instanceId)
        {
            DeploymentDiagnosticManager deploymentDiagnosticManager = new DeploymentDiagnosticManager(cloudStorageAccount, deploymentId);

            String wadConfigurationBlobNameForInstance = String.Format("{0}/{1}/{2}", deploymentId, roleName, instanceId);
            String wadConfigurationForInstance = GetWadConfigurationForInstance(wadConfigurationBlobNameForInstance);

            return wadConfigurationForInstance;
        }
 public void UpdateAllInstanceDiagnostics(DiagnosticMonitorConfiguration config, string deploymentId, string roleName)
 {
     var deploymentDiagnosticManager = new DeploymentDiagnosticManager(this._connectionString, deploymentId);
     var instances = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManagersForRole(roleName);
     foreach(var instance in instances)
     {
         instance.SetCurrentConfiguration(config);
     }
 }
Example #6
0
        public void UpdateAllInstanceDiagnostics(DiagnosticMonitorConfiguration config, string deploymentId, string roleName)
        {
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(this._connectionString, deploymentId);
            var instances = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManagersForRole(roleName);

            foreach (var instance in instances)
            {
                instance.SetCurrentConfiguration(config);
            }
        }
Example #7
0
        public void UpdateInstanceDiagnostics(DiagnosticMonitorConfiguration config, string deploymentId, string roleName, string instanceName)
        {
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(this._connectionString, deploymentId);
            var instance = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManagersForRole(roleName)
                           .FirstOrDefault(t => t.RoleInstanceId.Equals(instanceName, StringComparison.InvariantCultureIgnoreCase));

            if (instance != null)
            {
                instance.SetCurrentConfiguration(config);
            }
        }
		static void Main()
		{
			var accountName = ConfigurationManager.AppSettings["Cloud Diagnostics Storage Account Name"];
			Console.WriteLine(string.Format("Cloud Diagnostics Storage Account Name: {0}", accountName));
			var accountKey = ConfigurationManager.AppSettings["Cloud Diagnostics Storage Account Key"];
			Console.WriteLine(string.Format("Cloud Diagnostics Storage Account Key: {0}", new string('*', accountKey.Length)));

			var storageCredentialsAccountAndKey = new StorageCredentialsAccountAndKey(accountName, accountKey);
			var storageAccount = new CloudStorageAccount(storageCredentialsAccountAndKey, true);

			Console.WriteLine(string.Format("Deployment ID: "));
			var deploymentID = Console.ReadLine();

			var deploymentDiagnosticManager = new DeploymentDiagnosticManager(storageAccount, deploymentID);

			string roleInstanceName;
			Guid guid;

			var roleNames = deploymentDiagnosticManager.GetRoleNames();
			foreach (var roleName in roleNames)
			{
				Console.WriteLine(string.Format("Role Name: {0}", roleName));

				foreach (var roleInstanceDiagnosticManager in deploymentDiagnosticManager.GetRoleInstanceDiagnosticManagersForRole(roleName))
				{
					roleInstanceName = roleInstanceDiagnosticManager.RoleInstanceId;
					Console.WriteLine(string.Format("Role Instance Name: {0}", roleInstanceName));

					Console.WriteLine("Calling to transfer logs.");
					guid = Transfer(roleInstanceDiagnosticManager, DataBufferName.Logs);
					Console.WriteLine(string.Format("Logs transfer '{0}'", guid));
					Console.WriteLine("Calling to transfer directories.");
					guid = Transfer(roleInstanceDiagnosticManager, DataBufferName.Directories);
					Console.WriteLine(string.Format("Directories transfer '{0}'", guid));
				}
			}

			Console.WriteLine("Hit any key to end...");
			Console.ReadKey();
		}
Example #9
0
        public static void ConfigureDiagnostics(string certificateThumbprint, string subscriptionId, string serviceName, string connectionString, string roleName, int sampleRateInSeconds, int transferPeriodInSeconds, string[] counters)
        {
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connectionString);

            //TODO: Need to remove this if HTTPS is enabled - this allows connecting though http, otherwise the connection will fail.
            DeploymentDiagnosticManager.AllowInsecureRemoteConnections = true;

            //Get the diagnostis manager associated with this blob storage.
            var channel = ServiceManagementHelper.CreateServiceManagementChannel("WindowsAzureEndPoint", GetCertificate(certificateThumbprint));
            var deployment = channel.GetDeploymentBySlot(subscriptionId, serviceName, DeploymentSlot);
            DeploymentDiagnosticManager deploymentDiagnosticsManager = new DeploymentDiagnosticManager(cloudStorageAccount, deployment.PrivateID);

            //Get the Role instance Diagnostics manager for each instance. and use it to enable data collection
            var roleInstanceManagers = deploymentDiagnosticsManager.GetRoleInstanceDiagnosticManagersForRole(roleName);
            RoleInstanceDiagnosticManager.AllowInsecureRemoteConnections = true;
            Trace.WriteLine(string.Format("Getting Diagnostics Managers for Azure Role '{0}'", roleName));

            //Set the new diagnostic monitor configuration for each instance of the role
            foreach (var ridmN in roleInstanceManagers)
            {
                Trace.WriteLine(string.Format("Enabling counters on instance {0} of role {1}", ridmN.RoleInstanceId, ridmN.RoleName));
                EnableCounters(sampleRateInSeconds, transferPeriodInSeconds, counters, ridmN);
            }
        }
        private bool IsTransferInProgress()
        {
            var manager = new DeploymentDiagnosticManager(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"),
                                                          RoleEnvironment.DeploymentId);
            var account     = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"));
            var queueClient = account.CreateCloudQueueClient();

            var result          = false;
            var activeTransfers = new Dictionary <string, List <OnDemandTransferInfo> >();

            foreach (var role in manager.GetRoleNames())
            {
                foreach (var instanceManager in manager.GetRoleInstanceDiagnosticManagersForRole(role))
                {
                    var transfers = instanceManager.GetActiveTransfers();

                    foreach (var transfer in transfers)
                    {
                        if (!activeTransfers.ContainsKey(transfer.Value.NotificationQueueName))
                        {
                            activeTransfers.Add(transfer.Value.NotificationQueueName, new List <OnDemandTransferInfo>());
                        }

                        activeTransfers[transfer.Value.NotificationQueueName].Add(transfer.Value);
                    }
                }
            }

            foreach (var queueTransfersPair in activeTransfers)
            {
                var queue = queueClient.GetQueueReference(queueTransfersPair.Key);

                if (queue.Exists())
                {
                    foreach (var msg in queue.GetMessages(queueTransfersPair.Value.Count))
                    {
                        var info            = OnDemandTransferInfo.FromQueueMessage(msg);
                        var instanceManager = manager.GetRoleInstanceDiagnosticManager(info.RoleName, info.RoleInstanceId);
                        var res             = instanceManager.EndOnDemandTransfer(info.RequestId);
                        System.Diagnostics.Trace.WriteLine(string.Format("data transfer complete for role instance {0}.", info.RoleInstanceId));

                        var pairInfo = queueTransfersPair.Value.Find((value) => value.RequestId == info.RequestId);

                        if (pairInfo != null)
                        {
                            queueTransfersPair.Value.Remove(pairInfo);
                        }

                        queue.DeleteMessage(msg);
                    }
                }

                if (queueTransfersPair.Value.Count != 0)
                {
                    result = true;
                }
                else if (queue.Exists())
                {
                    queue.Delete();
                }
            }

            return(result);
        }
Example #11
0
        public static void RegisterSignalRPerfCounters()
        {
            TimeSpan ts = new TimeSpan(0, 0, 10);

            RoleInstanceDiagnosticManager roleInstanceDiagnosticManager =
                new RoleInstanceDiagnosticManager(
                    RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"),
                    RoleEnvironment.DeploymentId,
                    RoleEnvironment.CurrentRoleInstance.Role.Name,
                    RoleEnvironment.CurrentRoleInstance.Id);

            // Get the current diagnostic monitor for the role.
            var config = roleInstanceDiagnosticManager.GetCurrentConfiguration() ?? DiagnosticMonitor.GetDefaultInitialConfiguration();

            string connectionString = RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
            string deploymentID     = RoleEnvironment.DeploymentId;
            string roleName         = RoleEnvironment.CurrentRoleInstance.Role.Name;

            // Get the DeploymentDiagnosticManager object for your deployment.
            DeploymentDiagnosticManager diagManager = new DeploymentDiagnosticManager(connectionString, deploymentID);

            var signalRCategoryName = createSignalRCategoryName();

            RegisterCounter("Connections Connected", ts, signalRCategoryName, config);
            RegisterCounter("Connections Reconnected", ts, signalRCategoryName, config);
            RegisterCounter("Connections Disconnected", ts, signalRCategoryName, config);
            RegisterCounter("Connections Current", ts, signalRCategoryName, config);
            RegisterCounter("Connection Messages Received Total", ts, signalRCategoryName, config);
            RegisterCounter("Connection Messages Sent Total", ts, signalRCategoryName, config);
            RegisterCounter("Connection Messages Received/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Connection Messages Sent/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Messages Received Total", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Messages Received/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Message Bus Messages Received/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Messages Published Total", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Messages Published/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Subscribers Current", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Subscribers Total", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Subscribers/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Allocated Workers", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Busy Workers", ts, signalRCategoryName, config);
            RegisterCounter("Message Bus Topics Current", ts, signalRCategoryName, config);
            RegisterCounter("Errors: All Total", ts, signalRCategoryName, config);
            RegisterCounter("Errors: All/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Hub Resolution Total", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Hub Resolution/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Hub Invocation Total", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Hub Invocation/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Tranport Total", ts, signalRCategoryName, config);
            RegisterCounter("Errors: Transport/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Streams Total", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Streams Open", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Streams Buffering", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Errors Total", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Errors/Sec", ts, signalRCategoryName, config);
            RegisterCounter("Scaleout Send Queue Length", ts, signalRCategoryName, config);

            // useful for checking that it is not the category name that is issue
            RegisterCounter("Connection Failures", ts, "TCPV6", config);

            // Apply the updated configuration to the diagnostic monitor.
            DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config);
            return;
        }
        private void pushLogs(DataBufferName bufferName, string age)
        {
            if (IsTransferInProgress())
            {
                TransferErrorMessage.Text = "Another transfer is in progress. Please wait for this transfer to complete before requesting another.";
                TransferErrorMessage.Visible = true;

                return;
            }

            var queueName = "hellofabric-" + Guid.NewGuid().ToString().ToLowerInvariant();

            var manager = new DeploymentDiagnosticManager(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"),
                                                           RoleEnvironment.DeploymentId);
            foreach (var role in manager.GetRoleNames())
            {
                foreach (var instanceManager in manager.GetRoleInstanceDiagnosticManagersForRole(role))
                {
                    var guid = instanceManager.BeginOnDemandTransfer(bufferName, getTransferParameters(age, queueName));
                    System.Diagnostics.Trace.WriteLine(string.Format("data transfer started for role {0}...", role));
                }
            }

            TransferProgressPanel.Visible = true;
            TransferSetupPanel.Visible = false;
        }
        private bool IsTransferInProgress()
        {
            var manager = new DeploymentDiagnosticManager(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"),
                RoleEnvironment.DeploymentId);
            var account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"));
            var queueClient = account.CreateCloudQueueClient();

            var result = false;
            var activeTransfers = new Dictionary<string, List<OnDemandTransferInfo>>();

            foreach (var role in manager.GetRoleNames())
            {
                foreach (var instanceManager in manager.GetRoleInstanceDiagnosticManagersForRole(role))
                {
                    var transfers = instanceManager.GetActiveTransfers();

                    foreach (var transfer in transfers)
                    {
                        if (!activeTransfers.ContainsKey(transfer.Value.NotificationQueueName))
                            activeTransfers.Add(transfer.Value.NotificationQueueName, new List<OnDemandTransferInfo>());

                        activeTransfers[transfer.Value.NotificationQueueName].Add(transfer.Value);
                    }
                }
            }

            foreach (var queueTransfersPair in activeTransfers)
            {
                var queue = queueClient.GetQueueReference(queueTransfersPair.Key);

                if (queue.Exists())
                {
                    foreach (var msg in queue.GetMessages(queueTransfersPair.Value.Count))
                    {
                        var info = OnDemandTransferInfo.FromQueueMessage(msg);
                        var instanceManager = manager.GetRoleInstanceDiagnosticManager(info.RoleName, info.RoleInstanceId);
                        var res = instanceManager.EndOnDemandTransfer(info.RequestId);
                        System.Diagnostics.Trace.WriteLine(string.Format("data transfer complete for role instance {0}.", info.RoleInstanceId));

                        var pairInfo = queueTransfersPair.Value.Find((value) => value.RequestId == info.RequestId);

                        if (pairInfo != null)
                            queueTransfersPair.Value.Remove(pairInfo);

                        queue.DeleteMessage(msg);
                    }
                }

                if (queueTransfersPair.Value.Count != 0)
                    result = true;
                else if (queue.Exists())
                    queue.Delete();
            }

            return result;
        }
Example #14
0
        /// <summary>Windows Azure診断(Windows Azure Diagnostics)関連の設定</summary>
        private void ConfigureDiagnostics()
        {
            // Windows Azure診断(Windows Azure Diagnostics)情報出力用のストレージ アカウント取得
            string wadConnectionString = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";

            //// ストレージ アカウントの初期化
            //CloudStorageAccount cloudStorageAccount =
            //  CloudStorageAccount.Parse(
            //    RoleEnvironment.GetConfigurationSettingValue(wadConnectionString));

            //// RoleInstance診断管理の初期化(ロールに対する診断の有効化)
            //RoleInstanceDiagnosticManager roleInstanceDiagnosticManager =
            //  cloudStorageAccount.CreateRoleInstanceDiagnosticManager(
            //    RoleEnvironment.DeploymentId,
            //    RoleEnvironment.CurrentRoleInstance.Role.Name,
            //    RoleEnvironment.CurrentRoleInstance.Id);
            var storageConnectionString = RoleEnvironment.GetConfigurationSettingValue(
                wadConnectionString);
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(
                storageConnectionString,
                RoleEnvironment.DeploymentId);
            RoleInstanceDiagnosticManager roleInstanceDiagnosticManager = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManager(
                RoleEnvironment.CurrentRoleInstance.Role.Name,
                RoleEnvironment.CurrentRoleInstance.Id);

            // RoleInstance診断管理からコンフィグを取得する。
            // ・基本的にはデフォルト設定を利用する。
            // ・RoleEnvironment.Changedイベント ハンドラを仕掛ける場合はカレント設定を利用する。
            DiagnosticMonitorConfiguration config =
                DiagnosticMonitor.GetDefaultInitialConfiguration();

            // roleInstanceDiagnosticManager.GetCurrentConfiguration();

            #region Windows Azure診断(Windows Azure Diagnostics)APIを使用した設定開始

            #region インフラストラクチャ ログ(診断モニタ自体のログ)
            // 転送レベルおよび転送間隔を設定
            config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Undefined;       // 要検討
            config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod         = TimeSpan.FromSeconds(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADDiagnosticInfrastructureLogsTable

            #region イベント ログの設定
            // 取得するイベント ソースを設定
            config.WindowsEventLog.DataSources.Add("Application!*");
            config.WindowsEventLog.DataSources.Add("System!*");
            // 転送レベルおよび転送間隔を設定
            config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Undefined;       // 要検討
            config.WindowsEventLog.ScheduledTransferPeriod         = TimeSpan.FromMinutes(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADWindowsEventLogsTable

            #region パフォーマンス カウンタの転送設定
            // カウンタ、サンプリング レートの指定
            config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration()
            {
                CounterSpecifier = @"\Processor(_Total)\% Processor Time",
                SampleRate       = TimeSpan.FromSeconds(10)
            });
            config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration()
            {
                CounterSpecifier = @"\Memory\Available Bytes",
                SampleRate       = TimeSpan.FromSeconds(10)
            });
            // 転送間隔を設定
            config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADPerformanceCountersTable

            #region クラッシュ ダンプ転送の有効化
            CrashDumps.EnableCollection(true);
            #endregion
            // 出力先のBlobストレージ コンテナ名:wad-crash-dumps

            #region IISログ、FREBログの転送設定(※ web.config への設定も必要)
            // IISログはデフォルトで取得が有効となっているため、Blobへの転送を指定するのみで収集が可能となる。
            // FREB(Failed Request Trace log)ログについてはweb.config への設定も必要
            #endregion
            // 出力先のBlobストレージ コンテナ名:wad-iis-logfiles、wad-iis-failedreqlogfiles

            #region トレース ログの設定(※ *.config への設定も必要)
            // 転送レベルおよび転送間隔を設定
            config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Undefined;      // 要検討
            config.Logs.ScheduledTransferPeriod         = TimeSpan.FromMinutes(1); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADLogsTable

            #region カスタム ログ(ローカル ストレージへの出力の場合)

            // 出力先ディレクトリ設定
            DirectoryConfiguration dirConfig1 = new DirectoryConfiguration()
            {
                // 出力先Blobコンテナの指定
                Container = "my-custom-logfiles1",
                // クォーターの設定(実際に使う量)
                DirectoryQuotaInMB = 100,
            };

            // ローカル ストレージのパスを指定
            //(ローカル ストレージの設定自体は、Visual Studioを使用し*.csdefに設定可能)
            LocalResource ls = RoleEnvironment.GetLocalResource("LogStorage");
            dirConfig1.Path = ls.RootPath;

            // log4netに環境変数経由でパス情報(RootPath)を
            // 渡そうとしたがエミュレータ上でうまく動作せず断念。

            // ローカル ストレージを転送元コレクションに追加
            config.Directories.DataSources.Add(dirConfig1);
            // なお、ローカル ストレージのパスは、LocalResource.RootPathにて取得が可能である。

            #endregion
            // 出力先のBlobストレージ コンテナ名:my-custom-logfiles1

            #region カスタムログ(任意の出力先の場合)

            // 出力先ディレクトリ設定
            DirectoryConfiguration dirConfig2 = new DirectoryConfiguration()
            {
                // 出力先Blobコンテナの指定
                Container = "my-custom-logfiles2",
                // クォーターの設定(実際に使う量)
                DirectoryQuotaInMB = 100,
            };

            // 任意のディレクトリを指定
            string path = "c:\\logs";
            dirConfig2.Path = path;
            // ディレクトリを転送元コレクションに追加
            config.Directories.DataSources.Add(dirConfig2);

            // ディレクトリ セキュリティを取得
            DirectorySecurity ds = Directory.GetAccessControl(path);

            // Everyone FullControlのアクセス ルールの生成
            FileSystemAccessRule AccessRule = new FileSystemAccessRule(
                "Everyone",
                FileSystemRights.FullControl,
                InheritanceFlags.ObjectInherit,
                PropagationFlags.None,
                AccessControlType.Allow);
            // ディレクトリ キュリティにアクセス ルールを追加
            ds.AddAccessRule(AccessRule);

            // ディレクトリにディレクトリ セキュリティを反映
            // ★ <Runtime executionContext="elevated"/>を「*.csdef」に記述。
            Directory.SetAccessControl(path, ds);

            #endregion
            // 出力先のBlobストレージ コンテナ名:my-custom-logfiles2

            // IISログ、カスタム ログ、クラッシュ ダンプなどで
            // 使用するディレクトリ バッファからBlobストレージへの転送間隔の指定
            config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(15);

            #endregion

            // RoleInstance診断管理にコンフィグを設定
            roleInstanceDiagnosticManager.SetCurrentConfiguration(config);

            // 診断の開始(エミュレータでは不要だが、実機では必要
            DiagnosticMonitor.Start(wadConnectionString, config);

            // ローカル ストレージへのログ出力テスト
            path = Path.Combine(ls.RootPath,
                                string.Format("test_{0}.txt", DateTime.Now.ToString("yyyyMMdd")));

            // StreamWriterを開き、ログを出力
            using (StreamWriter sw = new StreamWriter(path, true))
            {
                sw.WriteLine("{0} : {1}", DateTime.UtcNow, "ローカル ストレージへのログ出力テスト");
                sw.Close();
            }
        }
Example #15
0
        /// <summary>Windows Azure診断(Windows Azure Diagnostics)関連の設定</summary>
        private void ConfigureDiagnostics()
        {
            // Windows Azure診断(Windows Azure Diagnostics)情報出力用のストレージ アカウント取得
            string wadConnectionString = "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString";

            //// ストレージ アカウントの初期化
            //CloudStorageAccount cloudStorageAccount =
            //  CloudStorageAccount.Parse(
            //    RoleEnvironment.GetConfigurationSettingValue(wadConnectionString));

            //// RoleInstance診断管理の初期化(ロールに対する診断の有効化)
            //RoleInstanceDiagnosticManager roleInstanceDiagnosticManager =
            //  cloudStorageAccount.CreateRoleInstanceDiagnosticManager(
            //    RoleEnvironment.DeploymentId,
            //    RoleEnvironment.CurrentRoleInstance.Role.Name,
            //    RoleEnvironment.CurrentRoleInstance.Id);

            var storageConnectionString = RoleEnvironment.GetConfigurationSettingValue(
                   wadConnectionString);
            var deploymentDiagnosticManager = new DeploymentDiagnosticManager(
                                                  storageConnectionString,
                                                  RoleEnvironment.DeploymentId);
            RoleInstanceDiagnosticManager roleInstanceDiagnosticManager = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManager(
                                    RoleEnvironment.CurrentRoleInstance.Role.Name,
                                    RoleEnvironment.CurrentRoleInstance.Id);

            // RoleInstance診断管理からコンフィグを取得する。
            // ・基本的にはデフォルト設定を利用する。
            // ・RoleEnvironment.Changedイベント ハンドラを仕掛ける場合はカレント設定を利用する。
            DiagnosticMonitorConfiguration config =
                DiagnosticMonitor.GetDefaultInitialConfiguration();
            // roleInstanceDiagnosticManager.GetCurrentConfiguration();

            #region Windows Azure診断(Windows Azure Diagnostics)APIを使用した設定開始

            #region インフラストラクチャ ログ(診断モニタ自体のログ)
            // 転送レベルおよび転送間隔を設定
            config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Undefined; // 要検討
            config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromSeconds(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADDiagnosticInfrastructureLogsTable

            #region イベント ログの設定
            // 取得するイベント ソースを設定
            config.WindowsEventLog.DataSources.Add("Application!*");
            config.WindowsEventLog.DataSources.Add("System!*");
            // 転送レベルおよび転送間隔を設定
            config.WindowsEventLog.ScheduledTransferLogLevelFilter = LogLevel.Undefined; // 要検討
            config.WindowsEventLog.ScheduledTransferPeriod = TimeSpan.FromMinutes(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADWindowsEventLogsTable

            #region パフォーマンス カウンタの転送設定
            // カウンタ、サンプリング レートの指定
            config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration()
            {
                CounterSpecifier = @"\Processor(_Total)\% Processor Time",
                SampleRate = TimeSpan.FromSeconds(10)
            });
            config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration()
            {
                CounterSpecifier = @"\Memory\Available Bytes",
                SampleRate = TimeSpan.FromSeconds(10)
            });
            // 転送間隔を設定
            config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(15); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADPerformanceCountersTable

            #region クラッシュ ダンプ転送の有効化
            CrashDumps.EnableCollection(true);
            #endregion
            // 出力先のBlobストレージ コンテナ名:wad-crash-dumps

            #region IISログ、FREBログの転送設定(※ web.config への設定も必要)
            // IISログはデフォルトで取得が有効となっているため、Blobへの転送を指定するのみで収集が可能となる。
            // FREB(Failed Request Trace log)ログについてはweb.config への設定も必要
            #endregion
            // 出力先のBlobストレージ コンテナ名:wad-iis-logfiles、wad-iis-failedreqlogfiles

            #region トレース ログの設定(※ *.config への設定も必要)
            // 転送レベルおよび転送間隔を設定
            config.Logs.ScheduledTransferLogLevelFilter = LogLevel.Undefined; // 要検討
            config.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1); // 要検討
            #endregion
            // 出力先のTableストレージ名:WADLogsTable

            #region カスタム ログ(ローカル ストレージへの出力の場合)

            // 出力先ディレクトリ設定
            DirectoryConfiguration dirConfig1 = new DirectoryConfiguration()
            {
                // 出力先Blobコンテナの指定
                Container = "my-custom-logfiles1",
                // クォーターの設定(実際に使う量)
                DirectoryQuotaInMB = 100,
            };

            // ローカル ストレージのパスを指定
            //(ローカル ストレージの設定自体は、Visual Studioを使用し*.csdefに設定可能)
            LocalResource ls = RoleEnvironment.GetLocalResource("LogStorage");
            dirConfig1.Path = ls.RootPath;

            // log4netに環境変数経由でパス情報(RootPath)を
            // 渡そうとしたがエミュレータ上でうまく動作せず断念。

            // ローカル ストレージを転送元コレクションに追加
            config.Directories.DataSources.Add(dirConfig1);
            // なお、ローカル ストレージのパスは、LocalResource.RootPathにて取得が可能である。

            #endregion
            // 出力先のBlobストレージ コンテナ名:my-custom-logfiles1

            #region カスタムログ(任意の出力先の場合)

            // 出力先ディレクトリ設定
            DirectoryConfiguration dirConfig2 = new DirectoryConfiguration()
            {
                // 出力先Blobコンテナの指定
                Container = "my-custom-logfiles2",
                // クォーターの設定(実際に使う量)
                DirectoryQuotaInMB = 100,
            };

            // 任意のディレクトリを指定
            string path = "c:\\logs";
            dirConfig2.Path = path;
            // ディレクトリを転送元コレクションに追加
            config.Directories.DataSources.Add(dirConfig2);

            // ディレクトリ セキュリティを取得
            DirectorySecurity ds = Directory.GetAccessControl(path);

            // Everyone FullControlのアクセス ルールの生成
            FileSystemAccessRule AccessRule = new FileSystemAccessRule(
                "Everyone",
                FileSystemRights.FullControl,
                InheritanceFlags.ObjectInherit,
                PropagationFlags.None,
                AccessControlType.Allow);
            // ディレクトリ キュリティにアクセス ルールを追加
            ds.AddAccessRule(AccessRule);

            // ディレクトリにディレクトリ セキュリティを反映
            // ★ <Runtime executionContext="elevated"/>を「*.csdef」に記述。
            Directory.SetAccessControl(path, ds);

            #endregion
            // 出力先のBlobストレージ コンテナ名:my-custom-logfiles2

            // IISログ、カスタム ログ、クラッシュ ダンプなどで
            // 使用するディレクトリ バッファからBlobストレージへの転送間隔の指定
            config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(15);

            #endregion

            // RoleInstance診断管理にコンフィグを設定
            roleInstanceDiagnosticManager.SetCurrentConfiguration(config);

            // 診断の開始(エミュレータでは不要だが、実機では必要
            DiagnosticMonitor.Start(wadConnectionString, config);

            // ローカル ストレージへのログ出力テスト
            path = Path.Combine(ls.RootPath,
                string.Format("test_{0}.txt", DateTime.Now.ToString("yyyyMMdd")));

            // StreamWriterを開き、ログを出力
            using (StreamWriter sw = new StreamWriter(path, true))
            {
                sw.WriteLine("{0} : {1}", DateTime.UtcNow, "ローカル ストレージへのログ出力テスト");
                sw.Close();
            }
        }
 public void UpdateInstanceDiagnostics(DiagnosticMonitorConfiguration config, string deploymentId, string roleName, string instanceName)
 {
     var deploymentDiagnosticManager = new DeploymentDiagnosticManager(this._connectionString, deploymentId);
     var instance = deploymentDiagnosticManager.GetRoleInstanceDiagnosticManagersForRole(roleName)
         .FirstOrDefault(t => t.RoleInstanceId.Equals(instanceName, StringComparison.InvariantCultureIgnoreCase));
     if (instance != null)
     {
         instance.SetCurrentConfiguration(config);
     }
 }