From 398daa1231db351f7ebf51a6a2798c5d5b58764f Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Tue, 20 Aug 2024 07:35:02 -0400 Subject: [PATCH] [Synthetics] Added alerts page (#190751) ## Summary Synthetics - add alerts page , it shows related alerts for selected monitor and location !! image --------- Co-authored-by: shahzad31 --- .../synthetics/common/constants/ui.ts | 1 + .../journeys/alerting_default.journey.ts | 25 +++---- .../date_picker/synthetics_date_picker.tsx | 3 + .../hooks/use_fetch_active_alerts.ts | 63 ++++++++++++++++++ .../monitor_alerts/alerts_icon.tsx | 15 +++++ .../monitor_alerts/monitor_detail_alerts.tsx | 65 +++++++++++++++++++ .../monitor_details_location.tsx | 15 ++++- .../monitor_details/route_config.tsx | 46 ++++++++++--- .../translations/translations/fr-FR.json | 10 +-- .../translations/translations/ja-JP.json | 10 +-- .../translations/translations/zh-CN.json | 10 +-- 11 files changed, 221 insertions(+), 42 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_fetch_active_alerts.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/alerts_icon.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/monitor_detail_alerts.tsx diff --git a/x-pack/plugins/observability_solution/synthetics/common/constants/ui.ts b/x-pack/plugins/observability_solution/synthetics/common/constants/ui.ts index 8f3ee8f3b903b2..6f3fd250dcfe2a 100644 --- a/x-pack/plugins/observability_solution/synthetics/common/constants/ui.ts +++ b/x-pack/plugins/observability_solution/synthetics/common/constants/ui.ts @@ -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'; diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alerting_default.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alerting_default.journey.ts index 540a8e584cc5e0..49b94eaf5c6a4e 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alerting_default.journey.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/alerting_default.journey.ts @@ -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'); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/date_picker/synthetics_date_picker.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/date_picker/synthetics_date_picker.tsx index 1edaf76ea95a82..e234e323fa9179 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/date_picker/synthetics_date_picker.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/date_picker/synthetics_date_picker.tsx @@ -63,6 +63,9 @@ export const SyntheticsDatePicker = ({ fullWidth }: { fullWidth?: boolean }) => refreshApp(); }} onRefresh={refreshApp} + updateButtonProps={{ + fill: false, + }} /> ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_fetch_active_alerts.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_fetch_active_alerts.ts new file mode 100644 index 00000000000000..f81601e3ed4133 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_fetch_active_alerts.ts @@ -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().services; + + const { monitorId: configId } = useParams<{ monitorId: string }>(); + + const selectedLocation = useSelectedLocation(); + + const { loading, data } = useFetcher(async () => { + return await http.post(`${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, + }; +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/alerts_icon.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/alerts_icon.tsx new file mode 100644 index 00000000000000..930c351b383d62 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/alerts_icon.tsx @@ -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 ? {numberOfAlerts} : null; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/monitor_detail_alerts.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/monitor_detail_alerts.tsx new file mode 100644 index 00000000000000..1737aa21b27d20 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_alerts/monitor_detail_alerts.tsx @@ -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().services; + + const { monitorId: configId } = useParams<{ monitorId: string }>(); + + const selectedLocation = useSelectedLocation(); + const { from, to } = useRefreshedRangeFromUrl(); + + if (!selectedLocation) { + return ; + } + + return ( + <> + + + + + + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_location.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_location.tsx index 6a88986ab46b2d..9c1f015f67d4f1 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_location.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_location.tsx @@ -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] )} /> ); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/route_config.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/route_config.tsx index fe322804a11ead..b8d0db0f5a7746 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/route_config.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/route_config.tsx @@ -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, 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 = [ + , + , + , + , + , + , + ]; + if (selectedTab === 'alerts' || selectedTab === 'history' || selectedTab === 'errors') { + // remove first item refresh button + rightSideItems.shift(); + } + return { pageTitle: , breadcrumbs: [getMonitorsBreadcrumb(syntheticsPath)], - rightSideItems: [ - , - , - , - , - , - , - ], + 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: , + isSelected: selectedTab === 'alerts', + href: `${syntheticsPath}${MONITOR_ALERTS_ROUTE.replace(':monitorId', monitorId)}${search}`, + 'data-test-subj': 'syntheticsMonitorAlertsTab', + }, ], }; }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 43b621fff0144e..cc0f7067d89e07 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -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.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 05a2e7a22a01c5..519c9f2a428a92 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -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": "アクションが必要です。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index ab9ce8edafe35a..328008ebf39526 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -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": "“操作”必填。",