Skip to content

Commit 9217bf7

Browse files
committed
feat: send host metrics
This adds in host metrics, which means we can see things like CPU and memory usage for apps using Reliability Kit.
1 parent 2d555e9 commit 9217bf7

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

packages/opentelemetry/lib/index.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { createInstrumentationConfig } = require('./config/instrumentations');
22
const { createMetricsConfig } = require('./config/metrics');
33
const { createResourceConfig } = require('./config/resource');
44
const { createTracingConfig } = require('./config/tracing');
5+
const { HostMetrics } = require('@opentelemetry/host-metrics');
56
const opentelemetry = require('@opentelemetry/sdk-node');
67
const logger = require('@dotcom-reliability-kit/logger');
78

@@ -27,6 +28,8 @@ const logger = require('@dotcom-reliability-kit/logger');
2728
* @typedef {object} Instances
2829
* @property {opentelemetry.NodeSDK} sdk
2930
* A singleton instance of the OpenTelemetry Node SDK.
31+
* @property {HostMetrics} [hostMetrics]
32+
* A singleton instances of the OpenTelemetry host metrics collector.
3033
*/
3134

3235
/**
@@ -81,6 +84,7 @@ function setupOpenTelemetry({
8184

8285
// Set up and start OpenTelemetry
8386
instances = {
87+
hostMetrics: undefined,
8488
sdk: new opentelemetry.NodeSDK({
8589
// Configurations we set regardless of whether we're using tracing
8690
instrumentations: createInstrumentationConfig(),
@@ -98,6 +102,18 @@ function setupOpenTelemetry({
98102
};
99103
instances.sdk.start();
100104

105+
// Set up host metrics if we have a metrics endpoint
106+
if (metricsOptions?.endpoint) {
107+
instances.hostMetrics = new HostMetrics({
108+
// This is a little redundant as the HostMetrics package defaults
109+
// this value to the package name, _however_ the types disagree and
110+
// think that `name` is a required property. Could be fixable in
111+
// future, see https://github.com/open-telemetry/opentelemetry-js-contrib/issues/2274
112+
name: '@opentelemetry/host-metrics'
113+
});
114+
instances.hostMetrics.start();
115+
}
116+
101117
return instances;
102118
}
103119

packages/opentelemetry/test/unit/lib/index.spec.js

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
jest.mock('@opentelemetry/host-metrics');
12
jest.mock('@opentelemetry/sdk-node');
23
jest.mock('@dotcom-reliability-kit/logger');
34
jest.mock('../../../lib/config/instrumentations', () => ({
@@ -16,11 +17,12 @@ jest.mock('../../../lib/config/tracing', () => ({
1617
}));
1718

1819
describe('@dotcom-reliability-kit/opentelemetry', () => {
20+
let api;
1921
let createInstrumentationConfig;
2022
let createMetricsConfig;
2123
let createResourceConfig;
2224
let createTracingConfig;
23-
let api;
25+
let HostMetrics;
2426
let logger;
2527
let NodeSDK;
2628
let opentelemetry;
@@ -40,6 +42,7 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
4042
createTracingConfig =
4143
require('../../../lib/config/tracing').createTracingConfig;
4244
api = require('@opentelemetry/sdk-node').api;
45+
HostMetrics = require('@opentelemetry/host-metrics').HostMetrics;
4346
NodeSDK = require('@opentelemetry/sdk-node').NodeSDK;
4447
logger = require('@dotcom-reliability-kit/logger');
4548

@@ -114,9 +117,39 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
114117
expect(NodeSDK.prototype.start).toHaveBeenCalledTimes(1);
115118
});
116119

117-
it('returns the SDK instance', () => {
120+
it('instantiates and starts a HostMetrics collector', () => {
121+
expect(HostMetrics).toHaveBeenCalledTimes(1);
122+
expect(HostMetrics).toHaveBeenCalledWith({
123+
name: '@opentelemetry/host-metrics'
124+
});
125+
expect(HostMetrics.prototype.start).toHaveBeenCalledTimes(1);
126+
});
127+
128+
it('returns the SDK instances', () => {
118129
expect(instances).toEqual({
119-
sdk: NodeSDK.mock.instances[0]
130+
sdk: NodeSDK.mock.instances[0],
131+
hostMetrics: HostMetrics.mock.instances[0]
132+
});
133+
});
134+
135+
describe('when no metrics endpoint is set', () => {
136+
beforeEach(() => {
137+
NodeSDK.mockClear();
138+
reloadAllModules();
139+
instances = opentelemetry.setup({
140+
tracing: {
141+
endpoint: 'mock-tracing-endpoint',
142+
samplePercentage: 137
143+
}
144+
});
145+
});
146+
147+
it('does not instantiate a HostMetrics collector', () => {
148+
expect(HostMetrics).toHaveBeenCalledTimes(0);
149+
});
150+
151+
it('returns instances with hostMetrics undefined', () => {
152+
expect(instances.hostMetrics).toBeUndefined();
120153
});
121154
});
122155

0 commit comments

Comments
 (0)