apm-agent-nodejs
beeline-nodejs
Our great sponsors
apm-agent-nodejs | beeline-nodejs | |
---|---|---|
5 | 2 | |
565 | 53 | |
0.4% | - | |
9.6 | 6.7 | |
6 days ago | about 1 month ago | |
JavaScript | JavaScript | |
BSD 2-clause "Simplified" License | Apache License 2.0 |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
apm-agent-nodejs
-
How to auto-instrument your applications
Most popular packages are auto-instrumented, and you can take a look on all supported modules here
-
A shallow dive into auto-instrumenting Node.js applications with Elastic APM
The Redis instrumentation wraps the RedisClient.prototype.internal_send_command method so that any new clients will automatically start spans before sending any commands.
beeline-nodejs
-
Using ES Modules (ESM) in Node.js: A Practical Guide (Part 1)
I find using ES Modules in Node.js to be full of gotchas and anti-patterns - sticking with CommonJS seems more functional in most cases.
1: With ES Modules, imports are asynchronous.
Synchronous imports are incredibly powerful. You can ensure that your application doesn't block on first requests, but instead on load. Initializing connection pools, setting up caches, etc.
You'll also find quite a few packages in NPM that explicitly depend on require over import just so that they can perform the bindings they have to before things get going (see https://www.npmjs.com/package/honeycomb-beeline as an example).
2: With ES Modules imports are commonly destructured.
I know it makes your code feel lighter to have const { add } = import("whatever"); - but as your files grow larger, and those imports start to become complicated bits for middleware or other features, you're just making it more difficult for future maintainers to figure out what those functions mean. A bit of context never hurt anybody, and for my money I'll be that this:
app.use(check);
is not nearly as useful as
app.use(Validator.check);
The example may be contrived - but 9/10 times I find this makes code better than the alternative.
All of these arguments go out the door for Frontend work - that's a totally different terrain. I think one of the big arguments is that developers want to use the exact same JavaScript on frontend and Node applications - but that's an argument unwilling to admit the fact that they're two very different tasks. :)
-
A shallow dive into auto-instrumenting Node.js applications with Elastic APM
An even better option is auto-instrumentation, where the APM library automatically identifies the libraries you use and track the operations you do with them. This is how Elastic APM works. Honeycomb's Beeline, DataDog's dd-trace and the OpenTelemetry Node.js client also provide automatic instrumentation. Of course, "operations" don't only happen when you interact with other libraries, so these libraries still let you manually add spans.
What are some alternatives?
appmetrics - Node Application Metrics provides a foundational infrastructure for collecting resource and performance monitoring data for Node.js-based applications.
TypeScript - TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
jaeger-ui - Web UI for Jaeger
require-in-the-middle - Module to hook into the Node.js require function
opentracing-javascript - OpenTracing API for Javascript (both Node and browser). 🛑 This library is DEPRECATED! https://github.com/opentracing/specification/issues/163
zipkin-js - Zipkin instrumentation for Node.js and browsers
kloi - kloi is a tiny toolkit for building simple static sites.
dora-metrics - Small backend project to calculate DORA Metrics
apm-server - APM Server
apm-agent-dotnet - Elastic APM .NET Agent