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

[Infrastructure UI] Host limit telemetry #155726

Merged
merged 7 commits into from
May 11, 2023
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const HOSTS_CHART: Omit<Props, 'loading' | 'value'> = {
toolTip: i18n.translate('xpack.infra.hostsViewPage.metricTrend.hostCount.tooltip', {
defaultMessage: 'The number of hosts returned by your current search criteria.',
}),
['data-test-subj']: 'hostsView-metricsTrend-hosts',
['data-test-subj']: 'hostsViewKPI-hostsCount',
};

export const HostsTile = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export const KPIGrid = () => {
direction="row"
gutterSize="s"
style={{ flexGrow: 0 }}
data-test-subj="hostsView-metricsTrend"
data-test-subj="hostsViewKPIGrid"
>
<EuiFlexItem>
<HostsTile />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ export const Tile = ({
hasShadow={false}
paddingSize={error ? 'm' : 'none'}
style={{ minHeight: MIN_HEIGHT }}
data-test-subj={`hostsView-metricsTrend-${type}`}
data-test-subj={`hostsViewKPI-${type}`}
>
{error ? (
<EuiFlexGroup
Expand Down Expand Up @@ -145,7 +145,7 @@ export const Tile = ({
anchorClassName="eui-fullWidth"
>
<LensWrapper
id={`hostViewKPIChart-${type}`}
id={`hostsViewKPIGrid${type}Tile`}
attributes={afterLoadedState.attributes}
style={{ height: MIN_HEIGHT }}
extraActions={[extraActionOptions.openInLens]}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,5 @@ const options: EuiButtonGroupOptionProps[] = HOST_LIMIT_OPTIONS.map((option) =>
id: buildId(option),
label: `${option}`,
value: option,
'data-test-subj': `hostsViewLimitSelection${option}button`,
'data-test-subj': `hostsViewLimitSelection${option}Button`,
}));
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ import { useCallback, useEffect } from 'react';
import { catchError, map, Observable, of, startWith } from 'rxjs';
import createContainer from 'constate';
import type { QueryDslQueryContainer, SearchResponse } from '@elastic/elasticsearch/lib/api/types';
import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana';
import { decodeOrThrow } from '../../../../../common/runtime_types';
import { useDataSearch, useLatestPartialDataSearchResponse } from '../../../../utils/data_search';
import { useMetricsDataViewContext } from './use_data_view';
import { useUnifiedSearchContext } from './use_unified_search';

export const useHostCount = () => {
const { dataView, metricAlias } = useMetricsDataViewContext();
const {
services: { telemetry },
} = useKibanaContextForPlugin();
const { buildQuery, getParsedDateRange } = useUnifiedSearchContext();

const { search: fetchHostCount, requests$ } = useDataSearch({
Expand Down Expand Up @@ -81,6 +85,14 @@ export const useHostCount = () => {
fetchHostCount();
}, [fetchHostCount]);

useEffect(() => {
if (latestResponseData) {
telemetry.reportHostsViewTotalHostCountRetrieved({
total: latestResponseData.count.value,
});
}
}, [latestResponseData, telemetry]);

return {
errors: latestResponseErrors,
isRequestRunning,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
InfraAssetMetricType,
} from '../../../../../common/http_api';
import { useHostFlyoutOpen } from './use_host_flyout_open_url_state';
import { Sorting, useHostsTableProperties } from './use_hosts_table_url_state';
import { Sorting, useHostsTableUrlState } from './use_hosts_table_url_state';
import { useHostsViewContext } from './use_hosts_view';
import { useUnifiedSearchContext } from './use_unified_search';

Expand Down Expand Up @@ -166,7 +166,7 @@ const toggleDialogActionLabel = i18n.translate(
export const useHostsTable = () => {
const { hostNodes } = useHostsViewContext();
const { searchCriteria } = useUnifiedSearchContext();
const [{ pagination, sorting }, setProperties] = useHostsTableProperties();
const [{ pagination, sorting }, setProperties] = useHostsTableUrlState();
const {
services: { telemetry },
} = useKibanaContextForPlugin();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const reducer = (prevState: TableProperties, params: Payload) => {
};
};

export const useHostsTableProperties = (): [TableProperties, TablePropertiesUpdater] => {
export const useHostsTableUrlState = (): [TableProperties, TablePropertiesUpdater] => {
const [localStoragePageSize, setLocalStoragePageSize] = useLocalStorage<number>(
LOCAL_STORAGE_PAGE_SIZE_KEY,
DEFAULT_PAGE_SIZE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,14 @@ import {
const buildQuerySubmittedPayload = (
hostState: HostsState & { parsedDateRange: StringDateRangeTimestamp }
) => {
const { panelFilters, filters, parsedDateRange, query: queryObj } = hostState;
const { panelFilters, filters, parsedDateRange, query: queryObj, limit } = hostState;

return {
control_filters: panelFilters.map((filter) => JSON.stringify(filter)),
filters: filters.map((filter) => JSON.stringify(filter)),
interval: telemetryTimeRangeFormatter(parsedDateRange.to - parsedDateRange.from),
query: queryObj.query,
limit,
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ export const createTelemetryClientMock = (): jest.Mocked<ITelemetryClient> => ({
reportHostsViewQuerySubmitted: jest.fn(),
reportHostFlyoutFilterRemoved: jest.fn(),
reportHostFlyoutFilterAdded: jest.fn(),
reportHostsViewTotalHostCountRetrieved: jest.fn(),
});
10 changes: 10 additions & 0 deletions x-pack/plugins/infra/public/services/telemetry/telemetry_client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { AnalyticsServiceSetup } from '@kbn/core-analytics-server';
import {
HostEntryClickedParams,
HostFlyoutFilterActionParams,
HostsViewQueryHostsCountRetrievedParams,
HostsViewQuerySubmittedParams,
InfraTelemetryEventTypes,
ITelemetryClient,
Expand Down Expand Up @@ -50,4 +51,13 @@ export class TelemetryClient implements ITelemetryClient {
public reportHostsViewQuerySubmitted = (params: HostsViewQuerySubmittedParams) => {
this.analytics.reportEvent(InfraTelemetryEventTypes.HOSTS_VIEW_QUERY_SUBMITTED, params);
};

public reportHostsViewTotalHostCountRetrieved(
params: HostsViewQueryHostsCountRetrievedParams
): void {
this.analytics.reportEvent(
InfraTelemetryEventTypes.HOST_VIEW_TOTAL_HOST_COUNT_RETRIEVED,
params
);
}
}
22 changes: 22 additions & 0 deletions x-pack/plugins/infra/public/services/telemetry/telemetry_events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ const hostsViewQuerySubmittedEvent: InfraTelemetryEvent = {
optional: false,
},
},
limit: {
type: 'integer',
_meta: {
description: 'Selected host limit',
optional: false,
},
},
},
};

Expand Down Expand Up @@ -78,6 +85,7 @@ const hostFlyoutRemoveFilter: InfraTelemetryEvent = {
},
},
};

const hostFlyoutAddFilter: InfraTelemetryEvent = {
eventType: InfraTelemetryEventTypes.HOST_FLYOUT_FILTER_ADDED,
schema: {
Expand All @@ -91,9 +99,23 @@ const hostFlyoutAddFilter: InfraTelemetryEvent = {
},
};

const hostViewTotalHostCountRetrieved: InfraTelemetryEvent = {
eventType: InfraTelemetryEventTypes.HOST_VIEW_TOTAL_HOST_COUNT_RETRIEVED,
schema: {
total: {
type: 'integer',
_meta: {
description: 'Total number of hosts retrieved.',
optional: false,
},
},
},
};

export const infraTelemetryEvents = [
hostsViewQuerySubmittedEvent,
hostsEntryClickedEvent,
hostFlyoutRemoveFilter,
hostFlyoutAddFilter,
hostViewTotalHostCountRetrieved,
];
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ describe('TelemetryService', () => {
filters: [],
interval: 'interval(now-1h)',
query: '',
limit: 100,
});

expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1);
Expand All @@ -117,6 +118,7 @@ describe('TelemetryService', () => {
filters: [],
interval: 'interval(now-1h)',
query: '',
limit: 100,
}
);
});
Expand Down Expand Up @@ -161,4 +163,24 @@ describe('TelemetryService', () => {
);
});
});

describe('#reportHostsViewTotalHostCountRetrieved', () => {
it('should report Host Flyout Filter Added click with field name', async () => {
const setupParams = getSetupParams();
service.setup(setupParams);
const telemetry = service.start();

telemetry.reportHostsViewTotalHostCountRetrieved({
total: 300,
});

expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1);
expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith(
InfraTelemetryEventTypes.HOST_VIEW_TOTAL_HOST_COUNT_RETRIEVED,
{
total: 300,
}
);
});
});
});
14 changes: 13 additions & 1 deletion x-pack/plugins/infra/public/services/telemetry/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ export enum InfraTelemetryEventTypes {
HOSTS_ENTRY_CLICKED = 'Host Entry Clicked',
HOST_FLYOUT_FILTER_REMOVED = 'Host Flyout Filter Removed',
HOST_FLYOUT_FILTER_ADDED = 'Host Flyout Filter Added',
HOST_VIEW_TOTAL_HOST_COUNT_RETRIEVED = 'Host View Total Host Count Retrieved',
}

export interface HostsViewQuerySubmittedParams {
control_filters: string[];
filters: string[];
interval: string;
query: string | { [key: string]: any };
limit: number;
}

export interface HostEntryClickedParams {
Expand All @@ -35,15 +37,21 @@ export interface HostFlyoutFilterActionParams {
field_name: string;
}

export interface HostsViewQueryHostsCountRetrievedParams {
total: number;
}

export type InfraTelemetryEventParams =
| HostsViewQuerySubmittedParams
| HostEntryClickedParams
| HostFlyoutFilterActionParams;
| HostFlyoutFilterActionParams
| HostsViewQueryHostsCountRetrievedParams;

export interface ITelemetryClient {
reportHostEntryClicked(params: HostEntryClickedParams): void;
reportHostFlyoutFilterRemoved(params: HostFlyoutFilterActionParams): void;
reportHostFlyoutFilterAdded(params: HostFlyoutFilterActionParams): void;
reportHostsViewTotalHostCountRetrieved(params: HostsViewQueryHostsCountRetrievedParams): void;
reportHostsViewQuerySubmitted(params: HostsViewQuerySubmittedParams): void;
}

Expand All @@ -63,4 +71,8 @@ export type InfraTelemetryEvent =
| {
eventType: InfraTelemetryEventTypes.HOSTS_ENTRY_CLICKED;
schema: RootSchema<HostEntryClickedParams>;
}
| {
eventType: InfraTelemetryEventTypes.HOST_VIEW_TOTAL_HOST_COUNT_RETRIEVED;
schema: RootSchema<HostsViewQueryHostsCountRetrievedParams>;
};
4 changes: 2 additions & 2 deletions x-pack/test/functional/apps/infra/hosts_view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
});

[
{ metric: 'hosts', value: '6' },
{ metric: 'hostsCount', value: '6' },
{ metric: 'cpu', value: '0.8%' },
{ metric: 'memory', value: '16.81%' },
{ metric: 'tx', value: 'N/A' },
Expand Down Expand Up @@ -510,7 +510,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
it('should update the KPIs content on a search submit', async () => {
await Promise.all(
[
{ metric: 'hosts', value: '3' },
{ metric: 'hostsCount', value: '3' },
{ metric: 'cpu', value: '0.8%' },
{ metric: 'memory', value: '16.25%' },
{ metric: 'tx', value: 'N/A' },
Expand Down
15 changes: 8 additions & 7 deletions x-pack/test/functional/page_objects/infra_hosts_view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) {
return cellContent.getVisibleText();
},

async getKPIContainer() {
return testSubjects.find('hostsView-metricsTrend');
async getMetricsTrendContainer() {
return testSubjects.find('hostsViewKPIGrid');
},

async getChartsContainer() {
Expand All @@ -118,7 +118,7 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) {

async visitMetricsTab() {
const metricsTab = await this.getMetricsTab();
await metricsTab.click();
return metricsTab.click();
},

async getAllMetricsCharts() {
Expand All @@ -144,14 +144,15 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) {
},

async getAllKPITiles() {
const container = await this.getKPIContainer();
return container.findAllByCssSelector('[data-test-subj*="hostsView-metricsTrend-"]');
const container = await this.getMetricsTrendContainer();
return container.findAllByCssSelector('[data-test-subj*="hostsViewKPI-"]');
},

async getKPITileValue(type: string) {
const element = await testSubjects.find(`hostsView-metricsTrend-${type}`);
const container = await this.getMetricsTrendContainer();
const element = await container.findByTestSubject(`hostsViewKPI-${type}`);
const div = await element.findByClassName('echMetricText__value');
return await div.getAttribute('title');
return div.getAttribute('title');
},

// Flyout Tabs
Expand Down