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); } }
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); } }
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(); }
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); }
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 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; }
/// <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(); } }