[8.15] [Entity Analytics] Remove links to legacy risk scoring docs (#187585) (#188086)

# Backport

This will backport the following commits from `main` to `8.15`:
- [[Entity Analytics] Remove links to legacy risk scoring docs
(#187585)](https://github.com/elastic/kibana/pull/187585)

<!--- Backport version: 9.4.3 -->

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

<!--BACKPORT [{"author":{"name":"Mark
Hopkin","email":"mark.hopkin@elastic.co"},"sourceCommit":{"committedDate":"2024-07-11T10:43:51Z","message":"[Entity
Analytics] Remove links to legacy risk scoring docs (#187585)\n\n##
Summary\r\n\r\nRelated to
https://github.com/elastic/security-docs/issues/5489. We had\r\na few
places where we incorrectly link to the legacy\r\nuser/host risk scoring
docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary`
components which\r\ncomponents which I have renamed `RiskSummaryPanel`
and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img
width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47
14\"\r\nsrc=\"20e26a15-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f","branchLabelMapping":{"^v8.16.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","backport:prev-minor","Team:Entity
Analytics","v8.16.0"],"title":"[Entity Analytics] Remove links to legacy
risk scoring
docs","number":187585,"url":"https://github.com/elastic/kibana/pull/187585","mergeCommit":{"message":"[Entity
Analytics] Remove links to legacy risk scoring docs (#187585)\n\n##
Summary\r\n\r\nRelated to
https://github.com/elastic/security-docs/issues/5489. We had\r\na few
places where we incorrectly link to the legacy\r\nuser/host risk scoring
docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary`
components which\r\ncomponents which I have renamed `RiskSummaryPanel`
and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img
width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47
14\"\r\nsrc=\"20e26a15-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v8.16.0","branchLabelMappingKey":"^v8.16.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/187585","number":187585,"mergeCommit":{"message":"[Entity
Analytics] Remove links to legacy risk scoring docs (#187585)\n\n##
Summary\r\n\r\nRelated to
https://github.com/elastic/security-docs/issues/5489. We had\r\na few
places where we incorrectly link to the legacy\r\nuser/host risk scoring
docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary`
components which\r\ncomponents which I have renamed `RiskSummaryPanel`
and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img
width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47
14\"\r\nsrc=\"20e26a15-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f"}}]}]
BACKPORT-->

Co-authored-by: Mark Hopkin <mark.hopkin@elastic.co>
This commit is contained in:
Kibana Machine 2024-07-11 14:33:48 +02:00 committed by GitHub
parent 109901226d
commit 4f933407df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 106 additions and 133 deletions

View file

@ -488,8 +488,6 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D
ruleUiAdvancedParams: `${SECURITY_SOLUTION_DOCS}rules-ui-create.html#rule-ui-advanced-params`,
entityAnalytics: {
riskScorePrerequisites: `${SECURITY_SOLUTION_DOCS}ers-requirements.html`,
hostRiskScore: `${SECURITY_SOLUTION_DOCS}host-risk-score.html`,
userRiskScore: `${SECURITY_SOLUTION_DOCS}user-risk-score.html`,
entityRiskScoring: `${SECURITY_SOLUTION_DOCS}entity-risk-scoring.html`,
assetCriticality: `${SECURITY_SOLUTION_DOCS}asset-criticality.html`,
},

View file

@ -360,8 +360,6 @@ export interface DocLinks {
readonly ruleUiAdvancedParams: string;
readonly entityAnalytics: {
readonly riskScorePrerequisites: string;
readonly hostRiskScore: string;
readonly userRiskScore: string;
readonly entityRiskScoring: string;
readonly assetCriticality: string;
};

View file

@ -18,7 +18,7 @@ import type {
TimelineEventsDetailsItem,
RiskSeverity,
} from '../../../../../common/search_strategy';
import { RiskSummary } from '../../../../entity_analytics/components/risk_summary';
import { RiskSummaryPanel } from '../../../../entity_analytics/components/risk_summary_panel';
import { EnrichmentSummary } from './enrichment_summary';
import { RiskScoreEntity } from '../../../../../common/search_strategy';
import { useHasSecurityCapability } from '../../../../helper_hooks';
@ -137,7 +137,7 @@ const ThreatSummaryViewComponent: React.FC<{
{hasEntityAnalyticsCapability && (
<>
<EuiFlexItem grow={false}>
<RiskSummary
<RiskSummaryPanel
riskEntity={RiskScoreEntity.host}
risk={hostRisk}
originalRisk={originalHostRisk}
@ -145,7 +145,7 @@ const ThreatSummaryViewComponent: React.FC<{
</EuiFlexItem>
<EuiFlexItem grow={false}>
<RiskSummary
<RiskSummaryPanel
riskEntity={RiskScoreEntity.user}
risk={userRisk}
originalRisk={originalUserRisk}

View file

@ -11,7 +11,7 @@ import { useCheckSignalIndex } from '../../../detections/containers/detection_en
import type { inputsModel } from '../../../common/store';
import { RiskScoreHeaderTitle } from '../risk_score_onboarding/risk_score_header_title';
import { HeaderSection } from '../../../common/components/header_section';
import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link';
import { EntityAnalyticsLearnMoreLink } from '../risk_score_onboarding/entity_analytics_doc_link';
import { RiskScoreEnableButton } from '../risk_score_onboarding/risk_score_enable_button';
import * as i18n from './translations';
@ -55,7 +55,7 @@ const EnableRiskScoreComponent = ({
<>
{text.body}
{` `}
<RiskScoreDocLink riskScoreEntity={entityType} />
<EntityAnalyticsLearnMoreLink />
</>
}
actions={

View file

@ -25,14 +25,6 @@ export const VIEW_ALL = i18n.translate(
}
);
export const LEARN_MORE = (riskEntity?: RiskScoreEntity) =>
i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.learnMore', {
defaultMessage: 'Learn more about {riskEntity} risk',
values: {
riskEntity: getRiskEntityTranslation(riskEntity, true),
},
});
export const LAST_UPDATED = i18n.translate(
'xpack.securitySolution.entityAnalytics.riskDashboard.lastUpdatedTitle',
{

View file

@ -37,7 +37,7 @@ import {
CriticalityLevels,
CriticalityModifiers,
} from '../../../../common/entity_analytics/asset_criticality';
import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link';
import { EntityAnalyticsLearnMoreLink } from '../risk_score_onboarding/entity_analytics_doc_link';
import { BETA } from '../risk_score_onboarding/translations';
import { AssetCriticalityBadge } from '../asset_criticality';
@ -262,14 +262,7 @@ export const RiskInformationFlyout = ({ handleOnClose }: { handleOnClose: () =>
</SpacedOrderedList>
</EuiText>
<EuiSpacer size="m" />
<RiskScoreDocLink
title={
<FormattedMessage
id="xpack.securitySolution.riskInformation.learnMore"
defaultMessage="Learn more about Entity risk"
/>
}
/>
<EntityAnalyticsLearnMoreLink />
</EuiFlyoutBody>
<EuiFlyoutFooter>

View file

@ -40,6 +40,13 @@ export const RISK_SCORE_TITLE = (riskEntity: RiskScoreEntity) =>
},
});
export const RISK_SCORING_TITLE = i18n.translate(
'xpack.securitySolution.riskScore.overview.riskScoringTitle',
{
defaultMessage: 'Entity Risk Scoring',
}
);
export const ENTITY_RISK_LEVEL = (riskEntity: RiskScoreEntity) =>
i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle', {
defaultMessage: '{riskEntity} risk level',

View file

@ -0,0 +1,37 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { EuiLink } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import React from 'react';
import { useKibana } from '../../../common/lib/kibana';
const EntityAnalyticsLearnMoreLinkComponent = ({ title }: { title?: string | React.ReactNode }) => {
const { docLinks } = useKibana().services;
const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics;
return (
<EuiLink
target="_blank"
rel="noopener nofollow noreferrer"
href={entityAnalyticsLinks.entityRiskScoring}
>
{title ? (
title
) : (
<FormattedMessage
id="xpack.securitySolution.entityAnalytics.learnMore"
defaultMessage="Learn more about entity risk scoring"
/>
)}
</EuiLink>
);
};
export const EntityAnalyticsLearnMoreLink = React.memo(EntityAnalyticsLearnMoreLinkComponent);
EntityAnalyticsLearnMoreLink.displayName = 'EntityAnalyticsLearnMoreLink';

View file

@ -1,46 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { EuiLink } from '@elastic/eui';
import React, { useMemo } from 'react';
import { RiskScoreEntity } from '../../../../common/search_strategy';
import { useKibana } from '../../../common/lib/kibana';
import { LEARN_MORE } from '../entity_analytics_risk_score/translations';
const useLearnMoreLinkForEntity = (riskScoreEntity?: RiskScoreEntity) => {
const { docLinks } = useKibana().services;
const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics;
return useMemo(() => {
if (!riskScoreEntity) {
return entityAnalyticsLinks.entityRiskScoring;
}
if (riskScoreEntity === RiskScoreEntity.user) {
return entityAnalyticsLinks.userRiskScore;
}
return entityAnalyticsLinks.hostRiskScore;
}, [riskScoreEntity, entityAnalyticsLinks]);
};
const RiskScoreDocLinkComponent = ({
riskScoreEntity,
title,
}: {
riskScoreEntity?: RiskScoreEntity;
title?: string | React.ReactNode;
}) => {
const learnMoreLink = useLearnMoreLinkForEntity(riskScoreEntity);
return (
<EuiLink target="_blank" rel="noopener nofollow noreferrer" href={learnMoreLink}>
{title ? title : LEARN_MORE(riskScoreEntity)}
</EuiLink>
);
};
export const RiskScoreDocLink = React.memo(RiskScoreDocLinkComponent);
RiskScoreDocLink.displayName = 'RiskScoreDocLink';

View file

@ -36,7 +36,7 @@ const RiskScoreEnableButtonComponent = ({
}) => {
const spaceId = useSpaceId();
const { http, dashboard, ...startServices } = useKibana().services;
const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent(riskScoreEntity);
const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent();
const { fetch, isLoading } = useFetch(REQUEST_NAMES.ENABLE_RISK_SCORE, installRiskScoreModule);
const isRiskEngineEnabled = useIsExperimentalFeatureEnabled('riskScoringRoutesEnabled');

View file

@ -30,7 +30,7 @@ const RiskScoreRestartButtonComponent = ({
);
const spaceId = useSpaceId();
const { renderDocLink } = useRiskScoreToastContent(riskScoreEntity);
const { renderDocLink } = useRiskScoreToastContent();
const { http, ...startServices } = useKibana().services;
const onClick = useCallback(async () => {

View file

@ -10,21 +10,20 @@ import React, { useCallback, useMemo } from 'react';
import styled from 'styled-components';
import { FormattedMessage } from '@kbn/i18n-react';
import type { RiskScoreEntity } from '../../../../common/search_strategy';
import { RiskScoreDocLink } from './risk_score_doc_link';
import { EntityAnalyticsLearnMoreLink } from './entity_analytics_doc_link';
const StyledButton = styled(EuiButton)`
float: right;
`;
export const useRiskScoreToastContent = (riskScoreEntity: RiskScoreEntity) => {
export const useRiskScoreToastContent = () => {
const renderDocLink = useCallback(
(message: string) => (
<>
{message} <RiskScoreDocLink riskScoreEntity={riskScoreEntity} />
{message} <EntityAnalyticsLearnMoreLink />
</>
),
[riskScoreEntity]
[]
);
const renderDashboardLink = useCallback(
(message: string, targetUrl: string) => (

View file

@ -10,11 +10,11 @@ import type { Story } from '@storybook/react';
import { TestProvider } from '@kbn/expandable-flyout/src/test/provider';
import { StorybookProviders } from '../../../common/mock/storybook_providers';
import { mockRiskScoreState } from '../../../timelines/components/side_panel/new_user_detail/__mocks__';
import { RiskSummary } from './risk_summary';
import { FlyoutRiskSummary } from './risk_summary';
export default {
component: RiskSummary,
title: 'Components/RiskSummary',
component: FlyoutRiskSummary,
title: 'Components/FlyoutRiskSummary',
};
export const Default: Story<void> = () => {
@ -22,7 +22,7 @@ export const Default: Story<void> = () => {
<StorybookProviders>
<TestProvider>
<div style={{ maxWidth: '300px' }}>
<RiskSummary
<FlyoutRiskSummary
openDetailsPanel={() => {}}
riskScoreData={{ ...mockRiskScoreState, data: [] }}
queryId={'testQuery'}
@ -39,7 +39,7 @@ export const PreviewMode: Story<void> = () => {
<StorybookProviders>
<TestProvider>
<div style={{ maxWidth: '300px' }}>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={{ ...mockRiskScoreState, data: [] }}
queryId={'testQuery'}
recalculatingScore={false}

View file

@ -12,7 +12,7 @@ import {
import { render } from '@testing-library/react';
import React from 'react';
import { TestProviders } from '../../../common/mock';
import { RiskSummary } from './risk_summary';
import { FlyoutRiskSummary } from './risk_summary';
import type {
LensAttributes,
VisualizationEmbeddableProps,
@ -37,7 +37,7 @@ jest.mock('@kbn/kibana-react-plugin/public', () => {
};
});
describe('RiskSummary', () => {
describe('FlyoutRiskSummary', () => {
beforeEach(() => {
mockVisualizationEmbeddable.mockClear();
});
@ -45,7 +45,7 @@ describe('RiskSummary', () => {
it('renders risk summary table with alerts only', () => {
const { getByTestId, queryByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -76,7 +76,7 @@ describe('RiskSummary', () => {
const { getByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -108,7 +108,7 @@ describe('RiskSummary', () => {
it('renders risk summary table when riskScoreData is empty', () => {
const { getByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={{ ...mockHostRiskScoreState, data: undefined }}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -122,7 +122,7 @@ describe('RiskSummary', () => {
it('risk summary header does not render link when riskScoreData is loading', () => {
const { queryByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={{ ...mockHostRiskScoreState, data: undefined, loading: true }}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -137,7 +137,7 @@ describe('RiskSummary', () => {
it('risk summary header does not render expand icon when in preview mode', () => {
const { queryByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={{ ...mockHostRiskScoreState, data: undefined, loading: true }}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -154,7 +154,7 @@ describe('RiskSummary', () => {
it('renders visualization embeddable', () => {
const { getByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -169,7 +169,7 @@ describe('RiskSummary', () => {
it('renders updated at', () => {
const { getByTestId } = render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -184,7 +184,7 @@ describe('RiskSummary', () => {
it('builds lens attributes for host risk score', () => {
render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -211,7 +211,7 @@ describe('RiskSummary', () => {
it('builds lens cases attachment metadata for host risk score', () => {
render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockHostRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -233,7 +233,7 @@ describe('RiskSummary', () => {
it('builds lens cases attachment metadata for user risk score', () => {
render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockUserRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}
@ -255,7 +255,7 @@ describe('RiskSummary', () => {
it('builds lens attributes for user risk score', () => {
render(
<TestProviders>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={mockUserRiskScoreState}
queryId={'testQuery'}
openDetailsPanel={() => {}}

View file

@ -55,7 +55,7 @@ export interface RiskSummaryProps<T extends RiskScoreEntity> {
isPreviewMode?: boolean;
}
const RiskSummaryComponent = <T extends RiskScoreEntity>({
const FlyoutRiskSummaryComponent = <T extends RiskScoreEntity>({
riskScoreData,
recalculatingScore,
queryId,
@ -287,5 +287,5 @@ const RiskSummaryComponent = <T extends RiskScoreEntity>({
);
};
export const RiskSummary = React.memo(RiskSummaryComponent);
RiskSummary.displayName = 'RiskSummary';
export const FlyoutRiskSummary = React.memo(FlyoutRiskSummaryComponent);
FlyoutRiskSummary.displayName = 'RiskSummary';

View file

@ -9,9 +9,9 @@ import React from 'react';
import { render } from '@testing-library/react';
import { TestProviders } from '../../common/mock';
import type { RiskEntity } from './risk_summary';
import type { RiskEntity } from './risk_summary_panel';
import * as i18n from '../../common/components/event_details/cti_details/translations';
import { RiskSummary } from './risk_summary';
import { RiskSummaryPanel } from './risk_summary_panel';
import { RiskScoreEntity, RiskSeverity } from '../../../common/search_strategy';
import { getEmptyValue } from '../../common/components/empty_value';
@ -46,7 +46,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
const { getByText } = render(
<TestProviders>
<RiskSummary {...props} />
<RiskSummaryPanel {...props} />
</TestProviders>
);
@ -67,7 +67,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
} as RiskEntity;
const { getByTestId } = render(
<TestProviders>
<RiskSummary {...props} />
<RiskSummaryPanel {...props} />
</TestProviders>
);
@ -86,7 +86,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
} as RiskEntity;
const { getByText } = render(
<TestProviders>
<RiskSummary {...props} />
<RiskSummaryPanel {...props} />
</TestProviders>
);

View file

@ -17,7 +17,7 @@ import { RiskScoreLevel } from './severity/common';
import type { RiskSeverity } from '../../../common/search_strategy';
import { RiskScoreEntity } from '../../../common/search_strategy';
import { getEmptyValue } from '../../common/components/empty_value';
import { RiskScoreDocLink } from './risk_score_onboarding/risk_score_doc_link';
import { EntityAnalyticsLearnMoreLink } from './risk_score_onboarding/entity_analytics_doc_link';
import { RiskScoreHeaderTitle } from './risk_score_onboarding/risk_score_header_title';
import type { HostRisk, UserRisk } from '../api/types';
@ -35,7 +35,7 @@ interface UserRiskEntity {
export type RiskEntity = HostRiskEntity | UserRiskEntity;
const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, originalRisk }) => {
const RiskSummaryPanelComponent: React.FC<RiskEntity> = ({ risk, riskEntity, originalRisk }) => {
const currentRiskScore =
riskEntity === RiskScoreEntity.host
? risk?.result?.[0]?.host?.risk?.calculated_level
@ -64,10 +64,7 @@ const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, original
values={{
riskEntity,
riskScoreDocumentationLink: (
<RiskScoreDocLink
riskScoreEntity={riskEntity}
title={i18n.RISK_SCORE_TITLE(riskEntity)}
/>
<EntityAnalyticsLearnMoreLink title={i18n.RISK_SCORING_TITLE} />
),
}}
/>
@ -103,4 +100,4 @@ const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, original
</>
);
};
export const RiskSummary = React.memo(RiskSummaryComponent);
export const RiskSummaryPanel = React.memo(RiskSummaryPanelComponent);

View file

@ -187,7 +187,7 @@ export const HostEntityOverview: React.FC<HostEntityOverviewProps> = ({ hostName
<EuiFlexGroup alignItems="flexEnd" gutterSize="none" responsive={false}>
<EuiFlexItem grow={false}>{HOST_RISK_LEVEL}</EuiFlexItem>
<EuiFlexItem grow={false}>
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.host} />
<RiskScoreDocTooltip />
</EuiFlexItem>
</EuiFlexGroup>
),

View file

@ -187,7 +187,7 @@ export const UserEntityOverview: React.FC<UserEntityOverviewProps> = ({ userName
<EuiFlexGroup alignItems="flexEnd" gutterSize="none" responsive={false}>
<EuiFlexItem grow={false}>{USER_RISK_LEVEL}</EuiFlexItem>
<EuiFlexItem grow={false}>
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.user} />
<RiskScoreDocTooltip />
</EuiFlexItem>
</EuiFlexGroup>
),

View file

@ -8,7 +8,7 @@
import React from 'react';
import { EuiHorizontalRule } from '@elastic/eui';
import { AssetCriticalityAccordion } from '../../../entity_analytics/components/asset_criticality/asset_criticality_selector';
import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
import { FlyoutRiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score';
import type { RiskScoreEntity, HostItem } from '../../../../common/search_strategy';
import { FlyoutBody } from '../../shared/components/flyout_body';
@ -49,7 +49,7 @@ export const HostPanelContent = ({
<FlyoutBody>
{riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && (
<>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={riskScoreState}
recalculatingScore={recalculatingScore}
queryId={HOST_PANEL_RISK_SCORE_QUERY_ID}

View file

@ -12,7 +12,7 @@ import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_exper
import { AssetCriticalityAccordion } from '../../../entity_analytics/components/asset_criticality/asset_criticality_selector';
import { OBSERVED_USER_QUERY_ID } from '../../../explore/users/containers/users/observed_details';
import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
import { FlyoutRiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score';
import { ManagedUser } from '../../../timelines/components/side_panel/new_user_detail/managed_user';
import type { ManagedUserData } from '../../../timelines/components/side_panel/new_user_detail/types';
@ -58,7 +58,7 @@ export const UserPanelContent = ({
<FlyoutBody>
{riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && (
<>
<RiskSummary
<FlyoutRiskSummary
riskScoreData={riskScoreState}
recalculatingScore={recalculatingScore}
queryId={USER_PANEL_RISK_SCORE_QUERY_ID}

View file

@ -8,14 +8,14 @@
import { EuiButtonIcon, EuiPopover, EuiPopoverTitle, EuiText } from '@elastic/eui';
import React, { useCallback, useState } from 'react';
import * as i18n from './translations';
import { RiskScoreDocLink } from '../../entity_analytics/components/risk_score_onboarding/risk_score_doc_link';
import type { RiskScoreEntity } from '../../../common/entity_analytics/risk_engine';
import { EntityAnalyticsLearnMoreLink } from '../../entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link';
export const RiskScoreInfoTooltip: React.FC<{
toolTipContent: React.ReactNode;
toolTipTitle?: React.ReactNode;
width?: number;
}> = ({ toolTipContent, toolTipTitle, width = 270 }) => {
anchorPosition?: EuiPopover['props']['anchorPosition'];
}> = ({ toolTipContent, toolTipTitle, width = 270, anchorPosition = 'leftCenter' }) => {
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
const onClick = useCallback(() => {
@ -30,7 +30,7 @@ export const RiskScoreInfoTooltip: React.FC<{
<EuiPopover
isOpen={isPopoverOpen}
closePopover={closePopover}
anchorPosition="leftCenter"
anchorPosition={anchorPosition}
button={
<EuiButtonIcon
color="text"
@ -50,9 +50,13 @@ export const RiskScoreInfoTooltip: React.FC<{
);
};
export const RiskScoreDocTooltip = ({ riskScoreEntity }: { riskScoreEntity: RiskScoreEntity }) => (
export const RiskScoreDocTooltip = ({
anchorPosition,
}: {
anchorPosition?: React.ComponentProps<typeof RiskScoreInfoTooltip>['anchorPosition'];
}) => (
<RiskScoreInfoTooltip
toolTipContent={<RiskScoreDocLink riskScoreEntity={riskScoreEntity} />}
width={200} // Magic number to match the width of the doc link
anchorPosition={anchorPosition}
toolTipContent={<EntityAnalyticsLearnMoreLink />}
/>
);

View file

@ -158,7 +158,7 @@ export const HostOverview = React.memo<HostSummaryProps>(
/>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.host} />
<RiskScoreDocTooltip anchorPosition="upCenter" />
</EuiFlexItem>
</EuiFlexGroup>
),

View file

@ -156,7 +156,7 @@ export const UserOverview = React.memo<UserSummaryProps>(
/>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.user} />
<RiskScoreDocTooltip anchorPosition="upCenter" />
</EuiFlexItem>
</EuiFlexGroup>
),

View file

@ -32727,7 +32727,6 @@
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "{ errorCount, plural, =1 {Erreur rencontrée} other {Erreurs rencontrées}} :",
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "Aucun renseignement supplémentaire sur les menaces n'a été détecté sur la période sélectionnée. Sélectionnez une autre plage temporelle ou {link} afin de collecter des renseignements sur les menaces pour les détecter et les comparer.",
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, =1 {tâche est actuellement indisponible} other {tâches sont actuellement indisponibles}}",
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "Découvrez plus d'informations sur les risques {riskEntity}",
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "Nom de {riskEntity}",
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "Score de risque de {riskEntity}",
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "Privilèges de cluster manquants : {privileges}.",
@ -37058,7 +37057,6 @@
"xpack.securitySolution.riskInformation.howOftenTitle": "À quelle fréquence le risque est-il calculé ?",
"xpack.securitySolution.riskInformation.informationAriaLabel": "Informations",
"xpack.securitySolution.riskInformation.introText": "L'analyse de risque des entités détecte les hôtes et les utilisateurs risqués à l'intérieur de votre environnement.",
"xpack.securitySolution.riskInformation.learnMore": "Découvrez plus d'informations sur les risques des entités",
"xpack.securitySolution.riskInformation.levelHeader": "Niveau de risque",
"xpack.securitySolution.riskInformation.riskCalculationStep1": "Uniquement les utilisateurs et les hôtes (entités) de scores associés aux alertes de détection non fermées.",
"xpack.securitySolution.riskInformation.riskCalculationStep2": "Génère un score de catégorie \"Alerte\" en regroupant les alertes par identificateur d'entité, afin que les alertes ayant des scores de risque plus élevés contribuent davantage que les alertes dont les scores de risque sont moins élevés.",

View file

@ -32700,7 +32700,6 @@
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "次の{ errorCount, plural, other {件のエラー}}が発生しました:",
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "選択した期間内に追加の脅威情報が見つかりませんでした。別の時間枠、または{link}を試して、脅威の検出と照合のための脅威インテリジェンスを収集します。",
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, other {件のジョブ}}が現在使用できません",
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "{riskEntity}リスクの詳細",
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名",
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity}リスクレベル",
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "クラスター権限が不足しています:{privileges}。",
@ -37033,7 +37032,6 @@
"xpack.securitySolution.riskInformation.howOftenTitle": "リスクを計算する頻度",
"xpack.securitySolution.riskInformation.informationAriaLabel": "情報",
"xpack.securitySolution.riskInformation.introText": "Entity Risk Analyticsは、環境内のリスクのあるホストとユーザーを明らかにします。",
"xpack.securitySolution.riskInformation.learnMore": "エンティティリスクの詳細",
"xpack.securitySolution.riskInformation.levelHeader": "リスクレベル",
"xpack.securitySolution.riskInformation.riskCalculationStep1": "クローズされていない検出アラートに関連付けられたユーザーとホスト(エンティティ)のみスコア付けします。",
"xpack.securitySolution.riskInformation.riskCalculationStep2": "エンティティID別にアラートを集約することで、「アラート」カテゴリスコアを生成します。リスクスコアが高いアラートがリスクスコアが低いアラートよりも大きく寄与するように設定されます。",

View file

@ -32744,7 +32744,6 @@
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "遇到以下{ errorCount, plural, other {错误}}",
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "在选定时间范围内未发现其他威胁情报。请尝试不同时间范围,或 {link} 以收集威胁情报用于威胁检测和匹配。",
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} 个{incompatibleJobCount, plural, other {作业}}当前不可用",
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "详细了解 {riskEntity} 风险",
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名称",
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity} 风险级别",
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "缺少集群权限:{privileges}。",
@ -37076,7 +37075,6 @@
"xpack.securitySolution.riskInformation.howOftenTitle": "多久计算一次风险?",
"xpack.securitySolution.riskInformation.informationAriaLabel": "信息",
"xpack.securitySolution.riskInformation.introText": "实体风险分析将显示您的环境中存在的有风险主机和用户。",
"xpack.securitySolution.riskInformation.learnMore": "详细了解实体风险",
"xpack.securitySolution.riskInformation.levelHeader": "风险级别",
"xpack.securitySolution.riskInformation.riskCalculationStep1": "仅对与尚未关闭的检测告警关联的用户和主机(实体)评分。",
"xpack.securitySolution.riskInformation.riskCalculationStep2": "通过按实体标识符聚合告警来生成“告警”类别分数,从而使风险分数高的告警贡献高于风险分数低的告警。",