[ML] AIOps: Rename Explain Log Rate Spikes to Log Rate Analysis. (#161764)

## Summary

Part of #161832.

This PR renames the Explain Log Rate Spikes feature to **Log Rate
Analysis**.

- [x] Renamed references in `docs/developer/*`
- [x] Updated docs screenshots
- [x] Redirect in docs
- [x] Redirect urls from `explain_log_rate_spikes` to `log_rate_analysis`
- [x] API versioning
- [x] Renamed navigation links
- [x] Renamed variable names
- [x] Renamed file names
- [x] Renamed i18n ids
- [x] Renamed breadcrumbs 
- [x] Removed hard coded `AIOPS_ENABLED` feature flag
This commit is contained in:
Walter Rafelsberger 2023-07-19 16:46:31 +02:00 committed by GitHub
parent 06cfd36787
commit 11cc1e1be6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
103 changed files with 770 additions and 817 deletions

View file

@ -427,7 +427,7 @@ The plugin exposes the static DefaultEditorController class to consume.
|{kib-repo}blob/{branch}/x-pack/plugins/aiops/README.md[aiops]
|The plugin provides APIs and components for AIOps features, including the “Explain log rate spikes” UI, maintained by the ML team.
|The plugin provides APIs and components for AIOps features, including the “Log rate analysis” UI, maintained by the ML team.
|{kib-repo}blob/{branch}/x-pack/plugins/alerting/README.md[alerting]

View file

@ -7,6 +7,10 @@
The following pages have moved or been deleted.
--
[role="exclude",id="explain-log-rate-spikes"]
== Explain log rate spikes
Refer to <<log-rate-analysis>>.
[role="exclude",id="snapshot-repositories"]
== Snapshot and Restore
Refer to {ref}/snapshot-restore.html[Snapshot and Restore].

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

View file

@ -117,27 +117,27 @@ AIOps Labs is a part of {ml-app} in {kib} which provides features that use
advanced statistical methods to help you interpret your data and its behavior.
[discrete]
[[explain-log-rate-spikes]]
=== Explain log rate spikes
[[log-rate-analysis]]
=== Log rate analysis
preview::[]
Explain log rate spikes is a feature that uses advanced statistical methods to
identify reasons for increases in log rates. It makes it easy to find and
investigate causes of unusual spikes by using the analysis workflow view.
Log rate analysis is a feature that uses advanced statistical methods to
identify reasons for increases or decreases in log rates. It makes it easy to find and
investigate causes of unusual spikes or drops by using the analysis workflow view.
Examine the histogram chart of the log rates for a given {data-source}, and find
the reason behind a particular change possibly in millions of log events across
multiple fields and values.
You can find explain log rate spikes under **{ml-app}** > **AIOps Labs** where
You can find log rate analysis under **{ml-app}** > **AIOps Labs** where
you can select the {data-source} or saved search that you want to analyze.
[role="screenshot"]
image::user/ml/images/ml-explain-log-rate-before.png[Log event histogram chart]
image::user/ml/images/ml-log-rate-analysis-before.png[Log event histogram chart]
Select a spike in the log event histogram chart to start the analysis. It
Select a spike or drop in the log event histogram chart to start the analysis. It
identifies statistically significant field-value combinations that contribute to
the spike and displays them in a table. You can optionally choose to summarize
the spike or drop and displays them in a table. You can optionally choose to summarize
the results into groups. The table also shows an indicator of the level of
impact and a sparkline showing the shape of the impact in the chart. Hovering
over a row displays the impact on the histogram chart in more detail. You can
@ -153,7 +153,7 @@ analyzed data. You can move the brushes to redefine both the baseline and the
deviation and rerun the analysis with the modified values.
[role="screenshot"]
image::user/ml/images/ml-explain-log-rate.png[Log rate spike explained]
image::user/ml/images/ml-log-rate-analysis.png[Log rate spike explained]
[discrete]
@ -205,7 +205,7 @@ image::user/ml/images/ml-change-point-detection.png[Change point detection UI]
Select a function and a metric field, then pick a date range to start detecting
change points in the defined range. Optionally, you can split the data by a
field. If the cardinality of the split field exceeds 10,000, then only the first
10,000, sorted by document count, are analyzed. You can configure a maximum of 6
10,000, sorted by document count, are analyzed. You can configure a maximum of 6
combinations of a function applied to a metric field, partitioned by a split
field to identify change points.
@ -222,4 +222,4 @@ change; lower values indicate more significant changes. You can use the change
point type selector to filter the results by specific types of change points.
[role="screenshot"]
image::user/ml/images/ml-change-point-detection-selected.png[Selected change points]
image::user/ml/images/ml-change-point-detection-selected.png[Selected change points]

View file

@ -19,7 +19,7 @@ export type LinkId =
| 'resultExplorer'
| 'analyticsMap'
| 'aiOps'
| 'explainLogRateSpikes'
| 'logRateAnalysis'
| 'logPatternAnalysis'
| 'changePointDetections'
| 'modelManagement'

View file

@ -121,7 +121,7 @@ export const defaultNavigation: MlNodeDefinition = {
}),
children: [
{
link: 'ml:explainLogRateSpikes',
link: 'ml:logRateAnalysis',
},
{
link: 'ml:logPatternAnalysis',

View file

@ -59,11 +59,11 @@ const allNavLinks: AppDeepLinkId[] = [
'ml:changePointDetections',
'ml:dataFrameAnalytics',
'ml:dataVisualizer',
'ml:explainLogRateSpikes',
'ml:fileUpload',
'ml:filterListsSettings',
'ml:indexDataVisualizer',
'ml:logPatternAnalysis',
'ml:logRateAnalysis',
'ml:memoryUsage',
'ml:modelManagement',
'ml:nodes',

View file

@ -486,21 +486,21 @@ Array [
"children": undefined,
"deepLink": Object {
"baseUrl": "/mocked",
"href": "http://mocked/ml:explainLogRateSpikes",
"id": "ml:explainLogRateSpikes",
"title": "Deeplink ml:explainLogRateSpikes",
"url": "/mocked/ml:explainLogRateSpikes",
"href": "http://mocked/ml:logRateAnalysis",
"id": "ml:logRateAnalysis",
"title": "Deeplink ml:logRateAnalysis",
"url": "/mocked/ml:logRateAnalysis",
},
"href": undefined,
"id": "ml:explainLogRateSpikes",
"id": "ml:logRateAnalysis",
"isActive": false,
"path": Array [
"rootNav:ml",
"aiops_labs",
"ml:explainLogRateSpikes",
"ml:logRateAnalysis",
],
"renderItem": undefined,
"title": "Deeplink ml:explainLogRateSpikes",
"title": "Deeplink ml:logRateAnalysis",
},
Object {
"children": undefined,

View file

@ -11,7 +11,7 @@ import type { SignificantTerm } from './types';
/**
* Type guard for a significant term.
* Note this is used as a custom type within Explain Log Rate Spikes
* Note this is used as a custom type within Log Rate Analysis
* for a p-value based variant, not a generic significant terms
* aggregation type.
* @param arg The unknown type to be evaluated

View file

@ -58,7 +58,7 @@ export interface HistogramField {
/**
* Significant term meta data for a field/value pair.
* Note this is used as a custom type within Explain Log Rate Spikes
* Note this is used as a custom type within Log Rate Analysis
* for a p-value based variant, not a generic significant terms
* aggregation type.
*/

View file

@ -1,6 +1,6 @@
# aiops
The plugin provides APIs and components for AIOps features, including the “Explain log rate spikes” UI, maintained by the ML team.
The plugin provides APIs and components for AIOps features, including the “Log rate analysis” UI, maintained by the ML team.
---

View file

@ -6,19 +6,22 @@
*/
import type {
AiopsExplainLogRateSpikesSchema,
AiopsExplainLogRateSpikesApiAction,
} from './explain_log_rate_spikes';
AiopsLogRateAnalysisSchema,
AiopsLogRateAnalysisApiAction,
} from './log_rate_analysis';
import { streamReducer } from './stream_reducer';
export const API_ENDPOINT = {
EXPLAIN_LOG_RATE_SPIKES: '/internal/aiops/explain_log_rate_spikes',
export const AIOPS_API_ENDPOINT = {
LOG_RATE_ANALYSIS: '/internal/aiops/log_rate_analysis',
} as const;
export interface ApiExplainLogRateSpikes {
endpoint: typeof API_ENDPOINT.EXPLAIN_LOG_RATE_SPIKES;
type AiopsApiEndpointKeys = keyof typeof AIOPS_API_ENDPOINT;
export type AiopsApiEndpoint = typeof AIOPS_API_ENDPOINT[AiopsApiEndpointKeys];
export interface AiopsApiLogRateAnalysis {
endpoint: AiopsApiEndpoint;
apiVersion: string;
reducer: typeof streamReducer;
body: AiopsExplainLogRateSpikesSchema;
actions: AiopsExplainLogRateSpikesApiAction;
body: AiopsLogRateAnalysisSchema;
actions: AiopsLogRateAnalysisApiAction;
}

View file

@ -148,7 +148,7 @@ export function updateLoadingStateAction(
};
}
export type AiopsExplainLogRateSpikesApiAction =
export type AiopsLogRateAnalysisApiAction =
| ApiActionAddSignificantTerms
| ApiActionAddSignificantTermsGroup
| ApiActionAddSignificantTermsHistogram

View file

@ -18,7 +18,7 @@ export {
updateLoadingStateAction,
API_ACTION_NAME,
} from './actions';
export type { AiopsExplainLogRateSpikesApiAction } from './actions';
export type { AiopsLogRateAnalysisApiAction } from './actions';
export { aiopsExplainLogRateSpikesSchema } from './schema';
export type { AiopsExplainLogRateSpikesSchema } from './schema';
export { aiopsLogRateAnalysisSchema } from './schema';
export type { AiopsLogRateAnalysisSchema } from './schema';

View file

@ -7,7 +7,7 @@
import { schema, TypeOf } from '@kbn/config-schema';
export const aiopsExplainLogRateSpikesSchema = schema.object({
export const aiopsLogRateAnalysisSchema = schema.object({
start: schema.number(),
end: schema.number(),
searchQuery: schema.string(),
@ -38,4 +38,4 @@ export const aiopsExplainLogRateSpikesSchema = schema.object({
sampleProbability: schema.maybe(schema.number()),
});
export type AiopsExplainLogRateSpikesSchema = TypeOf<typeof aiopsExplainLogRateSpikesSchema>;
export type AiopsLogRateAnalysisSchema = TypeOf<typeof aiopsLogRateAnalysisSchema>;

View file

@ -14,7 +14,7 @@ import {
resetAllAction,
resetGroupsAction,
updateLoadingStateAction,
} from './explain_log_rate_spikes';
} from './log_rate_analysis';
import { initialState, streamReducer } from './stream_reducer';
describe('streamReducer', () => {

View file

@ -7,7 +7,7 @@
import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils';
import { API_ACTION_NAME, AiopsExplainLogRateSpikesApiAction } from './explain_log_rate_spikes';
import { API_ACTION_NAME, AiopsLogRateAnalysisApiAction } from './log_rate_analysis';
interface StreamState {
ccsWarning: boolean;
@ -31,7 +31,7 @@ export const initialState: StreamState = {
export function streamReducer(
state: StreamState,
action: AiopsExplainLogRateSpikesApiAction | AiopsExplainLogRateSpikesApiAction[]
action: AiopsLogRateAnalysisApiAction | AiopsLogRateAnalysisApiAction[]
): StreamState {
if (Array.isArray(action)) {
return action.reduce(streamReducer, state);

View file

@ -7,6 +7,6 @@
export const SPIKE_ANALYSIS_THRESHOLD = 0.02;
// For the technical preview of Explain Log Rate Spikes we use a hard coded seed.
// For the technical preview of Log Rate Analysis we use a hard coded seed.
// In future versions we might use a user specific seed or let the user costumise it.
export const RANDOM_SAMPLER_SEED = 3867412;

View file

@ -15,12 +15,6 @@ export const PLUGIN_ID = 'aiops';
*/
export const PLUGIN_NAME = 'AIOps';
/**
* This is an internal hard coded feature flag so we can easily turn on/off the
* "Explain log rate spikes UI" during development until the first release.
*/
export const AIOPS_ENABLED = true;
/**
* This is an internal hard coded feature flag so we can easily turn on/off the
* "Change Point Detection UI" during development until the first release.

View file

@ -7,7 +7,7 @@
import type { SignificantTerm } from '@kbn/ml-agg-utils';
import type { GroupTableItem } from '../../components/spike_analysis_table/types';
import type { GroupTableItem } from '../../components/log_rate_analysis_results_table/types';
import { buildExtendedBaseFilterCriteria } from './build_extended_base_filter_criteria';

View file

@ -15,7 +15,7 @@ import type { SignificantTerm } from '@kbn/ml-agg-utils';
import { buildBaseFilterCriteria } from '@kbn/ml-query-utils';
import type { GroupTableItem } from '../../components/spike_analysis_table/types';
import type { GroupTableItem } from '../../components/log_rate_analysis_results_table/types';
/*
* Contains utility functions for building and processing queries.

View file

@ -14,7 +14,7 @@ import { i18n } from '@kbn/i18n';
export function timeSeriesDataViewWarning(
dataView: DataView,
feature: 'change_point_detection' | 'log_categorization' | 'explain_log_rate_spikes'
feature: 'change_point_detection' | 'log_categorization' | 'log_rate_analysis'
) {
if (dataView.isTimeBased()) {
return null;
@ -29,9 +29,9 @@ export function timeSeriesDataViewWarning(
description = i18n.translate('xpack.aiops.logCategorizationTimeSeriesWarning.description', {
defaultMessage: 'Log pattern analysis only runs over time-based indices.',
});
} else if (feature === 'explain_log_rate_spikes') {
description = i18n.translate('xpack.aiops.logRateSpikesTimeSeriesWarning.description', {
defaultMessage: 'Log rate spikes only runs over time-based indices.',
} else if (feature === 'log_rate_analysis') {
description = i18n.translate('xpack.aiops.logRateAnalysisTimeSeriesWarning.description', {
defaultMessage: 'Log rate analysis only runs over time-based indices.',
});
}

View file

@ -148,12 +148,9 @@ export const ChangePointsTable: FC<ChangePointsTableProps> = ({
})}
>
<span>
{i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel',
{
defaultMessage: 'p-value',
}
)}
{i18n.translate('xpack.aiops.changePointDetection.pValueLabel', {
defaultMessage: 'p-value',
})}
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
</span>
</EuiToolTip>

View file

@ -131,7 +131,7 @@ export const ChartsGrid: FC<ChartsGridProps> = ({ changePoints: changePointsDict
{
title: (
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel"
id="xpack.aiops.changePointDetection.pValueLabel"
defaultMessage="p-value"
/>
),

View file

@ -30,7 +30,7 @@ export const FieldFilterApplyButton: FC<FieldFilterApplyButtonProps> = ({
disabled={disabled}
>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldFilterApplyButtonLabel"
id="xpack.aiops.logRateAnalysis.page.fieldFilterApplyButtonLabel"
defaultMessage="Apply"
/>
</EuiButton>

View file

@ -105,7 +105,7 @@ export const FieldFilterPopover: FC<FieldFilterPopoverProps> = ({
color="text"
>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldFilterButtonLabel"
id="xpack.aiops.logRateAnalysis.page.fieldFilterButtonLabel"
defaultMessage="Filter fields"
/>
</EuiButton>
@ -116,7 +116,7 @@ export const FieldFilterPopover: FC<FieldFilterPopoverProps> = ({
<EuiPopoverTitle>
<EuiText size="xs" color="subdued" style={{ maxWidth: '400px' }}>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldFilterHelpText"
id="xpack.aiops.logRateAnalysis.page.fieldFilterHelpText"
defaultMessage="Deselect non-relevant fields to remove them from groups and click the Apply button to rerun the grouping. Use the search bar to filter the list, then select/deselect multiple fields with the actions below."
/>
</EuiText>
@ -168,12 +168,12 @@ export const FieldFilterPopover: FC<FieldFilterPopoverProps> = ({
>
{fieldSearchText.length > 0 ? (
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllSearchedFields"
id="xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllSearchedFields"
defaultMessage="Select filtered fields"
/>
) : (
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllFields"
id="xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllFields"
defaultMessage="Select all fields"
/>
)}
@ -189,12 +189,12 @@ export const FieldFilterPopover: FC<FieldFilterPopoverProps> = ({
>
{fieldSearchText.length > 0 ? (
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllSearchedFields"
id="xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllSearchedFields"
defaultMessage="Deselect filtered fields"
/>
) : (
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllFields"
id="xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllFields"
defaultMessage="Deselect all fields"
/>
)}

View file

@ -8,23 +8,23 @@
/**
* The usage of the components in this folder works like this:
*
* <ExplainLogRateSpikesAppState>
* <ExplainLogRateSpikesPageProps>
* <ExplainLogRateSpikesAnalysis>
* <LogRateAnalysisAppState>
* <LogRateAnalysisPageProps>
* <LogRateAnalysisResults>
*
* - `ExplainLogRateSpikesAppState`: Manages and passes down url/app state related data, e.g. search parameters.
* - `ExplainLogRateSpikesPageProps`: The overall page layout. Includes state management for data selection
* - `LogRateAnalysisAppState`: Manages and passes down url/app state related data, e.g. search parameters.
* - `LogRateAnalysisPageProps`: The overall page layout. Includes state management for data selection
* like date range, data fetching for the document count chart, window parameters for the analysis.
* - `ExplainLogRateSpikesAnalysis`: Hosts the analysis results table including code to fetch its data.
* - `LogRateAnalysisResults`: Hosts the analysis results table including code to fetch its data.
* While for example the earliest/latest parameter can still be `undefined` on load in the upper component,
* this component expects all necessary parameters/props already to be defined. The reason is the usage of
* data fetching hooks which cannot be called conditionally, so the pattern used here is to only load this
* whole component conditionally on the outer level.
*/
export type { ExplainLogRateSpikesAppStateProps } from './explain_log_rate_spikes_app_state';
import { ExplainLogRateSpikesAppState } from './explain_log_rate_spikes_app_state';
export type { LogRateAnalysisAppStateProps } from './log_rate_analysis_app_state';
import { LogRateAnalysisAppState } from './log_rate_analysis_app_state';
// required for dynamic import using React.lazy()
// eslint-disable-next-line import/no-default-export
export default ExplainLogRateSpikesAppState;
export default LogRateAnalysisAppState;

View file

@ -22,14 +22,14 @@ import { AiopsAppContext } from '../../hooks/use_aiops_app_context';
import { DataSourceContext } from '../../hooks/use_data_source';
import { AIOPS_STORAGE_KEYS } from '../../types/storage';
import { SpikeAnalysisTableRowStateProvider } from '../spike_analysis_table/spike_analysis_table_row_provider';
import { LogRateAnalysisResultsTableRowStateProvider } from '../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider';
import { ExplainLogRateSpikesPage } from './explain_log_rate_spikes_page';
import { LogRateAnalysisPage } from './log_rate_analysis_page';
import { timeSeriesDataViewWarning } from '../../application/utils/time_series_dataview_check';
const localStorage = new Storage(window.localStorage);
export interface ExplainLogRateSpikesAppStateProps {
export interface LogRateAnalysisAppStateProps {
/** The data view to analyze. */
dataView: DataView;
/** The saved search to analyze. */
@ -40,7 +40,7 @@ export interface ExplainLogRateSpikesAppStateProps {
stickyHistogram?: boolean;
}
export const ExplainLogRateSpikesAppState: FC<ExplainLogRateSpikesAppStateProps> = ({
export const LogRateAnalysisAppState: FC<LogRateAnalysisAppStateProps> = ({
dataView,
savedSearch,
appDependencies,
@ -48,7 +48,7 @@ export const ExplainLogRateSpikesAppState: FC<ExplainLogRateSpikesAppStateProps>
}) => {
if (!dataView) return null;
const warning = timeSeriesDataViewWarning(dataView, 'explain_log_rate_spikes');
const warning = timeSeriesDataViewWarning(dataView, 'log_rate_analysis');
if (warning !== null) {
return <>{warning}</>;
@ -65,13 +65,13 @@ export const ExplainLogRateSpikesAppState: FC<ExplainLogRateSpikesAppStateProps>
<AiopsAppContext.Provider value={appDependencies}>
<UrlStateProvider>
<DataSourceContext.Provider value={{ dataView, savedSearch }}>
<SpikeAnalysisTableRowStateProvider>
<LogRateAnalysisResultsTableRowStateProvider>
<StorageContextProvider storage={localStorage} storageKeys={AIOPS_STORAGE_KEYS}>
<DatePickerContextProvider {...datePickerDeps}>
<ExplainLogRateSpikesPage stickyHistogram={stickyHistogram} />
<LogRateAnalysisPage stickyHistogram={stickyHistogram} />
</DatePickerContextProvider>
</StorageContextProvider>
</SpikeAnalysisTableRowStateProvider>
</LogRateAnalysisResultsTableRowStateProvider>
</DataSourceContext.Provider>
</UrlStateProvider>
</AiopsAppContext.Provider>

View file

@ -5,8 +5,8 @@
* 2.0.
*/
import { ExplainLogRateSpikesContentWrapper } from './explain_log_rate_spikes_content_wrapper';
import { LogRateAnalysisContentWrapper } from './log_rate_analysis_content_wrapper';
// required for dynamic import using React.lazy()
// eslint-disable-next-line import/no-default-export
export default ExplainLogRateSpikesContentWrapper;
export default LogRateAnalysisContentWrapper;

View file

@ -22,11 +22,11 @@ import { useData } from '../../../hooks/use_data';
import { DocumentCountContent } from '../../document_count_content/document_count_content';
import {
ExplainLogRateSpikesAnalysis,
type ExplainLogRateSpikesAnalysisResults,
} from '../explain_log_rate_spikes_analysis';
import type { GroupTableItem } from '../../spike_analysis_table/types';
import { useSpikeAnalysisTableRowContext } from '../../spike_analysis_table/spike_analysis_table_row_provider';
LogRateAnalysisResults,
type LogRateAnalysisResultsData,
} from '../log_rate_analysis_results';
import type { GroupTableItem } from '../../log_rate_analysis_results_table/types';
import { useLogRateAnalysisResultsTableRowContext } from '../../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider';
const DEFAULT_SEARCH_QUERY = { match_all: {} };
@ -37,13 +37,13 @@ export function getDocumentCountStatsSplitLabel(
if (significantTerm) {
return `${significantTerm?.fieldName}:${significantTerm?.fieldValue}`;
} else if (group) {
return i18n.translate('xpack.aiops.spikeAnalysisPage.documentCountStatsSplitGroupLabel', {
return i18n.translate('xpack.aiops.logRateAnalysis.page.documentCountStatsSplitGroupLabel', {
defaultMessage: 'Selected group',
});
}
}
export interface ExplainLogRateSpikesContentProps {
export interface LogRateAnalysisContentProps {
/** The data view to analyze. */
dataView: DataView;
setGlobalState?: (params: Dictionary<unknown>) => void;
@ -59,10 +59,10 @@ export interface ExplainLogRateSpikesContentProps {
/** Optional color override for the highlighted bar color for charts */
barHighlightColorOverride?: string;
/** Optional callback that exposes data of the completed analysis */
onAnalysisCompleted?: (d: ExplainLogRateSpikesAnalysisResults) => void;
onAnalysisCompleted?: (d: LogRateAnalysisResultsData) => void;
}
export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentProps> = ({
export const LogRateAnalysisContent: FC<LogRateAnalysisContentProps> = ({
dataView,
setGlobalState,
initialAnalysisStart: incomingInitialAnalysisStart,
@ -90,7 +90,7 @@ export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentProps> =
setPinnedGroup,
setSelectedSignificantTerm,
setSelectedGroup,
} = useSpikeAnalysisTableRowContext();
} = useLogRateAnalysisResultsTableRowContext();
const { documentStats, earliest, latest } = useData(
dataView,
@ -146,7 +146,7 @@ export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentProps> =
)}
<EuiHorizontalRule />
{earliest !== undefined && latest !== undefined && windowParameters !== undefined && (
<ExplainLogRateSpikesAnalysis
<LogRateAnalysisResults
dataView={dataView}
earliest={earliest}
isBrushCleared={isBrushCleared}
@ -170,7 +170,7 @@ export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentProps> =
title={
<h2>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.emptyPromptTitle"
id="xpack.aiops.logRateAnalysis.page.emptyPromptTitle"
defaultMessage="Click a spike in the histogram chart to start the analysis."
/>
</h2>
@ -179,8 +179,8 @@ export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentProps> =
body={
<p>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.emptyPromptBody"
defaultMessage="The explain log rate spikes feature identifies statistically significant field/value combinations that contribute to a log rate spike."
id="xpack.aiops.logRateAnalysis.page.emptyPromptBody"
defaultMessage="The log rate analysis feature identifies statistically significant field/value combinations that contribute to a log rate spike or drop."
/>
</p>
}

View file

@ -25,13 +25,13 @@ import { AiopsAppContext, type AiopsAppDependencies } from '../../../hooks/use_a
import { DataSourceContext } from '../../../hooks/use_data_source';
import { AIOPS_STORAGE_KEYS } from '../../../types/storage';
import { SpikeAnalysisTableRowStateProvider } from '../../spike_analysis_table/spike_analysis_table_row_provider';
import { ExplainLogRateSpikesContent } from './explain_log_rate_spikes_content';
import type { ExplainLogRateSpikesAnalysisResults } from '../explain_log_rate_spikes_analysis';
import { LogRateAnalysisResultsTableRowStateProvider } from '../../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider';
import { LogRateAnalysisContent } from './log_rate_analysis_content';
import type { LogRateAnalysisResultsData } from '../log_rate_analysis_results';
const localStorage = new Storage(window.localStorage);
export interface ExplainLogRateSpikesContentWrapperProps {
export interface LogRateAnalysisContentWrapperProps {
/** The data view to analyze. */
dataView: DataView;
/** Option to make main histogram sticky */
@ -50,10 +50,10 @@ export interface ExplainLogRateSpikesContentWrapperProps {
/** Optional color override for the highlighted bar color for charts */
barHighlightColorOverride?: string;
/** Optional callback that exposes data of the completed analysis */
onAnalysisCompleted?: (d: ExplainLogRateSpikesAnalysisResults) => void;
onAnalysisCompleted?: (d: LogRateAnalysisResultsData) => void;
}
export const ExplainLogRateSpikesContentWrapper: FC<ExplainLogRateSpikesContentWrapperProps> = ({
export const LogRateAnalysisContentWrapper: FC<LogRateAnalysisContentWrapperProps> = ({
dataView,
appDependencies,
setGlobalState,
@ -67,7 +67,7 @@ export const ExplainLogRateSpikesContentWrapper: FC<ExplainLogRateSpikesContentW
}) => {
if (!dataView) return null;
const warning = timeSeriesDataViewWarning(dataView, 'explain_log_rate_spikes');
const warning = timeSeriesDataViewWarning(dataView, 'log_rate_analysis');
if (warning !== null) {
return <>{warning}</>;
@ -84,10 +84,10 @@ export const ExplainLogRateSpikesContentWrapper: FC<ExplainLogRateSpikesContentW
<AiopsAppContext.Provider value={appDependencies}>
<UrlStateProvider>
<DataSourceContext.Provider value={{ dataView, savedSearch: null }}>
<SpikeAnalysisTableRowStateProvider>
<LogRateAnalysisResultsTableRowStateProvider>
<StorageContextProvider storage={localStorage} storageKeys={AIOPS_STORAGE_KEYS}>
<DatePickerContextProvider {...datePickerDeps}>
<ExplainLogRateSpikesContent
<LogRateAnalysisContent
dataView={dataView}
setGlobalState={setGlobalState}
initialAnalysisStart={initialAnalysisStart}
@ -100,7 +100,7 @@ export const ExplainLogRateSpikesContentWrapper: FC<ExplainLogRateSpikesContentW
/>
</DatePickerContextProvider>
</StorageContextProvider>
</SpikeAnalysisTableRowStateProvider>
</LogRateAnalysisResultsTableRowStateProvider>
</DataSourceContext.Provider>
</UrlStateProvider>
</AiopsAppContext.Provider>

View file

@ -24,20 +24,20 @@ import {
} from '../../application/utils/url_state';
import { SearchPanel } from '../search_panel';
import { useSpikeAnalysisTableRowContext } from '../spike_analysis_table/spike_analysis_table_row_provider';
import { useLogRateAnalysisResultsTableRowContext } from '../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider';
import { PageHeader } from '../page_header';
import { ExplainLogRateSpikesContent } from './explain_log_rate_spikes_content/explain_log_rate_spikes_content';
import { LogRateAnalysisContent } from './log_rate_analysis_content/log_rate_analysis_content';
interface Props {
stickyHistogram?: boolean;
}
export const ExplainLogRateSpikesPage: FC<Props> = ({ stickyHistogram }) => {
export const LogRateAnalysisPage: FC<Props> = ({ stickyHistogram }) => {
const { data: dataService } = useAiopsAppContext();
const { dataView, savedSearch } = useDataSource();
const { currentSelectedSignificantTerm, currentSelectedGroup } =
useSpikeAnalysisTableRowContext();
useLogRateAnalysisResultsTableRowContext();
const [aiopsListState, setAiopsListState] = usePageUrlState<AiOpsPageUrlState>(
'AIOPS_INDEX_VIEWER',
@ -132,7 +132,7 @@ export const ExplainLogRateSpikesPage: FC<Props> = ({ stickyHistogram }) => {
}, [dataService, searchQueryLanguage, searchString]);
return (
<EuiPageBody data-test-subj="aiopsExplainLogRateSpikesPage" paddingSize="none" panelled={false}>
<EuiPageBody data-test-subj="aiopsLogRateAnalysisPage" paddingSize="none" panelled={false}>
<PageHeader />
<EuiSpacer size="m" />
<EuiPageSection paddingSize="none">
@ -146,7 +146,7 @@ export const ExplainLogRateSpikesPage: FC<Props> = ({ stickyHistogram }) => {
setSearchParams={setSearchParams}
/>
</EuiFlexItem>
<ExplainLogRateSpikesContent
<LogRateAnalysisContent
dataView={dataView}
setGlobalState={setGlobalState}
esSearchQuery={searchQuery}

View file

@ -31,53 +31,52 @@ import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils';
import { useAiopsAppContext } from '../../hooks/use_aiops_app_context';
import { initialState, streamReducer } from '../../../common/api/stream_reducer';
import type { ApiExplainLogRateSpikes } from '../../../common/api';
import type { AiopsApiLogRateAnalysis } from '../../../common/api';
import {
getGroupTableItems,
SpikeAnalysisTable,
SpikeAnalysisGroupsTable,
} from '../spike_analysis_table';
import {} from '../spike_analysis_table';
import { useSpikeAnalysisTableRowContext } from '../spike_analysis_table/spike_analysis_table_row_provider';
LogRateAnalysisResultsTable,
LogRateAnalysisResultsGroupsTable,
} from '../log_rate_analysis_results_table';
import { useLogRateAnalysisResultsTableRowContext } from '../log_rate_analysis_results_table/log_rate_analysis_results_table_row_provider';
import { FieldFilterPopover } from './field_filter_popover';
const groupResultsMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResults',
'xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResults',
{
defaultMessage: 'Smart grouping',
}
);
const groupResultsHelpMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage',
'xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsHelpMessage',
{
defaultMessage: 'Items which are unique to a group are marked by an asterisk (*).',
}
);
const groupResultsOffMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOff',
'xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsOff',
{
defaultMessage: 'Off',
}
);
const groupResultsOnMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOn',
'xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsOn',
{
defaultMessage: 'On',
}
);
const resultsGroupedOffId = 'aiopsExplainLogRateSpikesGroupingOff';
const resultsGroupedOnId = 'aiopsExplainLogRateSpikesGroupingOn';
const resultsGroupedOffId = 'aiopsLogRateAnalysisGroupingOff';
const resultsGroupedOnId = 'aiopsLogRateAnalysisGroupingOn';
export interface ExplainLogRateSpikesAnalysisResults {
export interface LogRateAnalysisResultsData {
significantTerms: SignificantTerm[];
significantTermsGroups: SignificantTermGroup[];
}
/**
* ExplainLogRateSpikes props require a data view.
* LogRateAnalysis props require a data view.
*/
interface ExplainLogRateSpikesAnalysisProps {
interface LogRateAnalysisResultsProps {
/** The data view to analyze. */
dataView: DataView;
/** Start timestamp filter */
@ -100,10 +99,10 @@ interface ExplainLogRateSpikesAnalysisProps {
/** Optional color override for the highlighted bar color for charts */
barHighlightColorOverride?: string;
/** Optional callback that exposes data of the completed analysis */
onAnalysisCompleted?: (d: ExplainLogRateSpikesAnalysisResults) => void;
onAnalysisCompleted?: (d: LogRateAnalysisResultsData) => void;
}
export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps> = ({
export const LogRateAnalysisResults: FC<LogRateAnalysisResultsProps> = ({
dataView,
earliest,
isBrushCleared,
@ -120,7 +119,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
const { http } = useAiopsAppContext();
const basePath = http.basePath.get() ?? '';
const { clearAllRowState } = useSpikeAnalysisTableRowContext();
const { clearAllRowState } = useLogRateAnalysisResultsTableRowContext();
const [currentAnalysisWindowParameters, setCurrentAnalysisWindowParameters] = useState<
WindowParameters | undefined
@ -129,7 +128,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
const [groupSkipFields, setGroupSkipFields] = useState<string[]>([]);
const [uniqueFieldNames, setUniqueFieldNames] = useState<string[]>([]);
const [overrides, setOverrides] = useState<
ApiExplainLogRateSpikes['body']['overrides'] | undefined
AiopsApiLogRateAnalysis['body']['overrides'] | undefined
>(undefined);
const [shouldStart, setShouldStart] = useState(false);
const [toggleIdSelected, setToggleIdSelected] = useState(resultsGroupedOffId);
@ -159,8 +158,8 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
data,
isRunning,
errors: streamErrors,
} = useFetchStream<ApiExplainLogRateSpikes, typeof basePath>(
`${basePath}/internal/aiops/explain_log_rate_spikes`,
} = useFetchStream<AiopsApiLogRateAnalysis, typeof basePath>(
`${basePath}/internal/aiops/log_rate_analysis`,
'1',
{
start: earliest,
@ -257,7 +256,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
[currentAnalysisWindowParameters, windowParameters]
);
const showSpikeAnalysisTable = data?.significantTerms.length > 0;
const showLogRateAnalysisResultsTable = data?.significantTerms.length > 0;
const groupItemCount = groupTableItems.reduce((p, c) => {
return p + c.groupItemsSortedByUniqueness.length;
}, 0);
@ -272,17 +271,17 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
{
id: resultsGroupedOffId,
label: groupResultsOffMessage,
'data-test-subj': 'aiopsExplainLogRateSpikesGroupSwitchOff',
'data-test-subj': 'aiopsLogRateAnalysisGroupSwitchOff',
},
{
id: resultsGroupedOnId,
label: groupResultsOnMessage,
'data-test-subj': 'aiopsExplainLogRateSpikesGroupSwitchOn',
'data-test-subj': 'aiopsLogRateAnalysisGroupSwitchOn',
},
];
return (
<div data-test-subj="aiopsExplainLogRateSpikesAnalysis">
<div data-test-subj="aiopsLogRateAnalysisResults">
<ProgressControls
isBrushCleared={isBrushCleared}
progress={data.loaded}
@ -301,7 +300,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiButtonGroup
data-test-subj={`aiopsExplainLogRateSpikesGroupSwitch${
data-test-subj={`aiopsLogRateAnalysisGroupSwitch${
groupResults ? ' checked' : ''
}`}
buttonSize="s"
@ -351,7 +350,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
<p>
<EuiButton size="s" onClick={() => startHandler(true)}>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.tryToContinueAnalysisButtonText"
id="xpack.aiops.logRateAnalysis.page.tryToContinueAnalysisButtonText"
defaultMessage="Try to continue analysis"
/>
</EuiButton>
@ -362,20 +361,20 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
<EuiSpacer size="xs" />
</>
) : null}
{showSpikeAnalysisTable && groupResults && foundGroups && (
{showLogRateAnalysisResultsTable && groupResults && foundGroups && (
<>
<EuiSpacer size="xs" />
<EuiText size="xs">{groupResults ? groupResultsHelpMessage : undefined}</EuiText>
</>
)}
<EuiSpacer size="xs" />
{!isRunning && !showSpikeAnalysisTable && (
{!isRunning && !showLogRateAnalysisResultsTable && (
<EuiEmptyPrompt
data-test-subj="aiopsNoResultsFoundEmptyPrompt"
title={
<h2>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.noResultsPromptTitle"
id="xpack.aiops.logRateAnalysis.page.noResultsPromptTitle"
defaultMessage="The analysis did not return any results."
/>
</h2>
@ -384,7 +383,7 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
body={
<p>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikesPage.noResultsPromptBody"
id="xpack.aiops.logRateAnalysis.page.noResultsPromptBody"
defaultMessage="Try to adjust the baseline and deviation time ranges and rerun the analysis. If you still get no results, there might be no statistically significant entities contributing to this spike in log rates."
/>
</p>
@ -404,8 +403,8 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
: undefined
}
>
{showSpikeAnalysisTable && groupResults ? (
<SpikeAnalysisGroupsTable
{showLogRateAnalysisResultsTable && groupResults ? (
<LogRateAnalysisResultsGroupsTable
significantTerms={data.significantTerms}
groupTableItems={groupTableItems}
loading={isRunning}
@ -416,8 +415,8 @@ export const ExplainLogRateSpikesAnalysis: FC<ExplainLogRateSpikesAnalysisProps>
barHighlightColorOverride={barHighlightColorOverride}
/>
) : null}
{showSpikeAnalysisTable && !groupResults ? (
<SpikeAnalysisTable
{showLogRateAnalysisResultsTable && !groupResults ? (
<LogRateAnalysisResultsTable
significantTerms={data.significantTerms}
loading={isRunning}
dataView={dataView}

View file

@ -6,5 +6,5 @@
*/
export { getGroupTableItems } from './get_group_table_items';
export { SpikeAnalysisTable } from './spike_analysis_table';
export { SpikeAnalysisGroupsTable } from './spike_analysis_table_groups';
export { LogRateAnalysisResultsTable } from './log_rate_analysis_results_table';
export { LogRateAnalysisResultsGroupsTable } from './log_rate_analysis_results_table_groups';

View file

@ -34,7 +34,7 @@ import { MiniHistogram } from '../mini_histogram';
import { useAiopsAppContext } from '../../hooks/use_aiops_app_context';
import { getFailedTransactionsCorrelationImpactLabel } from './get_failed_transactions_correlation_impact_label';
import { useSpikeAnalysisTableRowContext } from './spike_analysis_table_row_provider';
import { useLogRateAnalysisResultsTableRowContext } from './log_rate_analysis_results_table_row_provider';
import { FieldStatsPopover } from '../field_stats_popover';
import { useCopyToClipboardAction } from './use_copy_to_clipboard_action';
import { useViewInDiscoverAction } from './use_view_in_discover_action';
@ -49,7 +49,7 @@ const PAGINATION_SIZE_OPTIONS = [5, 10, 20, 50];
const DEFAULT_SORT_FIELD = 'pValue';
const DEFAULT_SORT_DIRECTION = 'asc';
interface SpikeAnalysisTableProps {
interface LogRateAnalysisResultsTableProps {
significantTerms: SignificantTerm[];
dataView: DataView;
loading: boolean;
@ -62,7 +62,7 @@ interface SpikeAnalysisTableProps {
barHighlightColorOverride?: string;
}
export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
export const LogRateAnalysisResultsTable: FC<LogRateAnalysisResultsTableProps> = ({
significantTerms,
dataView,
loading,
@ -81,7 +81,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
selectedSignificantTerm,
setPinnedSignificantTerm,
setSelectedSignificantTerm,
} = useSpikeAnalysisTableRowContext();
} = useLogRateAnalysisResultsTableRowContext();
const [pageIndex, setPageIndex] = useState(0);
const [pageSize, setPageSize] = useState(10);
@ -106,9 +106,9 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
const columns: Array<EuiBasicTableColumn<SignificantTerm>> = [
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnFieldName',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnFieldName',
field: 'fieldName',
name: i18n.translate('xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldNameLabel', {
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.fieldNameLabel', {
defaultMessage: 'Field name',
}),
render: (_, { fieldName, fieldValue }) => (
@ -128,9 +128,9 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
valign: 'middle',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnFieldValue',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnFieldValue',
field: 'fieldValue',
name: i18n.translate('xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldValueLabel', {
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.fieldValueLabel', {
defaultMessage: 'Field value',
}),
render: (_, { fieldValue }) => String(fieldValue),
@ -139,23 +139,20 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
valign: 'middle',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnLogRate',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnLogRate',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateColumnTooltip',
{
defaultMessage:
'A visual representation of the impact of the field on the message rate difference',
}
)}
content={i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.logRateColumnTooltip', {
defaultMessage:
'A visual representation of the impact of the field on the message rate difference',
})}
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateLabel"
id="xpack.aiops.logRateAnalysis.resultsTable.logRateLabel"
defaultMessage="Log rate"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -175,33 +172,30 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
valign: 'middle',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnDocCount',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnDocCount',
width: NARROW_COLUMN_WIDTH,
field: 'doc_count',
name: i18n.translate('xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.docCountLabel', {
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.docCountLabel', {
defaultMessage: 'Doc count',
}),
sortable: true,
valign: 'middle',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnPValue',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnPValue',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueColumnTooltip',
{
defaultMessage:
'The significance of changes in the frequency of values; lower values indicate greater change; sorting this column will automatically do a secondary sort on the doc count column.',
}
)}
content={i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.pValueColumnTooltip', {
defaultMessage:
'The significance of changes in the frequency of values; lower values indicate greater change; sorting this column will automatically do a secondary sort on the doc count column.',
})}
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueLabel"
id="xpack.aiops.logRateAnalysis.resultsTable.pValueLabel"
defaultMessage="p-value"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -213,14 +207,14 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
valign: 'middle',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnImpact',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnImpact',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTable.impactLabelColumnTooltip',
{
defaultMessage: 'The level of impact of the field on the message rate difference.',
}
@ -228,7 +222,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel"
id="xpack.aiops.logRateAnalysis.resultsTable.impactLabel"
defaultMessage="Impact"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -244,8 +238,8 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
valign: 'middle',
},
{
'data-test-subj': 'aiOpsSpikeAnalysisTableColumnAction',
name: i18n.translate('xpack.aiops.spikeAnalysisTable.actionsColumnName', {
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnAction',
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.actionsColumnName', {
defaultMessage: 'Actions',
}),
actions: [
@ -260,7 +254,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
if (isExpandedRow === true) {
columns.unshift({
'data-test-subj': 'aiopsSpikeAnalysisTableColumnUnique',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnUnique',
width: UNIQUE_COLUMN_WIDTH,
field: 'unique',
name: '',
@ -269,7 +263,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
return (
<EuiIconTip
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.uniqueColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTable.uniqueColumnTooltip',
{
defaultMessage: 'This field/value pair only appears in this group',
}
@ -377,7 +371,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
return (
<EuiBasicTable
data-test-subj="aiopsSpikeAnalysisTable"
data-test-subj="aiopsLogRateAnalysisResultsTable"
compressed
columns={columns}
items={pageOfItems}
@ -387,7 +381,7 @@ export const SpikeAnalysisTable: FC<SpikeAnalysisTableProps> = ({
sorting={sorting as EuiTableSortingType<SignificantTerm>}
rowProps={(significantTerm) => {
return {
'data-test-subj': `aiopsSpikeAnalysisTableRow row-${significantTerm.fieldName}-${significantTerm.fieldValue}`,
'data-test-subj': `aiopsLogRateAnalysisResultsTableRow row-${significantTerm.fieldName}-${significantTerm.fieldValue}`,
onClick: () => {
if (
significantTerm.fieldName === pinnedSignificantTerm?.fieldName &&

View file

@ -35,8 +35,8 @@ import type { DataView } from '@kbn/data-views-plugin/public';
import { MiniHistogram } from '../mini_histogram';
import { getFailedTransactionsCorrelationImpactLabel } from './get_failed_transactions_correlation_impact_label';
import { SpikeAnalysisTable } from './spike_analysis_table';
import { useSpikeAnalysisTableRowContext } from './spike_analysis_table_row_provider';
import { LogRateAnalysisResultsTable } from './log_rate_analysis_results_table';
import { useLogRateAnalysisResultsTableRowContext } from './log_rate_analysis_results_table_row_provider';
import type { GroupTableItem } from './types';
import { useCopyToClipboardAction } from './use_copy_to_clipboard_action';
import { useViewInDiscoverAction } from './use_view_in_discover_action';
@ -52,7 +52,7 @@ const PAGINATION_SIZE_OPTIONS = [5, 10, 20, 50];
const DEFAULT_SORT_FIELD = 'pValue';
const DEFAULT_SORT_DIRECTION = 'asc';
interface SpikeAnalysisTableProps {
interface LogRateAnalysisResultsTableProps {
significantTerms: SignificantTerm[];
groupTableItems: GroupTableItem[];
loading: boolean;
@ -65,7 +65,7 @@ interface SpikeAnalysisTableProps {
barHighlightColorOverride?: string;
}
export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
export const LogRateAnalysisResultsGroupsTable: FC<LogRateAnalysisResultsTableProps> = ({
significantTerms,
groupTableItems,
loading,
@ -88,7 +88,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
const primaryBackgroundColor = useEuiBackgroundColor('primary');
const { pinnedGroup, selectedGroup, setPinnedGroup, setSelectedGroup } =
useSpikeAnalysisTableRowContext();
useLogRateAnalysisResultsTableRowContext();
const dataViewId = dataView.id;
const toggleDetails = (item: GroupTableItem) => {
@ -97,7 +97,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
delete itemIdToExpandedRowMapValues[item.id];
} else {
itemIdToExpandedRowMapValues[item.id] = (
<SpikeAnalysisTable
<LogRateAnalysisResultsTable
significantTerms={item.groupItemsSortedByUniqueness.reduce<SignificantTerm[]>(
(p, groupItem) => {
const st = significantTerms.find(
@ -144,22 +144,16 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
),
render: (item: GroupTableItem) => (
<EuiButtonIcon
data-test-subj={'aiopsSpikeAnalysisGroupsTableRowExpansionButton'}
data-test-subj={'aiopsLogRateAnalysisResultsGroupsTableRowExpansionButton'}
onClick={() => toggleDetails(item)}
aria-label={
itemIdToExpandedRowMap[item.id]
? i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.collapseAriaLabel',
{
defaultMessage: 'Collapse',
}
)
: i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.expandAriaLabel',
{
defaultMessage: 'Expand',
}
)
? i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.collapseAriaLabel', {
defaultMessage: 'Collapse',
})
: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.expandAriaLabel', {
defaultMessage: 'Expand',
})
}
iconType={itemIdToExpandedRowMap[item.id] ? 'arrowDown' : 'arrowRight'}
/>
@ -167,13 +161,13 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valign: 'top',
},
{
'data-test-subj': 'aiopsSpikeAnalysisGroupsTableColumnGroup',
'data-test-subj': 'aiopsLogRateAnalysisResultsGroupsTableColumnGroup',
field: 'group',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTableGroups.groupColumnTooltip',
{
defaultMessage:
'Displays up to {maxItemCount} group items sorted by uniqueness and document count. Expand row to see all field/value pairs.',
@ -183,7 +177,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.groupLabel"
defaultMessage="Group"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -198,7 +192,10 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
if (valuesBadges.length >= MAX_GROUP_BADGES) break;
valuesBadges.push(
<span key={`${fieldName}-id`}>
<EuiBadge data-test-subj="aiopsSpikeAnalysisTableColumnGroupBadge" color="hollow">
<EuiBadge
data-test-subj="aiopsLogRateAnalysisResultsTableColumnGroupBadge"
color="hollow"
>
<span>
{(duplicate ?? 0) <= 1 ? '* ' : ''}
{`${fieldName}: `}
@ -214,12 +211,12 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valuesBadges.push(
<EuiText
key={`group-info-id`}
data-test-subj="aiopsSpikeAnalysisGroupsTableColumnGroupInfo"
data-test-subj="aiopsLogRateAnalysisResultsGroupsTableColumnGroupInfo"
color="subdued"
size="xs"
>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupItemsInfo"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo"
defaultMessage="Showing {valuesBadges} out of {count} items."
values={{
count: groupItemsSortedByUniqueness.length,
@ -230,7 +227,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
<>
{' '}
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupUniqueItemsInfo"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo"
defaultMessage="{count, plural, one {# item} other {# items}} unique to this group."
values={{
count: uniqueItemsCount,
@ -249,14 +246,14 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valign: 'top',
},
{
'data-test-subj': 'aiopsSpikeAnalysisGroupsTableColumnLogRate',
'data-test-subj': 'aiopsLogRateAnalysisResultsGroupsTableColumnLogRate',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTableGroups.logRateColumnTooltip',
{
defaultMessage:
'A visual representation of the impact of the group on the message rate difference.',
@ -265,7 +262,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateLabel"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.logRateLabel"
defaultMessage="Log rate"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -276,12 +273,9 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
<MiniHistogram
chartData={histogram}
isLoading={loading && histogram === undefined}
label={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel',
{
defaultMessage: 'Group',
}
)}
label={i18n.translate('xpack.aiops.logRateAnalysis.resultsTableGroups.groupLabel', {
defaultMessage: 'Group',
})}
barColorOverride={barColorOverride}
barHighlightColorOverride={barHighlightColorOverride}
/>
@ -290,24 +284,24 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valign: 'top',
},
{
'data-test-subj': 'aiopsSpikeAnalysisGroupsTableColumnDocCount',
'data-test-subj': 'aiopsLogRateAnalysisResultsGroupsTableColumnDocCount',
width: NARROW_COLUMN_WIDTH,
field: 'docCount',
name: i18n.translate('xpack.aiops.correlations.spikeAnalysisTableGroups.docCountLabel', {
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.docCountLabel', {
defaultMessage: 'Doc count',
}),
sortable: true,
valign: 'top',
},
{
'data-test-subj': 'aiopsSpikeAnalysisGroupsTableColumnPValue',
'data-test-subj': 'aiopsLogRateAnalysisResultsGroupsTableColumnPValue',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTableGroups.pValueColumnTooltip',
{
defaultMessage:
'The significance of changes in the frequency of values; lower values indicate greater change; sorting this column will automatically do a secondary sort on the doc count column.',
@ -316,7 +310,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.pValueLabel"
defaultMessage="p-value"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -328,14 +322,14 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valign: 'top',
},
{
'data-test-subj': 'aiopsSpikeAnalysisTableColumnImpact',
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnImpact',
width: NARROW_COLUMN_WIDTH,
field: 'pValue',
name: (
<EuiToolTip
position="top"
content={i18n.translate(
'xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.impactLabelColumnTooltip',
'xpack.aiops.logRateAnalysis.resultsTableGroups.impactLabelColumnTooltip',
{
defaultMessage: 'The level of impact of the group on the message rate difference',
}
@ -343,7 +337,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
>
<>
<FormattedMessage
id="xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel"
id="xpack.aiops.logRateAnalysis.resultsTableGroups.impactLabel"
defaultMessage="Impact"
/>
<EuiIcon size="s" color="subdued" type="questionInCircle" className="eui-alignTop" />
@ -359,8 +353,8 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
valign: 'top',
},
{
'data-test-subj': 'aiOpsSpikeAnalysisTableColumnAction',
name: i18n.translate('xpack.aiops.spikeAnalysisGroupsTable.actionsColumnName', {
'data-test-subj': 'aiopsLogRateAnalysisResultsTableColumnAction',
name: i18n.translate('xpack.aiops.logRateAnalysis.resultsTable.actionsColumnName', {
defaultMessage: 'Actions',
}),
actions: [
@ -449,7 +443,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
return (
<EuiBasicTable
data-test-subj="aiopsSpikeAnalysisGroupsTable"
data-test-subj="aiopsLogRateAnalysisResultsGroupsTable"
compressed
columns={columns}
items={pageOfItems}
@ -461,7 +455,7 @@ export const SpikeAnalysisGroupsTable: FC<SpikeAnalysisTableProps> = ({
sorting={sorting as EuiTableSortingType<GroupTableItem>}
rowProps={(group) => {
return {
'data-test-subj': `aiopsSpikeAnalysisGroupsTableRow row-${group.id}`,
'data-test-subj': `aiopsLogRateAnalysisResultsGroupsTableRow row-${group.id}`,
onClick: () => {
if (group.id === pinnedGroup?.id) {
setPinnedGroup(null);

View file

@ -22,7 +22,7 @@ import type { GroupTableItem } from './types';
type SignificantTermOrNull = SignificantTerm | null;
type GroupOrNull = GroupTableItem | null;
interface SpikeAnalysisTableRow {
interface LogRateAnalysisResultsTableRow {
pinnedSignificantTerm: SignificantTermOrNull;
setPinnedSignificantTerm: Dispatch<SetStateAction<SignificantTermOrNull>>;
pinnedGroup: GroupOrNull;
@ -36,11 +36,11 @@ interface SpikeAnalysisTableRow {
clearAllRowState: () => void;
}
export const spikeAnalysisTableRowContext = createContext<SpikeAnalysisTableRow | undefined>(
undefined
);
export const logRateAnalysisResultsTableRowContext = createContext<
LogRateAnalysisResultsTableRow | undefined
>(undefined);
export const SpikeAnalysisTableRowStateProvider: FC = ({ children }) => {
export const LogRateAnalysisResultsTableRowStateProvider: FC = ({ children }) => {
// State that will be shared with all components
const [pinnedSignificantTerm, setPinnedSignificantTerm] = useState<SignificantTermOrNull>(null);
const [pinnedGroup, setPinnedGroup] = useState<GroupOrNull>(null);
@ -66,7 +66,7 @@ export const SpikeAnalysisTableRowStateProvider: FC = ({ children }) => {
}
}, [selectedGroup, pinnedGroup]);
const contextValue: SpikeAnalysisTableRow = useMemo(
const contextValue: LogRateAnalysisResultsTableRow = useMemo(
() => ({
pinnedSignificantTerm,
setPinnedSignificantTerm,
@ -101,19 +101,19 @@ export const SpikeAnalysisTableRowStateProvider: FC = ({ children }) => {
return (
// Provider managing the state
<spikeAnalysisTableRowContext.Provider value={contextValue}>
<logRateAnalysisResultsTableRowContext.Provider value={contextValue}>
{children}
</spikeAnalysisTableRowContext.Provider>
</logRateAnalysisResultsTableRowContext.Provider>
);
};
export const useSpikeAnalysisTableRowContext = () => {
const spikeAnalysisTableRow = useContext(spikeAnalysisTableRowContext);
export const useLogRateAnalysisResultsTableRowContext = () => {
const logRateAnalysisResultsTableRow = useContext(logRateAnalysisResultsTableRowContext);
// If `undefined`, throw an error.
if (spikeAnalysisTableRow === undefined) {
throw new Error('useSpikeAnalysisTableRowContext was used outside of its Provider');
if (logRateAnalysisResultsTableRow === undefined) {
throw new Error('useLogRateAnalysisResultsTableRowContext was used outside of its Provider');
}
return spikeAnalysisTableRow;
return logRateAnalysisResultsTableRow;
};

View file

@ -17,21 +17,21 @@ import { getTableItemAsKQL } from './get_table_item_as_kql';
import type { GroupTableItem, TableItemAction } from './types';
const copyToClipboardButtonLabel = i18n.translate(
'xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardButtonLabel',
'xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardButtonLabel',
{
defaultMessage: 'Copy to clipboard',
}
);
const copyToClipboardSignificantTermMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardSignificantTermMessage',
'xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardSignificantTermMessage',
{
defaultMessage: 'Copy field/value pair as KQL syntax to clipboard',
}
);
const copyToClipboardGroupMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardGroupMessage',
'xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardGroupMessage',
{
defaultMessage: 'Copy group items as KQL syntax to clipboard',
}

View file

@ -18,7 +18,7 @@ import { getTableItemAsKQL } from './get_table_item_as_kql';
import type { GroupTableItem, TableItemAction } from './types';
const viewInDiscoverMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.linksMenu.viewInDiscover',
'xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInDiscover',
{
defaultMessage: 'View in Discover',
}
@ -35,7 +35,7 @@ export const useViewInDiscoverAction = (dataViewId?: string): TableItemAction =>
const discoverUrlError = useMemo(() => {
if (!application.capabilities.discover?.show) {
const discoverNotEnabled = i18n.translate(
'xpack.aiops.spikeAnalysisTable.discoverNotEnabledErrorMessage',
'xpack.aiops.logRateAnalysis.resultsTable.discoverNotEnabledErrorMessage',
{
defaultMessage: 'Discover is not enabled',
}
@ -45,7 +45,7 @@ export const useViewInDiscoverAction = (dataViewId?: string): TableItemAction =>
}
if (!discoverLocator) {
const discoverLocatorMissing = i18n.translate(
'xpack.aiops.spikeAnalysisTable.discoverLocatorMissingErrorMessage',
'xpack.aiops.logRateAnalysis.resultsTable.discoverLocatorMissingErrorMessage',
{
defaultMessage: 'No locator for Discover detected',
}
@ -55,7 +55,7 @@ export const useViewInDiscoverAction = (dataViewId?: string): TableItemAction =>
}
if (!dataViewId) {
const autoGeneratedDiscoverLinkError = i18n.translate(
'xpack.aiops.spikeAnalysisTable.autoGeneratedDiscoverLinkErrorMessage',
'xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedDiscoverLinkErrorMessage',
{
defaultMessage: 'Unable to link to Discover; no data view exists for this index',
}

View file

@ -20,7 +20,7 @@ import { getTableItemAsKQL } from './get_table_item_as_kql';
import type { GroupTableItem, TableItemAction } from './types';
const viewInLogPatternAnalysisMessage = i18n.translate(
'xpack.aiops.spikeAnalysisTable.linksMenu.viewInLogPatternAnalysis',
'xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInLogPatternAnalysis',
{
defaultMessage: 'View in Log Pattern Analysis',
}
@ -63,13 +63,16 @@ export const useViewInLogPatternAnalysisAction = (dataViewId?: string): TableIte
const logPatternAnalysisUrlError = useMemo(() => {
if (!mlLocator) {
return i18n.translate('xpack.aiops.spikeAnalysisTable.mlLocatorMissingErrorMessage', {
defaultMessage: 'No locator for Log Pattern Analysis detected',
});
return i18n.translate(
'xpack.aiops.logRateAnalysis.resultsTable.mlLocatorMissingErrorMessage',
{
defaultMessage: 'No locator for Log Pattern Analysis detected',
}
);
}
if (!dataViewId) {
return i18n.translate(
'xpack.aiops.spikeAnalysisTable.autoGeneratedLogPatternAnalysisLinkErrorMessage',
'xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedLogPatternAnalysisLinkErrorMessage',
{
defaultMessage:
'Unable to link to Log Pattern Analysis; no data view exists for this index',

View file

@ -15,7 +15,7 @@ import type { Query } from '@kbn/es-query';
import type { RandomSamplerWrapper } from '@kbn/ml-random-sampler-utils';
import { buildExtendedBaseFilterCriteria } from './application/utils/build_extended_base_filter_criteria';
import { GroupTableItem } from './components/spike_analysis_table/types';
import { GroupTableItem } from './components/log_rate_analysis_results_table/types';
export interface DocumentCountStats {
interval?: number;

View file

@ -20,7 +20,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { PLUGIN_ID } from '../../common';
import type { DocumentStatsSearchStrategyParams } from '../get_document_stats';
import type { GroupTableItem } from '../components/spike_analysis_table/types';
import type { GroupTableItem } from '../components/log_rate_analysis_results_table/types';
import { useTimeBuckets } from './use_time_buckets';
import { useAiopsAppContext } from './use_aiops_app_context';

View file

@ -14,14 +14,14 @@ export function plugin() {
}
export type { AiopsAppDependencies } from './hooks/use_aiops_app_context';
export type { ExplainLogRateSpikesAppStateProps } from './components/explain_log_rate_spikes';
export type { LogRateAnalysisAppStateProps } from './components/log_rate_analysis';
export type { LogCategorizationAppStateProps } from './components/log_categorization';
export type { ChangePointDetectionAppStateProps } from './components/change_point_detection';
export type { ExplainLogRateSpikesAnalysisResults } from './components/explain_log_rate_spikes/explain_log_rate_spikes_analysis';
export type { LogRateAnalysisResultsData } from './components/log_rate_analysis/log_rate_analysis_results';
export {
ExplainLogRateSpikes,
ExplainLogRateSpikesContent,
LogRateAnalysis,
LogRateAnalysisContent,
LogCategorization,
ChangePointDetection,
} from './shared_lazy_components';

View file

@ -8,17 +8,15 @@
import React, { FC, Suspense } from 'react';
import { EuiErrorBoundary, EuiSkeletonText } from '@elastic/eui';
import type { ExplainLogRateSpikesAppStateProps } from './components/explain_log_rate_spikes';
import type { ExplainLogRateSpikesContentWrapperProps } from './components/explain_log_rate_spikes/explain_log_rate_spikes_content/explain_log_rate_spikes_content_wrapper';
import type { LogRateAnalysisAppStateProps } from './components/log_rate_analysis';
import type { LogRateAnalysisContentWrapperProps } from './components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content_wrapper';
import type { LogCategorizationAppStateProps } from './components/log_categorization';
import type { ChangePointDetectionAppStateProps } from './components/change_point_detection';
const ExplainLogRateSpikesAppStateLazy = React.lazy(
() => import('./components/explain_log_rate_spikes')
);
const LogRateAnalysisAppStateLazy = React.lazy(() => import('./components/log_rate_analysis'));
const ExplainLogRateSpikesContentWrapperLazy = React.lazy(
() => import('./components/explain_log_rate_spikes/explain_log_rate_spikes_content')
const LogRateAnalysisContentWrapperLazy = React.lazy(
() => import('./components/log_rate_analysis/log_rate_analysis_content')
);
const LazyWrapper: FC = ({ children }) => (
@ -28,22 +26,22 @@ const LazyWrapper: FC = ({ children }) => (
);
/**
* Lazy-wrapped ExplainLogRateSpikesAppState React component
* @param {ExplainLogRateSpikesAppStateProps} props - properties specifying the data on which to run the analysis.
* Lazy-wrapped LogRateAnalysisAppState React component
* @param {LogRateAnalysisAppStateProps} props - properties specifying the data on which to run the analysis.
*/
export const ExplainLogRateSpikes: FC<ExplainLogRateSpikesAppStateProps> = (props) => (
export const LogRateAnalysis: FC<LogRateAnalysisAppStateProps> = (props) => (
<LazyWrapper>
<ExplainLogRateSpikesAppStateLazy {...props} />
<LogRateAnalysisAppStateLazy {...props} />
</LazyWrapper>
);
/**
* Lazy-wrapped ExplainLogRateSpikesContentWrapperReact component
* @param {ExplainLogRateSpikesContentWrapperProps} props - properties specifying the data on which to run the analysis.
* Lazy-wrapped LogRateAnalysisContentWrapperReact component
* @param {LogRateAnalysisContentWrapperProps} props - properties specifying the data on which to run the analysis.
*/
export const ExplainLogRateSpikesContent: FC<ExplainLogRateSpikesContentWrapperProps> = (props) => (
export const LogRateAnalysisContent: FC<LogRateAnalysisContentWrapperProps> = (props) => (
<LazyWrapper>
<ExplainLogRateSpikesContentWrapperLazy {...props} />
<LogRateAnalysisContentWrapperLazy {...props} />
</LazyWrapper>
);

View file

@ -10,8 +10,6 @@ import { Subscription } from 'rxjs';
import { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from '@kbn/core/server';
import type { DataRequestHandlerContext } from '@kbn/data-plugin/server';
import { AIOPS_ENABLED } from '../common';
import { isActiveLicense } from './lib/license';
import {
AiopsLicense,
@ -20,7 +18,7 @@ import {
AiopsPluginSetupDeps,
AiopsPluginStartDeps,
} from './types';
import { defineExplainLogRateSpikesRoute } from './routes';
import { defineLogRateAnalysisRoute } from './routes';
export class AiopsPlugin
implements Plugin<AiopsPluginSetup, AiopsPluginStart, AiopsPluginSetupDeps, AiopsPluginStartDeps>
@ -49,11 +47,9 @@ export class AiopsPlugin
const router = core.http.createRouter<DataRequestHandlerContext>();
// Register server side APIs
if (AIOPS_ENABLED) {
core.getStartServices().then(([coreStart, depsStart]) => {
defineExplainLogRateSpikesRoute(router, aiopsLicense, this.logger, coreStart);
});
}
core.getStartServices().then(([coreStart, depsStart]) => {
defineLogRateAnalysisRoute(router, aiopsLicense, this.logger, coreStart);
});
return {};
}

View file

@ -5,4 +5,4 @@
* 2.0.
*/
export { defineExplainLogRateSpikesRoute } from './explain_log_rate_spikes';
export { defineLogRateAnalysisRoute } from './log_rate_analysis';

View file

@ -30,16 +30,16 @@ import {
addSignificantTermsGroupAction,
addSignificantTermsGroupHistogramAction,
addSignificantTermsHistogramAction,
aiopsExplainLogRateSpikesSchema,
aiopsLogRateAnalysisSchema,
addErrorAction,
pingAction,
resetAllAction,
resetErrorsAction,
resetGroupsAction,
updateLoadingStateAction,
AiopsExplainLogRateSpikesApiAction,
} from '../../common/api/explain_log_rate_spikes';
import { API_ENDPOINT } from '../../common/api';
AiopsLogRateAnalysisApiAction,
} from '../../common/api/log_rate_analysis';
import { AIOPS_API_ENDPOINT } from '../../common/api';
import { PLUGIN_ID } from '../../common';
@ -63,7 +63,7 @@ const PROGRESS_STEP_GROUPING = 0.1;
const PROGRESS_STEP_HISTOGRAMS = 0.1;
const PROGRESS_STEP_HISTOGRAMS_GROUPS = 0.1;
export const defineExplainLogRateSpikesRoute = (
export const defineLogRateAnalysisRoute = (
router: IRouter<DataRequestHandlerContext>,
license: AiopsLicense,
logger: Logger,
@ -71,7 +71,8 @@ export const defineExplainLogRateSpikesRoute = (
) => {
router.versioned
.post({
path: API_ENDPOINT.EXPLAIN_LOG_RATE_SPIKES,
path: AIOPS_API_ENDPOINT.LOG_RATE_ANALYSIS,
access: 'internal',
})
.addVersion(
@ -79,7 +80,7 @@ export const defineExplainLogRateSpikesRoute = (
version: '1',
validate: {
request: {
body: aiopsExplainLogRateSpikesSchema,
body: aiopsLogRateAnalysisSchema,
},
},
},
@ -95,7 +96,7 @@ export const defineExplainLogRateSpikesRoute = (
let logMessageCounter = 1;
function logDebugMessage(msg: string) {
logger.debug(`Explain Log Rate Spikes #${logMessageCounter}: ${msg}`);
logger.debug(`Log Rate Analysis #${logMessageCounter}: ${msg}`);
logMessageCounter++;
}
@ -125,7 +126,7 @@ export const defineExplainLogRateSpikesRoute = (
end: streamEnd,
push,
responseWithHeaders,
} = streamFactory<AiopsExplainLogRateSpikesApiAction>(
} = streamFactory<AiopsLogRateAnalysisApiAction>(
request.headers,
logger,
request.body.compressResponse,
@ -158,7 +159,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded: 1,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.doneMessage',
'xpack.aiops.logRateAnalysis.loadingState.doneMessage',
{
defaultMessage: 'Done.',
}
@ -213,7 +214,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.loadingIndexInformation',
'xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation',
{
defaultMessage: 'Loading index information.',
}
@ -247,7 +248,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates',
'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates',
{
defaultMessage:
'Identified {fieldCandidatesCount, plural, one {# field candidate} other {# field candidates}}.',
@ -339,7 +340,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs',
'xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs',
{
defaultMessage:
'Identified {fieldValuePairsCount, plural, one {# significant field/value pair} other {# significant field/value pairs}}.',
@ -415,7 +416,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData',
'xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData',
{
defaultMessage: 'Loading histogram data.',
}
@ -438,7 +439,7 @@ export const defineExplainLogRateSpikesRoute = (
ccsWarning: false,
loaded,
loadingState: i18n.translate(
'xpack.aiops.explainLogRateSpikes.loadingState.groupingResults',
'xpack.aiops.logRateAnalysis.loadingState.groupingResults',
{
defaultMessage: 'Transforming significant field/value pairs into groups.',
}
@ -682,10 +683,8 @@ export const defineExplainLogRateSpikesRoute = (
endWithUpdatedLoadingState();
} catch (e) {
if (!isRequestAbortedError(e)) {
logger.error(
`Explain log rate spikes analysis failed to finish, got: \n${e.toString()}`
);
pushError(`Explain log rate spikes analysis failed to finish.`);
logger.error(`Log Rate Analysis failed to finish, got: \n${e.toString()}`);
pushError(`Log Rate Analysis failed to finish.`);
}
end();
}

View file

@ -9,11 +9,11 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { ElasticsearchClient } from '@kbn/core/server';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
import { fetchIndexInfo, getRandomDocsRequest } from './fetch_index_info';
const params: AiopsExplainLogRateSpikesSchema = {
const params: AiopsLogRateAnalysisSchema = {
index: 'the-index',
timeFieldName: 'the-time-field-name',
start: 1577836800000,

View file

@ -10,7 +10,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { ES_FIELD_TYPES } from '@kbn/field-types';
import type { ElasticsearchClient } from '@kbn/core/server';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
import { getQueryWithParams } from './get_query_with_params';
import { getRequestBase } from './get_request_base';
@ -27,7 +27,7 @@ const SUPPORTED_ES_FIELD_TYPES = [
];
export const getRandomDocsRequest = (
params: AiopsExplainLogRateSpikesSchema
params: AiopsLogRateAnalysisSchema
): estypes.SearchRequest => ({
...getRequestBase(params),
body: {
@ -48,7 +48,7 @@ export const getRandomDocsRequest = (
export const fetchIndexInfo = async (
esClient: ElasticsearchClient,
params: AiopsExplainLogRateSpikesSchema,
params: AiopsLogRateAnalysisSchema,
abortSignal?: AbortSignal
): Promise<{ fieldCandidates: string[]; totalDocCount: number }> => {
const { index } = params;

View file

@ -16,7 +16,7 @@ import {
} from '@kbn/ml-random-sampler-utils';
import { SPIKE_ANALYSIS_THRESHOLD, RANDOM_SAMPLER_SEED } from '../../../common/constants';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
import { isRequestAbortedError } from '../../lib/is_request_aborted_error';
@ -27,7 +27,7 @@ import { getRequestBase } from './get_request_base';
// `x-pack/plugins/apm/server/routes/correlations/queries/fetch_failed_events_correlation_p_values.ts`
export const getSignificantTermRequest = (
params: AiopsExplainLogRateSpikesSchema,
params: AiopsLogRateAnalysisSchema,
fieldName: string,
{ wrap }: RandomSamplerWrapper
): estypes.SearchRequest => {
@ -103,7 +103,7 @@ interface Aggs extends estypes.AggregationsSignificantLongTermsAggregate {
export const fetchSignificantTermPValues = async (
esClient: ElasticsearchClient,
params: AiopsExplainLogRateSpikesSchema,
params: AiopsLogRateAnalysisSchema,
fieldNames: string[],
logger: Logger,
// The default value of 1 means no sampling will be used

View file

@ -9,7 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { ESFilter } from '@kbn/es-types';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
export function rangeQuery(
start?: number,
@ -29,11 +29,7 @@ export function rangeQuery(
];
}
export function getFilters({
start,
end,
timeFieldName,
}: AiopsExplainLogRateSpikesSchema): ESFilter[] {
export function getFilters({ start, end, timeFieldName }: AiopsLogRateAnalysisSchema): ESFilter[] {
const filters: ESFilter[] = [];
if (timeFieldName !== '') {

View file

@ -7,12 +7,12 @@
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
import { getQueryWithParams } from './get_query_with_params';
export function getHistogramQuery(
params: AiopsExplainLogRateSpikesSchema,
params: AiopsLogRateAnalysisSchema,
filter: estypes.QueryDslQueryContainer[] = []
) {
const histogramQuery = getQueryWithParams({

View file

@ -9,7 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { FieldValuePair } from '@kbn/ml-agg-utils';
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
import { getFilters } from './get_filters';
@ -18,7 +18,7 @@ export const getTermsQuery = ({ fieldName, fieldValue }: FieldValuePair) => {
};
interface QueryParams {
params: AiopsExplainLogRateSpikesSchema;
params: AiopsLogRateAnalysisSchema;
termFilters?: FieldValuePair[];
}
export const getQueryWithParams = ({ params, termFilters }: QueryParams) => {

View file

@ -5,9 +5,9 @@
* 2.0.
*/
import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes';
import type { AiopsLogRateAnalysisSchema } from '../../../common/api/log_rate_analysis';
export const getRequestBase = ({ index, includeFrozen }: AiopsExplainLogRateSpikesSchema) => ({
export const getRequestBase = ({ index, includeFrozen }: AiopsLogRateAnalysisSchema) => ({
index,
...(includeFrozen ? { ignore_throttled: false } : {}),
ignore_unavailable: true,

View file

@ -13,10 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import { DataView } from '@kbn/data-views-plugin/common';
import {
ExplainLogRateSpikesContent,
type ExplainLogRateSpikesAnalysisResults,
} from '@kbn/aiops-plugin/public';
import { LogRateAnalysisContent, type LogRateAnalysisResultsData } from '@kbn/aiops-plugin/public';
import { Rule } from '@kbn/alerting-plugin/common';
import { CoPilotPrompt, TopAlert, useCoPilot } from '@kbn/observability-plugin/public';
import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types';
@ -35,7 +32,7 @@ import {
import { decodeOrThrow } from '../../../../../../common/runtime_types';
import { getESQueryForLogSpike } from '../log_rate_spike_query';
export interface AlertDetailsExplainLogRateSpikesSectionProps {
export interface AlertDetailsLogRateAnalysisSectionProps {
rule: Rule<PartialRuleParams>;
alert: TopAlert<Record<string, any>>;
}
@ -47,10 +44,7 @@ interface SignificantFieldValue {
pValue: number | null;
}
export const ExplainLogRateSpikes: FC<AlertDetailsExplainLogRateSpikesSectionProps> = ({
rule,
alert,
}) => {
export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ rule, alert }) => {
const { services } = useKibanaContextForPlugin();
const { dataViews, logsShared } = services;
const [dataView, setDataView] = useState<DataView | undefined>();
@ -161,9 +155,7 @@ export const ExplainLogRateSpikes: FC<AlertDetailsExplainLogRateSpikesSectionPro
}
);
const onAnalysisCompleted = (
analysisResults: ExplainLogRateSpikesAnalysisResults | undefined
) => {
const onAnalysisCompleted = (analysisResults: LogRateAnalysisResultsData | undefined) => {
const significantFieldValues = orderBy(
analysisResults?.significantTerms?.map((item) => ({
field: item.fieldName,
@ -183,20 +175,20 @@ export const ExplainLogRateSpikes: FC<AlertDetailsExplainLogRateSpikesSectionPro
if (!dataView || !esSearchQuery) return null;
return (
<EuiPanel hasBorder={true} data-test-subj="explainLogRateSpikesAlertDetails">
<EuiPanel hasBorder={true} data-test-subj="logRateAnalysisAlertDetails">
<EuiFlexGroup direction="column" gutterSize="none" responsive={false}>
<EuiFlexItem grow={false}>
<EuiTitle size="xs">
<h2>
<FormattedMessage
id="xpack.infra.logs.alertDetails.explainLogRateSpikes.sectionTitle"
defaultMessage="Explain Log Rate Spikes"
id="xpack.infra.logs.alertDetails.logRateAnalysis.sectionTitle"
defaultMessage="Log Rate Analysis"
/>
</h2>
</EuiTitle>
</EuiFlexItem>
<EuiFlexItem>
<ExplainLogRateSpikesContent
<LogRateAnalysisContent
dataView={dataView}
timeRange={timeRange}
esSearchQuery={esSearchQuery}

View file

@ -32,7 +32,7 @@ import {
} from '../../../../../common/alerting/logs/log_threshold';
import { AlertDetailsAppSectionProps } from './types';
import { Threshold } from '../../../common/components/threshold';
import { ExplainLogRateSpikes } from './components/explain_log_rate_spike';
import { LogRateAnalysis } from './components/log_rate_analysis';
import { LogThresholdCountChart, LogThresholdRatioChart } from './components/threhsold_chart';
import { useLicense } from '../../../../hooks/use_license';
@ -237,8 +237,8 @@ const AlertDetailsAppSection = ({
);
};
const getExplainLogRateSpikesSection = () => {
return hasLicenseForExplainLogSpike ? <ExplainLogRateSpikes rule={rule} alert={alert} /> : null;
const getLogRateAnalysisSection = () => {
return hasLicenseForExplainLogSpike ? <LogRateAnalysis rule={rule} alert={alert} /> : null;
};
return (
@ -246,7 +246,7 @@ const AlertDetailsAppSection = ({
<EuiFlexGroup direction="column" data-test-subj="logsThresholdAlertDetailsPage">
{getLogRatioChart()}
{getLogCountChart()}
{getExplainLogRateSpikesSection()}
{getLogRateAnalysisSection()}
{getLogsHistoryChart()}
</EuiFlexGroup>
</CoPilotContextProvider>

View file

@ -66,6 +66,8 @@ export const ML_PAGES = {
AIOPS: 'aiops',
AIOPS_EXPLAIN_LOG_RATE_SPIKES: 'aiops/explain_log_rate_spikes',
AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT: 'aiops/explain_log_rate_spikes_index_select',
AIOPS_LOG_RATE_ANALYSIS: 'aiops/log_rate_analysis',
AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT: 'aiops/log_rate_analysis_index_select',
AIOPS_LOG_CATEGORIZATION: 'aiops/log_categorization',
AIOPS_LOG_CATEGORIZATION_INDEX_SELECT: 'aiops/log_categorization_index_select',
AIOPS_CHANGE_POINT_DETECTION: 'aiops/change_point_detection',

View file

@ -62,10 +62,10 @@ export type MlGenericUrlState = MLPageState<
| typeof ML_PAGES.DATA_VISUALIZER_FILE
| typeof ML_PAGES.DATA_VISUALIZER_INDEX_SELECT
| typeof ML_PAGES.AIOPS
| typeof ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES
| typeof ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT
| typeof ML_PAGES.AIOPS_LOG_CATEGORIZATION
| typeof ML_PAGES.AIOPS_LOG_CATEGORIZATION_INDEX_SELECT
| typeof ML_PAGES.AIOPS_LOG_RATE_ANALYSIS
| typeof ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT
| typeof ML_PAGES.AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT
| typeof ML_PAGES.AIOPS_CHANGE_POINT_DETECTION,
MlGenericUrlPageState | undefined

View file

@ -5,5 +5,5 @@
* 2.0.
*/
export { ExplainLogRateSpikesPage } from './explain_log_rate_spikes';
export { LogRateAnalysisPage } from './log_rate_analysis';
export { ChangePointDetectionPage } from './change_point_detection';

View file

@ -10,14 +10,14 @@ import { pick } from 'lodash';
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import { ExplainLogRateSpikes } from '@kbn/aiops-plugin/public';
import { LogRateAnalysis } from '@kbn/aiops-plugin/public';
import { useDataSource } from '../contexts/ml/data_source_context';
import { useMlKibana } from '../contexts/kibana';
import { HelpMenu } from '../components/help_menu';
import { TechnicalPreviewBadge } from '../components/technical_preview_badge';
import { MlPageHeader } from '../components/page_header';
export const ExplainLogRateSpikesPage: FC = () => {
export const LogRateAnalysisPage: FC = () => {
const { services } = useMlKibana();
const { selectedDataView: dataView, selectedSavedSearch: savedSearch } = useDataSource();
@ -28,8 +28,8 @@ export const ExplainLogRateSpikesPage: FC = () => {
<EuiFlexGroup responsive={false} wrap={false} alignItems={'center'} gutterSize={'m'}>
<EuiFlexItem grow={false}>
<FormattedMessage
id="xpack.ml.explainLogRateSpikes.pageHeader"
defaultMessage="Explain log rate spikes"
id="xpack.ml.logRateAnalysis.pageHeader"
defaultMessage="Log rate analysis"
/>
</EuiFlexItem>
<EuiFlexItem grow={false}>
@ -38,7 +38,7 @@ export const ExplainLogRateSpikesPage: FC = () => {
</EuiFlexGroup>
</MlPageHeader>
{dataView && (
<ExplainLogRateSpikes
<LogRateAnalysis
// Default to false for now, until page restructure work to enable smooth sticky histogram is done
stickyHistogram={false}
dataView={dataView}

View file

@ -8,7 +8,7 @@
import { i18n } from '@kbn/i18n';
import type { EuiSideNavItemType } from '@elastic/eui';
import React, { ReactNode, useCallback, useMemo } from 'react';
import { AIOPS_ENABLED, CHANGE_POINT_DETECTION_ENABLED } from '@kbn/aiops-plugin/common';
import { CHANGE_POINT_DETECTION_ENABLED } from '@kbn/aiops-plugin/common';
import { useUrlState } from '@kbn/ml-url-state';
import { NotificationsIndicator } from './notifications_indicator';
import type { MlLocatorParams } from '../../../../common/types/locator';
@ -238,51 +238,49 @@ export function useSideNavItems(activeRoute: MlRoute | undefined) {
},
];
if (AIOPS_ENABLED) {
mlTabs.push({
id: 'aiops_section',
name: i18n.translate('xpack.ml.navMenu.aiopsTabLinkText', {
defaultMessage: 'AIOps Labs',
}),
disabled: disableLinks,
items: [
{
id: 'explainlogratespikes',
pathId: ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.explainLogRateSpikesLinkText', {
defaultMessage: 'Explain Log Rate Spikes',
}),
disabled: disableLinks,
testSubj: 'mlMainTab explainLogRateSpikes',
relatedRouteIds: ['explain_log_rate_spikes'],
},
{
id: 'logCategorization',
pathId: ML_PAGES.AIOPS_LOG_CATEGORIZATION_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.logCategorizationLinkText', {
defaultMessage: 'Log Pattern Analysis',
}),
disabled: disableLinks,
testSubj: 'mlMainTab logCategorization',
relatedRouteIds: ['log_categorization'],
},
...(CHANGE_POINT_DETECTION_ENABLED
? [
{
id: 'changePointDetection',
pathId: ML_PAGES.AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.changePointDetectionLinkText', {
defaultMessage: 'Change Point Detection',
}),
disabled: disableLinks,
testSubj: 'mlMainTab changePointDetection',
relatedRouteIds: ['change_point_detection'],
},
]
: []),
],
});
}
mlTabs.push({
id: 'aiops_section',
name: i18n.translate('xpack.ml.navMenu.aiopsTabLinkText', {
defaultMessage: 'AIOps Labs',
}),
disabled: disableLinks,
items: [
{
id: 'explainlogratespikes',
pathId: ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.logRateAnalysisLinkText', {
defaultMessage: 'Log Rate Analysis',
}),
disabled: disableLinks,
testSubj: 'mlMainTab logRateAnalysis',
relatedRouteIds: ['log_rate_analysis'],
},
{
id: 'logCategorization',
pathId: ML_PAGES.AIOPS_LOG_CATEGORIZATION_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.logCategorizationLinkText', {
defaultMessage: 'Log Pattern Analysis',
}),
disabled: disableLinks,
testSubj: 'mlMainTab logCategorization',
relatedRouteIds: ['log_categorization'],
},
...(CHANGE_POINT_DETECTION_ENABLED
? [
{
id: 'changePointDetection',
pathId: ML_PAGES.AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT,
name: i18n.translate('xpack.ml.navMenu.changePointDetectionLinkText', {
defaultMessage: 'Change Point Detection',
}),
disabled: disableLinks,
testSubj: 'mlMainTab changePointDetection',
relatedRouteIds: ['change_point_detection'],
},
]
: []),
],
});
return mlTabs;
}, [mlFeaturesDisabled, canViewMlNodes]);

View file

@ -55,13 +55,13 @@ export const DATA_VISUALIZER_BREADCRUMB: ChromeBreadcrumb = Object.freeze({
href: '/datavisualizer',
});
// we need two AIOPS_BREADCRUMB breadcrumb items as they each need to link
// to either the explain log rate spikes page or the log categorization page
export const AIOPS_BREADCRUMB_EXPLAIN_LOG_RATE_SPIKES: ChromeBreadcrumb = Object.freeze({
// we need multiple AIOPS_BREADCRUMB breadcrumb items as they each need to link
// to each of the AIOps pages.
export const AIOPS_BREADCRUMB_LOG_RATE_ANALYSIS: ChromeBreadcrumb = Object.freeze({
text: i18n.translate('xpack.ml.aiopsBreadcrumbLabel', {
defaultMessage: 'AIOps Labs',
}),
href: '/aiops/explain_log_rate_spikes_index_select',
href: '/aiops/log_rate_analysis_index_select',
});
export const AIOPS_BREADCRUMB_LOG_PATTERN_ANALYSIS: ChromeBreadcrumb = Object.freeze({
@ -78,11 +78,11 @@ export const AIOPS_BREADCRUMB_CHANGE_POINT_DETECTION: ChromeBreadcrumb = Object.
href: '/aiops/change_point_detection_index_select',
});
export const EXPLAIN_LOG_RATE_SPIKES: ChromeBreadcrumb = Object.freeze({
text: i18n.translate('xpack.ml.aiops.explainLogRateSpikesBreadcrumbLabel', {
defaultMessage: 'Explain Log Rate Spikes',
export const LOG_RATE_ANALYSIS: ChromeBreadcrumb = Object.freeze({
text: i18n.translate('xpack.ml.aiops.logRateAnalysisBreadcrumbLabel', {
defaultMessage: 'Log Rate Analysis',
}),
href: '/aiops/explain_log_rate_spikes_index_select',
href: '/aiops/log_rate_analysis_index_select',
});
export const LOG_PATTERN_ANALYSIS: ChromeBreadcrumb = Object.freeze({
@ -127,10 +127,10 @@ const breadcrumbs = {
DATA_FRAME_ANALYTICS_BREADCRUMB,
TRAINED_MODELS,
DATA_VISUALIZER_BREADCRUMB,
AIOPS_BREADCRUMB_EXPLAIN_LOG_RATE_SPIKES,
AIOPS_BREADCRUMB_LOG_RATE_ANALYSIS,
AIOPS_BREADCRUMB_LOG_PATTERN_ANALYSIS,
AIOPS_BREADCRUMB_CHANGE_POINT_DETECTION,
EXPLAIN_LOG_RATE_SPIKES,
LOG_RATE_ANALYSIS,
LOG_PATTERN_ANALYSIS,
CHANGE_POINT_DETECTION,
CREATE_JOB_BREADCRUMB,

View file

@ -5,6 +5,6 @@
* 2.0.
*/
export * from './explain_log_rate_spikes';
export * from './log_rate_analysis';
export * from './log_categorization';
export * from './change_point_detection';

View file

@ -7,7 +7,6 @@
import React, { FC } from 'react';
import { i18n } from '@kbn/i18n';
import { AIOPS_ENABLED } from '@kbn/aiops-plugin/common';
import { ML_PAGES } from '../../../../locator';
import { NavigateToPath } from '../../../contexts/kibana';
import { createPath, MlRoute, PageLoader } from '../../router';
@ -35,7 +34,6 @@ export const logCategorizationRouteFactory = (
}),
},
],
disabled: !AIOPS_ENABLED,
});
const PageWrapper: FC = () => {

View file

@ -6,42 +6,54 @@
*/
import React, { FC } from 'react';
import { useLocation, Redirect } from 'react-router-dom';
import { i18n } from '@kbn/i18n';
import { AIOPS_ENABLED } from '@kbn/aiops-plugin/common';
import { ML_PAGES } from '../../../../locator';
import { NavigateToPath } from '../../../contexts/kibana';
import { createPath, MlRoute, PageLoader } from '../../router';
import { useRouteResolver } from '../../use_resolver';
import { ExplainLogRateSpikesPage as Page } from '../../../aiops/explain_log_rate_spikes';
import { LogRateAnalysisPage as Page } from '../../../aiops/log_rate_analysis';
import { getBreadcrumbWithUrlForApp } from '../../breadcrumbs';
import { DataSourceContextProvider } from '../../../contexts/ml';
export const explainLogRateSpikesRouteFactory = (
export const logRateAnalysisRouteFactory = (
navigateToPath: NavigateToPath,
basePath: string
): MlRoute => ({
id: 'explain_log_rate_spikes',
path: createPath(ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES),
title: i18n.translate('xpack.ml.aiops.explainLogRateSpikes.docTitle', {
defaultMessage: 'Explain log rate spikes',
id: 'log_rate_analysis',
path: createPath(ML_PAGES.AIOPS_LOG_RATE_ANALYSIS),
title: i18n.translate('xpack.ml.aiops.logRateAnalysis.docTitle', {
defaultMessage: 'Log rate analysis',
}),
render: () => <PageWrapper />,
breadcrumbs: [
getBreadcrumbWithUrlForApp('ML_BREADCRUMB', navigateToPath, basePath),
getBreadcrumbWithUrlForApp(
'AIOPS_BREADCRUMB_EXPLAIN_LOG_RATE_SPIKES',
navigateToPath,
basePath
),
getBreadcrumbWithUrlForApp('AIOPS_BREADCRUMB_LOG_RATE_ANALYSIS', navigateToPath, basePath),
{
text: i18n.translate('xpack.ml.aiopsBreadcrumbs.explainLogRateSpikesLabel', {
defaultMessage: 'Explain log rate spikes',
text: i18n.translate('xpack.ml.aiopsBreadcrumbs.logRateAnalysisLabel', {
defaultMessage: 'Log rate analysis',
}),
},
],
disabled: !AIOPS_ENABLED,
});
// Deprecated since 8.10, kept here to redirect old bookmarks.
export const explainLogRateSpikesRouteFactory = (): MlRoute => ({
path: createPath(ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES),
render: () => <RedirectWithQueryString />,
// no breadcrumbs since it's just a redirect
breadcrumbs: [],
});
const RedirectWithQueryString: FC = () => {
const location = useLocation();
return (
<Redirect
to={{ pathname: createPath(ML_PAGES.AIOPS_LOG_RATE_ANALYSIS), search: `${location.search}` }}
/>
);
};
const PageWrapper: FC = () => {
const { context } = useRouteResolver('full', ['canUseAiops']);

View file

@ -6,6 +6,7 @@
*/
import React, { FC } from 'react';
import { Redirect } from 'react-router-dom';
import { i18n } from '@kbn/i18n';
import { ML_PAGES } from '../../../../locator';
import { NavigateToPath, useMlKibana } from '../../../contexts/kibana';
@ -45,10 +46,10 @@ const getDataVisBreadcrumbs = (navigateToPath: NavigateToPath, basePath: string)
},
];
const getExplainLogRateSpikesBreadcrumbs = (navigateToPath: NavigateToPath, basePath: string) => [
const getLogRateAnalysisBreadcrumbs = (navigateToPath: NavigateToPath, basePath: string) => [
getBreadcrumbWithUrlForApp('ML_BREADCRUMB', navigateToPath, basePath),
getBreadcrumbWithUrlForApp('AIOPS_BREADCRUMB_EXPLAIN_LOG_RATE_SPIKES', navigateToPath, basePath),
getBreadcrumbWithUrlForApp('EXPLAIN_LOG_RATE_SPIKES', navigateToPath, basePath),
getBreadcrumbWithUrlForApp('AIOPS_BREADCRUMB_LOG_RATE_ANALYSIS', navigateToPath, basePath),
getBreadcrumbWithUrlForApp('LOG_RATE_ANALYSIS', navigateToPath, basePath),
{
text: i18n.translate('xpack.ml.aiopsBreadcrumbs.selectDataViewLabel', {
defaultMessage: 'Select Data View',
@ -114,24 +115,32 @@ export const dataVizIndexOrSearchRouteFactory = (
breadcrumbs: getDataVisBreadcrumbs(navigateToPath, basePath),
});
export const explainLogRateSpikesIndexOrSearchRouteFactory = (
export const logRateAnalysisIndexOrSearchRouteFactory = (
navigateToPath: NavigateToPath,
basePath: string
): MlRoute => ({
id: 'data_view_explain_log_rate_spikes',
path: createPath(ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT),
id: 'data_view_log_rate_analysis',
path: createPath(ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT),
title: i18n.translate('xpack.ml.selectDataViewLabel', {
defaultMessage: 'Select Data View',
}),
render: (props, deps) => (
<PageWrapper
{...props}
nextStepPath={createPath(ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES)}
nextStepPath={createPath(ML_PAGES.AIOPS_LOG_RATE_ANALYSIS)}
deps={deps}
mode={MODE.DATAVISUALIZER}
/>
),
breadcrumbs: getExplainLogRateSpikesBreadcrumbs(navigateToPath, basePath),
breadcrumbs: getLogRateAnalysisBreadcrumbs(navigateToPath, basePath),
});
// Deprecated since 8.10, kept here to redirect old bookmarks.
export const explainLogRateSpikesIndexOrSearchRouteFactory = (): MlRoute => ({
path: createPath(ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT),
render: () => <Redirect to={createPath(ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT)} />,
// no breadcrumbs since it's just a redirect
breadcrumbs: [],
});
export const logCategorizationIndexOrSearchRouteFactory = (

View file

@ -87,8 +87,8 @@ export class MlLocatorDefinition implements LocatorDefinition<MlLocatorParams> {
case ML_PAGES.DATA_VISUALIZER_INDEX_VIEWER:
case ML_PAGES.DATA_VISUALIZER_INDEX_SELECT:
case ML_PAGES.AIOPS:
case ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES:
case ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT:
case ML_PAGES.AIOPS_LOG_RATE_ANALYSIS:
case ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT:
case ML_PAGES.AIOPS_LOG_CATEGORIZATION:
case ML_PAGES.AIOPS_LOG_CATEGORIZATION_INDEX_SELECT:
case ML_PAGES.AIOPS_CHANGE_POINT_DETECTION:

View file

@ -103,16 +103,16 @@ function getAiopsDeepLink(mlCapabilities: MlCapabilities): AppDeepLink<LinkId> {
title: i18n.translate('xpack.ml.deepLink.aiOps', {
defaultMessage: 'AIOps',
}),
// Default to the index select page for the explain log rate spikes since we don't have an AIops overview page
path: `/${ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT}`,
// Default to the index select page for log rate analysis since we don't have an AIops overview page
path: `/${ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT}`,
navLinkStatus,
deepLinks: [
{
id: 'explainLogRateSpikes',
title: i18n.translate('xpack.ml.deepLink.explainLogRateSpikes', {
defaultMessage: 'Explain Log Rate Spikes',
id: 'logRateAnalysis',
title: i18n.translate('xpack.ml.deepLink.logRateAnalysis', {
defaultMessage: 'Log Rate Analysis',
}),
path: `/${ML_PAGES.AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT}`,
path: `/${ML_PAGES.AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT}`,
navLinkStatus,
},
{

View file

@ -291,9 +291,9 @@ export const coPilotPrompts = {
const rows = significantFieldValues.map((item) => Object.values(item).join(',')).join('\n');
const content = `You are an observability expert using Elastic Observability Suite on call being consulted about a log threshold alert that got triggered by a spike of log messages. Your job is to take immediate action and proceed with both urgency and precision.
"Explain Log Rate Spikes" is an AIOps feature that uses advanced statistical methods to identify reasons for increases in log rates. It makes it easy to find and investigate causes of unusual spikes by using the analysis workflow view.
You are using "Explain Log Rate Spikes" and ran the statistical analysis on the log messages which occured during the alert.
You received the following analysis results from "Explain Log Rate Spikes" which list statistically significant co-occuring field/value combinations sorted from most significant (lower p-values) to least significant (higher p-values) that contribute to the log messages spike:
"Log Rate Analysis" is an AIOps feature that uses advanced statistical methods to identify reasons for increases in log rates. It makes it easy to find and investigate causes of unusual spikes by using the analysis workflow view.
You are using "Log Rate Analysis" and ran the statistical analysis on the log messages which occured during the alert.
You received the following analysis results from "Log Rate Analysis" which list statistically significant co-occuring field/value combinations sorted from most significant (lower p-values) to least significant (higher p-values) that contribute to the log messages spike:
${header}
${rows}

View file

@ -59,10 +59,10 @@ const navigationTree: NavigationTreeDefinition = {
link: 'ml:anomalyDetection',
},
{
title: i18n.translate('xpack.serverlessObservability.ml.spike.analysis', {
defaultMessage: 'Spike analysis',
title: i18n.translate('xpack.serverlessObservability.ml.logRateAnalysis', {
defaultMessage: 'Log rate analysis',
}),
link: 'ml:explainLogRateSpikes',
link: 'ml:logRateAnalysis',
icon: 'beaker',
},
{

View file

@ -7159,11 +7159,11 @@
"xpack.aiops.categorizeFlyout.title": "Analyse du modèle de {name}",
"xpack.aiops.changePointDetection.cardinalityWarningMessage": "La cardinalité du champ \"{splitField}\" est {cardinality}, ce qui dépasse la limite de {cardinalityLimit}. Seules les {cardinalityLimit} premières partitions, triées par nombre de documents, sont analysées.",
"xpack.aiops.dataViewNotBasedOnTimeSeriesWarning.title": "La vue de données \"{dataViewTitle}\" n'est pas basée sur une série temporelle.",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# champ candidat a été identifié} many {# champs candidats ont été identifiés} other {# champs candidats ont été identifiés}}.",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire champ/valeur significative a été identifiée} many {# paires champ/valeur significatives ont été identifiées} other {# paires champ/valeur significatives ont été identifiées}}.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupColumnTooltip": "Affiche jusqu'à {maxItemCount} éléments de groupe triés par unicité et nombre de documents. Développez la ligne pour voir toutes les paires champ/valeur.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupItemsInfo": "Affichage de {valuesBadges} éléments sur {count}.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupUniqueItemsInfo": "{count, plural, one {# élément} many {Éléments #} other {Éléments #}} unique(s) à ce groupe.",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# champ candidat a été identifié} many {# champs candidats ont été identifiés} other {# champs candidats ont été identifiés}}.",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire champ/valeur significative a été identifiée} many {# paires champ/valeur significatives ont été identifiées} other {# paires champ/valeur significatives ont été identifiées}}.",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupColumnTooltip": "Affiche jusqu'à {maxItemCount} éléments de groupe triés par unicité et nombre de documents. Développez la ligne pour voir toutes les paires champ/valeur.",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo": "Affichage de {valuesBadges} éléments sur {count}.",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo": "{count, plural, one {# élément} many {Éléments #} other {Éléments #}} unique(s) à ce groupe.",
"xpack.aiops.index.dataLoader.internalServerErrorMessage": "Erreur lors du chargement des données dans l'index {index}. {message}. La requête a peut-être expiré. Essayez d'utiliser un échantillon d'une taille inférieure ou de réduire la plage temporelle.",
"xpack.aiops.index.dataViewWithoutMetricNotificationTitle": "La vue de données \"{dataViewTitle}\" ne contient aucun champ d'indicateurs.",
"xpack.aiops.index.errorLoadingDataMessage": "Erreur lors du chargement des données dans l'index {index}. {message}.",
@ -7225,46 +7225,45 @@
"xpack.aiops.correlations.highImpactText": "Élevé",
"xpack.aiops.correlations.lowImpactText": "Bas",
"xpack.aiops.correlations.mediumImpactText": "Moyenne",
"xpack.aiops.correlations.spikeAnalysisTableGroups.docCountLabel": "Compte du document",
"xpack.aiops.correlations.veryLowImpactText": "Très bas",
"xpack.aiops.dataGrid.field.documentCountChart.seriesLabel": "compte du document",
"xpack.aiops.dataGrid.field.documentCountChartSplit.seriesLabel": "Autre compte du document",
"xpack.aiops.documentCountChart.baselineBadgeLabel": "Référence de base",
"xpack.aiops.documentCountChart.deviationBadgeLabel": "général",
"xpack.aiops.explainLogRateSpikes.loadingState.doneMessage": "Terminé.",
"xpack.aiops.explainLogRateSpikes.loadingState.groupingResults": "Transformation de paires champ/valeur significatives en groupes.",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData": "Chargement des données dhistogramme.",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingIndexInformation": "Chargement des informations d'index.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.collapseAriaLabel": "Réduire",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.docCountLabel": "Compte du document",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.expandAriaLabel": "Développer",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldNameLabel": "Nom du champ",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldValueLabel": "Valeur du champ",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel": "Impact",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip": "Le niveau d'impact du champ sur la différence de taux de messages.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateColumnTooltip": "Une représentation visuelle de l'impact du champ sur la différence de taux de messages",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateLabel": "Taux du log",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueColumnTooltip": "Une différence de fréquence des valeurs, surtout si celles-ci sont plus faibles, indique un changement important. Ordonner un tri de cette colonne entraînera automatiquement un tri secondaire sur la colonne \"nombre de documents\"..",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueLabel": "valeur-p",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.uniqueColumnTooltip": "Cette paire champ/valeur apparaît uniquement dans ce groupe",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel": "Regrouper",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.impactLabelColumnTooltip": "Niveau d'impact du groupe sur la différence de taux de messages",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip": "Représentation visuelle de l'impact du groupe sur la différence de taux de messages.",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateLabel": "Taux du log",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueColumnTooltip": "Une différence de fréquence des valeurs, surtout si celles-ci sont plus faibles, indique un changement important. Ordonner un tri de cette colonne entraînera automatiquement un tri secondaire sur la colonne \"nombre de documents\"..",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel": "valeur-p",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptBody": "La fonction Expliquer les pics de taux de log identifie les combinaisons champ/valeur statistiquement significatives qui contribuent à un pic de taux de log.",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptTitle": "Cliquez sur un pic dans l'histogramme pour lancer l'analyse.",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterApplyButtonLabel": "Appliquer",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterButtonLabel": "Champs de filtre",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterHelpText": "Désélectionnez les champs non pertinents pour les supprimer des groupes et cliquez sur le bouton Appliquer pour réexécuter le regroupement. Utilisez la barre de recherche pour filtrer la liste, puis sélectionnez/désélectionnez plusieurs champs avec les actions ci-dessous.",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllFields": "Désélectionner tous les champs",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllSearchedFields": "Désélectionner les champs filtrés",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllFields": "Sélectionner tous les champs",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllSearchedFields": "Sélectionner les champs filtrés",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptBody": "Essayez d'ajuster la référence de base et les plages temporelles d'écart-type, et réexécutez l'analyse. Si vous n'obtenez toujours aucun résultat, il se peut qu'il n'y ait aucune entité statistiquement significative contribuant à ce pic dans les taux de log.",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptTitle": "L'analyse n'a retourné aucun résultat.",
"xpack.aiops.explainLogRateSpikesPage.tryToContinueAnalysisButtonText": "Essayer de continuer l'analyse",
"xpack.aiops.logRateAnalysis.loadingState.doneMessage": "Terminé.",
"xpack.aiops.logRateAnalysis.loadingState.groupingResults": "Transformation de paires champ/valeur significatives en groupes.",
"xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData": "Chargement des données dhistogramme.",
"xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation": "Chargement des informations d'index.",
"xpack.aiops.logRateAnalysis.resultsTable.collapseAriaLabel": "Réduire",
"xpack.aiops.logRateAnalysis.resultsTable.docCountLabel": "Compte du document",
"xpack.aiops.logRateAnalysis.resultsTable.expandAriaLabel": "Développer",
"xpack.aiops.logRateAnalysis.resultsTable.fieldNameLabel": "Nom du champ",
"xpack.aiops.logRateAnalysis.resultsTable.fieldValueLabel": "Valeur du champ",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabel": "Impact",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabelColumnTooltip": "Le niveau d'impact du champ sur la différence de taux de messages.",
"xpack.aiops.logRateAnalysis.resultsTable.logRateColumnTooltip": "Une représentation visuelle de l'impact du champ sur la différence de taux de messages",
"xpack.aiops.logRateAnalysis.resultsTable.logRateLabel": "Taux du log",
"xpack.aiops.logRateAnalysis.resultsTable.pValueColumnTooltip": "L'importance de changements dans la fréquence des valeurs ; des valeurs plus faibles indiquent un changement plus important.",
"xpack.aiops.logRateAnalysis.resultsTable.pValueLabel": "valeur-p",
"xpack.aiops.logRateAnalysis.resultsTable.uniqueColumnTooltip": "Cette paire champ/valeur apparaît uniquement dans ce groupe",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupLabel": "Regrouper",
"xpack.aiops.logRateAnalysis.resultsTableGroups.impactLabelColumnTooltip": "Niveau d'impact du groupe sur la différence de taux de messages",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateColumnTooltip": "Représentation visuelle de l'impact du groupe sur la différence de taux de messages.",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateLabel": "Taux du log",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueColumnTooltip": "L'importance de changements dans la fréquence des valeurs ; des valeurs plus faibles indiquent un changement plus important.",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueLabel": "valeur-p",
"xpack.aiops.logRateAnalysis.page.emptyPromptBody": "La fonction Expliquer les pics de taux de log identifie les combinaisons champ/valeur statistiquement significatives qui contribuent à un pic de taux de log.",
"xpack.aiops.logRateAnalysis.page.emptyPromptTitle": "Cliquez sur un pic dans l'histogramme pour lancer l'analyse.",
"xpack.aiops.logRateAnalysis.page.fieldFilterApplyButtonLabel": "Appliquer",
"xpack.aiops.logRateAnalysis.page.fieldFilterButtonLabel": "Champs de filtre",
"xpack.aiops.logRateAnalysis.page.fieldFilterHelpText": "Désélectionnez les champs non pertinents pour les supprimer des groupes et cliquez sur le bouton Appliquer pour réexécuter le regroupement. Utilisez la barre de recherche pour filtrer la liste, puis sélectionnez/désélectionnez plusieurs champs avec les actions ci-dessous.",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllFields": "Désélectionner tous les champs",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllSearchedFields": "Désélectionner les champs filtrés",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllFields": "Sélectionner tous les champs",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllSearchedFields": "Sélectionner les champs filtrés",
"xpack.aiops.logRateAnalysis.page.noResultsPromptBody": "Essayez d'ajuster la référence de base et les plages temporelles d'écart-type, et réexécutez l'analyse. Si vous n'obtenez toujours aucun résultat, il se peut qu'il n'y ait aucune entité statistiquement significative contribuant à ce pic dans les taux de log.",
"xpack.aiops.logRateAnalysis.page.noResultsPromptTitle": "L'analyse n'a retourné aucun résultat.",
"xpack.aiops.logRateAnalysis.page.tryToContinueAnalysisButtonText": "Essayer de continuer l'analyse",
"xpack.aiops.fieldContextPopover.descriptionTooltipContent": "Afficher les principales valeurs de champ",
"xpack.aiops.fieldContextPopover.notTopTenValueMessage": "Le terme sélectionné n'est pas dans le top 10",
"xpack.aiops.fieldContextPopover.topFieldValuesAriaLabel": "Afficher les principales valeurs de champ",
@ -7297,7 +7296,6 @@
"xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerRowLabel": "Échantillonnage aléatoire",
"xpack.aiops.logCategorization.runButton": "Exécuter l'analyse du modèle",
"xpack.aiops.logCategorizationTimeSeriesWarning.description": "L'analyse du modèle de log ne fonctionne que sur des index temporels.",
"xpack.aiops.logRateSpikesTimeSeriesWarning.description": "Les pics de taux de log ne fonctionnent que sur des index temporels.",
"xpack.aiops.miniHistogram.noDataLabel": "S. O.",
"xpack.aiops.progressAriaLabel": "Progression",
"xpack.aiops.rerunAnalysisButtonTitle": "Lancer l'analyse",
@ -7305,23 +7303,20 @@
"xpack.aiops.resetLabel": "Réinitialiser",
"xpack.aiops.searchPanel.invalidSyntax": "Syntaxe non valide",
"xpack.aiops.searchPanel.queryBarPlaceholderText": "Rechercher… (par exemple, status:200 AND extension:\"PHP\")",
"xpack.aiops.spikeAnalysisGroupsTable.actionsColumnName": "Actions",
"xpack.aiops.spikeAnalysisPage.documentCountStatsSplitGroupLabel": "Groupe sélectionné",
"xpack.aiops.spikeAnalysisTable.actionsColumnName": "Actions",
"xpack.aiops.spikeAnalysisTable.autoGeneratedDiscoverLinkErrorMessage": "Liaison avec Discover impossible ; aucune vue de données n'existe pour cet index",
"xpack.aiops.spikeAnalysisTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "Liaison avec l'analyse de modèle de log impossible ; aucune vue de données n'existe pour cet index",
"xpack.aiops.spikeAnalysisTable.discoverLocatorMissingErrorMessage": "Aucun localisateur pour Discover détecté",
"xpack.aiops.spikeAnalysisTable.discoverNotEnabledErrorMessage": "Discover n'est pas activé",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResults": "Regroupement intelligent",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage": "Les éléments qui sont propres à un groupe sont marqués d'un astérisque (*).",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOff": "Désactivé",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOn": "Activé",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardButtonLabel": "Copier dans le presse-papiers",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardGroupMessage": "Copier les éléments de groupe en tant que syntaxe KQL dans le Presse-papiers",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardSignificantTermMessage": "Copier la paire clé-valeur en tant que syntaxe KQL dans le Presse-papiers",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInDiscover": "Afficher dans Discover",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInLogPatternAnalysis": "Voir dans l'analyse du modèle de log",
"xpack.aiops.spikeAnalysisTable.mlLocatorMissingErrorMessage": "Aucun localisateur pour l'analyse de modèle de log",
"xpack.aiops.logRateAnalysis.page.documentCountStatsSplitGroupLabel": "Groupe sélectionné",
"xpack.aiops.logRateAnalysis.resultsTable.actionsColumnName": "Actions",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedDiscoverLinkErrorMessage": "Liaison avec Discover impossible ; aucune vue de données n'existe pour cet index",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "Liaison avec l'analyse de modèle de log impossible ; aucune vue de données n'existe pour cet index",
"xpack.aiops.logRateAnalysis.resultsTable.discoverLocatorMissingErrorMessage": "Aucun localisateur pour Discover détecté",
"xpack.aiops.logRateAnalysis.resultsTable.discoverNotEnabledErrorMessage": "Discover n'est pas activé",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResults": "Résultats du groupe",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsHelpMessage": "Les éléments qui sont propres à un groupe sont marqués d'un astérisque (*).",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardButtonLabel": "Copier dans le presse-papiers",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardGroupMessage": "Copier les éléments de groupe en tant que syntaxe KQL dans le Presse-papiers",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardSignificantTermMessage": "Copier la paire clé-valeur en tant que syntaxe KQL dans le Presse-papiers",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInDiscover": "Afficher dans Discover",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInLogPatternAnalysis": "Voir dans l'analyse du modèle de log",
"xpack.aiops.logRateAnalysis.resultsTable.mlLocatorMissingErrorMessage": "Aucun localisateur pour l'analyse de modèle de log",
"xpack.aiops.techPreviewBadge.label": "Version d'évaluation technique",
"xpack.aiops.techPreviewBadge.tooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.",
"xpack.alerting.alertNavigationRegistry.get.missingNavigationError": "La navigation pour le type d'alerte \"{alertType}\" dans \"{consumer}\" n'est pas enregistrée.",
@ -19059,7 +19054,6 @@
"xpack.infra.logs.alertDetails.chartHistory.avgTimeToRecover": "Temps moyen de récupération",
"xpack.infra.logs.alertDetails.chartHistory.chartTitle": "Historique des alertes de seuil de logs",
"xpack.infra.logs.alertDetails.chartHistory.last30days": "30 derniers jours",
"xpack.infra.logs.alertDetails.explainLogRateSpikes.sectionTitle": "Expliquer les pics de taux de log",
"xpack.infra.logs.alertDetails.explainLogSpikeTitle": "Causes possibles et résolutions",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertContent": "La création d'alertes n'est pas prise en charge avec les vues de log en ligne.",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertTitle": "Vue de log en ligne",
@ -23270,13 +23264,13 @@
"xpack.ml.advancedSettings.enableAnomalyDetectionDefaultTimeRangeName": "Activer les valeurs par défaut du filtre temporel pour les résultats de détection des anomalies",
"xpack.ml.aiops.changePointDetection.docTitle": "Modifier la détection du point",
"xpack.ml.aiops.changePointDetectionBreadcrumbLabel": "Modifier la détection du point",
"xpack.ml.aiops.explainLogRateSpikes.docTitle": "Expliquer les pics de taux de log",
"xpack.ml.aiops.explainLogRateSpikesBreadcrumbLabel": "Expliquer les pics de taux de log",
"xpack.ml.aiops.logRateAnalysis.docTitle": "Expliquer les pics de taux de log",
"xpack.ml.aiops.logRateAnalysisBreadcrumbLabel": "Expliquer les pics de taux de log",
"xpack.ml.aiops.logCategorization.docTitle": "Analyse du modèle de log",
"xpack.ml.aiops.logPatternAnalysisBreadcrumbLabel": "Analyse du modèle de log",
"xpack.ml.aiopsBreadcrumbLabel": "AIOps Labs",
"xpack.ml.aiopsBreadcrumbs.changePointDetectionLabel": "Modifier la détection du point",
"xpack.ml.aiopsBreadcrumbs.explainLogRateSpikesLabel": "Expliquer les pics de taux de log",
"xpack.ml.aiopsBreadcrumbs.logRateAnalysisLabel": "Expliquer les pics de taux de log",
"xpack.ml.aiopsBreadcrumbs.selectDataViewLabel": "Sélectionner la vue de données",
"xpack.ml.alertConditionValidation.title": "La condition d'alerte contient les problèmes suivants :",
"xpack.ml.alertContext.anomalyExplorerUrlDescription": "URL pour ouvrir dans Anomaly Explorer",
@ -24076,7 +24070,7 @@
"xpack.ml.deepLink.changePointDetection": "Modifier la détection du point",
"xpack.ml.deepLink.dataFrameAnalytics": "Analyse du cadre de données",
"xpack.ml.deepLink.dataVisualizer": "Data Visualizer (Visualiseur de données)",
"xpack.ml.deepLink.explainLogRateSpikes": "Expliquer les pics de taux de log",
"xpack.ml.deepLink.logRateAnalysis": "Expliquer les pics de taux de log",
"xpack.ml.deepLink.fileUpload": "Chargement du fichier",
"xpack.ml.deepLink.filterListsSettings": "Listes de filtres",
"xpack.ml.deepLink.indexDataVisualizer": "Index Data Visualizer (Visualiseur de données pour les index)",
@ -24141,7 +24135,7 @@
"xpack.ml.embeddables.lensLayerFlyout.title": "Créer une tâche de détection des anomalies",
"xpack.ml.entityFilter.addFilterTooltip": "Ajouter un filtre",
"xpack.ml.entityFilter.removeFilterTooltip": "Supprimer le filtre",
"xpack.ml.explainLogRateSpikes.pageHeader": "Expliquer les pics de taux de log",
"xpack.ml.logRateAnalysis.pageHeader": "Expliquer les pics de taux de log",
"xpack.ml.explorer.addToDashboard.anomalyCharts.dashboardsTitle": "Ajouter des graphiques d'anomalies aux tableaux de bord",
"xpack.ml.explorer.addToDashboard.anomalyCharts.maxSeriesToPlotLabel": "Nombre maximal de séries à tracer",
"xpack.ml.explorer.addToDashboard.cancelButtonLabel": "Annuler",
@ -24763,7 +24757,7 @@
"xpack.ml.navMenu.dataFrameAnalyticsTabLinkText": "Analyse du cadre de données",
"xpack.ml.navMenu.dataViewDataVisualizerLinkText": "Vue de données",
"xpack.ml.navMenu.dataVisualizerTabLinkText": "Data Visualizer (Visualiseur de données)",
"xpack.ml.navMenu.explainLogRateSpikesLinkText": "Expliquer les pics de taux de log",
"xpack.ml.navMenu.logRateAnalysisLinkText": "Expliquer les pics de taux de log",
"xpack.ml.navMenu.fileDataVisualizerLinkText": "Fichier",
"xpack.ml.navMenu.logCategorizationLinkText": "Analyse du modèle de log",
"xpack.ml.navMenu.memoryUsageText": "Utilisation mémoire",

View file

@ -7174,11 +7174,11 @@
"xpack.aiops.categorizeFlyout.title": "{name}のパターン分析",
"xpack.aiops.changePointDetection.cardinalityWarningMessage": "\"{splitField}\"フィールドカーディナリティは{cardinality}であり、{cardinalityLimit}の制限を超えています。ドキュメントカウント別で並べ替えられた最初の{cardinalityLimit}個のパーティションのみが分析されます。",
"xpack.aiops.dataViewNotBasedOnTimeSeriesWarning.title": "データビュー\"{dataViewTitle}\"は時系列に基づいていません。",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, other {#個のフィールド候補}}が特定されました。",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, other {#個の重要なフィールドと値のペア}}が特定されました。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupColumnTooltip": "最大{maxItemCount}個のグループ項目を一意性とドキュメント数順に並べ替えて表示します。すべてのフィールドと値のペアを表示するには、行を展開します。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupItemsInfo": "{count}項目中{valuesBadges}項目を表示しています。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupUniqueItemsInfo": "このグループに固有の{count, plural, other {#アイテム}}。",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, other {#個のフィールド候補}}が特定されました。",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, other {#個の重要なフィールドと値のペア}}が特定されました。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupColumnTooltip": "最大{maxItemCount}個のグループ項目を一意性とドキュメント数順に並べ替えて表示します。すべてのフィールドと値のペアを表示するには、行を展開します。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo": "{count}項目中{valuesBadges}項目を表示しています。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo": "このグループに固有の{count, plural, other {#アイテム}}。",
"xpack.aiops.index.dataLoader.internalServerErrorMessage": "インデックス{index}のデータの読み込み中にエラーが発生。{message}。リクエストがタイムアウトした可能性があります。小さなサンプルサイズを使うか、時間範囲を狭めてみてください。",
"xpack.aiops.index.dataViewWithoutMetricNotificationTitle": "データビュー\"{dataViewTitle}\"にはメトリックフィールドが含まれていません。",
"xpack.aiops.index.errorLoadingDataMessage": "インデックス{index}のデータの読み込み中にエラーが発生。{message}。",
@ -7240,46 +7240,45 @@
"xpack.aiops.correlations.highImpactText": "高",
"xpack.aiops.correlations.lowImpactText": "低",
"xpack.aiops.correlations.mediumImpactText": "中",
"xpack.aiops.correlations.spikeAnalysisTableGroups.docCountLabel": "ドキュメントカウント",
"xpack.aiops.correlations.veryLowImpactText": "非常に低い",
"xpack.aiops.dataGrid.field.documentCountChart.seriesLabel": "ドキュメントカウント",
"xpack.aiops.dataGrid.field.documentCountChartSplit.seriesLabel": "他のドキュメントカウント",
"xpack.aiops.documentCountChart.baselineBadgeLabel": "ベースライン",
"xpack.aiops.documentCountChart.deviationBadgeLabel": "偏差",
"xpack.aiops.explainLogRateSpikes.loadingState.doneMessage": "完了しました。",
"xpack.aiops.explainLogRateSpikes.loadingState.groupingResults": "重要なフィールドと値のペアをグループに変換しています。",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData": "ヒストグラムデータを読み込んでいます。",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingIndexInformation": "インデックス情報を読み込んでいます。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.collapseAriaLabel": "縮小",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.docCountLabel": "ドキュメントカウント",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.expandAriaLabel": "拡張",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldNameLabel": "フィールド名",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldValueLabel": "フィールド値",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel": "インパクト",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip": "メッセージレート差異に対するフィールドの影響のレベル。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateColumnTooltip": "メッセージレート差異に対するフィールドの影響の視覚的な表示",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateLabel": "ログレート",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueColumnTooltip": "値の頻度の変化の重要性。値が小さいほど変化が大きいことを示します。この列をソートすると、自動的にdoc count列が二次ソートされます。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueLabel": "p値",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.uniqueColumnTooltip": "このフィールド/値の組み合わせはこのグループでのみ出現します",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel": "グループ",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.impactLabelColumnTooltip": "メッセージレート差異に対するグループの影響のレベル",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip": "メッセージレート差異に対するグループの影響の視覚的な表示。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateLabel": "ログレート",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueColumnTooltip": "値の頻度の変化の重要性。値が小さいほど変化が大きいことを示します。この列をソートすると、自動的にdoc count列が二次ソートされます。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel": "p値",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptBody": "explainログレートスパイク機能は、ログレートのスパイクに寄与する統計的に有意なフィールド/値の組み合わせを特定します。",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptTitle": "ヒストグラム図のスパイクをクリックすると、分析が開始します。",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterApplyButtonLabel": "適用",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterButtonLabel": "フィールドのフィルタリング",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterHelpText": "関連しないフィールドを選択解除すると、グループから削除されます。[適用]ボタンをクリックすると、グループ化が再実行されます。 検索バーを使用してリストをフィルタリングしてから、下のアクションを使用して複数のフィールドを選択/選択解除します。",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllFields": "すべてのフィールドを選択解除",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllSearchedFields": "フィルタリングされたフィールドを選択解除",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllFields": "すべてのフィールドを選択",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllSearchedFields": "フィルタリングされたフィールドを選択",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptBody": "ベースラインと時間範囲のずれを調整し、分析を再実行してください。結果が得られない場合は、このログレートの上昇に寄与する統計的に有意なエンティティが存在しない可能性があります。",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptTitle": "分析の結果が返されませんでした。",
"xpack.aiops.explainLogRateSpikesPage.tryToContinueAnalysisButtonText": "分析を続行してください",
"xpack.aiops.logRateAnalysis.loadingState.doneMessage": "完了しました。",
"xpack.aiops.logRateAnalysis.loadingState.groupingResults": "重要なフィールドと値のペアをグループに変換しています。",
"xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData": "ヒストグラムデータを読み込んでいます。",
"xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation": "インデックス情報を読み込んでいます。",
"xpack.aiops.logRateAnalysis.resultsTable.collapseAriaLabel": "縮小",
"xpack.aiops.logRateAnalysis.resultsTable.docCountLabel": "ドキュメントカウント",
"xpack.aiops.logRateAnalysis.resultsTable.expandAriaLabel": "拡張",
"xpack.aiops.logRateAnalysis.resultsTable.fieldNameLabel": "フィールド名",
"xpack.aiops.logRateAnalysis.resultsTable.fieldValueLabel": "フィールド値",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabel": "インパクト",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabelColumnTooltip": "メッセージレート差異に対するフィールドの影響のレベル。",
"xpack.aiops.logRateAnalysis.resultsTable.logRateColumnTooltip": "メッセージレート差異に対するフィールドの影響の視覚的な表示",
"xpack.aiops.logRateAnalysis.resultsTable.logRateLabel": "ログレート",
"xpack.aiops.logRateAnalysis.resultsTable.pValueColumnTooltip": "値の頻度の変化の有意性。値が小さいほど、変化が大きいことを示します。",
"xpack.aiops.logRateAnalysis.resultsTable.pValueLabel": "p値",
"xpack.aiops.logRateAnalysis.resultsTable.uniqueColumnTooltip": "このフィールド/値の組み合わせはこのグループでのみ出現します",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupLabel": "グループ",
"xpack.aiops.logRateAnalysis.resultsTableGroups.impactLabelColumnTooltip": "メッセージレート差異に対するグループの影響のレベル",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateColumnTooltip": "メッセージレート差異に対するグループの影響の視覚的な表示。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateLabel": "ログレート",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueColumnTooltip": "値の頻度の変化の有意性。値が小さいほど、変化が大きいことを示します。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueLabel": "p値",
"xpack.aiops.logRateAnalysis.page.emptyPromptBody": "explainログレートスパイク機能は、ログレートのスパイクに寄与する統計的に有意なフィールド/値の組み合わせを特定します。",
"xpack.aiops.logRateAnalysis.page.emptyPromptTitle": "ヒストグラム図のスパイクをクリックすると、分析が開始します。",
"xpack.aiops.logRateAnalysis.page.fieldFilterApplyButtonLabel": "適用",
"xpack.aiops.logRateAnalysis.page.fieldFilterButtonLabel": "フィールドのフィルタリング",
"xpack.aiops.logRateAnalysis.page.fieldFilterHelpText": "関連しないフィールドを選択解除すると、グループから削除されます。[適用]ボタンをクリックすると、グループ化が再実行されます。 検索バーを使用してリストをフィルタリングしてから、下のアクションを使用して複数のフィールドを選択/選択解除します。",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllFields": "すべてのフィールドを選択解除",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllSearchedFields": "フィルタリングされたフィールドを選択解除",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllFields": "すべてのフィールドを選択",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllSearchedFields": "フィルタリングされたフィールドを選択",
"xpack.aiops.logRateAnalysis.page.noResultsPromptBody": "ベースラインと時間範囲のずれを調整し、分析を再実行してください。結果が得られない場合は、このログレートの上昇に寄与する統計的に有意なエンティティが存在しない可能性があります。",
"xpack.aiops.logRateAnalysis.page.noResultsPromptTitle": "分析の結果が返されませんでした。",
"xpack.aiops.logRateAnalysis.page.tryToContinueAnalysisButtonText": "分析を続行してください",
"xpack.aiops.fieldContextPopover.descriptionTooltipContent": "上位のフィールド値を表示",
"xpack.aiops.fieldContextPopover.notTopTenValueMessage": "選択した用語は上位10件にありません",
"xpack.aiops.fieldContextPopover.topFieldValuesAriaLabel": "上位のフィールド値を表示",
@ -7312,7 +7311,6 @@
"xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerRowLabel": "無作為抽出",
"xpack.aiops.logCategorization.runButton": "パターン分析を実行",
"xpack.aiops.logCategorizationTimeSeriesWarning.description": "ログパターン分析は、時間ベースのインデックスに対してのみ実行されます。",
"xpack.aiops.logRateSpikesTimeSeriesWarning.description": "ログレートスパイクは、時間ベースのインデックスに対してのみ実行されます。",
"xpack.aiops.miniHistogram.noDataLabel": "N/A",
"xpack.aiops.progressAriaLabel": "進捗",
"xpack.aiops.rerunAnalysisButtonTitle": "分析を実行",
@ -7320,23 +7318,20 @@
"xpack.aiops.resetLabel": "リセット",
"xpack.aiops.searchPanel.invalidSyntax": "無効な構文",
"xpack.aiops.searchPanel.queryBarPlaceholderText": "検索…status:200 AND extension:\"PHP\"",
"xpack.aiops.spikeAnalysisGroupsTable.actionsColumnName": "アクション",
"xpack.aiops.spikeAnalysisPage.documentCountStatsSplitGroupLabel": "選択したグループ",
"xpack.aiops.spikeAnalysisTable.actionsColumnName": "アクション",
"xpack.aiops.spikeAnalysisTable.autoGeneratedDiscoverLinkErrorMessage": "Discoverにリンクできません。このインデックスのデータビューが存在しません",
"xpack.aiops.spikeAnalysisTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "ログパターン分析にリンクできません。このインデックスのデータビューが存在しません",
"xpack.aiops.spikeAnalysisTable.discoverLocatorMissingErrorMessage": "Discoverのロケーターが検出されません",
"xpack.aiops.spikeAnalysisTable.discoverNotEnabledErrorMessage": "Discoverが有効ではありません",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResults": "スマートグループ",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage": "グループに固有のアイテムにはアスタリスク(*)が表示されます。",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOff": "オフ",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOn": "オン",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardButtonLabel": "クリップボードにコピー",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardGroupMessage": "グループアイテムをKQL構文としてクリップボードにコピー",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardSignificantTermMessage": "フィールド/値のペアをKQL構文としてクリップボードにコピー",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInDiscover": "Discoverに表示",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInLogPatternAnalysis": "ログパターン分析で表示",
"xpack.aiops.spikeAnalysisTable.mlLocatorMissingErrorMessage": "ログパターン分析のロケーターが検出されません",
"xpack.aiops.logRateAnalysis.page.documentCountStatsSplitGroupLabel": "選択したグループ",
"xpack.aiops.logRateAnalysis.resultsTable.actionsColumnName": "アクション",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedDiscoverLinkErrorMessage": "Discoverにリンクできません。このインデックスのデータビューが存在しません",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "ログパターン分析にリンクできません。このインデックスのデータビューが存在しません",
"xpack.aiops.logRateAnalysis.resultsTable.discoverLocatorMissingErrorMessage": "Discoverのロケーターが検出されません",
"xpack.aiops.logRateAnalysis.resultsTable.discoverNotEnabledErrorMessage": "Discoverが有効ではありません",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResults": "結果をグループ化",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsHelpMessage": "グループに固有のアイテムにはアスタリスク(*)が表示されます。",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardButtonLabel": "クリップボードにコピー",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardGroupMessage": "グループアイテムをKQL構文としてクリップボードにコピー",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardSignificantTermMessage": "フィールド/値のペアをKQL構文としてクリップボードにコピー",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInDiscover": "Discoverに表示",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInLogPatternAnalysis": "ログパターン分析で表示",
"xpack.aiops.logRateAnalysis.resultsTable.mlLocatorMissingErrorMessage": "ログパターン分析のロケーターが検出されません",
"xpack.aiops.techPreviewBadge.label": "テクニカルプレビュー",
"xpack.aiops.techPreviewBadge.tooltip": "この機能はテクニカルプレビュー中であり、将来のリリースでは変更されたり完全に削除されたりする場合があります。Elasticは最善の努力を講じてすべての問題の修正に努めますが、テクニカルプレビュー中の機能には正式なGA機能のサポートSLAが適用されません。",
"xpack.alerting.alertNavigationRegistry.get.missingNavigationError": "「{consumer}」内のアラートタイプ「{alertType}」のナビゲーションは登録されていません。",
@ -19072,7 +19067,6 @@
"xpack.infra.logs.alertDetails.chartHistory.avgTimeToRecover": "回復までの平均時間",
"xpack.infra.logs.alertDetails.chartHistory.chartTitle": "ログしきい値アラート履歴",
"xpack.infra.logs.alertDetails.chartHistory.last30days": "過去30日間",
"xpack.infra.logs.alertDetails.explainLogRateSpikes.sectionTitle": "ログレートスパイクを説明",
"xpack.infra.logs.alertDetails.explainLogSpikeTitle": "考えられる原因と修正方法",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertContent": "インラインログビューではアラートの作成がサポートされていません",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertTitle": "インラインログビュー",
@ -23269,13 +23263,13 @@
"xpack.ml.advancedSettings.enableAnomalyDetectionDefaultTimeRangeName": "異常検知結果の時間フィルターデフォルトを有効にする",
"xpack.ml.aiops.changePointDetection.docTitle": "変化点検出",
"xpack.ml.aiops.changePointDetectionBreadcrumbLabel": "変化点検出",
"xpack.ml.aiops.explainLogRateSpikes.docTitle": "ログレートスパイクを説明",
"xpack.ml.aiops.explainLogRateSpikesBreadcrumbLabel": "ログレートスパイクを説明",
"xpack.ml.aiops.logRateAnalysis.docTitle": "ログレートスパイクを説明",
"xpack.ml.aiops.logRateAnalysisBreadcrumbLabel": "ログレートスパイクを説明",
"xpack.ml.aiops.logCategorization.docTitle": "ログパターン分析",
"xpack.ml.aiops.logPatternAnalysisBreadcrumbLabel": "ログパターン分析",
"xpack.ml.aiopsBreadcrumbLabel": "AIOps Labs",
"xpack.ml.aiopsBreadcrumbs.changePointDetectionLabel": "変化点検出",
"xpack.ml.aiopsBreadcrumbs.explainLogRateSpikesLabel": "ログレートスパイクを説明",
"xpack.ml.aiopsBreadcrumbs.logRateAnalysisLabel": "ログレートスパイクを説明",
"xpack.ml.aiopsBreadcrumbs.selectDataViewLabel": "データビューを選択",
"xpack.ml.alertConditionValidation.title": "アラート条件には次の問題が含まれます。",
"xpack.ml.alertContext.anomalyExplorerUrlDescription": "異常エクスプローラーを開くURL",
@ -24075,7 +24069,7 @@
"xpack.ml.deepLink.changePointDetection": "変化点検出",
"xpack.ml.deepLink.dataFrameAnalytics": "データフレーム分析",
"xpack.ml.deepLink.dataVisualizer": "データビジュアライザー",
"xpack.ml.deepLink.explainLogRateSpikes": "ログレートスパイクを説明",
"xpack.ml.deepLink.logRateAnalysis": "ログレートスパイクを説明",
"xpack.ml.deepLink.fileUpload": "ファイルアップロード",
"xpack.ml.deepLink.filterListsSettings": "フィルターリスト",
"xpack.ml.deepLink.indexDataVisualizer": "インデックスデータビジュアライザー",
@ -24140,7 +24134,7 @@
"xpack.ml.embeddables.lensLayerFlyout.title": "異常検知ジョブの作成",
"xpack.ml.entityFilter.addFilterTooltip": "フィルターを追加します",
"xpack.ml.entityFilter.removeFilterTooltip": "フィルターを削除",
"xpack.ml.explainLogRateSpikes.pageHeader": "ログレートスパイクを説明",
"xpack.ml.logRateAnalysis.pageHeader": "ログレートスパイクを説明",
"xpack.ml.explorer.addToDashboard.anomalyCharts.dashboardsTitle": "異常グラフをダッシュボードに追加",
"xpack.ml.explorer.addToDashboard.anomalyCharts.maxSeriesToPlotLabel": "プロットする最大系列数",
"xpack.ml.explorer.addToDashboard.cancelButtonLabel": "キャンセル",
@ -24762,7 +24756,7 @@
"xpack.ml.navMenu.dataFrameAnalyticsTabLinkText": "データフレーム分析",
"xpack.ml.navMenu.dataViewDataVisualizerLinkText": "データビュー",
"xpack.ml.navMenu.dataVisualizerTabLinkText": "データビジュアライザー",
"xpack.ml.navMenu.explainLogRateSpikesLinkText": "ログレートスパイクを説明",
"xpack.ml.navMenu.logRateAnalysisLinkText": "ログレートスパイクを説明",
"xpack.ml.navMenu.fileDataVisualizerLinkText": "ファイル",
"xpack.ml.navMenu.logCategorizationLinkText": "ログパターン分析",
"xpack.ml.navMenu.memoryUsageText": "メモリー使用状況",

View file

@ -7173,11 +7173,11 @@
"xpack.aiops.categorizeFlyout.title": "{name} 的模式分析",
"xpack.aiops.changePointDetection.cardinalityWarningMessage": "“{splitField}”字段基数为 {cardinality},这超出了 {cardinalityLimit} 的限制。仅分析前 {cardinalityLimit} 个分区(按文档计数排序)。",
"xpack.aiops.dataViewNotBasedOnTimeSeriesWarning.title": "数据视图“{dataViewTitle}”并非基于时间序列。",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates": "已识别 {fieldCandidatesCount, plural, other {# 个字段候选项}}。",
"xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs": "已识别 {fieldValuePairsCount, plural, other {# 个重要的字段/值对}}。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupColumnTooltip": "显示多达 {maxItemCount} 个按唯一性和文档计数排序的组项目。展开行以查看所有字段/值对。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupItemsInfo": "正在显示 {valuesBadges} 个(共 {count} 个)项目。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupUniqueItemsInfo": "{count, plural, other {# 项}}对此组唯一。",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldCandidates": "已识别 {fieldCandidatesCount, plural, other {# 个字段候选项}}。",
"xpack.aiops.logRateAnalysis.loadingState.identifiedFieldValuePairs": "已识别 {fieldValuePairsCount, plural, other {# 个重要的字段/值对}}。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupColumnTooltip": "显示多达 {maxItemCount} 个按唯一性和文档计数排序的组项目。展开行以查看所有字段/值对。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupItemsInfo": "正在显示 {valuesBadges} 个(共 {count} 个)项目。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupUniqueItemsInfo": "{count, plural, other {# 项}}对此组唯一。",
"xpack.aiops.index.dataLoader.internalServerErrorMessage": "加载索引 {index} 中的数据时出错。{message}。请求可能已超时。请尝试使用较小的样例大小或缩小时间范围。",
"xpack.aiops.index.dataViewWithoutMetricNotificationTitle": "数据视图“{dataViewTitle}”不包含任何指标字段。",
"xpack.aiops.index.errorLoadingDataMessage": "加载索引 {index} 中的数据时出错。{message}。",
@ -7239,46 +7239,45 @@
"xpack.aiops.correlations.highImpactText": "高",
"xpack.aiops.correlations.lowImpactText": "低",
"xpack.aiops.correlations.mediumImpactText": "中",
"xpack.aiops.correlations.spikeAnalysisTableGroups.docCountLabel": "文档计数",
"xpack.aiops.correlations.veryLowImpactText": "极低",
"xpack.aiops.dataGrid.field.documentCountChart.seriesLabel": "文档计数",
"xpack.aiops.dataGrid.field.documentCountChartSplit.seriesLabel": "其他文档计数",
"xpack.aiops.documentCountChart.baselineBadgeLabel": "基线",
"xpack.aiops.documentCountChart.deviationBadgeLabel": "偏差",
"xpack.aiops.explainLogRateSpikes.loadingState.doneMessage": "完成。",
"xpack.aiops.explainLogRateSpikes.loadingState.groupingResults": "正在将重要的字段/值对转换到组中。",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData": "正在加载直方图数据。",
"xpack.aiops.explainLogRateSpikes.loadingState.loadingIndexInformation": "正在加载索引信息。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.collapseAriaLabel": "折叠",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.docCountLabel": "文档计数",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.expandAriaLabel": "展开",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldNameLabel": "字段名称",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldValueLabel": "字段值",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel": "影响",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip": "字段对消息速率差异的影响水平。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateColumnTooltip": "字段对消息速率差异的影响的视觉表示形式",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateLabel": "日志速率",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueColumnTooltip": "值的频率更改的意义;值越小表示变化越大;对此列排序会自动在文档计数列上进行二次排序。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueLabel": "p-value",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.uniqueColumnTooltip": "此字段/值对只在该分组中出现",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel": "组",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.impactLabelColumnTooltip": "组对消息速率差异的影响水平",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip": "组对消息速率差异的影响的视觉表示形式。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateLabel": "日志速率",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueColumnTooltip": "值的频率更改的意义;值越小表示变化越大;对此列排序会自动在文档计数列上进行二次排序。",
"xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel": "p-value",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptBody": "“解释日志速率峰值”功能会从统计上识别有助于达到日志速率峰值的重要字段/值组合。",
"xpack.aiops.explainLogRateSpikesPage.emptyPromptTitle": "单击直方图中的某个峰值可开始分析。",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterApplyButtonLabel": "应用",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterButtonLabel": "筛选字段",
"xpack.aiops.explainLogRateSpikesPage.fieldFilterHelpText": "取消选择非相关字段以将其从组中移除,然后单击“应用”按钮返回分组。 使用搜索栏筛选列表,然后通过以下操作选择/取消选择多个字段。",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllFields": "取消选择所有字段",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllSearchedFields": "取消选择已筛选字段",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllFields": "选择所有字段",
"xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllSearchedFields": "选择已筛选字段",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptBody": "尝试调整基线和偏差时间范围,然后重新运行分析。如果仍然没有结果,可能没有具有统计意义的实体导致了该日志速率峰值。",
"xpack.aiops.explainLogRateSpikesPage.noResultsPromptTitle": "分析未返回任何结果。",
"xpack.aiops.explainLogRateSpikesPage.tryToContinueAnalysisButtonText": "尝试继续分析",
"xpack.aiops.logRateAnalysis.loadingState.doneMessage": "完成。",
"xpack.aiops.logRateAnalysis.loadingState.groupingResults": "正在将重要的字段/值对转换到组中。",
"xpack.aiops.logRateAnalysis.loadingState.loadingHistogramData": "正在加载直方图数据。",
"xpack.aiops.logRateAnalysis.loadingState.loadingIndexInformation": "正在加载索引信息。",
"xpack.aiops.logRateAnalysis.resultsTable.collapseAriaLabel": "折叠",
"xpack.aiops.logRateAnalysis.resultsTable.docCountLabel": "文档计数",
"xpack.aiops.logRateAnalysis.resultsTable.expandAriaLabel": "展开",
"xpack.aiops.logRateAnalysis.resultsTable.fieldNameLabel": "字段名称",
"xpack.aiops.logRateAnalysis.resultsTable.fieldValueLabel": "字段值",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabel": "影响",
"xpack.aiops.logRateAnalysis.resultsTable.impactLabelColumnTooltip": "字段对消息速率差异的影响水平。",
"xpack.aiops.logRateAnalysis.resultsTable.logRateColumnTooltip": "字段对消息速率差异的影响的视觉表示形式",
"xpack.aiops.logRateAnalysis.resultsTable.logRateLabel": "日志速率",
"xpack.aiops.logRateAnalysis.resultsTable.pValueColumnTooltip": "值的频率更改的意义;值越小表示变化越大",
"xpack.aiops.logRateAnalysis.resultsTable.pValueLabel": "p-value",
"xpack.aiops.logRateAnalysis.resultsTable.uniqueColumnTooltip": "此字段/值对只在该分组中出现",
"xpack.aiops.logRateAnalysis.resultsTableGroups.groupLabel": "组",
"xpack.aiops.logRateAnalysis.resultsTableGroups.impactLabelColumnTooltip": "组对消息速率差异的影响水平",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateColumnTooltip": "组对消息速率差异的影响的视觉表示形式。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.logRateLabel": "日志速率",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueColumnTooltip": "值的频率更改的意义;值越小表示变化越大。",
"xpack.aiops.logRateAnalysis.resultsTableGroups.pValueLabel": "p-value",
"xpack.aiops.logRateAnalysis.page.emptyPromptBody": "“解释日志速率峰值”功能会从统计上识别有助于达到日志速率峰值的重要字段/值组合。",
"xpack.aiops.logRateAnalysis.page.emptyPromptTitle": "单击直方图中的某个峰值可开始分析。",
"xpack.aiops.logRateAnalysis.page.fieldFilterApplyButtonLabel": "应用",
"xpack.aiops.logRateAnalysis.page.fieldFilterButtonLabel": "筛选字段",
"xpack.aiops.logRateAnalysis.page.fieldFilterHelpText": "取消选择非相关字段以将其从组中移除,然后单击“应用”按钮返回分组。 使用搜索栏筛选列表,然后通过以下操作选择/取消选择多个字段。",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllFields": "取消选择所有字段",
"xpack.aiops.logRateAnalysis.page.fieldSelector.deselectAllSearchedFields": "取消选择已筛选字段",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllFields": "选择所有字段",
"xpack.aiops.logRateAnalysis.page.fieldSelector.selectAllSearchedFields": "选择已筛选字段",
"xpack.aiops.logRateAnalysis.page.noResultsPromptBody": "尝试调整基线和偏差时间范围,然后重新运行分析。如果仍然没有结果,可能没有具有统计意义的实体导致了该日志速率峰值。",
"xpack.aiops.logRateAnalysis.page.noResultsPromptTitle": "分析未返回任何结果。",
"xpack.aiops.logRateAnalysis.page.tryToContinueAnalysisButtonText": "尝试继续分析",
"xpack.aiops.fieldContextPopover.descriptionTooltipContent": "显示排名靠前字段值",
"xpack.aiops.fieldContextPopover.notTopTenValueMessage": "选定的词未排名前 10",
"xpack.aiops.fieldContextPopover.topFieldValuesAriaLabel": "显示排名靠前字段值",
@ -7311,7 +7310,6 @@
"xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerRowLabel": "随机采样",
"xpack.aiops.logCategorization.runButton": "运行模式分析",
"xpack.aiops.logCategorizationTimeSeriesWarning.description": "仅针对基于时间的索引运行日志模式分析。",
"xpack.aiops.logRateSpikesTimeSeriesWarning.description": "仅针对基于时间的索引运行日志速率峰值。",
"xpack.aiops.miniHistogram.noDataLabel": "不可用",
"xpack.aiops.progressAriaLabel": "进度",
"xpack.aiops.rerunAnalysisButtonTitle": "运行分析",
@ -7319,23 +7317,20 @@
"xpack.aiops.resetLabel": "重置",
"xpack.aiops.searchPanel.invalidSyntax": "语法无效",
"xpack.aiops.searchPanel.queryBarPlaceholderText": "搜索……例如status:200 AND extension:\"PHP\"",
"xpack.aiops.spikeAnalysisGroupsTable.actionsColumnName": "操作",
"xpack.aiops.spikeAnalysisPage.documentCountStatsSplitGroupLabel": "选定的组",
"xpack.aiops.spikeAnalysisTable.actionsColumnName": "操作",
"xpack.aiops.spikeAnalysisTable.autoGeneratedDiscoverLinkErrorMessage": "无法链接到 Discover此索引的数据视图不存在",
"xpack.aiops.spikeAnalysisTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "无法链接到日志模式分析;此索引的数据视图不存在",
"xpack.aiops.spikeAnalysisTable.discoverLocatorMissingErrorMessage": "未检测到 Discover 的定位器",
"xpack.aiops.spikeAnalysisTable.discoverNotEnabledErrorMessage": "Discover 未启用",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResults": "智能分组",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage": "对组唯一的项目将用星号 (*) 标注。",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOff": "关闭",
"xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsOn": "开启",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardButtonLabel": "复制到剪贴板",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardGroupMessage": "将组项目作为 KQL 语法复制到剪贴板",
"xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardSignificantTermMessage": "将字段/值对作为 KQL 语法复制到剪贴板",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInDiscover": "在 Discover 中查看",
"xpack.aiops.spikeAnalysisTable.linksMenu.viewInLogPatternAnalysis": "在日志模式分析中查看",
"xpack.aiops.spikeAnalysisTable.mlLocatorMissingErrorMessage": "未检测到用于日志模式分析的定位器",
"xpack.aiops.logRateAnalysis.page.documentCountStatsSplitGroupLabel": "选定的组",
"xpack.aiops.logRateAnalysis.resultsTable.actionsColumnName": "操作",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedDiscoverLinkErrorMessage": "无法链接到 Discover此索引的数据视图不存在",
"xpack.aiops.logRateAnalysis.resultsTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "无法链接到日志模式分析;此索引的数据视图不存在",
"xpack.aiops.logRateAnalysis.resultsTable.discoverLocatorMissingErrorMessage": "未检测到 Discover 的定位器",
"xpack.aiops.logRateAnalysis.resultsTable.discoverNotEnabledErrorMessage": "Discover 未启用",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResults": "对结果分组",
"xpack.aiops.logRateAnalysis.resultsTable.groupedSwitchLabel.groupResultsHelpMessage": "对组唯一的项目将用星号 (*) 标注。",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardButtonLabel": "复制到剪贴板",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardGroupMessage": "将组项目作为 KQL 语法复制到剪贴板",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.copyToClipboardSignificantTermMessage": "将字段/值对作为 KQL 语法复制到剪贴板",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInDiscover": "在 Discover 中查看",
"xpack.aiops.logRateAnalysis.resultsTable.linksMenu.viewInLogPatternAnalysis": "在日志模式分析中查看",
"xpack.aiops.logRateAnalysis.resultsTable.mlLocatorMissingErrorMessage": "未检测到用于日志模式分析的定位器",
"xpack.aiops.techPreviewBadge.label": "技术预览",
"xpack.aiops.techPreviewBadge.tooltip": "此功能处于技术预览状态在未来版本中可能会更改或完全移除。Elastic 将尽最大努力来修复任何问题,但处于技术预览状态的功能不受正式 GA 功能支持 SLA 的约束。",
"xpack.alerting.alertNavigationRegistry.get.missingNavigationError": "在“{consumer}”内针对告警类型“{alertType}”的导航未注册。",
@ -19072,7 +19067,6 @@
"xpack.infra.logs.alertDetails.chartHistory.avgTimeToRecover": "恢复的平均时间",
"xpack.infra.logs.alertDetails.chartHistory.chartTitle": "日志阈值告警历史记录",
"xpack.infra.logs.alertDetails.chartHistory.last30days": "过去 30 天",
"xpack.infra.logs.alertDetails.explainLogRateSpikes.sectionTitle": "解释日志速率峰值",
"xpack.infra.logs.alertDetails.explainLogSpikeTitle": "可能的原因和补救措施",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertContent": "不支持通过内联日志视图创建告警",
"xpack.infra.logs.alertDropdown.inlineLogViewCreateAlertTitle": "内联日志视图",
@ -23268,13 +23262,13 @@
"xpack.ml.advancedSettings.enableAnomalyDetectionDefaultTimeRangeName": "对异常检测结果启用时间筛选默认值",
"xpack.ml.aiops.changePointDetection.docTitle": "更改点检测",
"xpack.ml.aiops.changePointDetectionBreadcrumbLabel": "更改点检测",
"xpack.ml.aiops.explainLogRateSpikes.docTitle": "解释日志速率峰值",
"xpack.ml.aiops.explainLogRateSpikesBreadcrumbLabel": "解释日志速率峰值",
"xpack.ml.aiops.logRateAnalysis.docTitle": "解释日志速率峰值",
"xpack.ml.aiops.logRateAnalysisBreadcrumbLabel": "解释日志速率峰值",
"xpack.ml.aiops.logCategorization.docTitle": "日志模式分析",
"xpack.ml.aiops.logPatternAnalysisBreadcrumbLabel": "日志模式分析",
"xpack.ml.aiopsBreadcrumbLabel": "AIOps 实验室",
"xpack.ml.aiopsBreadcrumbs.changePointDetectionLabel": "更改点检测",
"xpack.ml.aiopsBreadcrumbs.explainLogRateSpikesLabel": "解释日志速率峰值",
"xpack.ml.aiopsBreadcrumbs.logRateAnalysisLabel": "解释日志速率峰值",
"xpack.ml.aiopsBreadcrumbs.selectDataViewLabel": "选择数据视图",
"xpack.ml.alertConditionValidation.title": "告警条件包含以下问题:",
"xpack.ml.alertContext.anomalyExplorerUrlDescription": "要在 Anomaly Explorer 中打开的 URL",
@ -24074,7 +24068,7 @@
"xpack.ml.deepLink.changePointDetection": "更改点检测",
"xpack.ml.deepLink.dataFrameAnalytics": "数据帧分析",
"xpack.ml.deepLink.dataVisualizer": "数据可视化工具",
"xpack.ml.deepLink.explainLogRateSpikes": "解释日志速率峰值",
"xpack.ml.deepLink.logRateAnalysis": "解释日志速率峰值",
"xpack.ml.deepLink.fileUpload": "文件上传",
"xpack.ml.deepLink.filterListsSettings": "筛选列表",
"xpack.ml.deepLink.indexDataVisualizer": "索引数据可视化工具",
@ -24139,7 +24133,7 @@
"xpack.ml.embeddables.lensLayerFlyout.title": "创建异常检测作业",
"xpack.ml.entityFilter.addFilterTooltip": "添加筛选",
"xpack.ml.entityFilter.removeFilterTooltip": "移除筛选",
"xpack.ml.explainLogRateSpikes.pageHeader": "解释日志速率峰值",
"xpack.ml.logRateAnalysis.pageHeader": "解释日志速率峰值",
"xpack.ml.explorer.addToDashboard.anomalyCharts.dashboardsTitle": "将异常图表添加到仪表板",
"xpack.ml.explorer.addToDashboard.anomalyCharts.maxSeriesToPlotLabel": "要绘制的最大序列数目",
"xpack.ml.explorer.addToDashboard.cancelButtonLabel": "取消",
@ -24761,7 +24755,7 @@
"xpack.ml.navMenu.dataFrameAnalyticsTabLinkText": "数据帧分析",
"xpack.ml.navMenu.dataViewDataVisualizerLinkText": "数据视图",
"xpack.ml.navMenu.dataVisualizerTabLinkText": "数据可视化工具",
"xpack.ml.navMenu.explainLogRateSpikesLinkText": "解释日志速率峰值",
"xpack.ml.navMenu.logRateAnalysisLinkText": "解释日志速率峰值",
"xpack.ml.navMenu.fileDataVisualizerLinkText": "文件",
"xpack.ml.navMenu.logCategorizationLinkText": "日志模式分析",
"xpack.ml.navMenu.memoryUsageText": "内存利用率",

View file

@ -5,18 +5,14 @@
* 2.0.
*/
import { AIOPS_ENABLED } from '@kbn/aiops-plugin/common';
import type { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ loadTestFile }: FtrProviderContext) {
describe('AIOps', function () {
this.tags(['aiops']);
if (AIOPS_ENABLED) {
loadTestFile(require.resolve('./explain_log_rate_spikes_full_analysis'));
loadTestFile(require.resolve('./explain_log_rate_spikes_groups_only'));
loadTestFile(require.resolve('./explain_log_rate_spikes_no_index'));
}
loadTestFile(require.resolve('./log_rate_analysis_full_analysis'));
loadTestFile(require.resolve('./log_rate_analysis_groups_only'));
loadTestFile(require.resolve('./log_rate_analysis_no_index'));
});
}

View file

@ -10,13 +10,13 @@ import fetch from 'node-fetch';
import { format as formatUrl } from 'url';
import expect from '@kbn/expect';
import type { ApiExplainLogRateSpikes } from '@kbn/aiops-plugin/common/api';
import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api';
import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common';
import type { FtrProviderContext } from '../../ftr_provider_context';
import { parseStream } from './parse_stream';
import { explainLogRateSpikesTestData } from './test_data';
import { logRateAnalysisTestData } from './test_data';
export default ({ getService }: FtrProviderContext) => {
const aiops = getService('aiops');
@ -25,14 +25,14 @@ export default ({ getService }: FtrProviderContext) => {
const kibanaServerUrl = formatUrl(config.get('servers.kibana'));
const esArchiver = getService('esArchiver');
describe('POST /internal/aiops/explain_log_rate_spikes - full analysis', () => {
explainLogRateSpikesTestData.forEach((testData) => {
describe('POST /internal/aiops/log_rate_analysis - full analysis', () => {
logRateAnalysisTestData.forEach((testData) => {
describe(`with ${testData.testName}`, () => {
before(async () => {
if (testData.esArchive) {
await esArchiver.loadIfNeeded(testData.esArchive);
} else if (testData.dataGenerator) {
await aiops.explainLogRateSpikesDataGenerator.generateData(testData.dataGenerator);
await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator);
}
});
@ -40,9 +40,7 @@ export default ({ getService }: FtrProviderContext) => {
if (testData.esArchive) {
await esArchiver.unload(testData.esArchive);
} else if (testData.dataGenerator) {
await aiops.explainLogRateSpikesDataGenerator.removeGeneratedData(
testData.dataGenerator
);
await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator);
}
});
@ -100,9 +98,9 @@ export default ({ getService }: FtrProviderContext) => {
});
}
async function requestWithoutStreaming(body: ApiExplainLogRateSpikes['body']) {
async function requestWithoutStreaming(body: AiopsApiLogRateAnalysis['body']) {
const resp = await supertest
.post(`/internal/aiops/explain_log_rate_spikes`)
.post(`/internal/aiops/log_rate_analysis`)
.set('kbn-xsrf', 'kibana')
.set(ELASTIC_HTTP_VERSION_HEADER, '1')
.send(body)
@ -157,8 +155,8 @@ export default ({ getService }: FtrProviderContext) => {
});
});
async function requestWithStreaming(body: ApiExplainLogRateSpikes['body']) {
const resp = await fetch(`${kibanaServerUrl}/internal/aiops/explain_log_rate_spikes`, {
async function requestWithStreaming(body: AiopsApiLogRateAnalysis['body']) {
const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',

View file

@ -10,13 +10,13 @@ import fetch from 'node-fetch';
import { format as formatUrl } from 'url';
import expect from '@kbn/expect';
import type { ApiExplainLogRateSpikes } from '@kbn/aiops-plugin/common/api';
import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api';
import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common';
import type { FtrProviderContext } from '../../ftr_provider_context';
import { parseStream } from './parse_stream';
import { explainLogRateSpikesTestData } from './test_data';
import { logRateAnalysisTestData } from './test_data';
export default ({ getService }: FtrProviderContext) => {
const aiops = getService('aiops');
@ -25,8 +25,8 @@ export default ({ getService }: FtrProviderContext) => {
const kibanaServerUrl = formatUrl(config.get('servers.kibana'));
const esArchiver = getService('esArchiver');
describe('POST /internal/aiops/explain_log_rate_spikes - groups only', () => {
explainLogRateSpikesTestData.forEach((testData) => {
describe('POST /internal/aiops/log_rate_analysis - groups only', () => {
logRateAnalysisTestData.forEach((testData) => {
const overrides = {
loaded: 0,
remainingFieldCandidates: [],
@ -39,7 +39,7 @@ export default ({ getService }: FtrProviderContext) => {
if (testData.esArchive) {
await esArchiver.loadIfNeeded(testData.esArchive);
} else if (testData.dataGenerator) {
await aiops.explainLogRateSpikesDataGenerator.generateData(testData.dataGenerator);
await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator);
}
});
@ -47,9 +47,7 @@ export default ({ getService }: FtrProviderContext) => {
if (testData.esArchive) {
await esArchiver.unload(testData.esArchive);
} else if (testData.dataGenerator) {
await aiops.explainLogRateSpikesDataGenerator.removeGeneratedData(
testData.dataGenerator
);
await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator);
}
});
@ -91,9 +89,9 @@ export default ({ getService }: FtrProviderContext) => {
});
}
async function requestWithoutStreaming(body: ApiExplainLogRateSpikes['body']) {
async function requestWithoutStreaming(body: AiopsApiLogRateAnalysis['body']) {
const resp = await supertest
.post(`/internal/aiops/explain_log_rate_spikes`)
.post(`/internal/aiops/log_rate_analysis`)
.set('kbn-xsrf', 'kibana')
.set(ELASTIC_HTTP_VERSION_HEADER, '1')
.send(body)
@ -153,8 +151,8 @@ export default ({ getService }: FtrProviderContext) => {
});
});
async function requestWithStreaming(body: ApiExplainLogRateSpikes['body']) {
const resp = await fetch(`${kibanaServerUrl}/internal/aiops/explain_log_rate_spikes`, {
async function requestWithStreaming(body: AiopsApiLogRateAnalysis['body']) {
const resp = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',

View file

@ -10,17 +10,17 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common';
import type { FtrProviderContext } from '../../ftr_provider_context';
import { explainLogRateSpikesTestData } from './test_data';
import { logRateAnalysisTestData } from './test_data';
export default ({ getService }: FtrProviderContext) => {
const supertest = getService('supertest');
describe('POST /internal/aiops/explain_log_rate_spikes - no index', () => {
explainLogRateSpikesTestData.forEach((testData) => {
describe('POST /internal/aiops/log_rate_analysis - no index', () => {
logRateAnalysisTestData.forEach((testData) => {
describe(`with ${testData.testName}`, () => {
it('should return an error for non existing index without streaming', async () => {
const resp = await supertest
.post(`/internal/aiops/explain_log_rate_spikes`)
.post(`/internal/aiops/log_rate_analysis`)
.set('kbn-xsrf', 'kibana')
.set(ELASTIC_HTTP_VERSION_HEADER, '1')
.send({

View file

@ -13,7 +13,7 @@ import { finalSignificantTermGroups as artificialLogsSignificantTermGroups } fro
import type { TestData } from './types';
export const explainLogRateSpikesTestData: TestData[] = [
export const logRateAnalysisTestData: TestData[] = [
{
testName: 'ecommerce',
esArchive: 'x-pack/test/functional/es_archives/ml/ecommerce',

View file

@ -5,14 +5,14 @@
* 2.0.
*/
import type { ApiExplainLogRateSpikes } from '@kbn/aiops-plugin/common/api';
import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api';
import type { SignificantTerm, SignificantTermGroup } from '@kbn/ml-agg-utils';
export interface TestData {
testName: string;
esArchive?: string;
dataGenerator?: string;
requestBody: ApiExplainLogRateSpikes['body'];
requestBody: AiopsApiLogRateAnalysis['body'];
expected: {
chunksLength: number;
chunksLengthGroupOnly: number;

View file

@ -7,12 +7,12 @@
import { FtrProviderContext } from '../../functional/ftr_provider_context';
import { ExplainLogRateSpikesDataGeneratorProvider } from '../../functional/services/aiops/explain_log_rate_spikes_data_generator';
import { LogRateAnalysisDataGeneratorProvider } from '../../functional/services/aiops/log_rate_analysis_data_generator';
export function AiopsProvider(context: FtrProviderContext) {
const explainLogRateSpikesDataGenerator = ExplainLogRateSpikesDataGeneratorProvider(context);
const logRateAnalysisDataGenerator = LogRateAnalysisDataGeneratorProvider(context);
return {
explainLogRateSpikesDataGenerator,
logRateAnalysisDataGenerator,
};
}

View file

@ -11,7 +11,7 @@ import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common';
import expect from '@kbn/expect';
import type { ApiExplainLogRateSpikes } from '@kbn/aiops-plugin/common/api';
import type { AiopsApiLogRateAnalysis } from '@kbn/aiops-plugin/common/api';
import type { FtrProviderContext } from '../../ftr_provider_context';
@ -20,7 +20,7 @@ export default ({ getService }: FtrProviderContext) => {
const config = getService('config');
const kibanaServerUrl = formatUrl(config.get('servers.kibana'));
const requestBody: ApiExplainLogRateSpikes['body'] = {
const requestBody: AiopsApiLogRateAnalysis['body'] = {
baselineMax: 1561719083292,
baselineMin: 1560954147006,
deviationMax: 1562254538692,
@ -32,10 +32,10 @@ export default ({ getService }: FtrProviderContext) => {
timeFieldName: 'order_date',
};
describe('POST /internal/aiops/explain_log_rate_spikes', () => {
describe('POST /internal/aiops/log_rate_analysis', () => {
it('should return permission denied without streaming', async () => {
await supertest
.post(`/internal/aiops/explain_log_rate_spikes`)
.post(`/internal/aiops/log_rate_analysis`)
.set('kbn-xsrf', 'kibana')
.set(ELASTIC_HTTP_VERSION_HEADER, '1')
.send(requestBody)
@ -43,7 +43,7 @@ export default ({ getService }: FtrProviderContext) => {
});
it('should return permission denied with streaming', async () => {
const response = await fetch(`${kibanaServerUrl}/internal/aiops/explain_log_rate_spikes`, {
const response = await fetch(`${kibanaServerUrl}/internal/aiops/log_rate_analysis`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',

View file

@ -8,7 +8,7 @@
import type { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService, loadTestFile }: FtrProviderContext) {
// aiops / Explain Log Rate Spikes lives in the ML UI so we need some related services.
// AIOps / Log Rate Analysis lives in the ML UI so we need some related services.
const ml = getService('ml');
describe('aiops', function () {
@ -29,7 +29,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) {
await ml.testResources.resetKibanaTimeZone();
});
loadTestFile(require.resolve('./explain_log_rate_spikes'));
loadTestFile(require.resolve('./log_rate_analysis'));
loadTestFile(require.resolve('./change_point_detection'));
loadTestFile(require.resolve('./log_pattern_analysis'));
loadTestFile(require.resolve('./log_pattern_analysis_in_discover'));

View file

@ -11,51 +11,47 @@ import expect from '@kbn/expect';
import type { FtrProviderContext } from '../../ftr_provider_context';
import { isTestDataExpectedWithSampleProbability, type TestData } from './types';
import { explainLogRateSpikesTestData } from './test_data';
import { logRateAnalysisTestData } from './test_data';
export default function ({ getPageObjects, getService }: FtrProviderContext) {
const PageObjects = getPageObjects(['common', 'console', 'header', 'home', 'security']);
const elasticChart = getService('elasticChart');
const aiops = getService('aiops');
// aiops / Explain Log Rate Spikes lives in the ML UI so we need some related services.
// AIOps / Log Rate Analysis lives in the ML UI so we need some related services.
const ml = getService('ml');
function runTests(testData: TestData) {
it(`${testData.suiteTitle} loads the source data in explain log rate spikes`, async () => {
it(`${testData.suiteTitle} loads the source data in log rate analysis`, async () => {
await elasticChart.setNewChartUiDebugFlag(true);
await ml.testExecution.logTestStep(
`${testData.suiteTitle} loads the saved search selection page`
);
await aiops.explainLogRateSpikesPage.navigateToIndexPatternSelection();
await aiops.logRateAnalysisPage.navigateToIndexPatternSelection();
await ml.testExecution.logTestStep(
`${testData.suiteTitle} loads the explain log rate spikes page`
);
await ml.jobSourceSelection.selectSourceForExplainLogRateSpikes(
testData.sourceIndexOrSavedSearch
);
await ml.testExecution.logTestStep(`${testData.suiteTitle} loads the log rate analysis page`);
await ml.jobSourceSelection.selectSourceForLogRateAnalysis(testData.sourceIndexOrSavedSearch);
});
it(`${testData.suiteTitle} displays index details`, async () => {
await ml.testExecution.logTestStep(`${testData.suiteTitle} displays the time range step`);
await aiops.explainLogRateSpikesPage.assertTimeRangeSelectorSectionExists();
await aiops.logRateAnalysisPage.assertTimeRangeSelectorSectionExists();
await ml.testExecution.logTestStep(`${testData.suiteTitle} loads data for full time range`);
if (testData.query) {
await aiops.explainLogRateSpikesPage.setQueryInput(testData.query);
await aiops.logRateAnalysisPage.setQueryInput(testData.query);
}
await aiops.explainLogRateSpikesPage.clickUseFullDataButton(
await aiops.logRateAnalysisPage.clickUseFullDataButton(
testData.expected.totalDocCountFormatted
);
if (isTestDataExpectedWithSampleProbability(testData.expected)) {
await aiops.explainLogRateSpikesPage.assertSamplingProbability(
await aiops.logRateAnalysisPage.assertSamplingProbability(
testData.expected.sampleProbabilityFormatted
);
} else {
await aiops.explainLogRateSpikesPage.assertSamplingProbabilityMissing();
await aiops.logRateAnalysisPage.assertSamplingProbabilityMissing();
}
await PageObjects.header.waitUntilLoadingHasFinished();
@ -63,46 +59,47 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
await ml.testExecution.logTestStep(
`${testData.suiteTitle} displays elements in the doc count panel correctly`
);
await aiops.explainLogRateSpikesPage.assertTotalDocCountHeaderExists();
await aiops.explainLogRateSpikesPage.assertTotalDocCountChartExists();
await aiops.logRateAnalysisPage.assertTotalDocCountHeaderExists();
await aiops.logRateAnalysisPage.assertTotalDocCountChartExists();
await ml.testExecution.logTestStep(
`${testData.suiteTitle} displays elements in the page correctly`
);
await aiops.explainLogRateSpikesPage.assertSearchPanelExists();
await aiops.logRateAnalysisPage.assertSearchPanelExists();
await ml.testExecution.logTestStep('displays empty prompt');
await aiops.explainLogRateSpikesPage.assertNoWindowParametersEmptyPromptExists();
await aiops.logRateAnalysisPage.assertNoWindowParametersEmptyPromptExists();
await ml.testExecution.logTestStep('clicks the document count chart to start analysis');
await aiops.explainLogRateSpikesPage.clickDocumentCountChart(testData.chartClickCoordinates);
await aiops.explainLogRateSpikesPage.assertAnalysisSectionExists();
await aiops.logRateAnalysisPage.clickDocumentCountChart(testData.chartClickCoordinates);
await aiops.logRateAnalysisPage.assertAnalysisSectionExists();
if (testData.brushDeviationTargetTimestamp) {
await ml.testExecution.logTestStep('displays the no results found prompt');
await aiops.explainLogRateSpikesPage.assertNoResultsFoundEmptyPromptExists();
await aiops.logRateAnalysisPage.assertNoResultsFoundEmptyPromptExists();
await ml.testExecution.logTestStep('adjusts the brushes to get analysis results');
await aiops.explainLogRateSpikesPage.assertRerunAnalysisButtonExists(false);
await aiops.logRateAnalysisPage.assertRerunAnalysisButtonExists(false);
// Get the current width of the deviation brush for later comparison.
const brushSelectionWidthBefore =
await aiops.explainLogRateSpikesPage.getBrushSelectionWidth('aiopsBrushDeviation');
const brushSelectionWidthBefore = await aiops.logRateAnalysisPage.getBrushSelectionWidth(
'aiopsBrushDeviation'
);
// Get the px values for the timestamp we want to move the brush to.
const { targetPx, intervalPx } = await aiops.explainLogRateSpikesPage.getPxForTimestamp(
const { targetPx, intervalPx } = await aiops.logRateAnalysisPage.getPxForTimestamp(
testData.brushDeviationTargetTimestamp
);
// Adjust the right brush handle
await aiops.explainLogRateSpikesPage.adjustBrushHandler(
await aiops.logRateAnalysisPage.adjustBrushHandler(
'aiopsBrushDeviation',
'handle--e',
targetPx + intervalPx * testData.brushIntervalFactor
);
// Adjust the left brush handle
await aiops.explainLogRateSpikesPage.adjustBrushHandler(
await aiops.logRateAnalysisPage.adjustBrushHandler(
'aiopsBrushDeviation',
'handle--w',
targetPx - intervalPx * (testData.brushIntervalFactor - 1)
@ -110,20 +107,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
if (testData.brushBaselineTargetTimestamp) {
// Get the px values for the timestamp we want to move the brush to.
const { targetPx: targetBaselinePx } =
await aiops.explainLogRateSpikesPage.getPxForTimestamp(
testData.brushBaselineTargetTimestamp
);
const { targetPx: targetBaselinePx } = await aiops.logRateAnalysisPage.getPxForTimestamp(
testData.brushBaselineTargetTimestamp
);
// Adjust the right brush handle
await aiops.explainLogRateSpikesPage.adjustBrushHandler(
await aiops.logRateAnalysisPage.adjustBrushHandler(
'aiopsBrushBaseline',
'handle--e',
targetBaselinePx + intervalPx * testData.brushIntervalFactor
);
// Adjust the left brush handle
await aiops.explainLogRateSpikesPage.adjustBrushHandler(
await aiops.logRateAnalysisPage.adjustBrushHandler(
'aiopsBrushBaseline',
'handle--w',
targetBaselinePx - intervalPx * (testData.brushIntervalFactor - 1)
@ -131,8 +127,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
}
// Get the new brush selection width for later comparison.
const brushSelectionWidthAfter =
await aiops.explainLogRateSpikesPage.getBrushSelectionWidth('aiopsBrushDeviation');
const brushSelectionWidthAfter = await aiops.logRateAnalysisPage.getBrushSelectionWidth(
'aiopsBrushDeviation'
);
// Assert the adjusted brush: The selection width should have changed and
// we test if the selection is smaller than two bucket intervals.
@ -143,65 +140,65 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
intervalPx * 2 * testData.brushIntervalFactor
);
await aiops.explainLogRateSpikesPage.assertRerunAnalysisButtonExists(true);
await aiops.logRateAnalysisPage.assertRerunAnalysisButtonExists(true);
await ml.testExecution.logTestStep('rerun the analysis with adjusted settings');
await aiops.explainLogRateSpikesPage.clickRerunAnalysisButton(true);
await aiops.logRateAnalysisPage.clickRerunAnalysisButton(true);
}
await aiops.explainLogRateSpikesPage.assertAnalysisComplete();
await aiops.logRateAnalysisPage.assertAnalysisComplete();
// The group switch should be disabled by default
await aiops.explainLogRateSpikesPage.assertSpikeAnalysisGroupSwitchExists(false);
await aiops.logRateAnalysisPage.assertLogRateAnalysisResultsGroupSwitchExists(false);
if (!isTestDataExpectedWithSampleProbability(testData.expected)) {
// Enabled grouping
await aiops.explainLogRateSpikesPage.clickSpikeAnalysisGroupSwitchOn();
await aiops.logRateAnalysisPage.clickLogRateAnalysisResultsGroupSwitchOn();
await aiops.explainLogRateSpikesAnalysisGroupsTable.assertSpikeAnalysisTableExists();
await aiops.logRateAnalysisResultsGroupsTable.assertLogRateAnalysisResultsTableExists();
const analysisGroupsTable =
await aiops.explainLogRateSpikesAnalysisGroupsTable.parseAnalysisTable();
await aiops.logRateAnalysisResultsGroupsTable.parseAnalysisTable();
expect(orderBy(analysisGroupsTable, 'group')).to.be.eql(
orderBy(testData.expected.analysisGroupsTable, 'group')
);
await ml.testExecution.logTestStep('expand table row');
await aiops.explainLogRateSpikesAnalysisGroupsTable.assertExpandRowButtonExists();
await aiops.explainLogRateSpikesAnalysisGroupsTable.expandRow();
await aiops.logRateAnalysisResultsGroupsTable.assertExpandRowButtonExists();
await aiops.logRateAnalysisResultsGroupsTable.expandRow();
if (!isTestDataExpectedWithSampleProbability(testData.expected)) {
const analysisTable = await aiops.explainLogRateSpikesAnalysisTable.parseAnalysisTable();
const analysisTable = await aiops.logRateAnalysisResultsTable.parseAnalysisTable();
expect(orderBy(analysisTable, ['fieldName', 'fieldValue'])).to.be.eql(
orderBy(testData.expected.analysisTable, ['fieldName', 'fieldValue'])
);
}
await ml.testExecution.logTestStep('open the field filter');
await aiops.explainLogRateSpikesPage.assertFieldFilterPopoverButtonExists(false);
await aiops.explainLogRateSpikesPage.clickFieldFilterPopoverButton(true);
await aiops.explainLogRateSpikesPage.assertFieldSelectorFieldNameList(
await aiops.logRateAnalysisPage.assertFieldFilterPopoverButtonExists(false);
await aiops.logRateAnalysisPage.clickFieldFilterPopoverButton(true);
await aiops.logRateAnalysisPage.assertFieldSelectorFieldNameList(
testData.expected.fieldSelectorPopover
);
await ml.testExecution.logTestStep('filter fields');
await aiops.explainLogRateSpikesPage.setFieldSelectorSearch(testData.fieldSelectorSearch);
await aiops.explainLogRateSpikesPage.assertFieldSelectorFieldNameList([
await aiops.logRateAnalysisPage.setFieldSelectorSearch(testData.fieldSelectorSearch);
await aiops.logRateAnalysisPage.assertFieldSelectorFieldNameList([
testData.fieldSelectorSearch,
]);
await aiops.explainLogRateSpikesPage.clickFieldSelectorDisableAllSelectedButton();
await aiops.explainLogRateSpikesPage.assertFieldFilterApplyButtonExists(
await aiops.logRateAnalysisPage.clickFieldSelectorDisableAllSelectedButton();
await aiops.logRateAnalysisPage.assertFieldFilterApplyButtonExists(
!testData.fieldSelectorApplyAvailable
);
if (testData.fieldSelectorApplyAvailable) {
await ml.testExecution.logTestStep('regroup results');
await aiops.explainLogRateSpikesPage.clickFieldFilterApplyButton();
await aiops.logRateAnalysisPage.clickFieldFilterApplyButton();
if (!isTestDataExpectedWithSampleProbability(testData.expected)) {
const filteredAnalysisGroupsTable =
await aiops.explainLogRateSpikesAnalysisGroupsTable.parseAnalysisTable();
await aiops.logRateAnalysisResultsGroupsTable.parseAnalysisTable();
expect(orderBy(filteredAnalysisGroupsTable, 'group')).to.be.eql(
orderBy(testData.expected.filteredAnalysisGroupsTable, 'group')
);
@ -210,12 +207,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
if (testData.action !== undefined) {
await ml.testExecution.logTestStep('check all table row actions are present');
await aiops.explainLogRateSpikesAnalysisGroupsTable.assertRowActions(
await aiops.logRateAnalysisResultsGroupsTable.assertRowActions(
testData.action.tableRowId
);
await ml.testExecution.logTestStep('click log pattern analysis action');
await aiops.explainLogRateSpikesAnalysisGroupsTable.clickRowAction(
await aiops.logRateAnalysisResultsGroupsTable.clickRowAction(
testData.action.tableRowId,
testData.action.type
);
@ -231,11 +228,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
});
}
describe('explain log rate spikes', async function () {
for (const testData of explainLogRateSpikesTestData) {
describe('log rate analysis', async function () {
for (const testData of logRateAnalysisTestData) {
describe(`with '${testData.sourceIndexOrSavedSearch}'`, function () {
before(async () => {
await aiops.explainLogRateSpikesDataGenerator.generateData(testData.dataGenerator);
await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator);
await ml.testResources.createIndexPatternIfNeeded(
testData.sourceIndexOrSavedSearch,
@ -265,10 +262,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
if (testData.dataGenerator !== 'kibana_sample_data_logs') {
await ml.testResources.deleteIndexPatternByTitle(testData.sourceIndexOrSavedSearch);
}
await aiops.explainLogRateSpikesDataGenerator.removeGeneratedData(testData.dataGenerator);
await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator);
});
it(`${testData.suiteTitle} loads the explain log rate spikes page`, async () => {
it(`${testData.suiteTitle} loads the log rate analysis page`, async () => {
// Start navigation from the base of the ML app.
await ml.navigation.navigateToMl();
await elasticChart.setNewChartUiDebugFlag(true);

View file

@ -226,7 +226,7 @@ export const artificialLogDataViewTestData: TestData = {
},
};
export const explainLogRateSpikesTestData: TestData[] = [
export const logRateAnalysisTestData: TestData[] = [
kibanaLogsDataViewTestData,
farequoteDataViewTestData,
farequoteDataViewTestDataWithQuery,

View file

@ -7,20 +7,19 @@
import type { FtrProviderContext } from '../../ftr_provider_context';
import { ExplainLogRateSpikesPageProvider } from './explain_log_rate_spikes_page';
import { ExplainLogRateSpikesAnalysisTableProvider } from './explain_log_rate_spikes_analysis_table';
import { ExplainLogRateSpikesAnalysisGroupsTableProvider } from './explain_log_rate_spikes_analysis_groups_table';
import { ExplainLogRateSpikesDataGeneratorProvider } from './explain_log_rate_spikes_data_generator';
import { LogRateAnalysisPageProvider } from './log_rate_analysis_page';
import { LogRateAnalysisResultsTableProvider } from './log_rate_analysis_results_table';
import { LogRateAnalysisResultsGroupsTableProvider } from './log_rate_analysis_results_groups_table';
import { LogRateAnalysisDataGeneratorProvider } from './log_rate_analysis_data_generator';
import { LogPatternAnalysisPageProvider } from './log_pattern_analysis_page';
import { ChangePointDetectionPageProvider } from './change_point_detection_page';
import { MlTableServiceProvider } from '../ml/common_table_service';
export function AiopsProvider(context: FtrProviderContext) {
const explainLogRateSpikesPage = ExplainLogRateSpikesPageProvider(context);
const explainLogRateSpikesAnalysisTable = ExplainLogRateSpikesAnalysisTableProvider(context);
const explainLogRateSpikesAnalysisGroupsTable =
ExplainLogRateSpikesAnalysisGroupsTableProvider(context);
const explainLogRateSpikesDataGenerator = ExplainLogRateSpikesDataGeneratorProvider(context);
const logRateAnalysisPage = LogRateAnalysisPageProvider(context);
const logRateAnalysisResultsTable = LogRateAnalysisResultsTableProvider(context);
const logRateAnalysisResultsGroupsTable = LogRateAnalysisResultsGroupsTableProvider(context);
const logRateAnalysisDataGenerator = LogRateAnalysisDataGeneratorProvider(context);
const logPatternAnalysisPage = LogPatternAnalysisPageProvider(context);
const tableService = MlTableServiceProvider(context);
@ -29,10 +28,10 @@ export function AiopsProvider(context: FtrProviderContext) {
return {
changePointDetectionPage,
explainLogRateSpikesPage,
explainLogRateSpikesAnalysisTable,
explainLogRateSpikesAnalysisGroupsTable,
explainLogRateSpikesDataGenerator,
logRateAnalysisPage,
logRateAnalysisResultsTable,
logRateAnalysisResultsGroupsTable,
logRateAnalysisDataGenerator,
logPatternAnalysisPage,
};
}

View file

@ -114,7 +114,7 @@ function getArtificialLogsWithSpike(index: string) {
return bulkBody;
}
export function ExplainLogRateSpikesDataGeneratorProvider({ getService }: FtrProviderContext) {
export function LogRateAnalysisDataGeneratorProvider({ getService }: FtrProviderContext) {
const es = getService('es');
const esArchiver = getService('esArchiver');
const log = getService('log');

View file

@ -9,10 +9,7 @@ import expect from '@kbn/expect';
import type { FtrProviderContext } from '../../ftr_provider_context';
export function ExplainLogRateSpikesPageProvider({
getService,
getPageObject,
}: FtrProviderContext) {
export function LogRateAnalysisPageProvider({ getService, getPageObject }: FtrProviderContext) {
const browser = getService('browser');
const elasticChart = getService('elasticChart');
const ml = getService('ml');
@ -138,23 +135,23 @@ export function ExplainLogRateSpikesPageProvider({
async assertAnalysisSectionExists() {
await retry.tryForTime(5000, async () => {
await testSubjects.existOrFail(`aiopsExplainLogRateSpikesAnalysis`);
await testSubjects.existOrFail(`aiopsLogRateAnalysisResults`);
});
},
async assertSpikeAnalysisGroupSwitchExists(checked: boolean) {
async assertLogRateAnalysisResultsGroupSwitchExists(checked: boolean) {
await retry.tryForTime(5000, async () => {
await testSubjects.existOrFail(
`aiopsExplainLogRateSpikesGroupSwitch${checked ? ' checked' : ''}`
`aiopsLogRateAnalysisGroupSwitch${checked ? ' checked' : ''}`
);
});
},
async clickSpikeAnalysisGroupSwitchOn() {
await testSubjects.clickWhenNotDisabledWithoutRetry('aiopsExplainLogRateSpikesGroupSwitchOn');
async clickLogRateAnalysisResultsGroupSwitchOn() {
await testSubjects.clickWhenNotDisabledWithoutRetry('aiopsLogRateAnalysisGroupSwitchOn');
await retry.tryForTime(30 * 1000, async () => {
await testSubjects.existOrFail('aiopsExplainLogRateSpikesGroupSwitch checked');
await testSubjects.existOrFail('aiopsLogRateAnalysisGroupSwitch checked');
});
},
@ -251,7 +248,7 @@ export function ExplainLogRateSpikesPageProvider({
},
async navigateToIndexPatternSelection() {
await testSubjects.click('mlMainTab explainLogRateSpikes');
await testSubjects.click('mlMainTab logRateAnalysis');
await testSubjects.existOrFail('mlPageSourceSelection');
},

View file

@ -9,34 +9,32 @@ import expect from '@kbn/expect';
import { FtrProviderContext } from '../../ftr_provider_context';
export function ExplainLogRateSpikesAnalysisGroupsTableProvider({
getService,
}: FtrProviderContext) {
export function LogRateAnalysisResultsGroupsTableProvider({ getService }: FtrProviderContext) {
const find = getService('find');
const testSubjects = getService('testSubjects');
const retry = getService('retry');
const browser = getService('browser');
return new (class AnalysisTable {
public async assertSpikeAnalysisTableExists() {
await testSubjects.existOrFail(`aiopsSpikeAnalysisGroupsTable`);
public async assertLogRateAnalysisResultsTableExists() {
await testSubjects.existOrFail(`aiopsLogRateAnalysisResultsGroupsTable`);
}
public async assertExpandRowButtonExists() {
await testSubjects.existOrFail('aiopsSpikeAnalysisGroupsTableRowExpansionButton');
await testSubjects.existOrFail('aiopsLogRateAnalysisResultsGroupsTableRowExpansionButton');
}
public async expandRow() {
await testSubjects.click('aiopsSpikeAnalysisGroupsTableRowExpansionButton');
await testSubjects.existOrFail('aiopsSpikeAnalysisTable');
await testSubjects.click('aiopsLogRateAnalysisResultsGroupsTableRowExpansionButton');
await testSubjects.existOrFail('aiopsLogRateAnalysisResultsTable');
}
public async parseAnalysisTable() {
const table = await testSubjects.find('~aiopsSpikeAnalysisGroupsTable');
const table = await testSubjects.find('~aiopsLogRateAnalysisResultsGroupsTable');
const $ = await table.parseDomContent();
const rows = [];
for (const tr of $.findTestSubjects('~aiopsSpikeAnalysisGroupsTableRow').toArray()) {
for (const tr of $.findTestSubjects('~aiopsLogRateAnalysisResultsGroupsTableRow').toArray()) {
const $tr = $(tr);
const rowObject: {
@ -44,12 +42,12 @@ export function ExplainLogRateSpikesAnalysisGroupsTableProvider({
docCount: string;
} = {
group: $tr
.findTestSubject('aiopsSpikeAnalysisGroupsTableColumnGroup')
.findTestSubject('aiopsLogRateAnalysisResultsGroupsTableColumnGroup')
.find('.euiTableCellContent')
.text()
.trim(),
docCount: $tr
.findTestSubject('aiopsSpikeAnalysisGroupsTableColumnDocCount')
.findTestSubject('aiopsLogRateAnalysisResultsGroupsTableColumnDocCount')
.find('.euiTableCellContent')
.text()
.trim(),
@ -62,7 +60,7 @@ export function ExplainLogRateSpikesAnalysisGroupsTableProvider({
}
public rowSelector(rowId: string, subSelector?: string) {
const row = `~aiopsSpikeAnalysisGroupsTable > ~row-${rowId}`;
const row = `~aiopsLogRateAnalysisResultsGroupsTable > ~row-${rowId}`;
return !subSelector ? row : `${row} > ${subSelector}`;
}

Some files were not shown because too many files have changed in this diff Show more