in spectator-api/src/main/java/com/netflix/spectator/api/histogram/BucketFunctions.java [46:94]
static {
TIME_FORMATTERS.add(fmt(TimeUnit.NANOSECONDS.toNanos(10), 1, "ns", TimeUnit.NANOSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.NANOSECONDS.toNanos(100), 2, "ns", TimeUnit.NANOSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MICROSECONDS.toNanos(1), 3, "ns", TimeUnit.NANOSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MICROSECONDS.toNanos(8), 4, "ns", TimeUnit.NANOSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MICROSECONDS.toNanos(10), 1, "us", TimeUnit.MICROSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MICROSECONDS.toNanos(100), 2, "us", TimeUnit.MICROSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MILLISECONDS.toNanos(1), 3, "us", TimeUnit.MICROSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MILLISECONDS.toNanos(8), 4, "us", TimeUnit.MICROSECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MILLISECONDS.toNanos(10), 1, "ms", TimeUnit.MILLISECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MILLISECONDS.toNanos(100), 2, "ms", TimeUnit.MILLISECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.SECONDS.toNanos(1), 3, "ms", TimeUnit.MILLISECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.SECONDS.toNanos(8), 4, "ms", TimeUnit.MILLISECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.SECONDS.toNanos(10), 1, "s", TimeUnit.SECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.SECONDS.toNanos(100), 2, "s", TimeUnit.SECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MINUTES.toNanos(8), 3, "s", TimeUnit.SECONDS));
TIME_FORMATTERS.add(fmt(TimeUnit.MINUTES.toNanos(10), 1, "min", TimeUnit.MINUTES));
TIME_FORMATTERS.add(fmt(TimeUnit.MINUTES.toNanos(100), 2, "min", TimeUnit.MINUTES));
TIME_FORMATTERS.add(fmt(TimeUnit.HOURS.toNanos(8), 3, "min", TimeUnit.MINUTES));
TIME_FORMATTERS.add(fmt(TimeUnit.HOURS.toNanos(10), 1, "h", TimeUnit.HOURS));
TIME_FORMATTERS.add(fmt(TimeUnit.HOURS.toNanos(100), 2, "h", TimeUnit.HOURS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(8), 1, "h", TimeUnit.HOURS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(10), 1, "d", TimeUnit.DAYS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(100), 2, "d", TimeUnit.DAYS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(1000), 3, "d", TimeUnit.DAYS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(10000), 4, "d", TimeUnit.DAYS));
TIME_FORMATTERS.add(fmt(TimeUnit.DAYS.toNanos(100000), 5, "d", TimeUnit.DAYS));
TIME_FORMATTERS.add(fmt(Long.MAX_VALUE, 6, "d", TimeUnit.DAYS));
// TimeUnit.NANOSECONDS.toDays(java.lang.Long.MAX_VALUE) == 106751
final String[] binaryUnits = {"B", "KiB", "MiB", "GiB", "TiB", "PiB"};
for (int i = 0; i < binaryUnits.length; ++i) {
BINARY_FORMATTERS.add(bin(10, i, 1, "_" + binaryUnits[i]));
BINARY_FORMATTERS.add(bin(100, i, 2, "_" + binaryUnits[i]));
BINARY_FORMATTERS.add(bin(1000, i, 3, "_" + binaryUnits[i]));
BINARY_FORMATTERS.add(bin(10000, i, 4, "_" + binaryUnits[i]));
}
BINARY_FORMATTERS.add(new ValueFormatter(Long.MAX_VALUE, 4, "_PiB", v -> v >> 50));
final String[] decimalUnits = {"", "_k", "_M", "_G", "_T", "_P"};
for (int i = 0; i < decimalUnits.length; ++i) {
final int pow = i * 3;
DECIMAL_FORMATTERS.add(dec(10, pow, 1, decimalUnits[i]));
DECIMAL_FORMATTERS.add(dec(100, pow, 2, decimalUnits[i]));
DECIMAL_FORMATTERS.add(dec(1000, pow, 3, decimalUnits[i]));
DECIMAL_FORMATTERS.add(dec(10000, pow, 4, decimalUnits[i]));
}
DECIMAL_FORMATTERS.add(new ValueFormatter(Long.MAX_VALUE, 1, "_E", v -> v / pow10(1, 18)));
}