This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user