Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to opentelemetry v0.27 #3

Merged
merged 1 commit into from
Dec 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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