|
|
|
|
@ -242,32 +242,47 @@ export function makeSeriesForLogs(rows: LogRow[], intervalMs: number): TimeSerie |
|
|
|
|
// Graph time series by log level
|
|
|
|
|
const seriesByLevel = {}; |
|
|
|
|
const bucketSize = intervalMs * 10; |
|
|
|
|
const seriesList = []; |
|
|
|
|
|
|
|
|
|
for (const row of rows) { |
|
|
|
|
if (!seriesByLevel[row.logLevel]) { |
|
|
|
|
seriesByLevel[row.logLevel] = { lastTs: null, datapoints: [], alias: row.logLevel }; |
|
|
|
|
} |
|
|
|
|
let series = seriesByLevel[row.logLevel]; |
|
|
|
|
|
|
|
|
|
if (!series) { |
|
|
|
|
seriesByLevel[row.logLevel] = series = { |
|
|
|
|
lastTs: null, |
|
|
|
|
datapoints: [], |
|
|
|
|
alias: row.logLevel, |
|
|
|
|
color: LogLevelColor[row.logLevel], |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const levelSeries = seriesByLevel[row.logLevel]; |
|
|
|
|
seriesList.push(series); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Bucket to nearest minute
|
|
|
|
|
// align time to bucket size
|
|
|
|
|
const time = Math.round(row.timeEpochMs / bucketSize) * bucketSize; |
|
|
|
|
|
|
|
|
|
// Entry for time
|
|
|
|
|
if (time === levelSeries.lastTs) { |
|
|
|
|
levelSeries.datapoints[levelSeries.datapoints.length - 1][0]++; |
|
|
|
|
if (time === series.lastTs) { |
|
|
|
|
series.datapoints[series.datapoints.length - 1][0]++; |
|
|
|
|
} else { |
|
|
|
|
levelSeries.datapoints.push([1, time]); |
|
|
|
|
levelSeries.lastTs = time; |
|
|
|
|
series.datapoints.push([1, time]); |
|
|
|
|
series.lastTs = time; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Object.keys(seriesByLevel).reduce((acc, level) => { |
|
|
|
|
if (seriesByLevel[level]) { |
|
|
|
|
const gs = new TimeSeries(seriesByLevel[level]); |
|
|
|
|
gs.setColor(LogLevelColor[level]); |
|
|
|
|
acc.push(gs); |
|
|
|
|
// add zero to other levels to aid stacking so each level series has same number of points
|
|
|
|
|
for (const other of seriesList) { |
|
|
|
|
if (other !== series && other.lastTs !== time) { |
|
|
|
|
other.datapoints.push([0, time]); |
|
|
|
|
other.lastTs = time; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return acc; |
|
|
|
|
}, []); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return seriesList.map(series => { |
|
|
|
|
series.datapoints.sort((a, b) => { |
|
|
|
|
return a[1] - b[1]; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return new TimeSeries(series); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|