[Synthetics] Added alerts page (#190751)

## Summary

Synthetics - add alerts page , it shows related alerts for selected
monitor and location !!

<img width="1717" alt="image"
src="https://github.com/user-attachments/assets/590d2110-ad75-4c95-b413-496eff3a2544">

---------

Co-authored-by: shahzad31 <shahzad31comp@gmail.com>
This commit is contained in:
Dominique Clarke 2024-08-20 07:35:02 -04:00 committed by GitHub
parent 9ff78cf08b
commit 398daa1231
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 221 additions and 42 deletions

View file

@ -12,6 +12,7 @@ export const MONITOR_NOT_FOUND_ROUTE = '/monitor-not-found/:monitorId';
export const MONITOR_HISTORY_ROUTE = '/monitor/:monitorId/history';
export const MONITOR_ERRORS_ROUTE = '/monitor/:monitorId/errors';
export const MONITOR_ALERTS_ROUTE = '/monitor/:monitorId/alerts';
export const MONITOR_ADD_ROUTE = '/add-monitor';

View file

@ -119,21 +119,16 @@ journey('AlertingDefaults', async ({ page, params }) => {
await page.click('.euiForm');
await page.click('text=To: Email is required for selected email connector');
});
step(
'Click .euiComboBox.euiComboBox--fullWidth.euiComboBox-isInvalid .euiFormControlLayout .euiFormControlLayout__childrenWrapper .euiComboBox__inputWrap',
async () => {
await page.click(
'.euiComboBox.euiComboBox--fullWidth.euiComboBox-isInvalid .euiFormControlLayout .euiFormControlLayout__childrenWrapper .euiComboBox__inputWrap'
);
await page.fill(
'text=To BccCombo box. Selected. Combo box input. Type some text or, to display a list >> input[role="combobox"]',
'test@gmail.com'
);
await page.isDisabled('button:has-text("Apply changes")');
await page.click('[aria-label="Account menu"]');
await page.click('text=Log out');
}
);
step('Fill email fields', async () => {
await page
.getByTestId('toEmailAddressInput')
.getByTestId('comboBoxSearchInput')
.fill('test@gmail.com');
await page.isDisabled('button:has-text("Apply changes")');
await page.click('[aria-label="Account menu"]');
await page.click('text=Log out');
});
step('Login to kibana with readonly', async () => {
await syntheticsApp.loginToKibana('viewer', 'changeme');

View file

@ -63,6 +63,9 @@ export const SyntheticsDatePicker = ({ fullWidth }: { fullWidth?: boolean }) =>
refreshApp();
}}
onRefresh={refreshApp}
updateButtonProps={{
fill: false,
}}
/>
);
};

View file

@ -0,0 +1,63 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common';
import { AlertConsumers } from '@kbn/rule-registry-plugin/common/technical_rule_data_field_names';
import { useFetcher } from '@kbn/observability-shared-plugin/public';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import { useParams } from 'react-router-dom';
import type { ESSearchResponse } from '@kbn/es-types';
import { useSelectedLocation } from './use_selected_location';
import { ClientPluginsStart } from '../../../../../plugin';
export function useFetchActiveAlerts() {
const { http } = useKibana<ClientPluginsStart>().services;
const { monitorId: configId } = useParams<{ monitorId: string }>();
const selectedLocation = useSelectedLocation();
const { loading, data } = useFetcher(async () => {
return await http.post<ESSearchResponse>(`${BASE_RAC_ALERTS_API_PATH}/find`, {
body: JSON.stringify({
feature_ids: [AlertConsumers.UPTIME],
size: 0,
track_total_hits: true,
query: {
bool: {
filter: [
{
range: {
'@timestamp': {
gte: 'now-24h/h',
},
},
},
{
term: {
configId,
},
},
{
term: {
'location.id': selectedLocation?.id,
},
},
],
},
},
}),
});
}, [configId, http, selectedLocation?.id]);
return {
loading,
data,
numberOfAlerts: data?.hits?.total.value ?? 0,
};
}

View file

@ -0,0 +1,15 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React from 'react';
import { EuiBadge } from '@elastic/eui';
import { useFetchActiveAlerts } from '../hooks/use_fetch_active_alerts';
export const MonitorAlertsIcon = () => {
const { numberOfAlerts } = useFetchActiveAlerts();
return numberOfAlerts > 0 ? <EuiBadge color="danger">{numberOfAlerts}</EuiBadge> : null;
};

View file

@ -0,0 +1,65 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiLoadingSpinner } from '@elastic/eui';
import React from 'react';
import { AlertConsumers } from '@kbn/rule-data-utils';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import { useParams } from 'react-router-dom';
import { useRefreshedRangeFromUrl } from '../../../hooks';
import { SyntheticsDatePicker } from '../../common/date_picker/synthetics_date_picker';
import { useSelectedLocation } from '../hooks/use_selected_location';
import { ClientPluginsStart } from '../../../../../plugin';
export const MONITOR_ALERTS_TABLE_ID = 'xpack.observability.slo.sloDetails.alertTable';
export function MonitorDetailsAlerts() {
const {
triggersActionsUi: { alertsTableConfigurationRegistry, getAlertsStateTable: AlertsStateTable },
observability: { observabilityRuleTypeRegistry },
} = useKibana<ClientPluginsStart>().services;
const { monitorId: configId } = useParams<{ monitorId: string }>();
const selectedLocation = useSelectedLocation();
const { from, to } = useRefreshedRangeFromUrl();
if (!selectedLocation) {
return <EuiLoadingSpinner size="xl" />;
}
return (
<>
<EuiSpacer size="m" />
<EuiFlexGroup direction="column" gutterSize="xl">
<EuiFlexItem>
<SyntheticsDatePicker fullWidth={true} />
</EuiFlexItem>
<EuiFlexItem>
<AlertsStateTable
alertsTableConfigurationRegistry={alertsTableConfigurationRegistry}
configurationId={AlertConsumers.OBSERVABILITY}
id={MONITOR_ALERTS_TABLE_ID}
data-test-subj="monitorAlertsTable"
featureIds={[AlertConsumers.UPTIME]}
query={{
bool: {
filter: [
{ term: { configId } },
{ term: { 'location.id': selectedLocation?.id } },
{ range: { '@timestamp': { gte: from, lte: to } } },
],
},
}}
showAlertStatusWithFlapping
initialPageSize={100}
cellContext={{ observabilityRuleTypeRegistry }}
/>
</EuiFlexItem>
</EuiFlexGroup>
</>
);
}

View file

@ -9,7 +9,11 @@ import React, { useCallback } from 'react';
import { useParams, useRouteMatch } from 'react-router-dom';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import { useGetUrlParams } from '../../hooks';
import { MONITOR_ERRORS_ROUTE, MONITOR_HISTORY_ROUTE } from '../../../../../common/constants';
import {
MONITOR_ALERTS_ROUTE,
MONITOR_ERRORS_ROUTE,
MONITOR_HISTORY_ROUTE,
} from '../../../../../common/constants';
import { ClientPluginsStart } from '../../../../plugin';
import { PLUGIN } from '../../../../../common/constants/plugin';
import { useSelectedLocation } from './hooks/use_selected_location';
@ -28,6 +32,7 @@ export const MonitorDetailsLocation = ({ isDisabled }: { isDisabled?: boolean })
const isErrorsTab = useRouteMatch(MONITOR_ERRORS_ROUTE);
const isHistoryTab = useRouteMatch(MONITOR_HISTORY_ROUTE);
const isAlertsTab = useRouteMatch(MONITOR_ALERTS_ROUTE);
const params = `&dateRangeStart=${dateRangeStart}&dateRangeEnd=${dateRangeEnd}`;
@ -39,7 +44,11 @@ export const MonitorDetailsLocation = ({ isDisabled }: { isDisabled?: boolean })
selectedLocation={selectedLocation}
onChange={useCallback(
(id, label) => {
if (isErrorsTab) {
if (isAlertsTab) {
services.application.navigateToApp(PLUGIN.SYNTHETICS_PLUGIN_ID, {
path: `/monitor/${monitorId}/alerts?locationId=${id}${params}`,
});
} else if (isErrorsTab) {
services.application.navigateToApp(PLUGIN.SYNTHETICS_PLUGIN_ID, {
path: `/monitor/${monitorId}/errors?locationId=${id}${params}`,
});
@ -53,7 +62,7 @@ export const MonitorDetailsLocation = ({ isDisabled }: { isDisabled?: boolean })
});
}
},
[isErrorsTab, isHistoryTab, monitorId, params, services.application]
[isAlertsTab, isErrorsTab, isHistoryTab, monitorId, params, services.application]
)}
/>
);

View file

@ -10,6 +10,8 @@ import React from 'react';
import { useHistory, useRouteMatch } from 'react-router-dom';
import { EuiIcon, EuiPageHeaderProps } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import { MonitorDetailsAlerts } from './monitor_alerts/monitor_detail_alerts';
import { MonitorAlertsIcon } from './monitor_alerts/alerts_icon';
import { RefreshButton } from '../common/components/refresh_button';
import { MonitorNotFoundPage } from './monitor_not_found_page';
import { MonitorDetailsPageTitle } from './monitor_details_page_title';
@ -23,6 +25,7 @@ import { MonitorHistory } from './monitor_history/monitor_history';
import { MonitorSummary } from './monitor_summary/monitor_summary';
import { EditMonitorLink } from './monitor_summary/edit_monitor_link';
import {
MONITOR_ALERTS_ROUTE,
MONITOR_ERRORS_ROUTE,
MONITOR_HISTORY_ROUTE,
MONITOR_NOT_FOUND_ROUTE,
@ -67,6 +70,16 @@ export const getMonitorDetailsRoute = (
dataTestSubj: 'syntheticsMonitorHistoryPage',
pageHeader: getMonitorSummaryHeader(history, syntheticsPath, 'errors'),
},
{
title: i18n.translate('xpack.synthetics.monitorErrors.title', {
defaultMessage: 'Synthetics Monitor Alerts | {baseTitle}',
values: { baseTitle },
}),
path: MONITOR_ALERTS_ROUTE,
component: MonitorDetailsAlerts,
dataTestSubj: 'syntheticsMonitorAlertsPage',
pageHeader: getMonitorSummaryHeader(history, syntheticsPath, 'alerts'),
},
{
title: i18n.translate('xpack.synthetics.monitorNotFound.title', {
defaultMessage: 'Synthetics Monitor Not Found | {baseTitle}',
@ -100,7 +113,7 @@ const getMonitorsBreadcrumb = (syntheticsPath: string) => ({
const getMonitorSummaryHeader = (
history: ReturnType<typeof useHistory>,
syntheticsPath: string,
selectedTab: 'overview' | 'history' | 'errors'
selectedTab: 'overview' | 'history' | 'errors' | 'alerts'
): EuiPageHeaderProps => {
// Not a component, but it doesn't matter. Hooks are just functions
const match = useRouteMatch<{ monitorId: string }>(MONITOR_ROUTE); // eslint-disable-line react-hooks/rules-of-hooks
@ -112,17 +125,23 @@ const getMonitorSummaryHeader = (
const search = history.location.search;
const monitorId = match.params.monitorId;
const rightSideItems = [
<RefreshButton />,
<EditMonitorLink />,
<RunTestManually />,
<MonitorDetailsLastRun />,
<MonitorDetailsStatus />,
<MonitorDetailsLocation />,
];
if (selectedTab === 'alerts' || selectedTab === 'history' || selectedTab === 'errors') {
// remove first item refresh button
rightSideItems.shift();
}
return {
pageTitle: <MonitorDetailsPageTitle />,
breadcrumbs: [getMonitorsBreadcrumb(syntheticsPath)],
rightSideItems: [
<RefreshButton />,
<EditMonitorLink />,
<RunTestManually />,
<MonitorDetailsLastRun />,
<MonitorDetailsStatus />,
<MonitorDetailsLocation />,
],
rightSideItems,
tabs: [
{
label: i18n.translate('xpack.synthetics.monitorOverviewTab.title', {
@ -149,6 +168,15 @@ const getMonitorSummaryHeader = (
href: `${syntheticsPath}${MONITOR_ERRORS_ROUTE.replace(':monitorId', monitorId)}${search}`,
'data-test-subj': 'syntheticsMonitorErrorsTab',
},
{
label: i18n.translate('xpack.synthetics.monitorAlertsTab.title', {
defaultMessage: 'Alerts',
}),
prepend: <MonitorAlertsIcon />,
isSelected: selectedTab === 'alerts',
href: `${syntheticsPath}${MONITOR_ALERTS_ROUTE.replace(':monitorId', monitorId)}${search}`,
'data-test-subj': 'syntheticsMonitorAlertsTab',
},
],
};
};

View file

@ -11131,8 +11131,8 @@
"xpack.apm.serviceIcons.service": "Service",
"xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "Architecture",
"xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} other {Zones de disponibilité}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclencheur} one {Type de déclencheur} other {Types de déclencheurs}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0{Type de machine} one {Type de machine} other {Types de machines}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "ID de projet",
"xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "Fournisseur cloud",
@ -27088,8 +27088,8 @@
"xpack.maps.source.esSearch.descendingLabel": "décroissant",
"xpack.maps.source.esSearch.extentFilterLabel": "Filtre dynamique pour les données de la zone de carte visible",
"xpack.maps.source.esSearch.fieldNotFoundMsg": "Impossible de trouver \"{fieldName}\" dans le modèle d'indexation \"{indexPatternName}\".",
"xpack.maps.source.esSearch.geoFieldLabel": "Champ géospatial",
"xpack.maps.source.esSearch.geofieldLabel": "Champ géospatial",
"xpack.maps.source.esSearch.geoFieldLabel": "Champ géospatial",
"xpack.maps.source.esSearch.geoFieldTypeLabel": "Type de champ géospatial",
"xpack.maps.source.esSearch.indexOverOneLengthEditError": "Votre vue de données pointe vers plusieurs index. Un seul index est autorisé par vue de données.",
"xpack.maps.source.esSearch.indexZeroLengthEditError": "Votre vue de données ne pointe vers aucun index.",
@ -36554,8 +36554,8 @@
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "Kibana ne permet qu'un maximum de {maxNumber} {maxNumber, plural, =1 {alerte} other {alertes}} par exécution de règle.",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "Nom obligatoire.",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "Ajouter un guide d'investigation sur les règles...",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "Fournissez des instructions sur les conditions préalables à la règle, telles que les intégrations requises, les étapes de configuration et tout ce qui est nécessaire au bon fonctionnement de la règle.",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "Ajouter le guide de configuration de règle...",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "Fournissez des instructions sur les conditions préalables à la règle, telles que les intégrations requises, les étapes de configuration et tout ce qui est nécessaire au bon fonctionnement de la règle.",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "Guide de configuration",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "Une balise ne doit pas être vide",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "Le remplacement du préfixe d'indicateur ne peut pas être vide.",
@ -42193,8 +42193,8 @@
"xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "Sélectionner un SLO",
"xpack.slo.sloEmbeddable.displayName": "Aperçu du SLO",
"xpack.slo.sloEmbeddable.overview.sloNotFoundText": "Le SLO a été supprimé. Vous pouvez supprimer sans risque le widget du tableau de bord.",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "Cible {target}",
"xpack.slo.sloGridItem.targetFlexItemLabel": "Cible {target}",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "Cible {target}",
"xpack.slo.sloGroupConfiguration.customFiltersLabel": "Personnaliser le filtre",
"xpack.slo.sloGroupConfiguration.customFiltersOptional": "Facultatif",
"xpack.slo.sloGroupConfiguration.customFilterText": "Personnaliser le filtre",
@ -43640,8 +43640,8 @@
"xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webhook - Données de gestion des cas",
"xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "Éditeur de code",
"xpack.stackConnectors.components.d3security.bodyFieldLabel": "Corps",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security",
"xpack.stackConnectors.components.d3security.connectorTypeTitle": "Données D3",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security",
"xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "Type d'événement",
"xpack.stackConnectors.components.d3security.invalidActionText": "Nom d'action non valide.",
"xpack.stackConnectors.components.d3security.requiredActionText": "L'action est requise.",

View file

@ -11120,8 +11120,8 @@
"xpack.apm.serviceIcons.service": "サービス",
"xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "アーキテクチャー",
"xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性ゾーン}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {関数名}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {トリガータイプ}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {関数名}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {コンピュータータイプ} }\n ",
"xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "プロジェクト ID",
"xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "クラウドプロバイダー",
@ -27076,8 +27076,8 @@
"xpack.maps.source.esSearch.descendingLabel": "降順",
"xpack.maps.source.esSearch.extentFilterLabel": "マップの表示範囲でデータを動的にフィルタリング",
"xpack.maps.source.esSearch.fieldNotFoundMsg": "インデックスパターン''{indexPatternName}''に''{fieldName}''が見つかりません。",
"xpack.maps.source.esSearch.geoFieldLabel": "地理空間フィールド",
"xpack.maps.source.esSearch.geofieldLabel": "地理空間フィールド",
"xpack.maps.source.esSearch.geoFieldLabel": "地理空間フィールド",
"xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空間フィールドタイプ",
"xpack.maps.source.esSearch.indexOverOneLengthEditError": "データビューは複数のインデックスを参照しています。データビューごとに1つのインデックスのみが許可されています。",
"xpack.maps.source.esSearch.indexZeroLengthEditError": "データビューはどのインデックスも参照していません。",
@ -36537,8 +36537,8 @@
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "Kibanaで許可される最大数は、1回の実行につき、{maxNumber} {maxNumber, plural, other {アラート}}です。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "名前が必要です。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "ルール調査ガイドを追加...",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "必要な統合、構成ステップ、ルールが正常に動作するために必要な他のすべての項目といった、ルール前提条件に関する指示を入力します。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "ルールセットアップガイドを追加...",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "必要な統合、構成ステップ、ルールが正常に動作するために必要な他のすべての項目といった、ルール前提条件に関する指示を入力します。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "セットアップガイド",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "タグを空にすることはできません",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "インジケータープレフィックスの無効化を空にすることはできません",
@ -42176,8 +42176,8 @@
"xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "SLOを選択",
"xpack.slo.sloEmbeddable.displayName": "SLO概要",
"xpack.slo.sloEmbeddable.overview.sloNotFoundText": "SLOが削除されました。ウィジェットをダッシュボードから安全に削除できます。",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "目標{target}",
"xpack.slo.sloGridItem.targetFlexItemLabel": "目標{target}",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "目標{target}",
"xpack.slo.sloGroupConfiguration.customFiltersLabel": "カスタムフィルター",
"xpack.slo.sloGroupConfiguration.customFiltersOptional": "オプション",
"xpack.slo.sloGroupConfiguration.customFilterText": "カスタムフィルター",
@ -43619,8 +43619,8 @@
"xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webフック - ケース管理データ",
"xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "コードエディター",
"xpack.stackConnectors.components.d3security.bodyFieldLabel": "本文",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3セキュリティ",
"xpack.stackConnectors.components.d3security.connectorTypeTitle": "D3データ",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3セキュリティ",
"xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "イベントタイプ",
"xpack.stackConnectors.components.d3security.invalidActionText": "無効なアクション名です。",
"xpack.stackConnectors.components.d3security.requiredActionText": "アクションが必要です。",

View file

@ -11139,8 +11139,8 @@
"xpack.apm.serviceIcons.service": "服务",
"xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "架构",
"xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, other {可用性区域}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {功能名称}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, other {触发类型}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, other {功能名称}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, other {机器类型}} ",
"xpack.apm.serviceIcons.serviceDetails.cloud.projectIdLabel": "项目 ID",
"xpack.apm.serviceIcons.serviceDetails.cloud.providerLabel": "云服务提供商",
@ -27108,8 +27108,8 @@
"xpack.maps.source.esSearch.descendingLabel": "降序",
"xpack.maps.source.esSearch.extentFilterLabel": "在可见地图区域中动态筛留数据",
"xpack.maps.source.esSearch.fieldNotFoundMsg": "在索引模式“{indexPatternName}”中找不到“{fieldName}”。",
"xpack.maps.source.esSearch.geoFieldLabel": "地理空间字段",
"xpack.maps.source.esSearch.geofieldLabel": "地理空间字段",
"xpack.maps.source.esSearch.geoFieldLabel": "地理空间字段",
"xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空间字段类型",
"xpack.maps.source.esSearch.indexOverOneLengthEditError": "您的数据视图指向多个索引。每个数据视图只允许一个索引。",
"xpack.maps.source.esSearch.indexZeroLengthEditError": "您的数据视图未指向任何索引。",
@ -36579,8 +36579,8 @@
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.maxAlertsFieldLessThanWarning": "每次规则运行时Kibana 最多只允许 {maxNumber} 个{maxNumber, plural, other {告警}}。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.nameFieldRequiredError": "名称必填。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.noteHelpText": "添加规则调查指南......",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "提供有关规则先决条件的说明,如所需集成、配置步骤,以及规则正常运行所需的任何其他内容。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutrule.setupHelpText": "添加规则设置指南......",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupHelpText": "提供有关规则先决条件的说明,如所需集成、配置步骤,以及规则正常运行所需的任何其他内容。",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.setupLabel": "设置指南",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.tagFieldEmptyError": "标签不得为空",
"xpack.securitySolution.detectionEngine.createRule.stepAboutRule.threatIndicatorPathFieldEmptyError": "指标前缀覆盖不得为空",
@ -42220,8 +42220,8 @@
"xpack.slo.sloEmbeddable.config.sloSelector.placeholder": "选择 SLO",
"xpack.slo.sloEmbeddable.displayName": "SLO 概览",
"xpack.slo.sloEmbeddable.overview.sloNotFoundText": "SLO 已删除。您可以放心从仪表板中删除小组件。",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "目标 {target}",
"xpack.slo.sloGridItem.targetFlexItemLabel": "目标 {target}",
"xpack.slo.sLOGridItem.targetFlexItemLabel": "目标 {target}",
"xpack.slo.sloGroupConfiguration.customFiltersLabel": "定制筛选",
"xpack.slo.sloGroupConfiguration.customFiltersOptional": "可选",
"xpack.slo.sloGroupConfiguration.customFilterText": "定制筛选",
@ -43667,8 +43667,8 @@
"xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle": "Webhook - 案例管理数据",
"xpack.stackConnectors.components.d3security.bodyCodeEditorAriaLabel": "代码编辑器",
"xpack.stackConnectors.components.d3security.bodyFieldLabel": "正文",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security",
"xpack.stackConnectors.components.d3security.connectorTypeTitle": "D3 数据",
"xpack.stackConnectors.components.d3Security.connectorTypeTitle": "D3 Security",
"xpack.stackConnectors.components.d3security.eventTypeFieldLabel": "事件类型",
"xpack.stackConnectors.components.d3security.invalidActionText": "操作名称无效。",
"xpack.stackConnectors.components.d3security.requiredActionText": "“操作”必填。",