[Monitoring] update SM rule template variables (#104176)
* continue to support shardIndices template variable * add unit test for large shard size alert * change template variables in CCR rule * add CCR rule unit test * fix internationalization Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
b794e7b7ca
commit
08257f1f93
|
@ -0,0 +1,201 @@
|
||||||
|
/*
|
||||||
|
* 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 { CCRReadExceptionsAlert } from './ccr_read_exceptions_alert';
|
||||||
|
import { ALERT_CCR_READ_EXCEPTIONS } from '../../common/constants';
|
||||||
|
import { fetchCCRReadExceptions } from '../lib/alerts/fetch_ccr_read_exceptions';
|
||||||
|
import { fetchClusters } from '../lib/alerts/fetch_clusters';
|
||||||
|
import { elasticsearchServiceMock } from 'src/core/server/mocks';
|
||||||
|
|
||||||
|
type ICCRReadExceptionsAlertMock = CCRReadExceptionsAlert & {
|
||||||
|
defaultParams: {
|
||||||
|
duration: string;
|
||||||
|
};
|
||||||
|
} & {
|
||||||
|
actionVariables: Array<{
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const RealDate = Date;
|
||||||
|
|
||||||
|
jest.mock('../lib/alerts/fetch_ccr_read_exceptions', () => ({
|
||||||
|
fetchCCRReadExceptions: jest.fn(),
|
||||||
|
}));
|
||||||
|
jest.mock('../lib/alerts/fetch_clusters', () => ({
|
||||||
|
fetchClusters: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../static_globals', () => ({
|
||||||
|
Globals: {
|
||||||
|
app: {
|
||||||
|
getLogger: () => ({ debug: jest.fn() }),
|
||||||
|
url: 'http://localhost:5601',
|
||||||
|
config: {
|
||||||
|
ui: {
|
||||||
|
ccs: { enabled: true },
|
||||||
|
metricbeat: { index: 'metricbeat-*' },
|
||||||
|
container: { elasticsearch: { enabled: false } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('CCRReadExceptionsAlert', () => {
|
||||||
|
it('should have defaults', () => {
|
||||||
|
const alert = new CCRReadExceptionsAlert() as ICCRReadExceptionsAlertMock;
|
||||||
|
expect(alert.alertOptions.id).toBe(ALERT_CCR_READ_EXCEPTIONS);
|
||||||
|
expect(alert.alertOptions.name).toBe('CCR read exceptions');
|
||||||
|
expect(alert.alertOptions.throttle).toBe('6h');
|
||||||
|
expect(alert.alertOptions.defaultParams).toStrictEqual({
|
||||||
|
duration: '1h',
|
||||||
|
});
|
||||||
|
expect(alert.alertOptions.actionVariables).toStrictEqual([
|
||||||
|
{
|
||||||
|
name: 'remoteCluster',
|
||||||
|
description: 'The remote cluster experiencing CCR read exceptions.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'followerIndex',
|
||||||
|
description: 'The follower index reporting CCR read exceptions.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'internalShortMessage',
|
||||||
|
description: 'The short internal message generated by Elastic.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'internalFullMessage',
|
||||||
|
description: 'The full internal message generated by Elastic.',
|
||||||
|
},
|
||||||
|
{ name: 'state', description: 'The current state of the alert.' },
|
||||||
|
{ name: 'clusterName', description: 'The cluster to which the node(s) belongs.' },
|
||||||
|
{ name: 'action', description: 'The recommended action for this alert.' },
|
||||||
|
{
|
||||||
|
name: 'actionPlain',
|
||||||
|
description: 'The recommended action for this alert, without any markdown.',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
describe('execute', () => {
|
||||||
|
const FakeDate = function () {};
|
||||||
|
FakeDate.prototype.valueOf = () => 1;
|
||||||
|
|
||||||
|
const clusterUuid = 'abc123';
|
||||||
|
const clusterName = 'testCluster';
|
||||||
|
const nodeId = 'myNodeId';
|
||||||
|
const nodeName = 'myNodeName';
|
||||||
|
const remoteCluster = 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1';
|
||||||
|
const followerIndex = '.follower_index_1';
|
||||||
|
const leaderIndex = '.leader_index_1';
|
||||||
|
const readExceptions = [
|
||||||
|
{
|
||||||
|
exception: {
|
||||||
|
type: 'read_exceptions_type_1',
|
||||||
|
reason: 'read_exceptions_reason_1',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const stat = {
|
||||||
|
remoteCluster,
|
||||||
|
followerIndex,
|
||||||
|
leaderIndex,
|
||||||
|
read_exceptions: readExceptions,
|
||||||
|
clusterUuid,
|
||||||
|
nodeId,
|
||||||
|
nodeName,
|
||||||
|
};
|
||||||
|
|
||||||
|
const replaceState = jest.fn();
|
||||||
|
const scheduleActions = jest.fn();
|
||||||
|
const getState = jest.fn();
|
||||||
|
const executorOptions = {
|
||||||
|
services: {
|
||||||
|
scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(),
|
||||||
|
alertInstanceFactory: jest.fn().mockImplementation(() => {
|
||||||
|
return {
|
||||||
|
replaceState,
|
||||||
|
scheduleActions,
|
||||||
|
getState,
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
state: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
Date = FakeDate as DateConstructor;
|
||||||
|
(fetchCCRReadExceptions as jest.Mock).mockImplementation(() => {
|
||||||
|
return [stat];
|
||||||
|
});
|
||||||
|
(fetchClusters as jest.Mock).mockImplementation(() => {
|
||||||
|
return [{ clusterUuid, clusterName }];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
Date = RealDate;
|
||||||
|
replaceState.mockReset();
|
||||||
|
scheduleActions.mockReset();
|
||||||
|
getState.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fire actions', async () => {
|
||||||
|
const alert = new CCRReadExceptionsAlert() as ICCRReadExceptionsAlertMock;
|
||||||
|
const type = alert.getAlertType();
|
||||||
|
await type.executor({
|
||||||
|
...executorOptions,
|
||||||
|
params: alert.alertOptions.defaultParams,
|
||||||
|
} as any);
|
||||||
|
expect(scheduleActions).toHaveBeenCalledWith('default', {
|
||||||
|
internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`,
|
||||||
|
internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`,
|
||||||
|
action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`,
|
||||||
|
actionPlain:
|
||||||
|
'Verify follower and leader index relationships on the affected remote cluster.',
|
||||||
|
clusterName,
|
||||||
|
state: 'firing',
|
||||||
|
remoteCluster,
|
||||||
|
remoteClusters: remoteCluster,
|
||||||
|
followerIndex,
|
||||||
|
followerIndices: followerIndex,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle ccs', async () => {
|
||||||
|
const ccs = 'testCluster';
|
||||||
|
(fetchCCRReadExceptions as jest.Mock).mockImplementation(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
...stat,
|
||||||
|
ccs,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
});
|
||||||
|
const alert = new CCRReadExceptionsAlert() as ICCRReadExceptionsAlertMock;
|
||||||
|
const type = alert.getAlertType();
|
||||||
|
await type.executor({
|
||||||
|
...executorOptions,
|
||||||
|
params: alert.alertOptions.defaultParams,
|
||||||
|
} as any);
|
||||||
|
expect(scheduleActions).toHaveBeenCalledWith('default', {
|
||||||
|
internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`,
|
||||||
|
internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`,
|
||||||
|
action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`,
|
||||||
|
actionPlain:
|
||||||
|
'Verify follower and leader index relationships on the affected remote cluster.',
|
||||||
|
clusterName,
|
||||||
|
state: 'firing',
|
||||||
|
remoteCluster,
|
||||||
|
remoteClusters: remoteCluster,
|
||||||
|
followerIndex,
|
||||||
|
followerIndices: followerIndex,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -47,20 +47,20 @@ export class CCRReadExceptionsAlert extends BaseAlert {
|
||||||
},
|
},
|
||||||
actionVariables: [
|
actionVariables: [
|
||||||
{
|
{
|
||||||
name: 'remoteClusters',
|
name: 'remoteCluster',
|
||||||
description: i18n.translate(
|
description: i18n.translate(
|
||||||
'xpack.monitoring.alerts.ccrReadExceptions.actionVariables.remoteClusters',
|
'xpack.monitoring.alerts.ccrReadExceptions.actionVariables.remoteCluster',
|
||||||
{
|
{
|
||||||
defaultMessage: 'List of remote clusters that are experiencing CCR read exceptions.',
|
defaultMessage: 'The remote cluster experiencing CCR read exceptions.',
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'followerIndices',
|
name: 'followerIndex',
|
||||||
description: i18n.translate(
|
description: i18n.translate(
|
||||||
'xpack.monitoring.alerts.ccrReadExceptions.actionVariables.followerIndices',
|
'xpack.monitoring.alerts.ccrReadExceptions.actionVariables.followerIndex',
|
||||||
{
|
{
|
||||||
defaultMessage: 'List of follower indices reporting CCR read exceptions.',
|
defaultMessage: 'The follower index reporting CCR read exceptions.',
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
@ -229,12 +229,11 @@ export class CCRReadExceptionsAlert extends BaseAlert {
|
||||||
item: AlertData | null,
|
item: AlertData | null,
|
||||||
cluster: AlertCluster
|
cluster: AlertCluster
|
||||||
) {
|
) {
|
||||||
const remoteClustersList = alertStates
|
if (alertStates.length === 0) {
|
||||||
.map((alertState) => (alertState.meta as CCRReadExceptionsUIMeta).remoteCluster)
|
return;
|
||||||
.join(', ');
|
}
|
||||||
const followerIndicesList = alertStates
|
const CCRReadExceptionsMeta = alertStates[0].meta as CCRReadExceptionsUIMeta;
|
||||||
.map((alertState) => (alertState.meta as CCRReadExceptionsUIMeta).followerIndex)
|
const { remoteCluster, followerIndex } = CCRReadExceptionsMeta;
|
||||||
.join(', ');
|
|
||||||
|
|
||||||
const shortActionText = i18n.translate(
|
const shortActionText = i18n.translate(
|
||||||
'xpack.monitoring.alerts.ccrReadExceptions.shortAction',
|
'xpack.monitoring.alerts.ccrReadExceptions.shortAction',
|
||||||
|
@ -258,9 +257,9 @@ export class CCRReadExceptionsAlert extends BaseAlert {
|
||||||
const internalShortMessage = i18n.translate(
|
const internalShortMessage = i18n.translate(
|
||||||
'xpack.monitoring.alerts.ccrReadExceptions.firing.internalShortMessage',
|
'xpack.monitoring.alerts.ccrReadExceptions.firing.internalShortMessage',
|
||||||
{
|
{
|
||||||
defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteClustersList}. {shortActionText}`,
|
defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteCluster}. {shortActionText}`,
|
||||||
values: {
|
values: {
|
||||||
remoteClustersList,
|
remoteCluster,
|
||||||
shortActionText,
|
shortActionText,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -268,11 +267,11 @@ export class CCRReadExceptionsAlert extends BaseAlert {
|
||||||
const internalFullMessage = i18n.translate(
|
const internalFullMessage = i18n.translate(
|
||||||
'xpack.monitoring.alerts.ccrReadExceptions.firing.internalFullMessage',
|
'xpack.monitoring.alerts.ccrReadExceptions.firing.internalFullMessage',
|
||||||
{
|
{
|
||||||
defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteClustersList}. Current 'follower_index' index affected: {followerIndicesList}. {action}`,
|
defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteCluster}. Current 'follower_index' index affected: {followerIndex}. {action}`,
|
||||||
values: {
|
values: {
|
||||||
action,
|
action,
|
||||||
remoteClustersList,
|
remoteCluster,
|
||||||
followerIndicesList,
|
followerIndex,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -281,8 +280,14 @@ export class CCRReadExceptionsAlert extends BaseAlert {
|
||||||
internalShortMessage,
|
internalShortMessage,
|
||||||
internalFullMessage,
|
internalFullMessage,
|
||||||
state: AlertingDefaults.ALERT_STATE.firing,
|
state: AlertingDefaults.ALERT_STATE.firing,
|
||||||
remoteClusters: remoteClustersList,
|
remoteCluster,
|
||||||
followerIndices: followerIndicesList,
|
followerIndex,
|
||||||
|
/* continue to send "remoteClusters" and "followerIndices" values for users still using it though
|
||||||
|
we have replaced it with "remoteCluster" and "followerIndex" in the template due to alerts per index instead of all indices
|
||||||
|
see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431
|
||||||
|
*/
|
||||||
|
remoteClusters: remoteCluster,
|
||||||
|
followerIndices: followerIndex,
|
||||||
clusterName: cluster.clusterName,
|
clusterName: cluster.clusterName,
|
||||||
action,
|
action,
|
||||||
actionPlain: shortActionText,
|
actionPlain: shortActionText,
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
/*
|
||||||
|
* 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 { LargeShardSizeAlert } from './large_shard_size_alert';
|
||||||
|
import { ALERT_LARGE_SHARD_SIZE } from '../../common/constants';
|
||||||
|
import { fetchIndexShardSize } from '../lib/alerts/fetch_index_shard_size';
|
||||||
|
import { fetchClusters } from '../lib/alerts/fetch_clusters';
|
||||||
|
import { elasticsearchServiceMock } from 'src/core/server/mocks';
|
||||||
|
|
||||||
|
type ILargeShardSizeAlertMock = LargeShardSizeAlert & {
|
||||||
|
defaultParams: {
|
||||||
|
threshold: number;
|
||||||
|
duration: string;
|
||||||
|
};
|
||||||
|
} & {
|
||||||
|
actionVariables: Array<{
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const RealDate = Date;
|
||||||
|
|
||||||
|
jest.mock('../lib/alerts/fetch_index_shard_size', () => ({
|
||||||
|
fetchIndexShardSize: jest.fn(),
|
||||||
|
}));
|
||||||
|
jest.mock('../lib/alerts/fetch_clusters', () => ({
|
||||||
|
fetchClusters: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../static_globals', () => ({
|
||||||
|
Globals: {
|
||||||
|
app: {
|
||||||
|
getLogger: () => ({ debug: jest.fn() }),
|
||||||
|
url: 'http://localhost:5601',
|
||||||
|
config: {
|
||||||
|
ui: {
|
||||||
|
ccs: { enabled: true },
|
||||||
|
metricbeat: { index: 'metricbeat-*' },
|
||||||
|
container: { elasticsearch: { enabled: false } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('LargeShardSizeAlert', () => {
|
||||||
|
it('should have defaults', () => {
|
||||||
|
const alert = new LargeShardSizeAlert() as ILargeShardSizeAlertMock;
|
||||||
|
expect(alert.alertOptions.id).toBe(ALERT_LARGE_SHARD_SIZE);
|
||||||
|
expect(alert.alertOptions.name).toBe('Shard size');
|
||||||
|
expect(alert.alertOptions.throttle).toBe('12h');
|
||||||
|
expect(alert.alertOptions.defaultParams).toStrictEqual({
|
||||||
|
threshold: 55,
|
||||||
|
indexPattern: '-.*',
|
||||||
|
});
|
||||||
|
expect(alert.alertOptions.actionVariables).toStrictEqual([
|
||||||
|
{ name: 'shardIndex', description: 'The index experiencing large average shard size.' },
|
||||||
|
{
|
||||||
|
name: 'internalShortMessage',
|
||||||
|
description: 'The short internal message generated by Elastic.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'internalFullMessage',
|
||||||
|
description: 'The full internal message generated by Elastic.',
|
||||||
|
},
|
||||||
|
{ name: 'state', description: 'The current state of the alert.' },
|
||||||
|
{ name: 'clusterName', description: 'The cluster to which the node(s) belongs.' },
|
||||||
|
{ name: 'action', description: 'The recommended action for this alert.' },
|
||||||
|
{
|
||||||
|
name: 'actionPlain',
|
||||||
|
description: 'The recommended action for this alert, without any markdown.',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
describe('execute', () => {
|
||||||
|
const FakeDate = function () {};
|
||||||
|
FakeDate.prototype.valueOf = () => 1;
|
||||||
|
|
||||||
|
const shardIndex = 'apm-8.0.0-onboarding-2021.06.30';
|
||||||
|
const shardSize = 0;
|
||||||
|
const clusterUuid = 'abc123';
|
||||||
|
const clusterName = 'testCluster';
|
||||||
|
const nodeId = 'myNodeId';
|
||||||
|
const nodeName = 'myNodeName';
|
||||||
|
const stat = {
|
||||||
|
shardIndex,
|
||||||
|
shardSize,
|
||||||
|
clusterUuid,
|
||||||
|
nodeId,
|
||||||
|
nodeName,
|
||||||
|
};
|
||||||
|
|
||||||
|
const replaceState = jest.fn();
|
||||||
|
const scheduleActions = jest.fn();
|
||||||
|
const getState = jest.fn();
|
||||||
|
const executorOptions = {
|
||||||
|
services: {
|
||||||
|
scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(),
|
||||||
|
alertInstanceFactory: jest.fn().mockImplementation(() => {
|
||||||
|
return {
|
||||||
|
replaceState,
|
||||||
|
scheduleActions,
|
||||||
|
getState,
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
state: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
Date = FakeDate as DateConstructor;
|
||||||
|
(fetchIndexShardSize as jest.Mock).mockImplementation(() => {
|
||||||
|
return [stat];
|
||||||
|
});
|
||||||
|
(fetchClusters as jest.Mock).mockImplementation(() => {
|
||||||
|
return [{ clusterUuid, clusterName }];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
Date = RealDate;
|
||||||
|
replaceState.mockReset();
|
||||||
|
scheduleActions.mockReset();
|
||||||
|
getState.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fire actions', async () => {
|
||||||
|
const alert = new LargeShardSizeAlert() as ILargeShardSizeAlertMock;
|
||||||
|
const type = alert.getAlertType();
|
||||||
|
await type.executor({
|
||||||
|
...executorOptions,
|
||||||
|
params: alert.alertOptions.defaultParams,
|
||||||
|
} as any);
|
||||||
|
expect(scheduleActions).toHaveBeenCalledWith('default', {
|
||||||
|
internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`,
|
||||||
|
internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`,
|
||||||
|
action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`,
|
||||||
|
actionPlain: 'Investigate indices with large shard sizes.',
|
||||||
|
clusterName,
|
||||||
|
state: 'firing',
|
||||||
|
shardIndex,
|
||||||
|
shardIndices: shardIndex,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle ccs', async () => {
|
||||||
|
const ccs = 'testCluster';
|
||||||
|
(fetchIndexShardSize as jest.Mock).mockImplementation(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
...stat,
|
||||||
|
ccs,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
});
|
||||||
|
const alert = new LargeShardSizeAlert() as ILargeShardSizeAlertMock;
|
||||||
|
const type = alert.getAlertType();
|
||||||
|
await type.executor({
|
||||||
|
...executorOptions,
|
||||||
|
params: alert.alertOptions.defaultParams,
|
||||||
|
} as any);
|
||||||
|
expect(scheduleActions).toHaveBeenCalledWith('default', {
|
||||||
|
internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`,
|
||||||
|
internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`,
|
||||||
|
action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`,
|
||||||
|
actionPlain: 'Investigate indices with large shard sizes.',
|
||||||
|
clusterName,
|
||||||
|
state: 'firing',
|
||||||
|
shardIndex,
|
||||||
|
shardIndices: shardIndex,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -211,6 +211,11 @@ export class LargeShardSizeAlert extends BaseAlert {
|
||||||
internalShortMessage,
|
internalShortMessage,
|
||||||
internalFullMessage,
|
internalFullMessage,
|
||||||
state: AlertingDefaults.ALERT_STATE.firing,
|
state: AlertingDefaults.ALERT_STATE.firing,
|
||||||
|
/* continue to send "shardIndices" values for users still using it though
|
||||||
|
we have replaced it with shardIndex in the template due to alerts per index instead of all indices
|
||||||
|
see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431
|
||||||
|
*/
|
||||||
|
shardIndices: shardIndex,
|
||||||
shardIndex,
|
shardIndex,
|
||||||
clusterName: cluster.clusterName,
|
clusterName: cluster.clusterName,
|
||||||
action,
|
action,
|
||||||
|
|
|
@ -15669,11 +15669,7 @@
|
||||||
"xpack.monitoring.alerts.badge.panelCategory.errors": "エラーと例外",
|
"xpack.monitoring.alerts.badge.panelCategory.errors": "エラーと例外",
|
||||||
"xpack.monitoring.alerts.badge.panelCategory.resourceUtilization": "リソースの利用状況",
|
"xpack.monitoring.alerts.badge.panelCategory.resourceUtilization": "リソースの利用状況",
|
||||||
"xpack.monitoring.alerts.badge.panelTitle": "アラート",
|
"xpack.monitoring.alerts.badge.panelTitle": "アラート",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.actionVariables.followerIndices": "CCR読み取り例外を報告するフォロワーインデックスのリスト。",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.actionVariables.remoteClusters": "CCR読み取り例外が発生しているリモートクラスターのリスト。",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.description": "CCR読み取り例外が検出された場合にアラートを発行します。",
|
"xpack.monitoring.alerts.ccrReadExceptions.description": "CCR読み取り例外が検出された場合にアラートを発行します。",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.firing.internalFullMessage": "CCR読み取り例外アラートは次のリモートクラスターに対して発行されます。{remoteClustersList}。現在の「follower_index」インデックスが影響を受けます。{followerIndicesList}。{action}",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.firing.internalShortMessage": "CCR読み取り例外アラートは次のリモートクラスターに対して発行されます。{remoteClustersList}。{shortActionText}",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.fullAction": "CCR統計情報を表示",
|
"xpack.monitoring.alerts.ccrReadExceptions.fullAction": "CCR統計情報を表示",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.label": "CCR読み取り例外",
|
"xpack.monitoring.alerts.ccrReadExceptions.label": "CCR読み取り例外",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.paramDetails.duration.label": "最後の",
|
"xpack.monitoring.alerts.ccrReadExceptions.paramDetails.duration.label": "最後の",
|
||||||
|
|
|
@ -15901,11 +15901,7 @@
|
||||||
"xpack.monitoring.alerts.badge.panelCategory.errors": "错误和异常",
|
"xpack.monitoring.alerts.badge.panelCategory.errors": "错误和异常",
|
||||||
"xpack.monitoring.alerts.badge.panelCategory.resourceUtilization": "资源使用率",
|
"xpack.monitoring.alerts.badge.panelCategory.resourceUtilization": "资源使用率",
|
||||||
"xpack.monitoring.alerts.badge.panelTitle": "告警",
|
"xpack.monitoring.alerts.badge.panelTitle": "告警",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.actionVariables.followerIndices": "报告 CCR 读取异常的 Follower 索引列表。",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.actionVariables.remoteClusters": "有 CCR 读取异常的远程集群列表。",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.description": "检测到任何 CCR 读取异常时告警。",
|
"xpack.monitoring.alerts.ccrReadExceptions.description": "检测到任何 CCR 读取异常时告警。",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.firing.internalFullMessage": "以下远程集群触发 CCR 读取异常告警:{remoteClustersList}。当前“follower_index”索引受影响:{followerIndicesList}。{action}",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.firing.internalShortMessage": "以下远程集群触发 CCR 读取异常告警:{remoteClustersList}。{shortActionText}",
|
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.fullAction": "查看 CCR 统计",
|
"xpack.monitoring.alerts.ccrReadExceptions.fullAction": "查看 CCR 统计",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.label": "CCR 读取异常",
|
"xpack.monitoring.alerts.ccrReadExceptions.label": "CCR 读取异常",
|
||||||
"xpack.monitoring.alerts.ccrReadExceptions.paramDetails.duration.label": "过去",
|
"xpack.monitoring.alerts.ccrReadExceptions.paramDetails.duration.label": "过去",
|
||||||
|
|
Loading…
Reference in a new issue