Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PMM-9288 Extended profiler. #1656

Open
wants to merge 5 commits into
base: v3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 72 additions & 3 deletions pmm-app/src/pmm-qan/panel/QueryAnalytics.constants.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const metrics = {
rows_examined: {
sum: 100,
},
docs_scanned: {
docs_examined: {
sum: 200,
},
docs_returned: {
Expand Down Expand Up @@ -87,6 +87,26 @@ const metrics = {
sum: 100,
avg: 10,
},
locks_global_acquire_count_read_shared: {
sum: 100,
cnt: 100,
},
locks_global_acquire_count_write_shared: {
sum: 200,
cnt: 100,
},
locks_database_acquire_count_read_shared: {
sum: 200,
cnt: 100,
},
locks_database_acquire_wait_count_read_shared: {
sum: 200,
cnt: 100,
},
locks_collection_acquire_count_read_shared: {
sum: 200,
cnt: 100,
},
};

const EMPTY_RELATIONS_METRICS = [
Expand Down Expand Up @@ -124,6 +144,10 @@ const EMPTY_RELATIONS_METRICS = [
'sort_scan',
'cpu_user_time',
'cpu_sys_time',
'keys_examined',
'locks_database_time_acquiring_micros_read_shared',
'storage_bytes_read',
'storage_time_reading_micros',
];

describe('Query analytics metrics::', () => {
Expand All @@ -137,8 +161,8 @@ describe('Query analytics metrics::', () => {
expect(processedMetric).toBe('2.00 Bytes per row sent');
});

it('docs_scanned', () => {
const metric = METRIC_CATALOGUE.docs_scanned;
it('docs_examined', () => {
const metric = METRIC_CATALOGUE.docs_examined;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

Expand Down Expand Up @@ -317,6 +341,51 @@ describe('Query analytics metrics::', () => {
expect(absentMetric).toBe('');
});

it('locks_global_acquire_count_read_shared', () => {
const metric = METRIC_CATALOGUE.locks_global_acquire_count_read_shared;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

expect(absentMetric).toBe('');
expect(processedMetric).toBe('1.00 per query');
});

it('locks_global_acquire_count_write_shared', () => {
const metric = METRIC_CATALOGUE.locks_global_acquire_count_write_shared;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

expect(absentMetric).toBe('');
expect(processedMetric).toBe('2.00 per query');
});

it('locks_database_acquire_count_read_shared', () => {
const metric = METRIC_CATALOGUE.locks_database_acquire_count_read_shared;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

expect(absentMetric).toBe('');
expect(processedMetric).toBe('2.00 per query');
});

it('locks_database_acquire_wait_count_read_shared', () => {
const metric = METRIC_CATALOGUE.locks_database_acquire_wait_count_read_shared;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

expect(absentMetric).toBe('');
expect(processedMetric).toBe('2.00 per query');
});

it('locks_collection_acquire_count_read_shared', () => {
const metric = METRIC_CATALOGUE.locks_collection_acquire_count_read_shared;
const processedMetric = metric.metricRelation(metrics);
const absentMetric = metric.metricRelation({});

expect(absentMetric).toBe('');
expect(processedMetric).toBe('2.00 per query');
});

test.each(EMPTY_RELATIONS_METRICS)('%s', (metricName) => {
const metric = METRIC_CATALOGUE[metricName];
const processedMetric = metric.metricRelation();
Expand Down
185 changes: 180 additions & 5 deletions pmm-app/src/pmm-qan/panel/QueryAnalytics.constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,13 +295,13 @@ export const METRIC_CATALOGUE = {
perQueryStatsPipe: 'number',
},
},
docs_scanned: {
humanizeName: 'Docs scanned',
tooltipText: 'Number of scanned documents',
simpleName: 'docs_scanned',
docs_examined: {
humanizeName: 'Docs examined',
tooltipText: 'Number of examined documents',
simpleName: 'docs_examined',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['docs_scanned', 'sum']);
const mainMetric = get(data, ['docs_examined', 'sum']);
const divider = get(data, ['docs_returned', 'sum']);

if (!mainMetric || !divider) {
Expand Down Expand Up @@ -1111,4 +1111,179 @@ export const METRIC_CATALOGUE = {
perQueryStatsPipe: 'number',
},
},
keys_examined: {
humanizeName: 'Keys Examined',
tooltipText: 'Number of index keys scanned during query execution',
simpleName: 'docs_returned',
serviceTypes: [Databases.mongodb],
metricRelation: () => '',
units: Units.NONE,
pipeTypes: {
ratePipe: 'number',
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: 'number',
},
},
locks_global_acquire_count_read_shared: {
humanizeName: 'Locks Global Acquire Count Read Shared',
tooltipText: 'Number of times a global read lock was acquired during query execution',
simpleName: 'locks_global_acquire_count_read_shared',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['locks_global_acquire_count_read_shared', 'sum']);
const divider = get(data, ['locks_global_acquire_count_read_shared', 'cnt']);

if (!mainMetric || !divider) {
return '';
}

return `${humanize.transform(mainMetric / divider, 'number')} per query`;
},
units: Units.NONE,
pipeTypes: {
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: '',
},
},
locks_global_acquire_count_write_shared: {
humanizeName: 'Locks Global Acquire Count Write Shared',
tooltipText: 'Number of times a global write lock was acquired during query execution',
simpleName: 'locks_global_acquire_count_write_shared',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['locks_global_acquire_count_write_shared', 'sum']);
const divider = get(data, ['locks_global_acquire_count_write_shared', 'cnt']);

if (!mainMetric || !divider) {
return '';
}

return `${humanize.transform(mainMetric / divider, 'number')} per query`;
},
units: Units.NONE,
pipeTypes: {
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: '',
},
},
locks_database_acquire_count_read_shared: {
humanizeName: 'Locks Database Acquire Count Read Shared',
tooltipText: 'Number of times a read lock was acquired at the database level during query execution',
simpleName: 'locks_database_acquire_count_read_shared',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['locks_database_acquire_count_read_shared', 'sum']);
const divider = get(data, ['locks_database_acquire_count_read_shared', 'cnt']);

if (!mainMetric || !divider) {
return '';
}

return `${humanize.transform(mainMetric / divider, 'number')} per query`;
},
units: Units.NONE,
pipeTypes: {
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: '',
},
},
locks_database_acquire_wait_count_read_shared: {
humanizeName: 'Locks Database Acquire Wait Count Read Shared',
tooltipText: 'Number of times a read lock at the database level was requested but had to wait before being granted',
simpleName: 'locks_database_acquire_wait_count_read_shared',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['locks_database_acquire_wait_count_read_shared', 'sum']);
const divider = get(data, ['locks_database_acquire_wait_count_read_shared', 'cnt']);

if (!mainMetric || !divider) {
return '';
}

return `${humanize.transform(mainMetric / divider, 'number')} per query`;
},
units: Units.NONE,
pipeTypes: {
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: '',
},
},
locks_database_time_acquiring_micros_read_shared: {
humanizeName: 'Locks Database Time Acquiring Micros Read Shared',
tooltipText: 'Indicates the time, spent acquiring a read lock at the database level during an operation',
simpleName: 'locks_database_time_acquiring_micros_read_shared',
serviceTypes: [Databases.mongodb],
metricRelation: () => '',
units: Units.AVG_LOAD,
pipeTypes: {
ratePipe: 'number',
sumPipe: 'time',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: 'time',
},
},
locks_collection_acquire_count_read_shared: {
humanizeName: 'Locks Collection Acquire Count Read Shared',
tooltipText: 'Number of times a read lock was acquired on a specific collection during operations',
simpleName: 'locks_collection_acquire_count_read_shared',
serviceTypes: [Databases.mongodb],
metricRelation: (data) => {
const mainMetric = get(data, ['locks_collection_acquire_count_read_shared', 'sum']);
const divider = get(data, ['locks_collection_acquire_count_read_shared', 'cnt']);

if (!mainMetric || !divider) {
return '';
}

return `${humanize.transform(mainMetric / divider, 'number')} per query`;
},
units: Units.NONE,
pipeTypes: {
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: '',
},
},
storage_bytes_read: {
humanizeName: 'Storage Bytes Read',
tooltipText: 'Total number of bytes read from storage during a specific operation',
simpleName: 'storage_bytes_read',
serviceTypes: [Databases.mongodb],
metricRelation: () => '',
units: Units.NONE,
pipeTypes: {
ratePipe: 'number',
sumPipe: 'number',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: 'number',
},
},
storage_time_reading_micros: {
humanizeName: 'Storage Time Reading Micros',
tooltipText: 'Indicates the time, spent reading data from storage during an operation',
simpleName: 'storage_time_reading_micros',
serviceTypes: [Databases.mongodb],
metricRelation: () => '',
units: Units.AVG_LOAD,
pipeTypes: {
ratePipe: 'number',
sumPipe: 'time',
subSumPipe: 'percent',
sparklineType: 'number',
perQueryStatsPipe: 'time',
},
},
};
Loading