Skip to content

Commit 82aebb8

Browse files
authored
Fix bill graph 95th percentile calculation under ONLY_FULL_GROUP_BY (librenms#20102)
1 parent 453c163 commit 82aebb8

1 file changed

Lines changed: 9 additions & 9 deletions

File tree

LibreNMS/Billing.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,26 +132,26 @@ public static function getLastMeasurement($bill_id): array
132132

133133
private static function get95thagg($bill_id, $datefrom, $dateto): float
134134
{
135-
$sum_data = dbFetchRows('SELECT (SUM(delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start, DATE_ADD(FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300), INTERVAL 5 MINUTE) AS bucket_end,SUM(delta) as delta_sum FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
136-
$measurement_95th = (round(count($sum_data) / 100 * 95) - 2);
135+
$sum_data = dbFetchRows('SELECT (SUM(delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
136+
$measurement_95th = max(0, (int) round(count($sum_data) / 100 * 95) - 2);
137137

138-
return round($sum_data[$measurement_95th]['rate'], 2);
138+
return round($sum_data[$measurement_95th]['rate'] ?? 0, 2);
139139
}
140140

141141
private static function get95thIn($bill_id, $datefrom, $dateto): float
142142
{
143-
$sum_data = dbFetchRows('SELECT (SUM(in_delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start, DATE_ADD(FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300), INTERVAL 5 MINUTE) AS bucket_end,SUM(in_delta) as delta_sum FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
144-
$measurement_95th = (round(count($sum_data) / 100 * 95) - 2);
143+
$sum_data = dbFetchRows('SELECT (SUM(in_delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
144+
$measurement_95th = max(0, (int) round(count($sum_data) / 100 * 95) - 2);
145145

146-
return round($sum_data[$measurement_95th]['rate'], 2);
146+
return round($sum_data[$measurement_95th]['rate'] ?? 0, 2);
147147
}
148148

149149
private static function get95thout($bill_id, $datefrom, $dateto): float
150150
{
151-
$sum_data = dbFetchRows('SELECT (SUM(out_delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start, DATE_ADD(FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300), INTERVAL 5 MINUTE) AS bucket_end,SUM(out_delta) as delta_sum FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
152-
$measurement_95th = (round(count($sum_data) / 100 * 95) - 2);
151+
$sum_data = dbFetchRows('SELECT (SUM(out_delta) / SUM(period) * 8) as rate, FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`timestamp`) / 300) * 300) AS bucket_start FROM bill_data WHERE bill_id = ? AND timestamp > ? AND timestamp <= ? GROUP BY bill_id, bucket_start ORDER BY rate ASC', [$bill_id, $datefrom, $dateto]);
152+
$measurement_95th = max(0, (int) round(count($sum_data) / 100 * 95) - 2);
153153

154-
return round($sum_data[$measurement_95th]['rate'], 2);
154+
return round($sum_data[$measurement_95th]['rate'] ?? 0, 2);
155155
}
156156

157157
public static function getRates($bill_id, $datefrom, $dateto, $dir_95th): array

0 commit comments

Comments
 (0)