This commit is contained in:
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -50,7 +50,7 @@
|
|||||||
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
|
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
|
||||||
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
|
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
|
||||||
"AYANOVA_METRICS_USE_INFLUXDB": "false",
|
"AYANOVA_METRICS_USE_INFLUXDB": "false",
|
||||||
"AYANOVA_SERVER_TEST_MODE":"false",
|
"AYANOVA_SERVER_TEST_MODE":"true",
|
||||||
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL":"small",
|
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL":"small",
|
||||||
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET":"-7",
|
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET":"-7",
|
||||||
"AYANOVA_BACKUP_PG_DUMP_PATH":"C:\\data\\code\\PostgreSQLPortable_12.0\\App\\PgSQL\\bin\\"
|
"AYANOVA_BACKUP_PG_DUMP_PATH":"C:\\data\\code\\PostgreSQLPortable_12.0\\App\\PgSQL\\bin\\"
|
||||||
|
|||||||
@@ -691,3 +691,7 @@ JAVASCRIPT DOWNSAMPLING TOOL
|
|||||||
return sampled;
|
return sampled;
|
||||||
}
|
}
|
||||||
//=============================================
|
//=============================================
|
||||||
|
|
||||||
|
|
||||||
|
COlors colours for charts
|
||||||
|
http://perceptualedge.com/articles/b-eye/choosing_colors.pdf
|
||||||
@@ -31,7 +31,7 @@ namespace AyaNova.Api.Controllers
|
|||||||
private readonly AyContext ct;
|
private readonly AyContext ct;
|
||||||
private readonly ILogger<LogFilesController> log;
|
private readonly ILogger<LogFilesController> log;
|
||||||
private readonly ApiServerState serverState;
|
private readonly ApiServerState serverState;
|
||||||
private const int MAX_RECORDS_BEFORE_DOWNSAMPLING = 400;
|
private const int DEFAULT_MAX_RECORDS = 400;
|
||||||
private const long MB = (1024 * 1024);
|
private const long MB = (1024 * 1024);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -49,7 +49,6 @@ namespace AyaNova.Api.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get all server metrics for time period specified
|
/// Get all server metrics for time period specified
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -61,7 +60,6 @@ namespace AyaNova.Api.Controllers
|
|||||||
public async Task<IActionResult> GetMetrics([FromQuery, Required] DateTime? tsStart, [FromQuery, Required] DateTime? tsEnd, [FromQuery] int? maxRecords)
|
public async Task<IActionResult> GetMetrics([FromQuery, Required] DateTime? tsStart, [FromQuery, Required] DateTime? tsEnd, [FromQuery] int? maxRecords)
|
||||||
{
|
{
|
||||||
//Note: the date and times are nullable and required so that the regular modelstate code kicks in to ensure they are present
|
//Note: the date and times are nullable and required so that the regular modelstate code kicks in to ensure they are present
|
||||||
|
|
||||||
if (serverState.IsClosed)
|
if (serverState.IsClosed)
|
||||||
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
|
||||||
if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Metrics))
|
if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Metrics))
|
||||||
@@ -69,21 +67,14 @@ namespace AyaNova.Api.Controllers
|
|||||||
if (!ModelState.IsValid)
|
if (!ModelState.IsValid)
|
||||||
return BadRequest(new ApiErrorResponse(ModelState));
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
|
|
||||||
//use specified values or just return all
|
maxRecords ??= DEFAULT_MAX_RECORDS;
|
||||||
maxRecords ??= MAX_RECORDS_BEFORE_DOWNSAMPLING;
|
|
||||||
|
|
||||||
List<MetricMM> MinuteMetrics = new List<MetricMM>();
|
List<MetricMM> MinuteMetrics = new List<MetricMM>();
|
||||||
//touniversal is because the parameters are converted to local time here, but then sent to the query as local time as well and not universal time which is what it should be
|
//touniversal is because the parameters are converted to local time here
|
||||||
|
//but then sent to the query as local time as well and not universal time which is what it should be
|
||||||
MinuteMetrics = await ct.MetricMM.AsNoTracking().Where(z => z.t >= ((DateTime)tsStart).ToUniversalTime() && z.t <= ((DateTime)tsEnd).ToUniversalTime()).OrderBy(z => z.t).ToListAsync();
|
MinuteMetrics = await ct.MetricMM.AsNoTracking().Where(z => z.t >= ((DateTime)tsStart).ToUniversalTime() && z.t <= ((DateTime)tsEnd).ToUniversalTime()).OrderBy(z => z.t).ToListAsync();
|
||||||
|
|
||||||
//Log
|
|
||||||
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Downsample
|
|
||||||
// if (maxRecords < MinuteMetrics.Count)
|
|
||||||
// {
|
|
||||||
var dsCPU = MinuteMetrics.Select(z => new Tuple<double, double>(z.t.ToOADate(), z.CPU)).ToList();
|
var dsCPU = MinuteMetrics.Select(z => new Tuple<double, double>(z.t.ToOADate(), z.CPU)).ToList();
|
||||||
dsCPU = Util.DataUtil.LargestTriangleThreeBuckets(dsCPU, (int)maxRecords) as List<Tuple<double, double>>;
|
dsCPU = Util.DataUtil.LargestTriangleThreeBuckets(dsCPU, (int)maxRecords) as List<Tuple<double, double>>;
|
||||||
|
|
||||||
@@ -105,13 +96,8 @@ namespace AyaNova.Api.Controllers
|
|||||||
var dsGen2 = MinuteMetrics.Select(z => new Tuple<double, double>(z.t.ToOADate(), z.Gen2)).ToList();
|
var dsGen2 = MinuteMetrics.Select(z => new Tuple<double, double>(z.t.ToOADate(), z.Gen2)).ToList();
|
||||||
dsGen2 = Util.DataUtil.LargestTriangleThreeBuckets(dsGen2, (int)maxRecords) as List<Tuple<double, double>>;
|
dsGen2 = Util.DataUtil.LargestTriangleThreeBuckets(dsGen2, (int)maxRecords) as List<Tuple<double, double>>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var ret = new
|
var ret = new
|
||||||
{
|
{
|
||||||
DownSampled = true,
|
|
||||||
MetricMM = new
|
MetricMM = new
|
||||||
{
|
{
|
||||||
cpu = dsCPU.Select(z => new MetricDouble(DateTime.FromOADate(z.Item1), z.Item2)).ToArray(),
|
cpu = dsCPU.Select(z => new MetricDouble(DateTime.FromOADate(z.Item1), z.Item2)).ToArray(),
|
||||||
@@ -125,31 +111,9 @@ namespace AyaNova.Api.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct);
|
||||||
return Ok(ApiOkResponse.Response(ret));
|
return Ok(ApiOkResponse.Response(ret));
|
||||||
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// var tsOffset = new TimeSpan(0);
|
|
||||||
// var ret = new
|
|
||||||
// {
|
|
||||||
// DownSampled = false,
|
|
||||||
// MetricMM = new
|
|
||||||
// {
|
|
||||||
// labels = MinuteMetrics.Select(z => z.t).ToArray(),
|
|
||||||
// cpu = MinuteMetrics.Select(z => z.CPU).ToArray(),
|
|
||||||
// gen0 = MinuteMetrics.Select(z => z.Gen0).ToArray(),
|
|
||||||
// gen1 = MinuteMetrics.Select(z => z.Gen1).ToArray(),
|
|
||||||
// gen2 = MinuteMetrics.Select(z => z.Gen2).ToArray(),
|
|
||||||
// allocated = MinuteMetrics.Select(z => z.Allocated / MB).ToArray(),
|
|
||||||
// workingSet = MinuteMetrics.Select(z => z.WorkingSet / MB).ToArray(),
|
|
||||||
// privateBytes = MinuteMetrics.Select(z => z.PrivateBytes / MB).ToArray()
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
// };
|
|
||||||
// return Ok(ApiOkResponse.Response(ret));
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user