formatYAxisValue.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import {formatBytesBase2} from 'sentry/utils/bytes/formatBytesBase2';
  2. import {formatBytesBase10} from 'sentry/utils/bytes/formatBytesBase10';
  3. import {ABYTE_UNITS} from 'sentry/utils/discover/fieldRenderers';
  4. import {
  5. DurationUnit,
  6. RATE_UNIT_LABELS,
  7. RateUnit,
  8. SizeUnit,
  9. } from 'sentry/utils/discover/fields';
  10. import {formatAbbreviatedNumber} from 'sentry/utils/formatters';
  11. import {formatPercentage} from 'sentry/utils/number/formatPercentage';
  12. import {convertDuration} from 'sentry/utils/unitConversion/convertDuration';
  13. import {convertSize} from 'sentry/utils/unitConversion/convertSize';
  14. import {isADurationUnit, isARateUnit, isASizeUnit} from '../common/typePredicates';
  15. import {formatYAxisDuration} from './formatYAxisDuration';
  16. export function formatYAxisValue(value: number, type: string, unit?: string): string {
  17. if (value === 0) {
  18. return '0';
  19. }
  20. switch (type) {
  21. case 'integer':
  22. return formatAbbreviatedNumber(value);
  23. case 'number':
  24. return value.toLocaleString();
  25. case 'percentage':
  26. return formatPercentage(value, 3);
  27. case 'duration':
  28. const durationUnit = isADurationUnit(unit) ? unit : DurationUnit.MILLISECOND;
  29. const durationInMilliseconds = convertDuration(
  30. value,
  31. durationUnit,
  32. DurationUnit.MILLISECOND
  33. );
  34. return formatYAxisDuration(durationInMilliseconds);
  35. case 'size':
  36. const sizeUnit = isASizeUnit(unit) ? unit : SizeUnit.BYTE;
  37. const sizeInBytes = convertSize(value, sizeUnit, SizeUnit.BYTE);
  38. const formatter = ABYTE_UNITS.includes(unit ?? 'byte')
  39. ? formatBytesBase10
  40. : formatBytesBase2;
  41. return formatter(sizeInBytes);
  42. case 'rate':
  43. // Always show rate in the original dataset's unit. If the unit is not
  44. // appropriate, always convert the unit in the original dataset first.
  45. // This way, named rate functions like `epm()` will be shows in per minute
  46. // units
  47. const rateUnit = isARateUnit(unit) ? unit : RateUnit.PER_SECOND;
  48. return `${value.toLocaleString(undefined, {
  49. notation: 'compact',
  50. maximumSignificantDigits: 6,
  51. })}${RATE_UNIT_LABELS[rateUnit]}`;
  52. default:
  53. return value.toString();
  54. }
  55. }