Skip to content

Commit

Permalink
[8.8] [Infrastructure UI] Host limit telemetry (elastic#155726) (elas…
Browse files Browse the repository at this point in the history
…tic#157409)

# Backport

This will backport the following commits from `main` to `8.8`:
- [[Infrastructure UI] Host limit telemetry
(elastic#155726)](elastic#155726)

<!--- Backport version: 8.9.7 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Carlos
Crespo","email":"crespocarlos@users.noreply.github.com"},"sourceCommit":{"committedDate":"2023-05-11T15:44:38Z","message":"[Infrastructure
UI] Host limit telemetry (elastic#155726)\n\ncloses:
https://github.com/elastic/kibana/issues/155567\r\n\r\n##
Summary\r\n\r\nThis PR adds a new custom event to track the total number
of hosts, as\r\nwell as adjusts a few `data-test-subj` attribute values
to meet the\r\nnaming convention defined in the
observability-dev\r\n[docs](https://github.com/elastic/observability-dev/blob/main/docs/how-we-work/telemetry/telemetry-convention.md#naming-convention)\r\n\r\n\r\n###
For Reviewers\r\n\r\nAn option for not allowing yet a new custom event
in FS could be\r\ntriggering the new custom events only for self-managed
customers, and in\r\nFS watch the element that holds the total number of
hosts. But for now,\r\nI decided to allow the new custom event in FS for
consistency\r\n\r\n---------\r\n\r\nCo-authored-by: Kibana Machine
<42973632+kibanamachine@users.noreply.github.com>","sha":"937912b056f5876247f27a7baad5314401e65939","branchLabelMapping":{"^v8.9.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Feature:Metrics
UI","Team:Infra Monitoring
UI","release_note:skip","backport:prev-minor","Feature:ObsHosts","v8.9.0"],"number":155726,"url":"https://github.com/elastic/kibana/pull/155726","mergeCommit":{"message":"[Infrastructure
UI] Host limit telemetry (elastic#155726)\n\ncloses:
https://github.com/elastic/kibana/issues/155567\r\n\r\n##
Summary\r\n\r\nThis PR adds a new custom event to track the total number
of hosts, as\r\nwell as adjusts a few `data-test-subj` attribute values
to meet the\r\nnaming convention defined in the
observability-dev\r\n[docs](https://github.com/elastic/observability-dev/blob/main/docs/how-we-work/telemetry/telemetry-convention.md#naming-convention)\r\n\r\n\r\n###
For Reviewers\r\n\r\nAn option for not allowing yet a new custom event
in FS could be\r\ntriggering the new custom events only for self-managed
customers, and in\r\nFS watch the element that holds the total number of
hosts. But for now,\r\nI decided to allow the new custom event in FS for
consistency\r\n\r\n---------\r\n\r\nCo-authored-by: Kibana Machine
<42973632+kibanamachine@users.noreply.github.com>","sha":"937912b056f5876247f27a7baad5314401e65939"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v8.9.0","labelRegex":"^v8.9.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/155726","number":155726,"mergeCommit":{"message":"[Infrastructure
UI] Host limit telemetry (elastic#155726)\n\ncloses:
https://github.com/elastic/kibana/issues/155567\r\n\r\n##
Summary\r\n\r\nThis PR adds a new custom event to track the total number
of hosts, as\r\nwell as adjusts a few `data-test-subj` attribute values
to meet the\r\nnaming convention defined in the
observability-dev\r\n[docs](https://github.com/elastic/observability-dev/blob/main/docs/how-we-work/telemetry/telemetry-convention.md#naming-convention)\r\n\r\n\r\n###
For Reviewers\r\n\r\nAn option for not allowing yet a new custom event
in FS could be\r\ntriggering the new custom events only for self-managed
customers, and in\r\nFS watch the element that holds the total number of
hosts. But for now,\r\nI decided to allow the new custom event in FS for
consistency\r\n\r\n---------\r\n\r\nCo-authored-by: Kibana Machine
<42973632+kibanamachine@users.noreply.github.com>","sha":"937912b056f5876247f27a7baad5314401e65939"}}]}]
BACKPORT-->

Co-authored-by: Carlos Crespo <crespocarlos@users.noreply.github.com>
  • Loading branch information
kibanamachine and crespocarlos authored May 11, 2023
1 parent 31ff66e commit d927533
Show file tree
Hide file tree
Showing 15 changed files with 100 additions and 19 deletions.
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

0 comments on commit d927533

Please sign in to comment.