[Usage Collection] [schema] lens (#77929)

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Alejandro Fernández Haro 2020-09-24 11:40:59 +01:00 committed by GitHub
parent 8ad53d5203
commit 4d08763af7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 528 additions and 29 deletions

View file

@ -75,11 +75,9 @@ export const parsedWorkingCollector: ParsedUsageCollection = [
type: 'StringKeyword',
},
my_index_signature_prop: {
'': {
'@@INDEX@@': {
kind: SyntaxKind.NumberKeyword,
type: 'NumberKeyword',
},
'@@INDEX@@': {
kind: SyntaxKind.NumberKeyword,
type: 'NumberKeyword',
},
},
my_objects: {

View file

@ -96,16 +96,14 @@ Array [
"collectorName": "indexed_interface_with_not_matching_schema",
"fetch": Object {
"typeDescriptor": Object {
"": Object {
"@@INDEX@@": Object {
"count_1": Object {
"kind": 143,
"type": "NumberKeyword",
},
"count_2": Object {
"kind": 143,
"type": "NumberKeyword",
},
"@@INDEX@@": Object {
"count_1": Object {
"kind": 143,
"type": "NumberKeyword",
},
"count_2": Object {
"kind": 143,
"type": "NumberKeyword",
},
},
},
@ -165,11 +163,9 @@ Array [
},
},
"my_index_signature_prop": Object {
"": Object {
"@@INDEX@@": Object {
"kind": 143,
"type": "NumberKeyword",
},
"@@INDEX@@": Object {
"kind": 143,
"type": "NumberKeyword",
},
},
"my_objects": Object {

View file

@ -44,13 +44,13 @@ export function loadFixtureProgram(fixtureName: string) {
}
describe('getDescriptor', () => {
const usageInterfaces = new Map<string, ts.InterfaceDeclaration>();
const usageInterfaces = new Map<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration>();
let tsProgram: ts.Program;
beforeAll(() => {
const { program, sourceFile } = loadFixtureProgram('constants');
tsProgram = program;
for (const node of traverseNodes(sourceFile)) {
if (ts.isInterfaceDeclaration(node)) {
if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) {
const interfaceName = node.name.getText();
usageInterfaces.set(interfaceName, node);
}
@ -102,4 +102,26 @@ describe('getDescriptor', () => {
'Mapping does not support conflicting union types.'
);
});
it('serializes TypeAliasDeclaration', () => {
const usageInterface = usageInterfaces.get('TypeAliasWithUnion')!;
const descriptor = getDescriptor(usageInterface, tsProgram);
expect(descriptor).toEqual({
locale: { kind: ts.SyntaxKind.StringKeyword, type: 'StringKeyword' },
prop1: { kind: ts.SyntaxKind.StringKeyword, type: 'StringKeyword' },
prop2: { kind: ts.SyntaxKind.StringKeyword, type: 'StringKeyword' },
prop3: { kind: ts.SyntaxKind.StringKeyword, type: 'StringKeyword' },
prop4: { kind: ts.SyntaxKind.StringLiteral, type: 'StringLiteral' },
prop5: { kind: ts.SyntaxKind.FirstLiteralToken, type: 'FirstLiteralToken' },
});
});
it('serializes Record entries', () => {
const usageInterface = usageInterfaces.get('TypeAliasWithRecord')!;
const descriptor = getDescriptor(usageInterface, tsProgram);
expect(descriptor).toEqual({
locale: { kind: ts.SyntaxKind.StringKeyword, type: 'StringKeyword' },
'@@INDEX@@': { kind: ts.SyntaxKind.NumberKeyword, type: 'NumberKeyword' },
});
});
});

View file

@ -79,9 +79,13 @@ export function getDescriptor(node: ts.Node, program: ts.Program): Descriptor |
}
if (ts.isTypeLiteralNode(node) || ts.isInterfaceDeclaration(node)) {
return node.members.reduce((acc, m) => {
acc[m.name?.getText() || ''] = getDescriptor(m, program);
return acc;
}, {} as any);
const key = m.name?.getText();
if (key) {
return { ...acc, [key]: getDescriptor(m, program) };
} else {
return { ...acc, ...getDescriptor(m, program) };
}
}, {});
}
// If it's defined as signature { [key: string]: OtherInterface }
@ -114,6 +118,10 @@ export function getDescriptor(node: ts.Node, program: ts.Program): Descriptor |
if (symbolName === 'Date') {
return { kind: TelemetryKinds.Date, type: 'Date' };
}
// Support `Record<string, SOMETHING>`
if (symbolName === 'Record' && node.typeArguments![0].kind === ts.SyntaxKind.StringKeyword) {
return { '@@INDEX@@': getDescriptor(node.typeArguments![1], program) };
}
const declaration = (symbol?.getDeclarations() || [])[0];
if (declaration) {
return getDescriptor(declaration, program);
@ -157,6 +165,19 @@ export function getDescriptor(node: ts.Node, program: ts.Program): Descriptor |
return uniqueKinds[0];
}
// Support `type MyUsageType = SomethingElse`
if (ts.isTypeAliasDeclaration(node)) {
return getDescriptor(node.type, program);
}
// Support `&` unions
if (ts.isIntersectionTypeNode(node)) {
return node.types.reduce(
(acc, unionNode) => ({ ...acc, ...getDescriptor(unionNode, program) }),
{}
);
}
switch (node.kind) {
case ts.SyntaxKind.NumberKeyword:
case ts.SyntaxKind.BooleanKeyword:

View file

@ -249,7 +249,7 @@ export function difference(actual: any, expected: any) {
function (result, value, key) {
if (key && /@@INDEX@@/.test(`${key}`)) {
// The type definition is an Index Signature, fuzzy searching for similar keys
const regexp = new RegExp(`${key}`.replace(/@@INDEX@@/g, '(.+)?'));
const regexp = new RegExp(`^${key}`.replace(/@@INDEX@@/g, '(.+)?'));
const keysInBase = Object.keys(base)
.map((k) => {
const match = k.match(regexp);

View file

@ -51,3 +51,7 @@ export const externallyDefinedSchema: MakeSchemaFrom<{ locale: string }> = {
type: 'keyword',
},
};
export type TypeAliasWithUnion = Usage & WithUnion;
export type TypeAliasWithRecord = Usage & Record<string, number>;

View file

@ -7,7 +7,6 @@
"plugins/apm/server/lib/apm_telemetry/index.ts",
"plugins/canvas/server/collectors/collector.ts",
"plugins/infra/server/usage/usage_collector.ts",
"plugins/lens/server/usage/collectors.ts",
"plugins/reporting/server/usage/reporting_usage_collector.ts",
"plugins/maps/server/maps_telemetry/collectors/register.ts"
]

View file

@ -10,6 +10,7 @@ import { UsageCollectionSetup } from 'src/plugins/usage_collection/server';
import { TaskManagerStartContract } from '../../../task_manager/server';
import { LensUsage, LensTelemetryState } from './types';
import { lensUsageSchema } from './schema';
export function registerLensUsageCollector(
usageCollection: UsageCollectionSetup,
@ -20,9 +21,9 @@ export function registerLensUsageCollector(
// mark lensUsageCollector as ready to collect when the TaskManager is ready
isCollectorReady = true;
});
const lensUsageCollector = usageCollection.makeUsageCollector({
const lensUsageCollector = usageCollection.makeUsageCollector<LensUsage>({
type: 'lens',
fetch: async (): Promise<LensUsage> => {
async fetch() {
try {
const docs = await getLatestTaskState(await taskManager);
// get the accumulated state from the recurring task
@ -55,6 +56,7 @@ export function registerLensUsageCollector(
}
},
isReady: () => isCollectorReady,
schema: lensUsageSchema,
});
usageCollection.registerCollector(lensUsageCollector);

View file

@ -0,0 +1,83 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { MakeSchemaFrom } from 'src/plugins/usage_collection/server';
import { LensUsage } from './types';
const eventsSchema: MakeSchemaFrom<LensUsage['events_30_days']> = {
app_query_change: { type: 'long' },
indexpattern_field_info_click: { type: 'long' },
loaded: { type: 'long' },
app_filters_updated: { type: 'long' },
app_date_change: { type: 'long' },
save_failed: { type: 'long' },
loaded_404: { type: 'long' },
drop_total: { type: 'long' },
chart_switch: { type: 'long' },
suggestion_confirmed: { type: 'long' },
suggestion_clicked: { type: 'long' },
drop_onto_workspace: { type: 'long' },
drop_non_empty: { type: 'long' },
drop_empty: { type: 'long' },
indexpattern_changed: { type: 'long' },
indexpattern_filters_cleared: { type: 'long' },
indexpattern_type_filter_toggled: { type: 'long' },
indexpattern_existence_toggled: { type: 'long' },
indexpattern_show_all_fields_clicked: { type: 'long' },
drop_onto_dimension: { type: 'long' },
indexpattern_dimension_removed: { type: 'long' },
indexpattern_dimension_field_changed: { type: 'long' },
xy_change_layer_display: { type: 'long' },
xy_layer_removed: { type: 'long' },
xy_layer_added: { type: 'long' },
indexpattern_dimension_operation_terms: { type: 'long' },
indexpattern_dimension_operation_date_histogram: { type: 'long' },
indexpattern_dimension_operation_avg: { type: 'long' },
indexpattern_dimension_operation_min: { type: 'long' },
indexpattern_dimension_operation_max: { type: 'long' },
indexpattern_dimension_operation_sum: { type: 'long' },
indexpattern_dimension_operation_count: { type: 'long' },
indexpattern_dimension_operation_cardinality: { type: 'long' },
indexpattern_dimension_operation_filters: { type: 'long' },
};
const suggestionEventsSchema: MakeSchemaFrom<LensUsage['suggestion_events_30_days']> = {
back_to_current: { type: 'long' },
reload: { type: 'long' },
};
const savedSchema: MakeSchemaFrom<LensUsage['saved_overall']> = {
bar: { type: 'long' },
bar_horizontal: { type: 'long' },
line: { type: 'long' },
area: { type: 'long' },
bar_stacked: { type: 'long' },
bar_percentage_stacked: { type: 'long' },
bar_horizontal_stacked: { type: 'long' },
bar_horizontal_percentage_stacked: { type: 'long' },
area_stacked: { type: 'long' },
area_percentage_stacked: { type: 'long' },
lnsDatatable: { type: 'long' },
lnsPie: { type: 'long' },
lnsMetric: { type: 'long' },
};
export const lensUsageSchema: MakeSchemaFrom<LensUsage> = {
// LensClickUsage
events_30_days: eventsSchema,
events_90_days: eventsSchema,
suggestion_events_30_days: suggestionEventsSchema,
suggestion_events_90_days: suggestionEventsSchema,
// LensVisualizationUsage
saved_overall_total: { type: 'long' },
saved_30_days_total: { type: 'long' },
saved_90_days_total: { type: 'long' },
saved_overall: savedSchema,
saved_30_days: savedSchema,
saved_90_days: savedSchema,
};

View file

@ -155,6 +155,380 @@
}
}
},
"lens": {
"properties": {
"events_30_days": {
"properties": {
"app_query_change": {
"type": "long"
},
"indexpattern_field_info_click": {
"type": "long"
},
"loaded": {
"type": "long"
},
"app_filters_updated": {
"type": "long"
},
"app_date_change": {
"type": "long"
},
"save_failed": {
"type": "long"
},
"loaded_404": {
"type": "long"
},
"drop_total": {
"type": "long"
},
"chart_switch": {
"type": "long"
},
"suggestion_confirmed": {
"type": "long"
},
"suggestion_clicked": {
"type": "long"
},
"drop_onto_workspace": {
"type": "long"
},
"drop_non_empty": {
"type": "long"
},
"drop_empty": {
"type": "long"
},
"indexpattern_changed": {
"type": "long"
},
"indexpattern_filters_cleared": {
"type": "long"
},
"indexpattern_type_filter_toggled": {
"type": "long"
},
"indexpattern_existence_toggled": {
"type": "long"
},
"indexpattern_show_all_fields_clicked": {
"type": "long"
},
"drop_onto_dimension": {
"type": "long"
},
"indexpattern_dimension_removed": {
"type": "long"
},
"indexpattern_dimension_field_changed": {
"type": "long"
},
"xy_change_layer_display": {
"type": "long"
},
"xy_layer_removed": {
"type": "long"
},
"xy_layer_added": {
"type": "long"
},
"indexpattern_dimension_operation_terms": {
"type": "long"
},
"indexpattern_dimension_operation_date_histogram": {
"type": "long"
},
"indexpattern_dimension_operation_avg": {
"type": "long"
},
"indexpattern_dimension_operation_min": {
"type": "long"
},
"indexpattern_dimension_operation_max": {
"type": "long"
},
"indexpattern_dimension_operation_sum": {
"type": "long"
},
"indexpattern_dimension_operation_count": {
"type": "long"
},
"indexpattern_dimension_operation_cardinality": {
"type": "long"
},
"indexpattern_dimension_operation_filters": {
"type": "long"
}
}
},
"events_90_days": {
"properties": {
"app_query_change": {
"type": "long"
},
"indexpattern_field_info_click": {
"type": "long"
},
"loaded": {
"type": "long"
},
"app_filters_updated": {
"type": "long"
},
"app_date_change": {
"type": "long"
},
"save_failed": {
"type": "long"
},
"loaded_404": {
"type": "long"
},
"drop_total": {
"type": "long"
},
"chart_switch": {
"type": "long"
},
"suggestion_confirmed": {
"type": "long"
},
"suggestion_clicked": {
"type": "long"
},
"drop_onto_workspace": {
"type": "long"
},
"drop_non_empty": {
"type": "long"
},
"drop_empty": {
"type": "long"
},
"indexpattern_changed": {
"type": "long"
},
"indexpattern_filters_cleared": {
"type": "long"
},
"indexpattern_type_filter_toggled": {
"type": "long"
},
"indexpattern_existence_toggled": {
"type": "long"
},
"indexpattern_show_all_fields_clicked": {
"type": "long"
},
"drop_onto_dimension": {
"type": "long"
},
"indexpattern_dimension_removed": {
"type": "long"
},
"indexpattern_dimension_field_changed": {
"type": "long"
},
"xy_change_layer_display": {
"type": "long"
},
"xy_layer_removed": {
"type": "long"
},
"xy_layer_added": {
"type": "long"
},
"indexpattern_dimension_operation_terms": {
"type": "long"
},
"indexpattern_dimension_operation_date_histogram": {
"type": "long"
},
"indexpattern_dimension_operation_avg": {
"type": "long"
},
"indexpattern_dimension_operation_min": {
"type": "long"
},
"indexpattern_dimension_operation_max": {
"type": "long"
},
"indexpattern_dimension_operation_sum": {
"type": "long"
},
"indexpattern_dimension_operation_count": {
"type": "long"
},
"indexpattern_dimension_operation_cardinality": {
"type": "long"
},
"indexpattern_dimension_operation_filters": {
"type": "long"
}
}
},
"suggestion_events_30_days": {
"properties": {
"back_to_current": {
"type": "long"
},
"reload": {
"type": "long"
}
}
},
"suggestion_events_90_days": {
"properties": {
"back_to_current": {
"type": "long"
},
"reload": {
"type": "long"
}
}
},
"saved_overall_total": {
"type": "long"
},
"saved_30_days_total": {
"type": "long"
},
"saved_90_days_total": {
"type": "long"
},
"saved_overall": {
"properties": {
"bar": {
"type": "long"
},
"bar_horizontal": {
"type": "long"
},
"line": {
"type": "long"
},
"area": {
"type": "long"
},
"bar_stacked": {
"type": "long"
},
"bar_percentage_stacked": {
"type": "long"
},
"bar_horizontal_stacked": {
"type": "long"
},
"bar_horizontal_percentage_stacked": {
"type": "long"
},
"area_stacked": {
"type": "long"
},
"area_percentage_stacked": {
"type": "long"
},
"lnsDatatable": {
"type": "long"
},
"lnsPie": {
"type": "long"
},
"lnsMetric": {
"type": "long"
}
}
},
"saved_30_days": {
"properties": {
"bar": {
"type": "long"
},
"bar_horizontal": {
"type": "long"
},
"line": {
"type": "long"
},
"area": {
"type": "long"
},
"bar_stacked": {
"type": "long"
},
"bar_percentage_stacked": {
"type": "long"
},
"bar_horizontal_stacked": {
"type": "long"
},
"bar_horizontal_percentage_stacked": {
"type": "long"
},
"area_stacked": {
"type": "long"
},
"area_percentage_stacked": {
"type": "long"
},
"lnsDatatable": {
"type": "long"
},
"lnsPie": {
"type": "long"
},
"lnsMetric": {
"type": "long"
}
}
},
"saved_90_days": {
"properties": {
"bar": {
"type": "long"
},
"bar_horizontal": {
"type": "long"
},
"line": {
"type": "long"
},
"area": {
"type": "long"
},
"bar_stacked": {
"type": "long"
},
"bar_percentage_stacked": {
"type": "long"
},
"bar_horizontal_stacked": {
"type": "long"
},
"bar_horizontal_percentage_stacked": {
"type": "long"
},
"area_stacked": {
"type": "long"
},
"area_percentage_stacked": {
"type": "long"
},
"lnsDatatable": {
"type": "long"
},
"lnsPie": {
"type": "long"
},
"lnsMetric": {
"type": "long"
}
}
}
}
},
"mlTelemetry": {
"properties": {
"file_data_visualizer": {