kibana/x-pack/plugins/monitoring/server/lib/calculate_rate.js
2018-04-24 13:49:26 -07:00

70 lines
2 KiB
JavaScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import moment from 'moment';
/*
* Calculate "Per-Second" Rate from Metrics
* Uses first/last totals and time window bounds in millis
*
* Indexing rate example:
* 1. Take the latest index total
* 2. From that subtract the earliest index total
* This gives you the numerator
*
* 3. Take the latest timestamp from the time picker
* 4. From that subtract the earliest timestamp from the time picker
* This gives you the denominator in millis. Divide it by 1000 to convert to seconds
*/
export function calculateRate(
{
hitTimestamp = null,
earliestHitTimestamp = null,
latestTotal = null,
earliestTotal = null,
timeWindowMin,
timeWindowMax
} = {}
) {
const nullResult = {
rate: null,
isEstimate: false
};
// check if any params used for calculations are null
if (hitTimestamp === null || earliestHitTimestamp === null || latestTotal === null || earliestTotal === null) {
return nullResult;
}
const hitTimestampMoment = moment(hitTimestamp).valueOf();
const earliestHitTimestampMoment = moment(earliestHitTimestamp).valueOf();
const hitsTimeDelta = hitTimestampMoment - earliestHitTimestampMoment;
if (hitsTimeDelta < 1) {
return nullResult;
}
const earliestTimeInMillis = moment(timeWindowMin).valueOf();
const latestTimeInMillis = moment(timeWindowMax).valueOf();
const millisDelta = latestTimeInMillis - earliestTimeInMillis;
let rate = null;
let isEstimate = false;
if (millisDelta !== 0) {
const totalDelta = latestTotal - earliestTotal;
if (totalDelta < 0) {
rate = latestTotal / (millisDelta / 1000); // a restart caused an unwanted negative rate
isEstimate = true;
} else {
rate = totalDelta / (millisDelta / 1000);
}
}
return {
rate,
isEstimate,
};
}