diff --git a/public/app/features/trails/ActionTabs/MetricOverviewScene.tsx b/public/app/features/trails/ActionTabs/MetricOverviewScene.tsx index 4948504c077..7e1b9c141ce 100644 --- a/public/app/features/trails/ActionTabs/MetricOverviewScene.tsx +++ b/public/app/features/trails/ActionTabs/MetricOverviewScene.tsx @@ -10,6 +10,7 @@ import { import { Stack, Text, TextLink } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; +import { getUnitFromMetric } from '../AutomaticMetricQueries/units'; import { MetricScene } from '../MetricScene'; import { StatusWrapper } from '../StatusWrapper'; import { reportExploreMetrics } from '../interactions'; @@ -67,6 +68,10 @@ export class MetricOverviewScene extends SceneObjectBase @@ -105,7 +110,7 @@ export class MetricOverviewScene extends SceneObjectBase{metadata?.unit} ) : ( - Unknown + {unit} )} diff --git a/public/app/features/trails/AutomaticMetricQueries/units.test.ts b/public/app/features/trails/AutomaticMetricQueries/units.test.ts new file mode 100644 index 00000000000..15f61988690 --- /dev/null +++ b/public/app/features/trails/AutomaticMetricQueries/units.test.ts @@ -0,0 +1,18 @@ +import { getUnitFromMetric } from './units'; + +// Tests for units +describe('getUnitFromMetric', () => { + it('should return the last part of the metric if it is a valid unit', () => { + expect(getUnitFromMetric('go_gc_gomemlimit_bytes')).toBe('bytes'); + expect(getUnitFromMetric('go_gc_duration_seconds')).toBe('seconds'); + }); + + it('should return the second to last part of the metric if it is a valid unit', () => { + expect(getUnitFromMetric('go_gc_heap_allocs_by_size_bytes_count')).toBe('bytes'); + expect(getUnitFromMetric('go_cpu_classes_gc_mark_assist_cpu_seconds_total')).toBe('seconds'); + }); + + it('should return null if no valid unit is found', () => { + expect(getUnitFromMetric('ALERTS')).toBe(null); + }); +}); diff --git a/public/app/features/trails/AutomaticMetricQueries/units.ts b/public/app/features/trails/AutomaticMetricQueries/units.ts index 5a150809b1e..e025d41af2d 100644 --- a/public/app/features/trails/AutomaticMetricQueries/units.ts +++ b/public/app/features/trails/AutomaticMetricQueries/units.ts @@ -1,5 +1,20 @@ const DEFAULT_UNIT = 'short'; +// Get unit from metric name (e.g. "go_gc_duration_seconds" -> "seconds") +export function getUnitFromMetric(metric: string) { + const metricParts = metric.split('_'); + const suffix = metricParts.at(-1) ?? ''; + const secondToLastSuffix = metricParts.at(-2) ?? ''; + if (UNIT_LIST.includes(suffix)) { + return suffix; + } else if (UNIT_LIST.includes(secondToLastSuffix)) { + return secondToLastSuffix; + } else { + return null; + } +} + +// Get Grafana unit for a panel (e.g. "go_gc_duration_seconds" -> "s") export function getUnit(metricPart: string | undefined) { return (metricPart && UNIT_MAP[metricPart]) || DEFAULT_UNIT; } @@ -9,6 +24,8 @@ const UNIT_MAP: Record = { seconds: 's', }; +const UNIT_LIST = ['bytes', 'seconds']; + const RATE_UNIT_MAP: Record = { bytes: 'Bps', // bytes per second seconds: 'short', // seconds per second is unitless -- this may indicate a count of some resource that is active diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 9885a315581..ce8d0076cc6 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -1,5 +1,6 @@ { "_comment": "The code is the source of truth for English phrases. They should be updated in the components directly, and additional plurals specified in this file.", + "{unit}": "{unit}", "access-control": { "add-permission": { "role-label": "Role", diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json index 4b0ac98fbba..f3b8135be83 100644 --- a/public/locales/pseudo-LOCALE/grafana.json +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -1,5 +1,6 @@ { "_comment": "Ŧĥę čőđę įş ŧĥę şőūřčę őƒ ŧřūŧĥ ƒőř Ēʼnģľįşĥ pĥřäşęş. Ŧĥęy şĥőūľđ þę ūpđäŧęđ įʼn ŧĥę čőmpőʼnęʼnŧş đįřęčŧľy, äʼnđ äđđįŧįőʼnäľ pľūřäľş şpęčįƒįęđ įʼn ŧĥįş ƒįľę.", + "{unit}": "{ūʼnįŧ}", "access-control": { "add-permission": { "role-label": "Ŗőľę",