Skip to content

Commit 2065438

Browse files
[Fleet] Fix performance issue in agent status endpoint (#90066)
Co-authored-by: Kibana Machine <[email protected]>
1 parent 75d9e0a commit 2065438

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed

x-pack/plugins/fleet/server/services/agents/crud_so.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,35 @@ import { AgentSOAttributes, Agent, ListWithKuery } from '../../types';
1212
import { escapeSearchQueryPhrase, normalizeKuery, findAllSOs } from '../saved_object';
1313
import { savedObjectToAgent } from './saved_objects';
1414
import { appContextService } from '../../services';
15+
import { esKuery, KueryNode } from '../../../../../../src/plugins/data/server';
1516

1617
const ACTIVE_AGENT_CONDITION = `${AGENT_SAVED_OBJECT_TYPE}.attributes.active:true`;
1718
const INACTIVE_AGENT_CONDITION = `NOT (${ACTIVE_AGENT_CONDITION})`;
1819

19-
function _joinFilters(filters: string[], operator = 'AND') {
20-
return filters.reduce((acc: string | undefined, filter) => {
21-
if (acc) {
22-
return `${acc} ${operator} (${filter})`;
23-
}
24-
25-
return `(${filter})`;
26-
}, undefined);
20+
function _joinFilters(filters: Array<string | undefined | KueryNode>) {
21+
return filters
22+
.filter((filter) => filter !== undefined)
23+
.reduce((acc: KueryNode | undefined, kuery: string | KueryNode | undefined):
24+
| KueryNode
25+
| undefined => {
26+
if (kuery === undefined) {
27+
return acc;
28+
}
29+
const kueryNode: KueryNode =
30+
typeof kuery === 'string'
31+
? esKuery.fromKueryExpression(normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery))
32+
: kuery;
33+
34+
if (!acc) {
35+
return kueryNode;
36+
}
37+
38+
return {
39+
type: 'function',
40+
function: 'and',
41+
arguments: [acc, kueryNode],
42+
};
43+
}, undefined as KueryNode | undefined);
2744
}
2845

2946
export async function listAgents(
@@ -46,19 +63,18 @@ export async function listAgents(
4663
showInactive = false,
4764
showUpgradeable,
4865
} = options;
49-
const filters = [];
66+
const filters: Array<string | KueryNode | undefined> = [];
5067

5168
if (kuery && kuery !== '') {
52-
filters.push(normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery));
69+
filters.push(kuery);
5370
}
5471

5572
if (showInactive === false) {
5673
filters.push(ACTIVE_AGENT_CONDITION);
5774
}
58-
5975
let { saved_objects: agentSOs, total } = await soClient.find<AgentSOAttributes>({
6076
type: AGENT_SAVED_OBJECT_TYPE,
61-
filter: _joinFilters(filters),
77+
filter: _joinFilters(filters) || '',
6278
sortField,
6379
sortOrder,
6480
page,
@@ -94,7 +110,7 @@ export async function listAllAgents(
94110
const filters = [];
95111

96112
if (kuery && kuery !== '') {
97-
filters.push(normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery));
113+
filters.push(kuery);
98114
}
99115

100116
if (showInactive === false) {

x-pack/plugins/fleet/server/services/agents/status.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { AGENT_EVENT_SAVED_OBJECT_TYPE, AGENT_SAVED_OBJECT_TYPE } from '../../co
1111
import { AgentStatus } from '../../types';
1212

1313
import { AgentStatusKueryHelper } from '../../../common/services';
14+
import { esKuery, KueryNode } from '../../../../../../src/plugins/data/server';
15+
import { normalizeKuery } from '../saved_object';
1416

1517
export async function getAgentStatusById(
1618
soClient: SavedObjectsClientContract,
@@ -26,13 +28,24 @@ export const getAgentStatus = AgentStatusKueryHelper.getAgentStatus;
2628
function joinKuerys(...kuerys: Array<string | undefined>) {
2729
return kuerys
2830
.filter((kuery) => kuery !== undefined)
29-
.reduce((acc, kuery) => {
30-
if (acc === '') {
31-
return `(${kuery})`;
31+
.reduce((acc: KueryNode | undefined, kuery: string | undefined): KueryNode | undefined => {
32+
if (kuery === undefined) {
33+
return acc;
3234
}
35+
const normalizedKuery: KueryNode = esKuery.fromKueryExpression(
36+
normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery || '')
37+
);
3338

34-
return `${acc} and (${kuery})`;
35-
}, '');
39+
if (!acc) {
40+
return normalizedKuery;
41+
}
42+
43+
return {
44+
type: 'function',
45+
function: 'and',
46+
arguments: [acc, normalizedKuery],
47+
};
48+
}, undefined as KueryNode | undefined);
3649
}
3750

3851
export async function getAgentStatusForAgentPolicy(
@@ -58,6 +71,7 @@ export async function getAgentStatusForAgentPolicy(
5871
...[
5972
kuery,
6073
filterKuery,
74+
`${AGENT_SAVED_OBJECT_TYPE}.attributes.active:true`,
6175
agentPolicyId ? `${AGENT_SAVED_OBJECT_TYPE}.policy_id:"${agentPolicyId}"` : undefined,
6276
]
6377
),

x-pack/plugins/fleet/server/types/rest_spec/common.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ export const ListWithKuerySchema = schema.object({
1111
sortField: schema.maybe(schema.string()),
1212
sortOrder: schema.maybe(schema.oneOf([schema.literal('desc'), schema.literal('asc')])),
1313
showUpgradeable: schema.maybe(schema.boolean()),
14-
kuery: schema.maybe(schema.string()),
14+
kuery: schema.maybe(
15+
schema.oneOf([
16+
schema.string(),
17+
schema.any(), // KueryNode
18+
])
19+
),
1520
});
1621

1722
export type ListWithKuery = TypeOf<typeof ListWithKuerySchema>;

0 commit comments

Comments
 (0)