diff --git a/server/AyaNova/generator/CoreJobMetricsSnapshot.cs b/server/AyaNova/generator/CoreJobMetricsSnapshot.cs index 2409d7cc..a49eba49 100644 --- a/server/AyaNova/generator/CoreJobMetricsSnapshot.cs +++ b/server/AyaNova/generator/CoreJobMetricsSnapshot.cs @@ -16,8 +16,14 @@ namespace AyaNova.Biz internal static class CoreJobMetricsSnapshot { private static ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("CoreJobMetricsSnapshot"); + private static Process _process = Process.GetCurrentProcess(); + + private static TimeSpan _oldCPUTime = TimeSpan.Zero; + private static DateTime _lastSnapshot = DateTime.UtcNow; + private static DateTime _lastRpsTime = DateTime.UtcNow; + private static double _cpu = 0, _rps = 0; + - private static DateTime lastSnapshot = DateTime.MinValue; private static TimeSpan tsOneMinute = new TimeSpan(0, 1, 0); private static TimeSpan tsOneHour = new TimeSpan(1, 0, 0); private static TimeSpan ts24Hours = new TimeSpan(24, 0, 0); @@ -27,6 +33,8 @@ namespace AyaNova.Biz // public static async Task DoJobAsync(AyContext ct) { + //https://github.com/sebastienros/memoryleak/blob/master/src/MemoryLeak/MemoryLeak/Controllers/DiagnosticsController.cs + //Gather stats, output to database but only every minute or more /* //TODO: figure out teh best format to store it in based on what I need at the client end @@ -35,8 +43,10 @@ namespace AyaNova.Biz (test storing null in two columns results in same size so no saving) // todo: store data using Postgres REAL / c# float datatype, is 38mb vs 55 for double precision with one year 10 column test data +what others track: +https://www.dynatrace.com/technologies/net-monitoring/#&gid=0&pid=1 - +https://docs.microsoft.com/en-us/aspnet/core/performance/memory?view=aspnetcore-3.1 Make a chart at client with test data from digital ocean to play with try to replicate their stuff to learn how to best do it @@ -138,7 +148,7 @@ from generate_series(1, 525600) s(i) */ //Nothing is gathered less than one minute frequency - if (!DateUtil.IsAfterDuration(lastSnapshot, tsOneMinute)) + if (!DateUtil.IsAfterDuration(_lastSnapshot, tsOneMinute)) return; log.LogTrace("Starting metrics snapshot"); @@ -147,24 +157,48 @@ from generate_series(1, 525600) s(i) //ONE MINUTE SNAPS // - //Gather core metrics here - using (Process proc = Process.GetCurrentProcess()) - { + var now = DateTime.UtcNow; + _process.Refresh(); - //PHYSICAL MEMORY - // metrics.Measure.Gauge.SetValue(MetricsRegistry.PhysicalMemoryGauge, process.WorkingSet64); + //CPU + var cpuElapsedTime = now.Subtract(_lastSnapshot).TotalMilliseconds; + var newCPUTime = _process.TotalProcessorTime; + var elapsedCPU = (newCPUTime - _oldCPUTime).TotalMilliseconds; + _cpu = elapsedCPU * 100 / Environment.ProcessorCount / cpuElapsedTime; + _oldCPUTime = newCPUTime; - //PRIVATE BYTES - // metrics.Measure.Gauge.SetValue(MetricsRegistry.PrivateBytesGauge, process.PrivateMemorySize64); - } + //MEMORY + // The memory occupied by objects. + var Allocated = GC.GetTotalMemory(false); + // The working set includes both shared and private data. The shared data includes the pages that contain all the + // instructions that the process executes, including instructions in the process modules and the system libraries. + var WorkingSet = _process.WorkingSet64; + + // The value returned by this property represents the current size of memory used by the process, in bytes, that + // cannot be shared with other processes. + var PrivateBytes = _process.PrivateMemorySize64; + + // The number of generation 0 collections + var Gen0 = GC.CollectionCount(0); + + // The number of generation 1 collections + var Gen1 = GC.CollectionCount(1); + + // The number of generation 2 collections + var Gen2 = GC.CollectionCount(2); + + var CPU=_cpu; + + //write to db + MetricMM mm = new MetricMM(); ///////////////////////////////////////////// //EVERY HOUR SNAPS // - if (DateUtil.IsAfterDuration(lastSnapshot, tsOneHour)) + if (DateUtil.IsAfterDuration(_lastSnapshot, tsOneHour)) { //RECORDS IN TABLE //Only do this once per hour @@ -207,7 +241,7 @@ from generate_series(1, 525600) s(i) ///////////////////////////////////////////// //ONCE A DAY SNAPS // - if (DateUtil.IsAfterDuration(lastSnapshot, ts24Hours)) + if (DateUtil.IsAfterDuration(_lastSnapshot, ts24Hours)) { //FILES ON DISK log.LogTrace("Files on disk information"); @@ -226,7 +260,7 @@ from generate_series(1, 525600) s(i) } - lastSnapshot = DateTime.UtcNow; + _lastSnapshot = now; //just to hide compiler warning for now