[Infrastructure UI] Telemetry: Host view flyout - Add / Remove filter (#155511)

Closes [#155415](https://github.com/elastic/kibana/issues/155415)
## Summary

This PR adds telemetry for the flyout add/remove filter events

# Testing

- Open the hosts view flyout, select the metadata tab and add/remove a
filter from there
- Check in the network tab - there should be a request to the telemetry
cluster including the events:
<img width="2126" alt="image"
src="https://user-images.githubusercontent.com/14139027/233965729-58fd6266-7851-48e5-acf0-e395b4fd7ebe.png">

- It should be also visible in
[FS](https://app.fullstory.com/ui/1397FY/home) under API events (for
some reason I don't see the events made from my machine in FS at all so
I couldn't check it there)
This commit is contained in:
jennypavlova 2023-04-25 12:56:43 +02:00 committed by GitHub
parent 65a4ae6a7f
commit 460e9a707c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 125 additions and 4 deletions

View file

@ -22,6 +22,8 @@ const configSchema = schema.object({
'Loaded Kibana', // Sent once per page refresh (potentially, once per session)
'Hosts View Query Submitted', // Worst-case scenario 1 every 2 seconds
'Host Entry Clicked', // Worst-case scenario once per second - AT RISK,
'Host Flyout Filter Removed', // Worst-case scenario once per second - AT RISK,
'Host Flyout Filter Added', // Worst-case scenario once per second - AT RISK,
],
}),
});

View file

@ -37,6 +37,7 @@ export const AddMetadataFilterButton = ({ item }: AddMetadataFilterButtonProps)
query: { filterManager: filterManagerService },
},
notifications: { toasts: toastsService },
telemetry,
},
} = useKibanaContextForPlugin();
@ -53,6 +54,9 @@ export const AddMetadataFilterButton = ({ item }: AddMetadataFilterButtonProps)
negate: false,
});
if (newFilter) {
telemetry.reportHostFlyoutFilterAdded({
field_name: item.name,
});
filterManagerService.addFilters(newFilter);
toastsService.addSuccess({
title: filterAddedToastTitle,
@ -84,7 +88,12 @@ export const AddMetadataFilterButton = ({ item }: AddMetadataFilterButtonProps)
defaultMessage: 'Filter',
}
)}
onClick={() => filterManagerService.removeFilter(existingFilter)}
onClick={() => {
telemetry.reportHostFlyoutFilterRemoved({
field_name: existingFilter.meta.key!,
});
filterManagerService.removeFilter(existingFilter);
}}
/>
</EuiToolTip>
</span>

View file

@ -10,4 +10,6 @@ import { ITelemetryClient } from './types';
export const createTelemetryClientMock = (): jest.Mocked<ITelemetryClient> => ({
reportHostEntryClicked: jest.fn(),
reportHostsViewQuerySubmitted: jest.fn(),
reportHostFlyoutFilterRemoved: jest.fn(),
reportHostFlyoutFilterAdded: jest.fn(),
});

View file

@ -8,6 +8,7 @@
import { AnalyticsServiceSetup } from '@kbn/core-analytics-server';
import {
HostEntryClickedParams,
HostFlyoutFilterActionParams,
HostsViewQuerySubmittedParams,
InfraTelemetryEventTypes,
ITelemetryClient,
@ -30,6 +31,22 @@ export class TelemetryClient implements ITelemetryClient {
});
};
public reportHostFlyoutFilterRemoved = ({
field_name: fieldName,
}: HostFlyoutFilterActionParams) => {
this.analytics.reportEvent(InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_REMOVED, {
field_name: fieldName,
});
};
public reportHostFlyoutFilterAdded = ({
field_name: fieldName,
}: HostFlyoutFilterActionParams) => {
this.analytics.reportEvent(InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_ADDED, {
field_name: fieldName,
});
};
public reportHostsViewQuerySubmitted = (params: HostsViewQuerySubmittedParams) => {
this.analytics.reportEvent(InfraTelemetryEventTypes.HOSTS_VIEW_QUERY_SUBMITTED, params);
};

View file

@ -66,4 +66,34 @@ const hostsEntryClickedEvent: InfraTelemetryEvent = {
},
};
export const infraTelemetryEvents = [hostsViewQuerySubmittedEvent, hostsEntryClickedEvent];
const hostFlyoutRemoveFilter: InfraTelemetryEvent = {
eventType: InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_REMOVED,
schema: {
field_name: {
type: 'keyword',
_meta: {
description: 'Removed filter field name for the selected host.',
optional: false,
},
},
},
};
const hostFlyoutAddFilter: InfraTelemetryEvent = {
eventType: InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_ADDED,
schema: {
field_name: {
type: 'keyword',
_meta: {
description: 'Added filter field name for the selected host.',
optional: false,
},
},
},
};
export const infraTelemetryEvents = [
hostsViewQuerySubmittedEvent,
hostsEntryClickedEvent,
hostFlyoutRemoveFilter,
hostFlyoutAddFilter,
];

View file

@ -49,6 +49,8 @@ describe('TelemetryService', () => {
const telemetry = service.start();
expect(telemetry).toHaveProperty('reportHostEntryClicked');
expect(telemetry).toHaveProperty('reportHostFlyoutFilterRemoved');
expect(telemetry).toHaveProperty('reportHostFlyoutFilterAdded');
expect(telemetry).toHaveProperty('reportHostsViewQuerySubmitted');
});
});
@ -74,7 +76,7 @@ describe('TelemetryService', () => {
);
});
it('should report hosts entry click with cloud provider equal to "unknow" if not exist', async () => {
it('should report hosts entry click with cloud provider equal to "unknown" if not exist', async () => {
const setupParams = getSetupParams();
service.setup(setupParams);
const telemetry = service.start();
@ -119,4 +121,44 @@ describe('TelemetryService', () => {
);
});
});
describe('#reportHostFlyoutFilterRemoved', () => {
it('should report Host Flyout Filter Removed click with field name', async () => {
const setupParams = getSetupParams();
service.setup(setupParams);
const telemetry = service.start();
telemetry.reportHostFlyoutFilterRemoved({
field_name: 'agent.version',
});
expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1);
expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith(
InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_REMOVED,
{
field_name: 'agent.version',
}
);
});
});
describe('#reportHostFlyoutFilterAdded', () => {
it('should report Host Flyout Filter Added click with field name', async () => {
const setupParams = getSetupParams();
service.setup(setupParams);
const telemetry = service.start();
telemetry.reportHostFlyoutFilterAdded({
field_name: 'agent.version',
});
expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1);
expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith(
InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_ADDED,
{
field_name: 'agent.version',
}
);
});
});
});

View file

@ -15,6 +15,8 @@ export interface TelemetryServiceSetupParams {
export enum InfraTelemetryEventTypes {
HOSTS_VIEW_QUERY_SUBMITTED = 'Hosts View Query Submitted',
HOSTS_ENTRY_CLICKED = 'Host Entry Clicked',
HOST_FLYOUT_FILTER_REMOVED = 'Host Flyout Filter Removed',
HOST_FLYOUT_FILTER_ADDED = 'Host Flyout Filter Added',
}
export interface HostsViewQuerySubmittedParams {
@ -29,10 +31,19 @@ export interface HostEntryClickedParams {
cloud_provider?: string | null;
}
export type InfraTelemetryEventParams = HostsViewQuerySubmittedParams | HostEntryClickedParams;
export interface HostFlyoutFilterActionParams {
field_name: string;
}
export type InfraTelemetryEventParams =
| HostsViewQuerySubmittedParams
| HostEntryClickedParams
| HostFlyoutFilterActionParams;
export interface ITelemetryClient {
reportHostEntryClicked(params: HostEntryClickedParams): void;
reportHostFlyoutFilterRemoved(params: HostFlyoutFilterActionParams): void;
reportHostFlyoutFilterAdded(params: HostFlyoutFilterActionParams): void;
reportHostsViewQuerySubmitted(params: HostsViewQuerySubmittedParams): void;
}
@ -41,6 +52,14 @@ export type InfraTelemetryEvent =
eventType: InfraTelemetryEventTypes.HOSTS_VIEW_QUERY_SUBMITTED;
schema: RootSchema<HostsViewQuerySubmittedParams>;
}
| {
eventType: InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_ADDED;
schema: RootSchema<HostFlyoutFilterActionParams>;
}
| {
eventType: InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_REMOVED;
schema: RootSchema<HostFlyoutFilterActionParams>;
}
| {
eventType: InfraTelemetryEventTypes.HOSTS_ENTRY_CLICKED;
schema: RootSchema<HostEntryClickedParams>;