private void LogMetrics(DocumentDatabase database) { var metrics = database.CreateMetrics(); logText.AppendFormat("\tMetrics:: DocsWritesPerSecond: {0:N3}, IndexedPerSecond: {1:N3}, ReducedPerSecond: {2:N3}, RequestsPerSecond: {3:N3}\r\n", metrics.DocsWritesPerSecond, metrics.IndexedPerSecond, metrics.ReducedPerSecond, metrics.RequestsPerSecond); logText.AppendFormat("\tMetrics.Requests:: Count: {0:#,#}, OneMinuteRate: {1:N3}, MeanRate: {2:N3}\r\n", metrics.Requests.Count, metrics.Requests.OneMinuteRate, metrics.Requests.MeanRate); logText.AppendFormat("\tMetrics.RequestsDuration:: Counter: {0:#,#}, Max: {1:N3}, Min: {2:N3}, Mean: {3:N3}, Stdev: {4:N3}\r\n", metrics.RequestsDuration.Counter, metrics.RequestsDuration.Max, metrics.RequestsDuration.Min, metrics.RequestsDuration.Mean, metrics.RequestsDuration.Stdev); logText.AppendFormat("\tMetrics.StaleIndexMaps:: Counter: {0:#,#}, Max: {1:N3}, Min: {2:N3}, Mean: {3:N3}, Stdev: {4:N3}\r\n", metrics.StaleIndexMaps.Counter, metrics.StaleIndexMaps.Max, metrics.StaleIndexMaps.Min, metrics.StaleIndexMaps.Mean, metrics.StaleIndexMaps.Stdev); logText.AppendFormat("\tMetrics.StaleIndexMaps:: Counter: {0:#,#}, Max: {1:N3}, Min: {2:N3}, Mean: {3:N3}, Stdev: {4:N3}\r\n", metrics.StaleIndexReduces.Counter, metrics.StaleIndexReduces.Max, metrics.StaleIndexReduces.Min, metrics.StaleIndexReduces.Mean, metrics.StaleIndexReduces.Stdev); }
public static void CreateInfoPackageForDatabase(ZipArchive package, DocumentDatabase database, RequestManager requestManager, string zipEntryPrefix = null) { zipEntryPrefix = zipEntryPrefix ?? string.Empty; var databaseName = database.Name; if (string.IsNullOrWhiteSpace(databaseName)) { databaseName = Constants.SystemDatabase; } var jsonSerializer = JsonExtensions.CreateDefaultJsonSerializer(); jsonSerializer.Formatting = Formatting.Indented; if (database.StartupTasks.OfType <ReplicationTask>().Any()) { var replication = package.CreateEntry(zipEntryPrefix + "replication.json", compressionLevel); using (var statsStream = replication.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, ReplicationUtils.GetReplicationInformation(database)); streamWriter.Flush(); } } var sqlReplicationTask = database.StartupTasks.OfType <SqlReplicationTask>().FirstOrDefault(); if (sqlReplicationTask != null) { var replication = package.CreateEntry(zipEntryPrefix + "sql_replication.json", compressionLevel); using (var statsStream = replication.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, sqlReplicationTask.Statistics); streamWriter.Flush(); } } var stats = package.CreateEntry(zipEntryPrefix + "stats.json", compressionLevel); using (var statsStream = stats.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, database.Statistics); streamWriter.Flush(); } var metrics = package.CreateEntry(zipEntryPrefix + "metrics.json", compressionLevel); using (var metricsStream = metrics.Open()) using (var streamWriter = new StreamWriter(metricsStream)) { jsonSerializer.Serialize(streamWriter, database.CreateMetrics()); streamWriter.Flush(); } var logs = package.CreateEntry(zipEntryPrefix + "logs.csv", compressionLevel); using (var logsStream = logs.Open()) using (var streamWriter = new StreamWriter(logsStream)) { var target = LogManager.GetTarget <DatabaseMemoryTarget>(); if (target == null) { streamWriter.WriteLine("DatabaseMemoryTarget was not registered in the log manager, logs are not available"); } else { var boundedMemoryTarget = target[databaseName]; var log = boundedMemoryTarget.GeneralLog; streamWriter.WriteLine("time,logger,level,message,exception"); foreach (var logEvent in log) { streamWriter.WriteLine("{0:O},{1},{2},{3},{4}", logEvent.TimeStamp, logEvent.LoggerName, logEvent.Level, logEvent.FormattedMessage, logEvent.Exception); } } streamWriter.Flush(); } var config = package.CreateEntry(zipEntryPrefix + "config.json", compressionLevel); using (var configStream = config.Open()) using (var streamWriter = new StreamWriter(configStream)) using (var jsonWriter = new JsonTextWriter(streamWriter) { Formatting = Formatting.Indented }) { GetConfigForDebug(database).WriteTo(jsonWriter, new EtagJsonConverter()); jsonWriter.Flush(); } var indexes = package.CreateEntry(zipEntryPrefix + "indexes.json", compressionLevel); using (var indexesStream = indexes.Open()) using (var streamWriter = new StreamWriter(indexesStream)) { jsonSerializer.Serialize(streamWriter, database.IndexDefinitionStorage.IndexDefinitions.ToDictionary(x => x.Key, x => x.Value)); streamWriter.Flush(); } var currentlyIndexing = package.CreateEntry(zipEntryPrefix + "currently-indexing.json", compressionLevel); using (var currentlyIndexingStream = currentlyIndexing.Open()) using (var streamWriter = new StreamWriter(currentlyIndexingStream)) { jsonSerializer.Serialize(streamWriter, GetCurrentlyIndexingForDebug(database)); streamWriter.Flush(); } var queries = package.CreateEntry(zipEntryPrefix + "queries.json", compressionLevel); using (var queriesStream = queries.Open()) using (var streamWriter = new StreamWriter(queriesStream)) { jsonSerializer.Serialize(streamWriter, database.WorkContext.CurrentlyRunningQueries); streamWriter.Flush(); } var version = package.CreateEntry(zipEntryPrefix + "version.json", compressionLevel); using (var versionStream = version.Open()) using (var streamWriter = new StreamWriter(versionStream)) { jsonSerializer.Serialize(streamWriter, new { DocumentDatabase.ProductVersion, DocumentDatabase.BuildVersion }); streamWriter.Flush(); } var prefetchStatus = package.CreateEntry(zipEntryPrefix + "prefetch-status.json", compressionLevel); using (var prefetchStatusStream = prefetchStatus.Open()) using (var streamWriter = new StreamWriter(prefetchStatusStream)) { jsonSerializer.Serialize(streamWriter, GetPrefetchingQueueStatusForDebug(database)); streamWriter.Flush(); } var requestTracking = package.CreateEntry(zipEntryPrefix + "request-tracking.json", compressionLevel); using (var requestTrackingStream = requestTracking.Open()) using (var streamWriter = new StreamWriter(requestTrackingStream)) { jsonSerializer.Serialize(streamWriter, GetRequestTrackingForDebug(requestManager, databaseName)); streamWriter.Flush(); } var tasks = package.CreateEntry(zipEntryPrefix + "tasks.json", compressionLevel); using (var tasksStream = tasks.Open()) using (var streamWriter = new StreamWriter(tasksStream)) { jsonSerializer.Serialize(streamWriter, GetTasksForDebug(database)); streamWriter.Flush(); } var systemUtilization = package.CreateEntry(zipEntryPrefix + "system-utilization.json", compressionLevel); using (var systemUtilizationStream = systemUtilization.Open()) using (var streamWriter = new StreamWriter(systemUtilizationStream)) { long totalPhysicalMemory = -1; long availableMemory = -1; object cpuTimes = null; try { totalPhysicalMemory = MemoryStatistics.TotalPhysicalMemory; availableMemory = MemoryStatistics.AvailableMemoryInMb; using (var searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor")) { cpuTimes = searcher.Get() .Cast <ManagementObject>() .Select(mo => new { Name = mo["Name"], Usage = string.Format("{0} %", mo["PercentProcessorTime"]) }).ToArray(); } } catch (Exception e) { cpuTimes = "Could not get CPU times" + Environment.NewLine + e; } jsonSerializer.Serialize(streamWriter, new { TotalPhysicalMemory = string.Format("{0:#,#.##;;0} MB", totalPhysicalMemory), AvailableMemory = string.Format("{0:#,#.##;;0} MB", availableMemory), CurrentCpuUsage = cpuTimes }); streamWriter.Flush(); } }
public static void CreateInfoPackageForDatabase(ZipArchive package, DocumentDatabase database, RequestManager requestManager, string zipEntryPrefix = null) { zipEntryPrefix = zipEntryPrefix ?? string.Empty; var databaseName = database.Name; if (string.IsNullOrWhiteSpace(databaseName)) databaseName = Constants.SystemDatabase; var jsonSerializer = JsonExtensions.CreateDefaultJsonSerializer(); jsonSerializer.Formatting=Formatting.Indented; if (database.StartupTasks.OfType<ReplicationTask>().Any()) { var replication = package.CreateEntry(zipEntryPrefix + "replication.json", compressionLevel); using (var statsStream = replication.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, ReplicationUtils.GetReplicationInformation(database)); streamWriter.Flush(); } } var sqlReplicationTask = database.StartupTasks.OfType<SqlReplicationTask>().FirstOrDefault(); if (sqlReplicationTask != null) { var replication = package.CreateEntry(zipEntryPrefix + "sql_replication.json", compressionLevel); using (var statsStream = replication.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, sqlReplicationTask.Statistics); streamWriter.Flush(); } } var stats = package.CreateEntry(zipEntryPrefix + "stats.json", compressionLevel); using (var statsStream = stats.Open()) using (var streamWriter = new StreamWriter(statsStream)) { jsonSerializer.Serialize(streamWriter, database.Statistics); streamWriter.Flush(); } var metrics = package.CreateEntry(zipEntryPrefix + "metrics.json", compressionLevel); using (var metricsStream = metrics.Open()) using (var streamWriter = new StreamWriter(metricsStream)) { jsonSerializer.Serialize(streamWriter, database.CreateMetrics()); streamWriter.Flush(); } var logs = package.CreateEntry(zipEntryPrefix + "logs.csv", compressionLevel); using (var logsStream = logs.Open()) using (var streamWriter = new StreamWriter(logsStream)) { var target = LogManager.GetTarget<DatabaseMemoryTarget>(); if (target == null) streamWriter.WriteLine("DatabaseMemoryTarget was not registered in the log manager, logs are not available"); else { var boundedMemoryTarget = target[databaseName]; var log = boundedMemoryTarget.GeneralLog; streamWriter.WriteLine("time,logger,level,message,exception"); foreach (var logEvent in log) { streamWriter.WriteLine("{0:O},{1},{2},{3},{4}", logEvent.TimeStamp, logEvent.LoggerName, logEvent.Level, logEvent.FormattedMessage, logEvent.Exception); } } streamWriter.Flush(); } var config = package.CreateEntry(zipEntryPrefix + "config.json", compressionLevel); using (var configStream = config.Open()) using (var streamWriter = new StreamWriter(configStream)) using (var jsonWriter = new JsonTextWriter(streamWriter) { Formatting = Formatting.Indented }) { GetConfigForDebug(database).WriteTo(jsonWriter, new EtagJsonConverter()); jsonWriter.Flush(); } var indexes = package.CreateEntry(zipEntryPrefix + "indexes.json", compressionLevel); using (var indexesStream = indexes.Open()) using (var streamWriter = new StreamWriter(indexesStream)) { jsonSerializer.Serialize(streamWriter, database.IndexDefinitionStorage.IndexDefinitions.ToDictionary(x => x.Key, x => x.Value)); streamWriter.Flush(); } var currentlyIndexing = package.CreateEntry(zipEntryPrefix + "currently-indexing.json", compressionLevel); using (var currentlyIndexingStream = currentlyIndexing.Open()) using (var streamWriter = new StreamWriter(currentlyIndexingStream)) { jsonSerializer.Serialize(streamWriter, GetCurrentlyIndexingForDebug(database)); streamWriter.Flush(); } var queries = package.CreateEntry(zipEntryPrefix + "queries.json", compressionLevel); using (var queriesStream = queries.Open()) using (var streamWriter = new StreamWriter(queriesStream)) { jsonSerializer.Serialize(streamWriter, database.WorkContext.CurrentlyRunningQueries); streamWriter.Flush(); } var version = package.CreateEntry(zipEntryPrefix + "version.json", compressionLevel); using (var versionStream = version.Open()) using (var streamWriter = new StreamWriter(versionStream)) { jsonSerializer.Serialize(streamWriter, new { DocumentDatabase.ProductVersion, DocumentDatabase.BuildVersion }); streamWriter.Flush(); } var prefetchStatus = package.CreateEntry(zipEntryPrefix + "prefetch-status.json", compressionLevel); using (var prefetchStatusStream = prefetchStatus.Open()) using (var streamWriter = new StreamWriter(prefetchStatusStream)) { jsonSerializer.Serialize(streamWriter, GetPrefetchingQueueStatusForDebug(database)); streamWriter.Flush(); } var requestTracking = package.CreateEntry(zipEntryPrefix + "request-tracking.json", compressionLevel); using (var requestTrackingStream = requestTracking.Open()) using (var streamWriter = new StreamWriter(requestTrackingStream)) { jsonSerializer.Serialize(streamWriter, GetRequestTrackingForDebug(requestManager, databaseName)); streamWriter.Flush(); } var tasks = package.CreateEntry(zipEntryPrefix + "tasks.json", compressionLevel); using (var tasksStream = tasks.Open()) using (var streamWriter = new StreamWriter(tasksStream)) { jsonSerializer.Serialize(streamWriter, GetTasksForDebug(database)); streamWriter.Flush(); } var systemUtilization = package.CreateEntry(zipEntryPrefix + "system-utilization.json", compressionLevel); using (var systemUtilizationStream = systemUtilization.Open()) using (var streamWriter = new StreamWriter(systemUtilizationStream)) { long totalPhysicalMemory = -1; long availableMemory = -1; object cpuTimes = null; try { totalPhysicalMemory = MemoryStatistics.TotalPhysicalMemory; availableMemory = MemoryStatistics.AvailableMemoryInMb; using (var searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor")) { cpuTimes = searcher.Get() .Cast<ManagementObject>() .Select(mo => new { Name = mo["Name"], Usage = string.Format("{0} %", mo["PercentProcessorTime"]) }).ToArray(); } } catch (Exception e) { cpuTimes = "Could not get CPU times" + Environment.NewLine + e; } jsonSerializer.Serialize(streamWriter, new { TotalPhysicalMemory = string.Format("{0:#,#.##;;0} MB", totalPhysicalMemory), AvailableMemory = string.Format("{0:#,#.##;;0} MB", availableMemory), CurrentCpuUsage = cpuTimes }); streamWriter.Flush(); } }