Skip to content

Commit 04772fc

Browse files
authored
Register resident set size and limit bytes metrics in APM (#215458)
## Summary Resolves elastic/kibana-team#1565 Register resident set size and limit bytes metrics in APM. <img width="1614" alt="image" src="https://github.com/user-attachments/assets/d5f1caf5-da4f-4acd-a63f-2b5256a91307" /> ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)
1 parent b876e79 commit 04772fc

File tree

8 files changed

+55
-2
lines changed

8 files changed

+55
-2
lines changed

src/core/packages/metrics/collectors-server-internal/src/process.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import v8, { HeapInfo } from 'v8';
1111
import { mockEventLoopDelayMonitor, mockEventLoopUtilizationMonitor } from './process.test.mocks';
1212
import { ProcessMetricsCollector } from './process';
13+
import apm from 'elastic-apm-node';
1314

1415
describe('ProcessMetricsCollector', () => {
1516
let collector: ProcessMetricsCollector;
@@ -103,4 +104,24 @@ describe('ProcessMetricsCollector', () => {
103104
expect(mockEventLoopUtilizationMonitor.reset).toBeCalledTimes(1);
104105
});
105106
});
107+
108+
describe('register metrics in apm', () => {
109+
it('calls registerMetric in the constructor', () => {
110+
const apmSpy = jest.spyOn(apm, 'registerMetric');
111+
112+
collector.registerMetrics();
113+
114+
expect(apmSpy).toHaveBeenCalledTimes(2);
115+
expect(apmSpy).toHaveBeenNthCalledWith(
116+
1,
117+
'nodejs.memory.resident_set_size.bytes',
118+
expect.any(Function)
119+
);
120+
expect(apmSpy).toHaveBeenNthCalledWith(
121+
2,
122+
'nodejs.heap.size_limit.bytes',
123+
expect.any(Function)
124+
);
125+
});
126+
});
106127
});

src/core/packages/metrics/collectors-server-internal/src/process.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import v8 from 'v8';
1111
import type { OpsProcessMetrics, MetricsCollector } from '@kbn/core-metrics-server';
12+
import apm from 'elastic-apm-node';
1213
import { EventLoopDelaysMonitor } from './event_loop_delays_monitor';
1314
import { EventLoopUtilizationMonitor } from './event_loop_utilization_monitor';
1415

@@ -54,6 +55,14 @@ export class ProcessMetricsCollector implements MetricsCollector<OpsProcessMetri
5455
return [this.getCurrentPidMetrics()];
5556
}
5657

58+
public registerMetrics() {
59+
apm.registerMetric('nodejs.memory.resident_set_size.bytes', () => process.memoryUsage().rss);
60+
apm.registerMetric(
61+
'nodejs.heap.size_limit.bytes',
62+
() => v8.getHeapStatistics().heap_size_limit
63+
);
64+
}
65+
5766
public reset() {
5867
this.eventLoopDelayMonitor.reset();
5968
this.eventLoopUtilizationMonitor.reset();

src/core/packages/metrics/collectors-server-mocks/src/mocks.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@ const createMock = () => {
2121
return mocked;
2222
};
2323

24+
const createMockProcessMetricsCollector = () => ({
25+
...createMock(),
26+
registerMetrics: jest.fn().mockResolvedValue({}),
27+
});
28+
2429
export const collectorMock = {
2530
create: createMock,
2631
createOpsProcessMetrics: createMockOpsProcessMetrics,
32+
createProcessMetricsCollector: createMockProcessMetricsCollector,
2733
};

src/core/packages/metrics/server-internal/src/metrics_service.test.mocks.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010
import { collectorMock } from '@kbn/core-metrics-collectors-server-mocks';
1111

12-
export const mockOpsCollector = collectorMock.create();
12+
export const mockOpsCollector = {
13+
...collectorMock.create(),
14+
registerMetrics: jest.fn(),
15+
};
1316

1417
jest.doMock('./ops_metrics_collector', () => ({
1518
OpsMetricsCollector: jest.fn().mockImplementation(() => mockOpsCollector),

src/core/packages/metrics/server-internal/src/metrics_service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export class MetricsService
7878
}
7979
);
8080

81+
this.metricsCollector.registerMetrics();
82+
8183
await this.refreshMetrics();
8284

8385
this.collectInterval = setInterval(() => {

src/core/packages/metrics/server-internal/src/ops_metrics_collector.test.mocks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import { collectorMock } from '@kbn/core-metrics-collectors-server-mocks';
1111

1212
export const mockOsCollector = collectorMock.create();
13-
export const mockProcessCollector = collectorMock.create();
13+
export const mockProcessCollector = collectorMock.createProcessMetricsCollector();
1414
export const mockServerCollector = collectorMock.create();
1515
export const mockEsClientCollector = collectorMock.create();
1616

src/core/packages/metrics/server-internal/src/ops_metrics_collector.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,12 @@ describe('OpsMetricsCollector', () => {
8080
expect(mockServerCollector.reset).toHaveBeenCalledTimes(2);
8181
});
8282
});
83+
84+
describe('#registerMetrics', () => {
85+
it('call registerMetrics on the underlying collectors', () => {
86+
collector.registerMetrics();
87+
88+
expect(mockProcessCollector.registerMetrics).toHaveBeenCalledTimes(1);
89+
});
90+
});
8391
});

src/core/packages/metrics/server-internal/src/ops_metrics_collector.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ export class OpsMetricsCollector implements MetricsCollector<OpsMetrics> {
6464
};
6565
}
6666

67+
public registerMetrics() {
68+
this.processCollector.registerMetrics();
69+
}
70+
6771
public reset() {
6872
this.processCollector.reset();
6973
this.osCollector.reset();

0 commit comments

Comments
 (0)