diff --git a/packages/grafana-data/src/field/fieldOverrides.ts b/packages/grafana-data/src/field/fieldOverrides.ts index 932d934801a..d98f72b165b 100644 --- a/packages/grafana-data/src/field/fieldOverrides.ts +++ b/packages/grafana-data/src/field/fieldOverrides.ts @@ -2,6 +2,8 @@ import { ApplyFieldOverrideOptions, DataFrame, DataLink, + DisplayProcessor, + DisplayValue, DynamicConfigValue, Field, FieldColorModeId, @@ -187,6 +189,11 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra timeZone: options.timeZone, }); + // Wrap the display with a cache to avoid double calls + if (newField.config.unit !== 'dateTimeFromNow') { + newField.display = cachingDisplayProcessor(newField.display, 2500); + } + // Attach data links supplier newField.getLinks = getLinksSupplier( newFrame, @@ -204,6 +211,24 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra }); } +function cachingDisplayProcessor(disp: DisplayProcessor, maxCacheSize = 2500): DisplayProcessor { + const cache = new Map(); + + return (value: any) => { + let v = cache.get(value); + if (!v) { + // Don't grow too big + if (cache.size === maxCacheSize) { + cache.clear(); + } + + v = disp(value); + cache.set(value, v); + } + return v; + }; +} + export interface FieldOverrideEnv extends FieldOverrideContext { fieldConfigRegistry: FieldConfigOptionsRegistry; }