Skip to content

Commit

Permalink
feat: Upgrade to opentelemetry@0.27, keeps compatibility with v0.24
Browse files Browse the repository at this point in the history
  • Loading branch information
marcbachmann committed Dec 14, 2021
1 parent 5d35da1 commit a17bf43
Show file tree
Hide file tree
Showing 14 changed files with 242 additions and 121 deletions.
9 changes: 7 additions & 2 deletions example/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const {MeterProvider} = require('@opentelemetry/metrics')
const {MeterProvider} = require('@opentelemetry/sdk-metrics-base')
const {PrometheusExporter} = require('@opentelemetry/exporter-prometheus')

const exporter = new PrometheusExporter({startServer: true}, () => {
const exporter = new PrometheusExporter({port: 9464, startServer: true}, () => {
// eslint-disable-next-line no-console
console.log(
`Prometheus scrape endpoint: http://localhost:%s%s`,
Expand All @@ -16,3 +16,8 @@ const meterProvider = new MeterProvider({
})

require('opentelemetry-node-metrics')(meterProvider)


// With opentelemetry 0.27, the proecss somehow doesn't keep any open handles
// and stops without that
setInterval(() => {}, 1000)
216 changes: 158 additions & 58 deletions example/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
"description": "",
"main": "index.js",
"dependencies": {
"@opentelemetry/exporter-prometheus": "^0.14.0",
"@opentelemetry/metrics": "^0.14.0",
"@opentelemetry/exporter-prometheus": "^0.27.0",
"@opentelemetry/sdk-metrics-base": "^0.27.0",
"opentelemetry-node-metrics": "file:.."
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
Expand Down
17 changes: 14 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,20 @@ module.exports = function setupNodeMetrics (meterProvider, config) {
config.prefix = config.prefix ? config.prefix : ''
config.labels = config.labels ? config.labels : {}

const meter = meterProvider.getMeter('opentelemetry-node-metrics')
let meter = meterProvider.getMeter('opentelemetry-node-metrics')

// keep opentelemetry compatibility with v0.24.x
if (!meter.createObservableGauge) {
meter = {
createObservableGauge: meter.createValueObserver.bind(meter),
createHistogram: meter.createValueRecorder.bind(meter),
createCounter: meter.createCounter.bind(meter),
createUpDownCounter: meter.createUpDownCounter.bind(meter)
}
}

require('./metrics/version')(meter, config)
require('./metrics/processStartTime')(meter, config)
require('./metrics/eventLoopLag')(meter, config)
require('./metrics/gc')(meter, config)
require('./metrics/heapSizeAndUsed')(meter, config)
Expand All @@ -14,6 +27,4 @@ module.exports = function setupNodeMetrics (meterProvider, config) {
require('./metrics/processMaxFileDescriptors')(meter, config)
require('./metrics/processOpenFileDescriptors')(meter, config)
require('./metrics/processRequests')(meter, config)
require('./metrics/processStartTime')(meter, config)
require('./metrics/version')(meter, config)
}
30 changes: 14 additions & 16 deletions metrics/eventLoopLag.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,47 +20,44 @@ module.exports = (meter, {prefix, labels, eventLoopMonitoringPrecision}) => {

histogram.enable()

const lag = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG, {
const lag = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG, {
description: 'Lag of event loop in seconds.'
}).bind(labels)

const lagMin = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_MIN, {
const lagMin = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_MIN, {
description: 'The minimum recorded event loop delay.'
}).bind(labels)

const lagMax = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_MAX, {
const lagMax = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_MAX, {
description: 'The maximum recorded event loop delay.'
}).bind(labels)

const lagMean = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_MEAN, {
const lagMean = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_MEAN, {
description: 'The mean of the recorded event loop delays.'
}).bind(labels)

const lagStddev = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_STDDEV, {
const lagStddev = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_STDDEV, {
description: 'The standard deviation of the recorded event loop delays.'
}).bind(labels)

const lagP50 = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_P50, {
const lagP50 = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_P50, {
description: 'The 50th percentile of the recorded event loop delays.'
}).bind(labels)

const lagP90 = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_P90, {
const lagP90 = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_P90, {
description: 'The 90th percentile of the recorded event loop delays.'
}).bind(labels)

const lagP99 = meter.createValueObserver(prefix + NODEJS_EVENTLOOP_LAG_P99, {
const lagP99 = meter.createObservableGauge(prefix + NODEJS_EVENTLOOP_LAG_P99, {
description: 'The 99th percentile of the recorded event loop delays.'
}).bind(labels)
}, async () => {
const startTime = process.hrtime()
await new Promise((resolve) => setImmediate(() => resolve()))

function reportEventloopLag (start) {
const delta = process.hrtime(start)
const delta = process.hrtime(startTime)
const nanosec = (delta[0] * 1e9) + delta[1]
const seconds = nanosec / 1e9
lag.update(seconds)
}

meter.createBatchObserver((observerBatchResult) => {
setImmediate(reportEventloopLag, process.hrtime())

lagMin.update(histogram.min / 1e9)
lagMax.update(histogram.max / 1e9)
Expand All @@ -69,8 +66,9 @@ module.exports = (meter, {prefix, labels, eventLoopMonitoringPrecision}) => {
lagP50.update(histogram.percentile(50) / 1e9)
lagP90.update(histogram.percentile(90) / 1e9)
lagP99.update(histogram.percentile(99) / 1e9)
})
}).bind(labels)

lag.update(0)
}

module.exports.metricNames = [
Expand Down
2 changes: 1 addition & 1 deletion metrics/gc.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const DEFAULT_GC_DURATION_BUCKETS = [0.001, 0.01, 0.1, 1, 2, 5]
module.exports = (meter, {prefix, labels, gcDurationBuckets}) => {
const boundaries = gcDurationBuckets || DEFAULT_GC_DURATION_BUCKETS

const histogram = meter.createValueRecorder(prefix + NODEJS_GC_DURATION_SECONDS, {
const histogram = meter.createHistogram(prefix + NODEJS_GC_DURATION_SECONDS, {
description: 'Garbage collection duration by kind, one of major, minor, incremental or weakcb.',
boundaries
})
Expand Down
Loading

0 comments on commit a17bf43

Please sign in to comment.