All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Improve the memory usage of histograms by delaying allocation of bucket counters in
bucketValues
until their value is > 0 (Use a prototype of the initial counters) - Improve the memory usage of histograms by allocating empty
enableExemplars
instead of pre-filling withnull
- Minor performance improvements:
- Uvoid unneeded hash table updates
- Avoid hash table lookup for examplars
- Improve the memory usage of histograms when the
enableExemplars
option is disabled
- remove unnecessary loop from
osMemoryHeapLinux
- Improve performance of
hashObject
by using pre-sorted array of label names - Fix type of
collectDefaultMetrics.metricsList
- Allow Pushgateway to now require job names for compatibility with Gravel Gateway.
- Allow
histogram.startTime()
to be used with exemplars.
- drop support for Node.js versions 10, 12, 14, 17 and 19
- Refactor histogram internals and provide a fast path for rendering metrics to Prometheus strings when there are many labels shared across different values.
- Disable custom content encoding for pushgateway delete requests in order to
avoid failures from the server when using
Content-Encoding: gzip
header. - Refactor
escapeString
helper inlib/registry.js
to improve performance and avoid an unnecessarily complex regex. - Cleanup code and refactor to be more efficient
- Correct TS types for working with OpenMetrics
- Updated Typescript and Readme docs for
setToCurrentTime()
to reflect units as seconds. - Do not ignore error if request to pushgateway fails
- Make sure to reject the request to pushgateway if it times out
- Support for OpenMetrics and Exemplars
- Refactor
getMetricAsPrometheusString
method in theRegistry
class to useArray.prototype.join
instead of loop of string concatenations. - Also use
Array.prototype.map
, and object spread instead of an explicitfor
loop - changed: updated the sample output in
example/default-metrics.js
summary
metrics now has apruneAgedBuckets
config parameter to remove entries without any new values in the lastmaxAgeSeconds
. Default isfalse
(old behavior)
- Add
get
method to type definitions of metric classes
- Increase compatibility with external build system such as
rollup
by making perf_hooks optional in gc.js
-
types: converted all the generic Metric types to be optional
-
The
done()
functions returned bygauge.startTimer()
andsummary.startTimer()
now return the timed duration. Histograms already had this behavior. -
types: fixed type for
registry.getMetricsAsArray()
-
Improve performance of
gague.inc()
andgauge.dec()
by callinghashObject()
once.
-
The
processResources
metric was added, which keeps a track of all sorts of active resources. It consists of the following gauges:nodejs_active_resources
- Number of active resources that are currently keeping the event loop alive, grouped by async resource type.nodejs_active_resources_total
- Total number of active resources. It is supposed to provide the combined result of theprocessHandles
andprocessRequests
metrics along with information about any other types of async resources that these metrics do not keep a track of (like timers).
-
Support gzipped pushgateway requests
- changed: typedef for pushgateway to reflect js implementation.
-
changed:
linearBuckets
does not propagate rounding errors anymore.Fewer bucket bounds will be affected by rounding errors. Histogram bucket labels may change.
6f1f3b2
-
changed: The push gateway methods
pushAdd()
,push()
anddelete()
now return Promises instead of accepting a callback:// Old: gateway.pushAdd({ jobName: 'test' }, (err, resp, body) => {}); // New: gateway .pushAdd({ jobName: 'test' }) .then(({ resp, body }) => {}) .catch(err => {}); // or const { resp, body } = await gateway.pushAdd({ jobName: 'test' });
-
changed: The default
nodejs_eventloop_lag_*
metrics are now reset every time they are observed. This prevents these metrics from "stabilizing" over a long period of time and becoming insensitive to small changes. For more info, see #370.0f444cd
- Add missing
await
/then
s to examples.074f339
- Add missing type declaration for
client.contentType
.3b66641
- Modernize some label processing code.
c9bf1d8
- Don't add event listener to
process
if cluster module is not used. - fix: set labels for default memory metrics on linux.
- fix: fix DEP0152 deprecation warning in Node.js v16+.
- fix: Set aggregation mode for newer event loop metrics. (Fixes #418)
- Improve performance of/reduce memory allocations in Gauge.
- feat: added
zero()
toHistogram
for setting the metrics for a given label combination to zero - fix: allow
Gauge.inc/dec(0)
without defaulting to 1
- fix: push client attempting to write Promise (fixes #390)
- types: improve type checking of labels
- fix: Summary#observe should throw when adding additional labels to labelset (fixes #262)
- feat: added the ability to pass labels as an object to
labels()
andremove()
- Added: More examples with commented output
-
changed: The following functions are now async (return a promise):
registry.metrics()
registry.getMetricsAsJSON()
registry.getMetricsAsArray()
registry.getSingleMetricAsString()
If your metrics server has a line like
res.send(register.metrics())
, you should change it tores.send(await register.metrics())
.Additionally, all metric types now accept an optional
collect
function, which is called when the metric's value should be collected and within which you should set the metric's value. You should provide acollect
function for point-in-time metrics (e.g. current memory usage, as opposed to HTTP request durations that are continuously logged in a histogram). -
changed:
register.clusterMetrics()
no longer accepts a callback; it only returns a promise. -
removed: v12.0.0 added the undocumented functions
registry.registerCollector
andregistry.collectors()
. These have been removed. If you were using them, you should instead provide acollect
function as described above.
- fix: provide nodejs_version_info metric value after calling
registry.resetMetrics()
(#238) - fix: provide process_max_fds metric value after calling
registry.resetMetrics()
- fix: provide process_start_time_seconds metric value after calling
registry.resetMetrics()
- chore: improve performance of
registry.getMetricAsPrometheusString
- chore: refactor metrics to reduce code duplication
- chore: replace
utils.getPropertiesFromObj
withObject.values
- chore: remove unused
catch
bindings - chore: upgrade Prettier to 2.x
- fix: startTimer returns
number
in typescript instead ofvoid
- fix: incorrect typings of `registry.getSingleMetric' (#388)
- chore: stop testing node v13 on CI
- feat: exposed
registry.registerCollector()
andregistry.collectors()
methods in TypeScript declaration - Added: complete working example of a pushgateway push in
example/pushgateway.js
- feat: added support for adding labels to default metrics (#374)
- Added CHANGELOG reminder
- Dropped support for end-of-life Node.js versions 6.x and 8.x
- Dropped the previously deprecated support for positional parameters in constructors, only the config object forms remain.
- Default metrics are collected on scrape of metrics endpoint, not on an
interval. The
timeout
option tocollectDefaultMetrics(conf)
is no longer supported or needed, and the function no longer returns aTimeout
object.
- chore: remove ignored package-lock.json
- fix:
process_max_fds
is process limit, not OS (#314) - Changed
Metric
labelNames & labelValues in TypeScript declaration to a generic typeT extends string
, instead ofstring
- Lazy-load Node.js Cluster module to fix Passenger support (#293)
- fix: avoid mutation bug in
registry.getMetricsAsJSON()
- fix: improve performance of
registry.getMetrics*
- End function of histogram
startTimer
, when invoked returns the number of seconds - chore: reindent package.json
- chore: correct var name in processStartTime
- chore: add test for
process_start_time_seconds
- chore: spelling corrections in README
- feat: implement GC metrics collection without native(C++) modules.
- feat: implement advanced event loop monitoring
- Parameter
compressCount
in Summaries to control compression of data in t-digest. - Compress t-digest in Summaries
- fix: avoid mutation bug in registry
- fix: guard against missing constructor
- Added
timestamps
toggle tocollectDefaultMetrics
options - Export
validateMetricName
nodejs_active_handles
metric to thecollectDefaultMetrics()
. Unlikenodejs_active_handles_total
it split count of active handles by type.nodejs_active_requests
metric to thecollectDefaultMetrics()
. Unlikenodejs_active_requests_total
it split count of active requests by type.
- Check that cluster worker is still connected before attempting to query it for metrics. (#244)
- Added a
remove()
method on each metric type, based on Prometheus "Writing Client Libraries" section on labels
- Updated types for Summary in typescript definition file
- Updated child dependency
merge
patch version to remove vulnerability.
- Added an initial
benchmark
suite which can be run withnpm run benchmarks
. - Add support for sliding windows in Summaries
- Fixed performance by avoiding
Object.assign
on hot paths, as well as mutating objects when appropriate.
- Allow setting Gauge values to NaN, +Inf, and -Inf
- Fixed
histogram
scrape performance by usingacc.push
instead ofacc.concat
. Fixes #216 with #219
- Fixed
processOpenFileDescriptors
metric when no custom config was set
- Added ability to set a name prefix in the default metrics
- Fixed
startTimer
utility to not mutate objects passed asstartLabels
- Fixed
Counter
to validate labels parameter ofinc()
against initial labelset - Fixed
AggregatorFactory
losing the aggregator method of metrics
- Fixed
gauge.setToCurrentTime()
to use seconds instead of milliseconds- This conforms to Prometheus best practices
- Dropped support for node 4
- Fixed issue that
registry.getMetricsAsJSON()
ignores registry default labels
10.2.2 - 2017-11-02
- Fixed invalid
process_virtual_memory_bytes
reported under linux
10.2.1 - 2017-10-27
- Only resolve/reject
clusterMetrics
promise if no callback is provided
10.2.0 - 2017-10-16
- Don't add event listeners if cluster module is not used.
- Fixed issue with counters having extra records when using empty labels
- Added
reset
to Counter and Gauge - Added
resetMetrics
to register to callingreset
of all metric instances
10.1.1 - 2017-09-26
- Update TypeScript definitions and JSDoc comments to match JavaScript sources
- Fix lexical scope of
arguments
in cluster code
10.1.0 - 2017-09-04
- Support aggregating metrics across workers in a Node.js cluster.
10.0.4 - 2017-08-22
- Include invalid values in the error messages
10.0.3 - 2017-08-07
- Added registerMetric to definitions file
- Fixed typing of DefaultMetricsCollectorConfiguration in definitions file
- Don't pass timestamps through to pushgateway by default
10.0.2 - 2017-07-07
- Don't poll default metrics every single tick
10.0.1 - 2017-07-06
- Metrics should be initialized to 0 when there are no labels
10.0.0 - 2017-07-04
- Print deprecation warning when metrics are constructed using non-objects
- Print deprecation warning when
collectDefaultMetrics
is called with a number
- Ability to set default labels by registry
- Allow passing in
registry
as second argument tocollectDefaultMetrics
to use that instead of the default registry
- Convert code base to ES2015 code (node 4)
- add engines field to package.json
- Use object shorthand
- Remove
util-extend
in favor ofObject.assign
- Arrow functions over binding or putting
this
in a variable - Use template strings
prototype
->class
9.1.1 - 2017-06-17
- Don't set timestamps for metrics that are never updated
9.1.0 - 2017-06-07
- Ability to merge registries
- Correct typedefs for object constructor of metrics
9.0.0 - 2017-05-06
- Support for multiple registers
- Support for object literals in metric constructors
- Timestamp support
- Collection of default metrics is now disabled by default. Start collection by
running
collectDefaultMetrics()
.
- Creating metrics with one argument per parameter - use object literals instead.