diff --git a/x-pack/plugins/canvas/__tests__/fixtures/workpads.ts b/x-pack/plugins/canvas/__tests__/fixtures/workpads.ts index 4b1f31cb1468..0d2939ed0e8a 100644 --- a/x-pack/plugins/canvas/__tests__/fixtures/workpads.ts +++ b/x-pack/plugins/canvas/__tests__/fixtures/workpads.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { CanvasWorkpad, CanvasElement, CanvasPage } from '../../types'; +import { CanvasWorkpad, CanvasElement, CanvasPage, CanvasVariable } from '../../types'; const BaseWorkpad: CanvasWorkpad = { '@created': '2019-02-08T18:35:23.029Z', @@ -50,6 +50,12 @@ const BaseElement: CanvasElement = { filter: '', }; +const BaseVariable: CanvasVariable = { + name: 'my-var', + value: 'Hello World', + type: 'string', +}; + export const workpads: CanvasWorkpad[] = [ { ...BaseWorkpad, @@ -71,6 +77,11 @@ export const workpads: CanvasWorkpad[] = [ ], }, ], + variables: [ + { + ...BaseVariable, + }, + ], }, { ...BaseWorkpad, @@ -82,6 +93,11 @@ export const workpads: CanvasWorkpad[] = [ ], }, ], + variables: [ + { + ...BaseVariable, + }, + ], }, { ...BaseWorkpad, @@ -103,6 +119,11 @@ export const workpads: CanvasWorkpad[] = [ { ...BasePage, elements: [{ ...BaseElement, expression: 'image | render' }] }, { ...BasePage, elements: [{ ...BaseElement, expression: 'image | render' }] }, ], + variables: [ + { + ...BaseVariable, + }, + ], }, { ...BaseWorkpad, @@ -136,6 +157,11 @@ export const workpads: CanvasWorkpad[] = [ ], }, ], + variables: [ + { + ...BaseVariable, + }, + ], }, { ...BaseWorkpad, @@ -166,6 +192,17 @@ export const workpads: CanvasWorkpad[] = [ ], }, ], + variables: [ + { + ...BaseVariable, + }, + { + ...BaseVariable, + }, + { + ...BaseVariable, + }, + ], }, { ...BaseWorkpad, diff --git a/x-pack/plugins/canvas/server/collectors/workpad_collector.test.ts b/x-pack/plugins/canvas/server/collectors/workpad_collector.test.ts index 9f71edcc05bf..32665cc42dc4 100644 --- a/x-pack/plugins/canvas/server/collectors/workpad_collector.test.ts +++ b/x-pack/plugins/canvas/server/collectors/workpad_collector.test.ts @@ -49,6 +49,14 @@ describe('usage collector handle es response data', () => { 'shape', ], }, + variables: { + total: 7, + per_workpad: { + avg: 1.1666666666666667, + min: 0, + max: 3, + }, + }, }); }); @@ -63,6 +71,7 @@ describe('usage collector handle es response data', () => { pages: { total: 1, per_workpad: { avg: 1, min: 1, max: 1 } }, elements: { total: 1, per_page: { avg: 1, min: 1, max: 1 } }, functions: { total: 1, in_use: ['toast'], per_element: { avg: 1, min: 1, max: 1 } }, + variables: { total: 1, per_workpad: { avg: 1, min: 1, max: 1 } }, }); }); @@ -76,6 +85,39 @@ describe('usage collector handle es response data', () => { pages: { total: 0, per_workpad: { avg: 0, min: 0, max: 0 } }, elements: undefined, functions: undefined, + variables: { total: 1, per_workpad: { avg: 1, min: 1, max: 1 } }, // Variables still possible even with no pages + }); + }); + + it('should handle cases where the version workpad might not have variables', () => { + const workpad = cloneDeep(workpads[0]); + // @ts-ignore + workpad.variables = undefined; + + const mockWorkpadsOld = [workpad]; + const usage = summarizeWorkpads(mockWorkpadsOld); + expect(usage).toEqual({ + workpads: { total: 1 }, + pages: { total: 1, per_workpad: { avg: 1, min: 1, max: 1 } }, + elements: { total: 1, per_page: { avg: 1, min: 1, max: 1 } }, + functions: { + total: 7, + in_use: [ + 'demodata', + 'ply', + 'rowCount', + 'as', + 'staticColumn', + 'math', + 'mapColumn', + 'sort', + 'pointseries', + 'plot', + 'seriesStyle', + ], + per_element: { avg: 7, min: 7, max: 7 }, + }, + variables: { total: 0, per_workpad: { avg: 0, min: 0, max: 0 } }, // Variables still possible even with no pages }); }); diff --git a/x-pack/plugins/canvas/server/collectors/workpad_collector.ts b/x-pack/plugins/canvas/server/collectors/workpad_collector.ts index 4b00d061c17c..9fa39c580962 100644 --- a/x-pack/plugins/canvas/server/collectors/workpad_collector.ts +++ b/x-pack/plugins/canvas/server/collectors/workpad_collector.ts @@ -44,6 +44,14 @@ interface WorkpadTelemetry { max: number; }; }; + variables?: { + total: number; + per_workpad: { + avg: number; + min: number; + max: number; + }; + }; } /** @@ -81,7 +89,10 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr }); }, []); - return { pages, elementCounts, functionCounts }; + const variableCount = + workpad.variables && workpad.variables.length ? workpad.variables.length : 0; + + return { pages, elementCounts, functionCounts, variableCount }; }); // combine together info from across the workpads @@ -91,9 +102,10 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr pageCounts: number[]; elementCounts: number[]; functionCounts: number[]; + variableCounts: number[]; }>( (accum, pageInfo) => { - const { pages, elementCounts, functionCounts } = pageInfo; + const { pages, elementCounts, functionCounts, variableCount } = pageInfo; return { pageMin: pages.count < accum.pageMin ? pages.count : accum.pageMin, @@ -101,6 +113,7 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr pageCounts: accum.pageCounts.concat(pages.count), elementCounts: accum.elementCounts.concat(elementCounts), functionCounts: accum.functionCounts.concat(functionCounts), + variableCounts: accum.variableCounts.concat([variableCount]), }; }, { @@ -109,13 +122,23 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr pageCounts: [], elementCounts: [], functionCounts: [], + variableCounts: [], } ); - const { pageCounts, pageMin, pageMax, elementCounts, functionCounts } = combinedWorkpadsInfo; + const { + pageCounts, + pageMin, + pageMax, + elementCounts, + functionCounts, + variableCounts, + } = combinedWorkpadsInfo; const pageTotal = arraySum(pageCounts); const elementsTotal = arraySum(elementCounts); const functionsTotal = arraySum(functionCounts); + const variableTotal = arraySum(variableCounts); + const pagesInfo = workpadsInfo.length > 0 ? { @@ -151,11 +174,21 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr } : undefined; + const variableInfo = { + total: variableTotal, + per_workpad: { + avg: variableTotal / variableCounts.length, + min: arrayMin(variableCounts) || 0, + max: arrayMax(variableCounts) || 0, + }, + }; + return { workpads: { total: workpadsInfo.length }, pages: pagesInfo, elements: elementsInfo, functions: functionsInfo, + variables: variableInfo, }; }