Skip to content

Commit 8b26907

Browse files
Migrates security solution usage collector es client from legacy to new (#86853)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
1 parent afc2c51 commit 8b26907

File tree

4 files changed

+38
-34
lines changed

4 files changed

+38
-34
lines changed

x-pack/plugins/security_solution/server/usage/collector.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ export const registerCollector: RegisterCollector = ({
7878
},
7979
},
8080
isReady: () => kibanaIndex.length > 0,
81-
fetch: async ({ callCluster }: CollectorFetchContext): Promise<UsageData> => {
81+
fetch: async ({ esClient }: CollectorFetchContext): Promise<UsageData> => {
8282
const savedObjectsClient = await getInternalSavedObjectsClient(core);
8383
const [detections, endpoints] = await Promise.allSettled([
8484
fetchDetectionsUsage(
8585
kibanaIndex,
86-
callCluster,
86+
esClient,
8787
ml,
8888
(savedObjectsClient as unknown) as SavedObjectsClientContract
8989
),

x-pack/plugins/security_solution/server/usage/detections/detections.test.ts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { LegacyAPICaller, SavedObjectsClientContract } from '../../../../../../src/core/server';
7+
import { ElasticsearchClient, SavedObjectsClientContract } from '../../../../../../src/core/server';
88
import { elasticsearchServiceMock } from '../../../../../../src/core/server/mocks';
99
import { mlServicesMock } from '../../lib/machine_learning/mocks';
1010
import {
@@ -16,22 +16,17 @@ import { fetchDetectionsUsage } from './index';
1616

1717
describe('Detections Usage', () => {
1818
describe('fetchDetectionsUsage()', () => {
19-
let callClusterMock: jest.Mocked<LegacyAPICaller>;
19+
let esClientMock: jest.Mocked<ElasticsearchClient>;
2020
let savedObjectsClientMock: jest.Mocked<SavedObjectsClientContract>;
2121
let mlMock: ReturnType<typeof mlServicesMock.create>;
2222

2323
beforeEach(() => {
24-
callClusterMock = elasticsearchServiceMock.createLegacyClusterClient().callAsInternalUser;
24+
esClientMock = elasticsearchServiceMock.createClusterClient().asInternalUser;
2525
mlMock = mlServicesMock.create();
2626
});
2727

2828
it('returns zeroed counts if both calls are empty', async () => {
29-
const result = await fetchDetectionsUsage(
30-
'',
31-
callClusterMock,
32-
mlMock,
33-
savedObjectsClientMock
34-
);
29+
const result = await fetchDetectionsUsage('', esClientMock, mlMock, savedObjectsClientMock);
3530

3631
expect(result).toEqual({
3732
detection_rules: {
@@ -58,13 +53,9 @@ describe('Detections Usage', () => {
5853
});
5954

6055
it('tallies rules data given rules results', async () => {
61-
(callClusterMock as jest.Mock).mockResolvedValue(getMockRulesResponse());
62-
const result = await fetchDetectionsUsage(
63-
'',
64-
callClusterMock,
65-
mlMock,
66-
savedObjectsClientMock
67-
);
56+
(esClientMock.search as jest.Mock).mockResolvedValue({ body: getMockRulesResponse() });
57+
58+
const result = await fetchDetectionsUsage('', esClientMock, mlMock, savedObjectsClientMock);
6859

6960
expect(result).toEqual(
7061
expect.objectContaining({
@@ -92,12 +83,7 @@ describe('Detections Usage', () => {
9283
jobsSummary: mockJobSummary,
9384
});
9485

95-
const result = await fetchDetectionsUsage(
96-
'',
97-
callClusterMock,
98-
mlMock,
99-
savedObjectsClientMock
100-
);
86+
const result = await fetchDetectionsUsage('', esClientMock, mlMock, savedObjectsClientMock);
10187

10288
expect(result).toEqual(
10389
expect.objectContaining({

x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { SearchParams } from 'elasticsearch';
8-
97
import {
10-
LegacyAPICaller,
8+
ElasticsearchClient,
119
SavedObjectsClientContract,
1210
KibanaRequest,
11+
SearchResponse,
1312
} from '../../../../../../src/core/server';
1413
import { MlPluginSetup } from '../../../../ml/server';
1514
import { SIGNALS_ID, INTERNAL_IMMUTABLE_KEY } from '../../../common/constants';
@@ -22,6 +21,26 @@ interface DetectionsMetric {
2221
isEnabled: boolean;
2322
}
2423

24+
interface RuleSearchBody {
25+
query: {
26+
bool: {
27+
filter: {
28+
term: { [key: string]: string };
29+
};
30+
};
31+
};
32+
}
33+
interface RuleSearchParams {
34+
body: RuleSearchBody;
35+
filterPath: string[];
36+
ignoreUnavailable: boolean;
37+
index: string;
38+
size: number;
39+
}
40+
interface RuleSearchResult {
41+
alert: { enabled: boolean; tags: string[] };
42+
}
43+
2544
const isElasticRule = (tags: string[]) => tags.includes(`${INTERNAL_IMMUTABLE_KEY}:true`);
2645

2746
/**
@@ -135,10 +154,10 @@ const updateMlJobsUsage = (jobMetric: DetectionsMetric, usage: MlJobsUsage): MlJ
135154

136155
export const getRulesUsage = async (
137156
index: string,
138-
callCluster: LegacyAPICaller
157+
esClient: ElasticsearchClient
139158
): Promise<DetectionRulesUsage> => {
140159
let rulesUsage: DetectionRulesUsage = initialRulesUsage;
141-
const ruleSearchOptions: SearchParams = {
160+
const ruleSearchOptions: RuleSearchParams = {
142161
body: { query: { bool: { filter: { term: { 'alert.alertTypeId': SIGNALS_ID } } } } },
143162
filterPath: ['hits.hits._source.alert.enabled', 'hits.hits._source.alert.tags'],
144163
ignoreUnavailable: true,
@@ -147,8 +166,7 @@ export const getRulesUsage = async (
147166
};
148167

149168
try {
150-
const ruleResults = await callCluster<{ alert: { enabled: boolean; tags: string[] } }>(
151-
'search',
169+
const { body: ruleResults } = await esClient.search<SearchResponse<RuleSearchResult>>(
152170
ruleSearchOptions
153171
);
154172

x-pack/plugins/security_solution/server/usage/detections/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { LegacyAPICaller, SavedObjectsClientContract } from '../../../../../../src/core/server';
7+
import { ElasticsearchClient, SavedObjectsClientContract } from '../../../../../../src/core/server';
88
import {
99
getMlJobsUsage,
1010
getRulesUsage,
@@ -40,12 +40,12 @@ export const defaultDetectionsUsage = {
4040

4141
export const fetchDetectionsUsage = async (
4242
kibanaIndex: string,
43-
callCluster: LegacyAPICaller,
43+
esClient: ElasticsearchClient,
4444
ml: MlPluginSetup | undefined,
4545
savedObjectClient: SavedObjectsClientContract
4646
): Promise<DetectionsUsage> => {
4747
const [rulesUsage, mlJobsUsage] = await Promise.allSettled([
48-
getRulesUsage(kibanaIndex, callCluster),
48+
getRulesUsage(kibanaIndex, esClient),
4949
getMlJobsUsage(ml, savedObjectClient),
5050
]);
5151

0 commit comments

Comments
 (0)