[SecuritySolutions] Fix Entity Analytics dashboard fires many risk_score/index_status requests (#179510)

## Summary

The Entity Analytics Dashboard page called the
`/risk_score/index_status` API many times, which led to a very long
loading time.

I wrapped all API calls inside `useEntityAnalyticsRoute` with `useMemo`
to quick-fix the multiple unnecessary HTTP calls.



### Checklist

Delete any items that are not applicable to this PR.

- [ ] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
- [x] [Flaky Test
Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was
used on any tests changed
This commit is contained in:
Pablo Machado 2024-04-02 10:55:42 +02:00 committed by GitHub
parent 9106bf7244
commit e290d2c1ab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -5,6 +5,7 @@
* 2.0.
*/
import { useMemo } from 'react';
import type { AssetCriticalityRecord } from '../../../common/api/entity_analytics/asset_criticality';
import type { RiskScoreEntity } from '../../../common/search_strategy';
import {
@ -36,150 +37,152 @@ import { useKibana } from '../../common/lib/kibana/kibana_react';
export const useEntityAnalyticsRoutes = () => {
const http = useKibana().services.http;
/**
* Fetches preview risks scores
*/
const fetchRiskScorePreview = ({
signal,
params,
}: {
signal?: AbortSignal;
params: RiskScorePreviewRequestSchema;
}) =>
http.fetch<CalculateScoresResponse>(RISK_SCORE_PREVIEW_URL, {
version: '1',
method: 'POST',
body: JSON.stringify(params),
return useMemo(() => {
/**
* Fetches preview risks scores
*/
const fetchRiskScorePreview = ({
signal,
});
params,
}: {
signal?: AbortSignal;
params: RiskScorePreviewRequestSchema;
}) =>
http.fetch<CalculateScoresResponse>(RISK_SCORE_PREVIEW_URL, {
version: '1',
method: 'POST',
body: JSON.stringify(params),
signal,
});
/**
* Fetches risks engine status
*/
const fetchRiskEngineStatus = ({ signal }: { signal?: AbortSignal }) =>
http.fetch<GetRiskEngineStatusResponse>(RISK_ENGINE_STATUS_URL, {
version: '1',
method: 'GET',
signal,
});
/**
* Fetches risks engine status
*/
const fetchRiskEngineStatus = ({ signal }: { signal?: AbortSignal }) =>
http.fetch<GetRiskEngineStatusResponse>(RISK_ENGINE_STATUS_URL, {
version: '1',
method: 'GET',
signal,
});
/**
* Init risk score engine
*/
const initRiskEngine = () =>
http.fetch<InitRiskEngineResponse>(RISK_ENGINE_INIT_URL, {
version: '1',
method: 'POST',
});
/**
* Init risk score engine
*/
const initRiskEngine = () =>
http.fetch<InitRiskEngineResponse>(RISK_ENGINE_INIT_URL, {
version: '1',
method: 'POST',
});
/**
* Enable risk score engine
*/
const enableRiskEngine = () =>
http.fetch<EnableRiskEngineResponse>(RISK_ENGINE_ENABLE_URL, {
version: '1',
method: 'POST',
});
/**
* Enable risk score engine
*/
const enableRiskEngine = () =>
http.fetch<EnableRiskEngineResponse>(RISK_ENGINE_ENABLE_URL, {
version: '1',
method: 'POST',
});
/**
* Disable risk score engine
*/
const disableRiskEngine = () =>
http.fetch<DisableRiskEngineResponse>(RISK_ENGINE_DISABLE_URL, {
version: '1',
method: 'POST',
});
/**
* Disable risk score engine
*/
const disableRiskEngine = () =>
http.fetch<DisableRiskEngineResponse>(RISK_ENGINE_DISABLE_URL, {
version: '1',
method: 'POST',
});
/**
* Get risk engine privileges
*/
const fetchRiskEnginePrivileges = () =>
http.fetch<EntityAnalyticsPrivileges>(RISK_ENGINE_PRIVILEGES_URL, {
version: '1',
method: 'GET',
});
/**
* Get risk engine privileges
*/
const fetchRiskEnginePrivileges = () =>
http.fetch<EntityAnalyticsPrivileges>(RISK_ENGINE_PRIVILEGES_URL, {
version: '1',
method: 'GET',
});
/**
* Get asset criticality privileges
*/
const fetchAssetCriticalityPrivileges = () =>
http.fetch<EntityAnalyticsPrivileges>(ASSET_CRITICALITY_PRIVILEGES_URL, {
version: '1',
method: 'GET',
});
/**
* Get asset criticality privileges
*/
const fetchAssetCriticalityPrivileges = () =>
http.fetch<EntityAnalyticsPrivileges>(ASSET_CRITICALITY_PRIVILEGES_URL, {
version: '1',
method: 'GET',
});
/**
* Create asset criticality
*/
const createAssetCriticality = async (
params: Pick<AssetCriticality, 'idField' | 'idValue' | 'criticalityLevel'>
): Promise<AssetCriticalityRecord> =>
http.fetch<AssetCriticalityRecord>(ASSET_CRITICALITY_URL, {
version: '1',
method: 'POST',
body: JSON.stringify({
id_value: params.idValue,
id_field: params.idField,
criticality_level: params.criticalityLevel,
}),
});
/**
* Create asset criticality
*/
const createAssetCriticality = async (
params: Pick<AssetCriticality, 'idField' | 'idValue' | 'criticalityLevel'>
): Promise<AssetCriticalityRecord> =>
http.fetch<AssetCriticalityRecord>(ASSET_CRITICALITY_URL, {
version: '1',
method: 'POST',
body: JSON.stringify({
id_value: params.idValue,
id_field: params.idField,
criticality_level: params.criticalityLevel,
}),
});
/**
* Get asset criticality
*/
const fetchAssetCriticality = async (
params: Pick<AssetCriticality, 'idField' | 'idValue'>
): Promise<AssetCriticalityRecord> => {
return http.fetch<AssetCriticalityRecord>(ASSET_CRITICALITY_URL, {
version: '1',
method: 'GET',
query: { id_value: params.idValue, id_field: params.idField },
});
};
const getRiskScoreIndexStatus = ({
query,
signal,
}: {
query: {
indexName: string;
entity: RiskScoreEntity;
/**
* Get asset criticality
*/
const fetchAssetCriticality = async (
params: Pick<AssetCriticality, 'idField' | 'idValue'>
): Promise<AssetCriticalityRecord> => {
return http.fetch<AssetCriticalityRecord>(ASSET_CRITICALITY_URL, {
version: '1',
method: 'GET',
query: { id_value: params.idValue, id_field: params.idField },
});
};
signal?: AbortSignal;
}): Promise<{
isDeprecated: boolean;
isEnabled: boolean;
}> =>
http.fetch<{ isDeprecated: boolean; isEnabled: boolean }>(RISK_SCORE_INDEX_STATUS_API_URL, {
version: '1',
method: 'GET',
const getRiskScoreIndexStatus = ({
query,
asSystemRequest: true,
signal,
});
}: {
query: {
indexName: string;
entity: RiskScoreEntity;
};
signal?: AbortSignal;
}): Promise<{
isDeprecated: boolean;
isEnabled: boolean;
}> =>
http.fetch<{ isDeprecated: boolean; isEnabled: boolean }>(RISK_SCORE_INDEX_STATUS_API_URL, {
version: '1',
method: 'GET',
query,
asSystemRequest: true,
signal,
});
/**
* Fetches risk engine settings
*/
const fetchRiskEngineSettings = () =>
http.fetch<RiskEngineSettingsResponse>(RISK_ENGINE_SETTINGS_URL, {
version: '1',
method: 'GET',
});
/**
* Fetches risk engine settings
*/
const fetchRiskEngineSettings = () =>
http.fetch<RiskEngineSettingsResponse>(RISK_ENGINE_SETTINGS_URL, {
version: '1',
method: 'GET',
});
return {
fetchRiskScorePreview,
fetchRiskEngineStatus,
initRiskEngine,
enableRiskEngine,
disableRiskEngine,
fetchRiskEnginePrivileges,
fetchAssetCriticalityPrivileges,
createAssetCriticality,
fetchAssetCriticality,
getRiskScoreIndexStatus,
fetchRiskEngineSettings,
};
return {
fetchRiskScorePreview,
fetchRiskEngineStatus,
initRiskEngine,
enableRiskEngine,
disableRiskEngine,
fetchRiskEnginePrivileges,
fetchAssetCriticalityPrivileges,
createAssetCriticality,
fetchAssetCriticality,
getRiskScoreIndexStatus,
fetchRiskEngineSettings,
};
}, [http]);
};
export type AssetCriticality = SnakeToCamelCase<AssetCriticalityRecord>;