• Stars
    star
    319
  • Rank 131,491 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 7 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Detects node eventloop block and reports where it started

blocked-at Build Status

Detects slow synchronous execution and reports where it started.

Installation

Requires Node 8+

$ npm install blocked-at

Usage

blocked((time, stack) => {
  console.log(`Blocked for ${time}ms, operation started here:`, stack)
})

Description

The blocked() function reports every value over the configured threshold (defaults to 20ms). Usage is similar to blocked but the detection mechanism is different, to allow pointing to the slow function.

It uses Async Hooks to measure the time and generate the stack trace. Stack trace will point to the beginning of an asynchronously called function that contained the long operation.

Run tests (npm test) to see examples.

There's a performance cost to enabling Async Hooks. It's recommended to detect blocking exists with something without the performance overhead and use blocked-at in testing environment to pinpoint where the slowdown happens. Rule of thumb is you should not be running this in production unless desperate.

Params and return value

const blocked = require('blocked-at')
const { stop } = blocked(fn, options)
  • fn: The callback function to execute when a function called asynchronously ran more than threshold. Two arguments are passed: time it measured and an array of stack frames (callstack)
  • options: Optional.
option default description
trimFalsePositives falsy eliminate a class of false positives (experimental)
threshold 20 minimum miliseconds of blockage to report. supported for parity with blocked
resourcesCap undefined maximum amount of stack traces with resource details kept in memory. Resources are not saved by default. see the next section for details
debug falsy print debug data to console

Returns: An object with stop method. stop() will disable the async hooks set up by this library and callback will no longer be called.

Using the stack trace

The stack trace is pointing to a start of a function called asynchronously, so in most cases the first stack frame pointing to your code is where you need to start analyzing all synchronous operations to find the slow one.

In some cases your code is not directly called and tracking it down will still be difficult. See how the http test case produces a stack pointing to Server.connectionListener as the slow function, because everything inside of it is synchronously called. You can always wrap your handlers' code in setImmediate if you become desperate. Or use resources.

Using the resource details

If you can't narrow down a blocking call to a particular function, you can try to use resourcesCap option and inspect an associated resource:

blocked((time, stack, {type, resource}) => {
 console.log(`Blocked for ${time}ms, operation started here:`, stack)
 if (type === 'HTTPPARSER' && resource) {
   // resource structure in this example assumes Node 10.x
   console.log(`URL related to blocking operation: ${resource.resource.incoming.url}`)
 }
}, {resourcesCap: 100})

Note that resource structure is a subject to change and may vary between Node versions.

Warning: Exposing resource details has a significant memory overhead, to the point of crashing the entire application due to exceeding heap limit. This is why resourcesCap is a number - it specifies the maximum amount of resources with details kept in memory. If this number is exceeded at runtime, you'll still get the information about blocked event loop, but resource will be undefined. Adjust it according to your needs. You can start arbitrarily with a 100 and decrease it if it's consuming too much memory or increase it if you don't see the details when you need them.

License

MIT

More Repositories

1

xhr

A small xhr wrapper
JavaScript
804
star
2

insertionQuery

Non-dom-event way to catch nodes showing up. And it uses selectors.
JavaScript
190
star
3

npm-audit-resolver

JavaScript
121
star
4

node-example-flamegraph

Shell
66
star
5

can-i-ignore-scripts

JavaScript
56
star
6

debugging-aid

Experimental tools for debugging Node.js apps without pausing
JavaScript
54
star
7

builder4impress

A tool to build slides in impress.js in a WYSIWYG manner
JavaScript
36
star
8

node-diagnostics-howtos

23
star
9

handsfreeyoutube

no hands and no eyes youtube experience
JavaScript
23
star
10

backbone-redux-migrator

Lets Backbone and Redux apps coexist, so you don't have to rewrite everything at once
JavaScript
23
star
11

https-proxy-cli

One command to run a local https server proxying to local http
JavaScript
20
star
12

naughty-images

SVG Images with XSS in them
C
17
star
13

safe-memory-cache

Secure and size-limited in-memory cache for node.js
JavaScript
14
star
14

node-example-heapdump

JavaScript
14
star
15

js-training-examples

Examples for JS trainings
JavaScript
13
star
16

CSP-exercise

JavaScript
12
star
17

strongly-typed

Strongly typed javascript objects, self-validating, detailed error reports
JavaScript
11
star
18

aframe-point-component

implements a-point based on THREE.js point object
JavaScript
11
star
19

naugtur.github.com

HTML
9
star
20

overlord.js

Mediator pattern taken to the limits. Can do more than just PubSub
JavaScript
9
star
21

secure-dependencies

Creates a tarball of your app dependencies checked with node security platform
JavaScript
8
star
22

lavalab

JavaScript
8
star
23

google-pubsub-mock

Transparently overrides @googlecloud/pub-sub for local testing
JavaScript
8
star
24

ripper

Ripper.js - copy fragments of DOM and insert to another document preserving the CSS styles of elements
JavaScript
8
star
25

jQuery-Mobile-dictionary

Community jquerymobile documentation in a handy form
JavaScript
8
star
26

meetjs.pl

Official meet.js website
TypeScript
5
star
27

node-examples

examples for node trainings
HTML
4
star
28

axons.js

A communication channel you always wanted instead of pub-sub
JavaScript
4
star
29

extendable-module

Extendable Revealing Module - lets you extend the private parts [ seriously ;) ]
JavaScript
4
star
30

research

Rabbit-holes and wild-goose chases.
JavaScript
3
star
31

git-livecoding

a tool to show commits from history as if they were about to be made
Shell
3
star
32

promise-blocked

Detect which function blocks your eventloop
JavaScript
3
star
33

human-redux-reactor

JavaScript
3
star
34

transitionrunner

tiny bit of javascript enabling CSS-defined animations with fallback for older browsers
JavaScript
3
star
35

csp-report-lite

JavaScript
3
star
36

selfexplanatory.js

Make your functions and methods self-explanatory with this simple wrapper
JavaScript
3
star
37

request-dependency

Requesting dependencies instead of DI
JavaScript
2
star
38

selfaware

A bind function for all the methods at once
JavaScript
2
star
39

package-firewall

An experimental package network access control tool
JavaScript
2
star
40

audit-resolve-core

Core modules for audit-resolve.json file and logic of its processing
JavaScript
1
star
41

js-memory-demo

Simple tests demonstrating memory impact of certain bits of code
JavaScript
1
star
42

alphabet-game

HTML
1
star
43

training-notes

HTML
1
star
44

podcastmaker-cli

a pile of bash tricks for unattended audio editing
Shell
1
star
45

node-example-websec

Example app for learning websecurity fundamentals
HTML
1
star
46

redux-request-generator

no-boilerplate http requests from redux apps
JavaScript
1
star
47

i-run-code-from-the-internet

1
star
48

debugging-tools-livecoding

1
star
49

bootstrap-prototyping

tiny introduction to prototyping with bootstrap - for UX designers
CSS
1
star
50

aframe-livereload-image

JavaScript
1
star