Ejemplo n.º 1
0
        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();
                }
        }
Ejemplo n.º 3
0
        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();
            }
        }