├── example ├── .env ├── grafana │ ├── config.ini │ ├── provisioning │ │ ├── datasources │ │ │ └── all.yml │ │ └── dashboards │ │ │ └── all.yml │ └── dashboards │ │ └── nodejs-metrics.json ├── screenshots │ ├── event-loop-lag.png │ └── nodejs-dashboard.png ├── timer-create-big-arrays.js ├── timer-big-json.js ├── server-big-json.js ├── load-big-json.js ├── package.json ├── setup.sh ├── README.md ├── metrics.js └── nodejs-dashboard.json ├── LICENSE ├── .gitignore └── README.md /example/.env: -------------------------------------------------------------------------------- 1 | INFLUXDB_URL="http://localhost:8086/write?db=mydb" 2 | METRICS_DB="mydb" 3 | REGION="us-west" -------------------------------------------------------------------------------- /example/grafana/config.ini: -------------------------------------------------------------------------------- 1 | 2 | [paths] 3 | provisioning = /etc/grafana/provisioning 4 | 5 | [server] 6 | enable_gzip = true 7 | -------------------------------------------------------------------------------- /example/screenshots/event-loop-lag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a0viedo/can-you-tell-if-your-node-app-is-healthy/HEAD/example/screenshots/event-loop-lag.png -------------------------------------------------------------------------------- /example/screenshots/nodejs-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a0viedo/can-you-tell-if-your-node-app-is-healthy/HEAD/example/screenshots/nodejs-dashboard.png -------------------------------------------------------------------------------- /example/timer-create-big-arrays.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | setInterval(() => { 4 | Array(10000000).join('a'); 5 | }, 500); 6 | 7 | setInterval(() => { 8 | Array(100000000).join('a'); 9 | }, 3000); 10 | -------------------------------------------------------------------------------- /example/grafana/provisioning/datasources/all.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: InfluxDB 5 | type: influxdb 6 | access: proxy 7 | database: mydb 8 | url: http://nodejs-influx-metrics:8086 9 | isDefault: true -------------------------------------------------------------------------------- /example/timer-big-json.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { load, parse } = require('./load-big-json'); 4 | setInterval(() => { 5 | parse((err, result) => { 6 | if(err) { 7 | throw err; 8 | } 9 | console.log(`${Date.now()} file parsed`); 10 | }); 11 | }, 15000); 12 | -------------------------------------------------------------------------------- /example/grafana/provisioning/dashboards/all.yml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'default' 5 | orgId: 1 6 | folder: '' 7 | type: file 8 | disableDeletion: false 9 | updateIntervalSeconds: 3 #how often Grafana will scan for changed dashboards 10 | options: 11 | path: /var/lib/grafana/dashboards -------------------------------------------------------------------------------- /example/server-big-json.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const http = require('http'); 3 | const { load, parse } = require('.load-big-json'); 4 | 5 | const server = http.createServer((req, res) => { 6 | parse((err, result) => { 7 | if(err) { 8 | return res.end('error'); 9 | } 10 | console.log(`${Date.now()} file parsed`); 11 | res.end(result); 12 | }); 13 | }); -------------------------------------------------------------------------------- /example/load-big-json.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | 5 | function load(cb) { 6 | fs.readFile('/home/fsociety/Documents/dev/event-loop/citylots.json',{ encoding: 'utf8'} ,(err, result) => { 7 | cb(err, result); 8 | }); 9 | } 10 | 11 | function parse(cb) { 12 | load((err, result) => { 13 | if(err) { 14 | return cb(err); 15 | } 16 | cb(null, JSON.parse(result)); 17 | }); 18 | } 19 | 20 | module.exports.load = load; 21 | module.exports.parse = parse; 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "metrics", 3 | "version": "1.0.0", 4 | "description": "Instrument metrics for your Node.js app", 5 | "main": "metrics.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "Alejandro Oviedo ", 11 | "license": "MIT", 12 | "dependencies": { 13 | "blocked": "^1.2.1", 14 | "pidusage": "^2.0.16" 15 | }, 16 | "devDependencies": { 17 | "dotenv": "^6.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /example/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker network create nodejs-metrics > /dev/null 4 | echo 'Initializing InfluxDB...' 5 | docker run -d -p 8086:8086 --net nodejs-metrics --name nodejs-influx-metrics influxdb > /dev/null 6 | # wait for Influx's HTTP API to be ready 7 | sleep .5 8 | echo 'Creating database...' 9 | curl -XPOST 'http://localhost:8086/query' --data-urlencode 'q=CREATE DATABASE "mydb"' &> /dev/null 10 | echo 'Initializing Grafana...' 11 | docker run -d --name=nodejs-grafana-metrics -v $PWD/grafana/config.ini:/etc/grafana/config.ini -v $PWD/grafana/provisioning:/etc/grafana/provisioning -v $PWD/grafana/dashboards:/var/lib/grafana/dashboards --net nodejs-metrics -p 3000:3000 grafana/grafana > /dev/null 12 | 13 | echo 'Configuration is done! Make sure you run `npm link` in this directory and `npm link metrics` in the directory of your app' -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Alejandro Oviedo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # parcel-bundler cache (https://parceljs.org/) 58 | .cache 59 | 60 | # next.js build output 61 | .next 62 | 63 | # nuxt.js build output 64 | .nuxt 65 | 66 | # vuepress build output 67 | .vuepress/dist 68 | 69 | # Serverless directories 70 | .serverless -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | Setup your own metrics configuration! Event loop's metrics included. 2 | 3 | 4 | ## Requirements 5 | - Docker 6 | - Node >= v6 7 | 8 | 9 | ## Setup 10 | Run the following in your terminal 11 | ``` 12 | $ ./setup.sh 13 | ``` 14 | 15 | You should see something like the following 16 | 17 | ``` 18 | Initializing InfluxDB... 19 | Creating database... 20 | Initializing Grafana... 21 | Configuration is done! 22 | ``` 23 | 24 |
25 | Check here for steps on how to do it manually 26 | 27 | 1. Run InfluxDB: 28 | 29 | ``` 30 | docker run -d -p 8086:8086 --net nodejs-metrics --name nodejs-influx-metrics influxdb 31 | ``` 32 | 33 | 2. Initiliaze InfluxDB: 34 | ``` 35 | $ curl -XPOST 'http://localhost:8086/query' --data-urlencode 'q=CREATE DATABASE "mydb"' 36 | ``` 37 | 3. Run Grafana 38 | ``` 39 | $ docker run -d --name=nodejs-grafana-metrics -v $PWD/grafana/config.ini:/etc/grafana/config.ini -v $PWD/grafana/provisioning:/etc/grafana/provisioning -v $PWD/grafana/dashboards:/var/lib/grafana/dashboards --net nodejs-metrics -p 3000:3000 grafana/grafana 40 | ``` 41 | 3. Run `npm link` in this directory and then in your app directory run `npm link metrics` 42 | 4. Run any Node app with metrics enabled: `node -r metrics myapp.js` 43 | 44 |
45 | 46 | 47 | 48 | 49 | You can toggle metrics for a specific process with this command `kill -s USR2 pid`. 50 | 51 | ## Screenshots 52 | ![dashboard](./screenshots/nodejs-dashboard.png) 53 | ![lag](./screenshots/event-loop-lag.png) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Can you tell me if your Node app is healthy? 2 | 3 | > _If you can’t measure it, you can’t improve it_ 4 | 5 | Here you will find some great resources to start with monitoring of Node.js applications. For a demo of a custom instrumentation using InfluxDB and Grafana you can check the [example](./example) directory. 6 | 7 | 8 | ## Talks 9 | - [What the heck is the event loop anyway?][what-the-heck-event-loop] _by Patrick_ 10 | - [Everything You Need to Know About Node.js Event Loop][everything-event-loop-talk] _by Bert Belder_ 11 | - [Into the Loop][in-the-loop] _by Jake Archivald_ 12 | - [Node's Event Loop From the Inside Out][the-event-loop-from-the-inside-out] _by Sam Roberts_ 13 | 14 | ## Blog posts 15 | - [What you should know to really understand the Node.js Event Loop][dkhan-article] - Daniel Khan 16 | - [The Definitive Guide for Monitoring Node.js Applications][monitor-nodejs-risingstack] - RisingStack's blog 17 | - [Node.js Performance Monitoring - Part 3: Debugging the Event Loop][understanding-parts-of-the-event-loop] - NodeSource's blog 18 | - [Don't Block the Event Loop (or the Worker Pool)][dont-block-the-event-loop] - nodejs.org's guides 19 | - [Overview of Blocking vs Non-Blocking][overview-blocking-vs-non-blocking] - nodejs.org's guides 20 | - [The Node.js Event Loop, Timers, and process.nextTick()][the-nodejs-event-loop] - nodejs.org's guides 21 | 22 | ## Packages 23 | - [blocked][blocked]: Check if a node event loop is blocked. 24 | - [under-pressure][under-pressure]: Measure process load with automatic handling of "Service Unavailable" plugin for Fastify. 25 | - [overload-protection][overload-protection]: Load detection and shedding capabilities for http, express, restify, and koa 26 | - [nodejs-dashboard][nodejs-dashboard]: Telemetry dashboard for node.js apps from the terminal 27 | - [node-clinic][node-clinic]: Clinic diagnoses your Node.js performance issues 28 | 29 | 30 | [monitor-nodejs-risingstack]: https://blog.risingstack.com/monitoring-nodejs-applications-nodejs-at-scale/ 31 | [dkhan-article]: https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c 32 | [understanding-parts-of-the-event-loop]: https://nodesource.com/blog/node-js-performance-monitoring-part-3-debugging-the-event-loop/ 33 | [the-event-loop-from-the-inside-out]: https://www.youtube.com/watch?v=P9csgxBgaZ8 34 | [everything-event-loop-talk]: https://www.youtube.com/watch?v=PNa9OMajw9w 35 | [dont-block-the-event-loop]: https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ 36 | [overview-blocking-vs-non-blocking]: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ 37 | [the-nodejs-event-loop]: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ 38 | [nodejs-dashboard]: https://github.com/FormidableLabs/nodejs-dashboard 39 | [blocked]: https://github.com/tj/node-blocked#readme 40 | [under-pressure]: https://github.com/fastify/under-pressure 41 | [overload-protection]: https://github.com/davidmarkclements/overload-protection 42 | [what-the-heck-event-loop]: https://www.youtube.com/watch?v=8aGhZQkoFbQ 43 | [in-the-loop]: https://www.youtube.com/watch?v=cCOL7MC4Pl0 44 | [node-clinic]: https://github.com/nearform/node-clinic 45 | 46 | ## License 47 | [MIT](./LICENSE) -------------------------------------------------------------------------------- /example/metrics.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const http = require('http'); 3 | const url = require('url'); 4 | const fs = require('fs'); 5 | const stream = require('stream'); 6 | const blocked = require('blocked'); 7 | const pidusage = require('pidusage'); 8 | const path = require('path'); 9 | 10 | if (process.env.NODE_ENV === 'dev') { 11 | require('dotenv').config({ 12 | path: path.resolve(__dirname, '.env') 13 | }); 14 | } 15 | 16 | const INFLUXDB_URL = process.env.INFLUXDB_URL; 17 | const METRICS_DATABASE = process.env.METRICS_DB; 18 | const REGION = process.env.REGION; 19 | 20 | function streamify(text) { 21 | const s = new stream.Readable(); 22 | s.push(text); 23 | s.push(null); 24 | return s; 25 | } 26 | 27 | function pushMetric(metricName, value) { 28 | const influxURL = new url.URL(INFLUXDB_URL); 29 | const options = { 30 | protocol: influxURL.protocol, 31 | host: influxURL.hostname, 32 | port: influxURL.port, 33 | path: `${influxURL.pathname}${influxURL.search}`, 34 | method: 'POST' 35 | }; 36 | 37 | streamify(`${metricName},host=${process.pid},region=${REGION} value=${value} ${Date.now() * 1000000}\n`) 38 | .pipe(http.request(options)).on('error', () => {}); 39 | } 40 | 41 | let blockedTimer; 42 | let generalMetricsTimer; 43 | const enableEventLoopMetric = () => { 44 | blockedTimer = blocked(ms => pushMetric('event_loop', ms), { threshold: 1 }); 45 | }; 46 | 47 | const clear = () => { 48 | clearInterval(blockedTimer); 49 | clearInterval(generalMetricsTimer); 50 | }; 51 | 52 | const toggle = () => { 53 | if (process.debugMode === true) { 54 | process.debugMode = false; 55 | clear(); 56 | console.log('[debug] stopped metrics collection'); 57 | } else { 58 | process.debugMode = true; 59 | enableEventLoopMetric(); 60 | enableGenericMetrics(); 61 | console.log('[debug] enabled metrics collection'); 62 | } 63 | }; 64 | 65 | const getMaximumFileDescriptors = () => { 66 | return new Promise((resolve, reject) => { 67 | fs.readFile('/proc/sys/fs/file-max', 'utf8', (err, maxFds) => { 68 | if (err) { 69 | return reject(err); 70 | } 71 | 72 | resolve(Number(maxFds)); 73 | }); 74 | }); 75 | }; 76 | 77 | const getOpenFileDescriptors = () => { 78 | return new Promise((resolve, reject) => { 79 | fs.readdir('/proc/self/fd', (err, list) => { 80 | if (err) { 81 | return reject(err); 82 | } 83 | // Minus 1, as this invocation created one 84 | resolve(list.length - 1); 85 | }); 86 | }); 87 | }; 88 | 89 | const metricsInterval = process.env.METRICS_INTERVAL || 3000; 90 | const enableGenericMetrics = () => { 91 | generalMetricsTimer = setInterval(() => { 92 | pushMetric('uptime', process.uptime()); 93 | pushMetric('active_requests', process._getActiveRequests().length); 94 | pushMetric('active_handlles', process._getActiveHandles().length); 95 | 96 | const mem = process.memoryUsage(); 97 | pushMetric('memory_rss', mem.rss); 98 | pushMetric('memory_heapTotal', mem.heapTotal); 99 | pushMetric('memory_heapUsed', mem.heapUsed); 100 | pushMetric('memory_external', mem.external); 101 | 102 | pidusage(process.pid, (err, stats) => { 103 | if (err) return err; 104 | pushMetric('cpu_usage', stats.cpu); 105 | }); 106 | 107 | pushMetric('nodejs_version', `\"${process.versions.node}\"`); 108 | pushMetric('v8_version', `\"${process.versions.v8}\"`); 109 | getMaximumFileDescriptors().then(res => pushMetric('max_fds', res)); 110 | getOpenFileDescriptors().then(res => pushMetric('open_fds', res)); 111 | }, metricsInterval); 112 | }; 113 | 114 | toggle(); 115 | 116 | process.on('SIGUSR2', toggle); -------------------------------------------------------------------------------- /example/nodejs-dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "__requires": [ 3 | { 4 | "type": "grafana", 5 | "id": "grafana", 6 | "name": "Grafana", 7 | "version": "5.2.3" 8 | }, 9 | { 10 | "type": "panel", 11 | "id": "graph", 12 | "name": "Graph", 13 | "version": "5.0.0" 14 | }, 15 | { 16 | "type": "panel", 17 | "id": "table", 18 | "name": "Table", 19 | "version": "5.0.0" 20 | } 21 | ], 22 | "annotations": { 23 | "list": [ 24 | { 25 | "builtIn": 1, 26 | "datasource": "-- Grafana --", 27 | "enable": true, 28 | "hide": true, 29 | "iconColor": "rgba(0, 211, 255, 1)", 30 | "name": "Annotations & Alerts", 31 | "type": "dashboard" 32 | } 33 | ] 34 | }, 35 | "editable": true, 36 | "gnetId": null, 37 | "graphTooltip": 0, 38 | "id": null, 39 | "links": [], 40 | "panels": [ 41 | { 42 | "aliasColors": {}, 43 | "bars": false, 44 | "dashLength": 10, 45 | "dashes": false, 46 | "datasource": null, 47 | "fill": 1, 48 | "gridPos": { 49 | "h": 8, 50 | "w": 12, 51 | "x": 0, 52 | "y": 0 53 | }, 54 | "id": 40, 55 | "legend": { 56 | "avg": false, 57 | "current": false, 58 | "max": false, 59 | "min": false, 60 | "show": true, 61 | "total": false, 62 | "values": false 63 | }, 64 | "lines": true, 65 | "linewidth": 1, 66 | "links": [], 67 | "nullPointMode": "null", 68 | "percentage": false, 69 | "pointradius": 5, 70 | "points": false, 71 | "renderer": "flot", 72 | "seriesOverrides": [], 73 | "spaceLength": 10, 74 | "stack": false, 75 | "steppedLine": false, 76 | "targets": [ 77 | { 78 | "alias": "$tag_host", 79 | "expr": "", 80 | "format": "time_series", 81 | "groupBy": [ 82 | { 83 | "params": [ 84 | "host" 85 | ], 86 | "type": "tag" 87 | } 88 | ], 89 | "intervalFactor": 1, 90 | "measurement": "cpu_usage", 91 | "orderByTime": "ASC", 92 | "policy": "default", 93 | "refId": "A", 94 | "resultFormat": "time_series", 95 | "select": [ 96 | [ 97 | { 98 | "params": [ 99 | "value" 100 | ], 101 | "type": "field" 102 | } 103 | ] 104 | ], 105 | "tags": [] 106 | } 107 | ], 108 | "thresholds": [], 109 | "timeFrom": null, 110 | "timeShift": null, 111 | "title": "CPU", 112 | "tooltip": { 113 | "shared": true, 114 | "sort": 0, 115 | "value_type": "individual" 116 | }, 117 | "type": "graph", 118 | "xaxis": { 119 | "buckets": null, 120 | "mode": "time", 121 | "name": null, 122 | "show": true, 123 | "values": [] 124 | }, 125 | "yaxes": [ 126 | { 127 | "format": "percent", 128 | "label": null, 129 | "logBase": 1, 130 | "max": null, 131 | "min": null, 132 | "show": true 133 | }, 134 | { 135 | "format": "short", 136 | "label": null, 137 | "logBase": 1, 138 | "max": null, 139 | "min": null, 140 | "show": false 141 | } 142 | ], 143 | "yaxis": { 144 | "align": false, 145 | "alignLevel": null 146 | } 147 | }, 148 | { 149 | "aliasColors": {}, 150 | "bars": true, 151 | "dashLength": 10, 152 | "dashes": false, 153 | "datasource": null, 154 | "fill": 1, 155 | "gridPos": { 156 | "h": 8, 157 | "w": 6, 158 | "x": 12, 159 | "y": 0 160 | }, 161 | "id": 14, 162 | "legend": { 163 | "avg": false, 164 | "current": false, 165 | "max": false, 166 | "min": false, 167 | "show": true, 168 | "total": false, 169 | "values": false 170 | }, 171 | "lines": false, 172 | "linewidth": 1, 173 | "links": [], 174 | "nullPointMode": "null", 175 | "percentage": false, 176 | "pointradius": 5, 177 | "points": false, 178 | "renderer": "flot", 179 | "seriesOverrides": [], 180 | "spaceLength": 10, 181 | "stack": false, 182 | "steppedLine": false, 183 | "targets": [ 184 | { 185 | "alias": "$tag_host", 186 | "expr": "process_open_fds", 187 | "format": "time_series", 188 | "groupBy": [ 189 | { 190 | "params": [ 191 | "host" 192 | ], 193 | "type": "tag" 194 | } 195 | ], 196 | "intervalFactor": 1, 197 | "legendFormat": "{{instance}}", 198 | "measurement": "open_fds", 199 | "orderByTime": "ASC", 200 | "policy": "autogen", 201 | "refId": "A", 202 | "resultFormat": "time_series", 203 | "select": [ 204 | [ 205 | { 206 | "params": [ 207 | "value" 208 | ], 209 | "type": "field" 210 | } 211 | ] 212 | ], 213 | "tags": [] 214 | } 215 | ], 216 | "thresholds": [], 217 | "timeFrom": null, 218 | "timeShift": null, 219 | "title": "Open fds", 220 | "tooltip": { 221 | "shared": true, 222 | "sort": 0, 223 | "value_type": "individual" 224 | }, 225 | "type": "graph", 226 | "xaxis": { 227 | "buckets": null, 228 | "mode": "time", 229 | "name": null, 230 | "show": true, 231 | "values": [] 232 | }, 233 | "yaxes": [ 234 | { 235 | "format": "short", 236 | "label": null, 237 | "logBase": 1, 238 | "max": null, 239 | "min": null, 240 | "show": true 241 | }, 242 | { 243 | "format": "short", 244 | "label": null, 245 | "logBase": 1, 246 | "max": null, 247 | "min": null, 248 | "show": true 249 | } 250 | ], 251 | "yaxis": { 252 | "align": false, 253 | "alignLevel": null 254 | } 255 | }, 256 | { 257 | "aliasColors": {}, 258 | "bars": true, 259 | "dashLength": 10, 260 | "dashes": false, 261 | "datasource": null, 262 | "fill": 1, 263 | "gridPos": { 264 | "h": 8, 265 | "w": 6, 266 | "x": 18, 267 | "y": 0 268 | }, 269 | "id": 20, 270 | "legend": { 271 | "avg": false, 272 | "current": false, 273 | "max": false, 274 | "min": false, 275 | "show": true, 276 | "total": false, 277 | "values": false 278 | }, 279 | "lines": false, 280 | "linewidth": 1, 281 | "links": [], 282 | "nullPointMode": "null", 283 | "percentage": false, 284 | "pointradius": 8, 285 | "points": false, 286 | "renderer": "flot", 287 | "seriesOverrides": [], 288 | "spaceLength": 10, 289 | "stack": false, 290 | "steppedLine": false, 291 | "targets": [ 292 | { 293 | "alias": "$tag_host", 294 | "expr": "nodejs_active_handles_total", 295 | "format": "time_series", 296 | "groupBy": [ 297 | { 298 | "params": [ 299 | "host" 300 | ], 301 | "type": "tag" 302 | } 303 | ], 304 | "intervalFactor": 1, 305 | "legendFormat": "nodejs_active_handles_total-{{instance}}", 306 | "measurement": "active_handlles", 307 | "orderByTime": "ASC", 308 | "policy": "default", 309 | "refId": "A", 310 | "resultFormat": "time_series", 311 | "select": [ 312 | [ 313 | { 314 | "params": [ 315 | "value" 316 | ], 317 | "type": "field" 318 | } 319 | ] 320 | ], 321 | "tags": [] 322 | } 323 | ], 324 | "thresholds": [], 325 | "timeFrom": null, 326 | "timeShift": null, 327 | "title": "Active handles", 328 | "tooltip": { 329 | "shared": true, 330 | "sort": 0, 331 | "value_type": "individual" 332 | }, 333 | "type": "graph", 334 | "xaxis": { 335 | "buckets": null, 336 | "mode": "time", 337 | "name": null, 338 | "show": true, 339 | "values": [] 340 | }, 341 | "yaxes": [ 342 | { 343 | "format": "short", 344 | "label": null, 345 | "logBase": 1, 346 | "max": null, 347 | "min": null, 348 | "show": true 349 | }, 350 | { 351 | "format": "short", 352 | "label": null, 353 | "logBase": 1, 354 | "max": null, 355 | "min": null, 356 | "show": true 357 | } 358 | ], 359 | "yaxis": { 360 | "align": false, 361 | "alignLevel": null 362 | } 363 | }, 364 | { 365 | "aliasColors": {}, 366 | "bars": false, 367 | "dashLength": 10, 368 | "dashes": false, 369 | "datasource": null, 370 | "fill": 1, 371 | "gridPos": { 372 | "h": 8, 373 | "w": 12, 374 | "x": 0, 375 | "y": 8 376 | }, 377 | "id": 34, 378 | "legend": { 379 | "avg": false, 380 | "current": false, 381 | "max": false, 382 | "min": false, 383 | "show": true, 384 | "total": false, 385 | "values": false 386 | }, 387 | "lines": true, 388 | "linewidth": 1, 389 | "links": [], 390 | "nullPointMode": "null", 391 | "percentage": false, 392 | "pointradius": 5, 393 | "points": false, 394 | "renderer": "flot", 395 | "seriesOverrides": [], 396 | "spaceLength": 10, 397 | "stack": false, 398 | "steppedLine": false, 399 | "targets": [ 400 | { 401 | "alias": "$tag_host-external", 402 | "expr": "nodejs_heap_space_size_used_bytes{space=\"new\"}", 403 | "format": "time_series", 404 | "groupBy": [ 405 | { 406 | "params": [ 407 | "host" 408 | ], 409 | "type": "tag" 410 | } 411 | ], 412 | "intervalFactor": 1, 413 | "legendFormat": "{{instance}}-new", 414 | "measurement": "memory_external", 415 | "orderByTime": "ASC", 416 | "policy": "autogen", 417 | "refId": "A", 418 | "resultFormat": "time_series", 419 | "select": [ 420 | [ 421 | { 422 | "params": [ 423 | "value" 424 | ], 425 | "type": "field" 426 | } 427 | ] 428 | ], 429 | "tags": [] 430 | }, 431 | { 432 | "alias": "$tag_host-heapTotal", 433 | "expr": "nodejs_heap_space_size_used_bytes{space=\"old\"}", 434 | "format": "time_series", 435 | "groupBy": [ 436 | { 437 | "params": [ 438 | "host" 439 | ], 440 | "type": "tag" 441 | } 442 | ], 443 | "intervalFactor": 1, 444 | "legendFormat": "{{instance}}-old", 445 | "measurement": "memory_heapTotal", 446 | "orderByTime": "ASC", 447 | "policy": "default", 448 | "refId": "B", 449 | "resultFormat": "time_series", 450 | "select": [ 451 | [ 452 | { 453 | "params": [ 454 | "value" 455 | ], 456 | "type": "field" 457 | } 458 | ] 459 | ], 460 | "tags": [] 461 | }, 462 | { 463 | "alias": "$tag_host-heapUsed", 464 | "expr": "nodejs_heap_space_size_used_bytes{space=\"code\"}", 465 | "format": "time_series", 466 | "groupBy": [ 467 | { 468 | "params": [ 469 | "host" 470 | ], 471 | "type": "tag" 472 | } 473 | ], 474 | "intervalFactor": 1, 475 | "legendFormat": "{{instance}}-code", 476 | "measurement": "memory_heapUsed", 477 | "orderByTime": "ASC", 478 | "policy": "default", 479 | "refId": "C", 480 | "resultFormat": "time_series", 481 | "select": [ 482 | [ 483 | { 484 | "params": [ 485 | "value" 486 | ], 487 | "type": "field" 488 | } 489 | ] 490 | ], 491 | "tags": [] 492 | }, 493 | { 494 | "alias": "$tag_host-rss", 495 | "expr": "nodejs_heap_space_size_used_bytes{space=\"map\"}", 496 | "format": "time_series", 497 | "groupBy": [ 498 | { 499 | "params": [ 500 | "host" 501 | ], 502 | "type": "tag" 503 | } 504 | ], 505 | "intervalFactor": 1, 506 | "legendFormat": "{{instance}}-map", 507 | "measurement": "memory_rss", 508 | "orderByTime": "ASC", 509 | "policy": "default", 510 | "refId": "D", 511 | "resultFormat": "time_series", 512 | "select": [ 513 | [ 514 | { 515 | "params": [ 516 | "value" 517 | ], 518 | "type": "field" 519 | } 520 | ] 521 | ], 522 | "tags": [] 523 | } 524 | ], 525 | "thresholds": [], 526 | "timeFrom": null, 527 | "timeShift": null, 528 | "title": "Memory", 529 | "tooltip": { 530 | "shared": true, 531 | "sort": 0, 532 | "value_type": "individual" 533 | }, 534 | "type": "graph", 535 | "xaxis": { 536 | "buckets": null, 537 | "mode": "time", 538 | "name": null, 539 | "show": true, 540 | "values": [] 541 | }, 542 | "yaxes": [ 543 | { 544 | "format": "decbytes", 545 | "label": null, 546 | "logBase": 1, 547 | "max": null, 548 | "min": null, 549 | "show": true 550 | }, 551 | { 552 | "format": "short", 553 | "label": null, 554 | "logBase": 1, 555 | "max": null, 556 | "min": null, 557 | "show": false 558 | } 559 | ], 560 | "yaxis": { 561 | "align": false, 562 | "alignLevel": null 563 | } 564 | }, 565 | { 566 | "aliasColors": {}, 567 | "bars": true, 568 | "dashLength": 10, 569 | "dashes": false, 570 | "datasource": null, 571 | "fill": 1, 572 | "gridPos": { 573 | "h": 8, 574 | "w": 6, 575 | "x": 12, 576 | "y": 8 577 | }, 578 | "id": 22, 579 | "legend": { 580 | "avg": false, 581 | "current": false, 582 | "max": false, 583 | "min": false, 584 | "show": true, 585 | "total": false, 586 | "values": false 587 | }, 588 | "lines": false, 589 | "linewidth": 1, 590 | "links": [], 591 | "nullPointMode": "null", 592 | "percentage": false, 593 | "pointradius": 5, 594 | "points": false, 595 | "renderer": "flot", 596 | "seriesOverrides": [], 597 | "spaceLength": 10, 598 | "stack": false, 599 | "steppedLine": false, 600 | "targets": [ 601 | { 602 | "alias": "$tag_host", 603 | "expr": "nodejs_active_requests_total", 604 | "format": "time_series", 605 | "groupBy": [ 606 | { 607 | "params": [ 608 | "host" 609 | ], 610 | "type": "tag" 611 | } 612 | ], 613 | "intervalFactor": 1, 614 | "legendFormat": "nodejs_active_requests_total-{{instance}}", 615 | "measurement": "active_requests", 616 | "orderByTime": "ASC", 617 | "policy": "default", 618 | "refId": "A", 619 | "resultFormat": "time_series", 620 | "select": [ 621 | [ 622 | { 623 | "params": [ 624 | "value" 625 | ], 626 | "type": "field" 627 | } 628 | ] 629 | ], 630 | "tags": [] 631 | } 632 | ], 633 | "thresholds": [], 634 | "timeFrom": null, 635 | "timeShift": null, 636 | "title": "Active requests", 637 | "tooltip": { 638 | "shared": true, 639 | "sort": 0, 640 | "value_type": "individual" 641 | }, 642 | "type": "graph", 643 | "xaxis": { 644 | "buckets": null, 645 | "mode": "time", 646 | "name": null, 647 | "show": true, 648 | "values": [] 649 | }, 650 | "yaxes": [ 651 | { 652 | "format": "short", 653 | "label": null, 654 | "logBase": 1, 655 | "max": null, 656 | "min": null, 657 | "show": true 658 | }, 659 | { 660 | "format": "short", 661 | "label": null, 662 | "logBase": 1, 663 | "max": null, 664 | "min": null, 665 | "show": true 666 | } 667 | ], 668 | "yaxis": { 669 | "align": false, 670 | "alignLevel": null 671 | } 672 | }, 673 | { 674 | "columns": [], 675 | "datasource": null, 676 | "fontSize": "100%", 677 | "gridPos": { 678 | "h": 8, 679 | "w": 3, 680 | "x": 18, 681 | "y": 8 682 | }, 683 | "id": 44, 684 | "links": [], 685 | "pageSize": null, 686 | "scroll": true, 687 | "showHeader": true, 688 | "sort": { 689 | "col": 0, 690 | "desc": true 691 | }, 692 | "styles": [ 693 | { 694 | "alias": "Time", 695 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 696 | "pattern": "Time", 697 | "type": "hidden" 698 | }, 699 | { 700 | "alias": "pid", 701 | "colorMode": null, 702 | "colors": [ 703 | "rgba(245, 54, 54, 0.9)", 704 | "rgba(237, 129, 40, 0.89)", 705 | "rgba(50, 172, 45, 0.97)" 706 | ], 707 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 708 | "decimals": 2, 709 | "mappingType": 1, 710 | "pattern": "Metric", 711 | "thresholds": [], 712 | "type": "number", 713 | "unit": "short" 714 | }, 715 | { 716 | "alias": "", 717 | "colorMode": null, 718 | "colors": [ 719 | "rgba(245, 54, 54, 0.9)", 720 | "rgba(237, 129, 40, 0.89)", 721 | "rgba(50, 172, 45, 0.97)" 722 | ], 723 | "decimals": 2, 724 | "pattern": "/.*/", 725 | "thresholds": [], 726 | "type": "number", 727 | "unit": "short" 728 | } 729 | ], 730 | "targets": [ 731 | { 732 | "alias": "$tag_host", 733 | "expr": "", 734 | "format": "table", 735 | "groupBy": [ 736 | { 737 | "params": [ 738 | "host" 739 | ], 740 | "type": "tag" 741 | } 742 | ], 743 | "intervalFactor": 1, 744 | "measurement": "nodejs_version", 745 | "orderByTime": "ASC", 746 | "policy": "autogen", 747 | "refId": "A", 748 | "resultFormat": "time_series", 749 | "select": [ 750 | [ 751 | { 752 | "params": [ 753 | "value" 754 | ], 755 | "type": "field" 756 | } 757 | ] 758 | ], 759 | "tags": [] 760 | } 761 | ], 762 | "title": "Node.js version", 763 | "transform": "timeseries_to_rows", 764 | "type": "table" 765 | }, 766 | { 767 | "columns": [], 768 | "datasource": null, 769 | "fontSize": "100%", 770 | "gridPos": { 771 | "h": 4, 772 | "w": 3, 773 | "x": 21, 774 | "y": 8 775 | }, 776 | "id": 46, 777 | "links": [], 778 | "pageSize": null, 779 | "scroll": true, 780 | "showHeader": true, 781 | "sort": { 782 | "col": 0, 783 | "desc": true 784 | }, 785 | "styles": [ 786 | { 787 | "alias": "Time", 788 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 789 | "pattern": "Time", 790 | "type": "hidden" 791 | }, 792 | { 793 | "alias": "pid", 794 | "colorMode": null, 795 | "colors": [ 796 | "rgba(245, 54, 54, 0.9)", 797 | "rgba(237, 129, 40, 0.89)", 798 | "rgba(50, 172, 45, 0.97)" 799 | ], 800 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 801 | "decimals": 2, 802 | "mappingType": 1, 803 | "pattern": "Metric", 804 | "thresholds": [], 805 | "type": "number", 806 | "unit": "short" 807 | }, 808 | { 809 | "alias": "", 810 | "colorMode": null, 811 | "colors": [ 812 | "rgba(245, 54, 54, 0.9)", 813 | "rgba(237, 129, 40, 0.89)", 814 | "rgba(50, 172, 45, 0.97)" 815 | ], 816 | "decimals": 2, 817 | "link": false, 818 | "pattern": "/.*/", 819 | "thresholds": [], 820 | "type": "number", 821 | "unit": "short" 822 | } 823 | ], 824 | "targets": [ 825 | { 826 | "alias": "$tag_host", 827 | "expr": "", 828 | "format": "table", 829 | "groupBy": [ 830 | { 831 | "params": [ 832 | "host" 833 | ], 834 | "type": "tag" 835 | } 836 | ], 837 | "intervalFactor": 1, 838 | "measurement": "v8_version", 839 | "orderByTime": "ASC", 840 | "policy": "default", 841 | "refId": "A", 842 | "resultFormat": "time_series", 843 | "select": [ 844 | [ 845 | { 846 | "params": [ 847 | "value" 848 | ], 849 | "type": "field" 850 | } 851 | ] 852 | ], 853 | "tags": [] 854 | } 855 | ], 856 | "title": "V8 version", 857 | "transform": "timeseries_to_rows", 858 | "type": "table" 859 | }, 860 | { 861 | "columns": [], 862 | "datasource": null, 863 | "fontSize": "100%", 864 | "gridPos": { 865 | "h": 4, 866 | "w": 3, 867 | "x": 21, 868 | "y": 12 869 | }, 870 | "hideTimeOverride": false, 871 | "id": 42, 872 | "links": [], 873 | "pageSize": null, 874 | "scroll": true, 875 | "showHeader": true, 876 | "sort": { 877 | "col": 0, 878 | "desc": true 879 | }, 880 | "styles": [ 881 | { 882 | "alias": "Time", 883 | "colorMode": null, 884 | "colors": [ 885 | "rgba(245, 54, 54, 0.9)", 886 | "rgba(237, 129, 40, 0.89)", 887 | "rgba(50, 172, 45, 0.97)" 888 | ], 889 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 890 | "decimals": 2, 891 | "mappingType": 1, 892 | "pattern": "Time", 893 | "thresholds": [], 894 | "type": "hidden", 895 | "unit": "short" 896 | }, 897 | { 898 | "alias": "", 899 | "colorMode": null, 900 | "colors": [ 901 | "rgba(245, 54, 54, 0.9)", 902 | "rgba(237, 129, 40, 0.89)", 903 | "rgba(50, 172, 45, 0.97)" 904 | ], 905 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 906 | "decimals": 0, 907 | "mappingType": 1, 908 | "pattern": "Value", 909 | "thresholds": [], 910 | "type": "number", 911 | "unit": "short" 912 | }, 913 | { 914 | "alias": "pid", 915 | "colorMode": null, 916 | "colors": [ 917 | "rgba(245, 54, 54, 0.9)", 918 | "rgba(237, 129, 40, 0.89)", 919 | "rgba(50, 172, 45, 0.97)" 920 | ], 921 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 922 | "decimals": 0, 923 | "mappingType": 1, 924 | "pattern": "Metric", 925 | "thresholds": [], 926 | "type": "number", 927 | "unit": "short" 928 | }, 929 | { 930 | "alias": "", 931 | "colorMode": null, 932 | "colors": [ 933 | "rgba(245, 54, 54, 0.9)", 934 | "rgba(237, 129, 40, 0.89)", 935 | "rgba(50, 172, 45, 0.97)" 936 | ], 937 | "decimals": 2, 938 | "pattern": "/.*/", 939 | "thresholds": [], 940 | "type": "number", 941 | "unit": "short" 942 | } 943 | ], 944 | "targets": [ 945 | { 946 | "alias": "$tag_host", 947 | "expr": "", 948 | "format": "table", 949 | "groupBy": [ 950 | { 951 | "params": [ 952 | "host" 953 | ], 954 | "type": "tag" 955 | } 956 | ], 957 | "intervalFactor": 1, 958 | "measurement": "max_fds", 959 | "orderByTime": "ASC", 960 | "policy": "default", 961 | "refId": "A", 962 | "resultFormat": "time_series", 963 | "select": [ 964 | [ 965 | { 966 | "params": [ 967 | "value" 968 | ], 969 | "type": "field" 970 | } 971 | ] 972 | ], 973 | "tags": [] 974 | } 975 | ], 976 | "title": "Max fds", 977 | "transform": "timeseries_to_rows", 978 | "type": "table" 979 | }, 980 | { 981 | "aliasColors": {}, 982 | "bars": false, 983 | "dashLength": 10, 984 | "dashes": false, 985 | "datasource": null, 986 | "fill": 1, 987 | "gridPos": { 988 | "h": 8, 989 | "w": 15, 990 | "x": 0, 991 | "y": 16 992 | }, 993 | "id": 38, 994 | "legend": { 995 | "alignAsTable": true, 996 | "avg": true, 997 | "current": false, 998 | "hideEmpty": false, 999 | "hideZero": false, 1000 | "max": true, 1001 | "min": false, 1002 | "rightSide": true, 1003 | "show": true, 1004 | "total": false, 1005 | "values": true 1006 | }, 1007 | "lines": true, 1008 | "linewidth": 1, 1009 | "links": [], 1010 | "nullPointMode": "null", 1011 | "percentage": false, 1012 | "pointradius": 5, 1013 | "points": false, 1014 | "renderer": "flot", 1015 | "seriesOverrides": [], 1016 | "spaceLength": 10, 1017 | "stack": false, 1018 | "steppedLine": false, 1019 | "targets": [ 1020 | { 1021 | "alias": "$tag_host", 1022 | "groupBy": [ 1023 | { 1024 | "params": [ 1025 | "host" 1026 | ], 1027 | "type": "tag" 1028 | } 1029 | ], 1030 | "hide": false, 1031 | "limit": "", 1032 | "measurement": "event_loop", 1033 | "orderByTime": "ASC", 1034 | "policy": "autogen", 1035 | "refId": "A", 1036 | "resultFormat": "time_series", 1037 | "select": [ 1038 | [ 1039 | { 1040 | "params": [ 1041 | "value" 1042 | ], 1043 | "type": "field" 1044 | } 1045 | ] 1046 | ], 1047 | "tags": [] 1048 | } 1049 | ], 1050 | "thresholds": [], 1051 | "timeFrom": null, 1052 | "timeShift": null, 1053 | "title": "Event loop lag", 1054 | "tooltip": { 1055 | "shared": true, 1056 | "sort": 0, 1057 | "value_type": "individual" 1058 | }, 1059 | "type": "graph", 1060 | "xaxis": { 1061 | "buckets": null, 1062 | "mode": "time", 1063 | "name": null, 1064 | "show": true, 1065 | "values": [] 1066 | }, 1067 | "yaxes": [ 1068 | { 1069 | "format": "ms", 1070 | "label": null, 1071 | "logBase": 1, 1072 | "max": null, 1073 | "min": null, 1074 | "show": true 1075 | }, 1076 | { 1077 | "format": "short", 1078 | "label": null, 1079 | "logBase": 1, 1080 | "max": null, 1081 | "min": null, 1082 | "show": true 1083 | } 1084 | ], 1085 | "yaxis": { 1086 | "align": false, 1087 | "alignLevel": null 1088 | } 1089 | } 1090 | ], 1091 | "refresh": "1s", 1092 | "schemaVersion": 16, 1093 | "style": "dark", 1094 | "tags": [], 1095 | "templating": { 1096 | "list": [] 1097 | }, 1098 | "time": { 1099 | "from": "now-6h", 1100 | "to": "now" 1101 | }, 1102 | "timepicker": { 1103 | "hidden": false, 1104 | "refresh_intervals": [ 1105 | "1s", 1106 | "5s", 1107 | "10s", 1108 | "30s", 1109 | "1m", 1110 | "5m", 1111 | "10m", 1112 | "1h" 1113 | ], 1114 | "time_options": [ 1115 | "5m", 1116 | "15m", 1117 | "1h", 1118 | "6h", 1119 | "12h", 1120 | "24h", 1121 | "2d", 1122 | "7d", 1123 | "30d" 1124 | ] 1125 | }, 1126 | "timezone": "", 1127 | "title": "Node.js dashboard - kawabonga", 1128 | "uid": "GhUkknhik", 1129 | "version": 17 1130 | } -------------------------------------------------------------------------------- /example/grafana/dashboards/nodejs-metrics.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": "-- Grafana --", 7 | "enable": true, 8 | "hide": true, 9 | "iconColor": "rgba(0, 211, 255, 1)", 10 | "name": "Annotations & Alerts", 11 | "type": "dashboard" 12 | } 13 | ] 14 | }, 15 | "editable": true, 16 | "gnetId": null, 17 | "graphTooltip": 0, 18 | "links": [], 19 | "panels": [ 20 | { 21 | "aliasColors": {}, 22 | "bars": false, 23 | "dashLength": 10, 24 | "dashes": false, 25 | "datasource": null, 26 | "fill": 1, 27 | "gridPos": { 28 | "h": 8, 29 | "w": 12, 30 | "x": 0, 31 | "y": 0 32 | }, 33 | "id": 40, 34 | "legend": { 35 | "avg": false, 36 | "current": false, 37 | "max": false, 38 | "min": false, 39 | "show": true, 40 | "total": false, 41 | "values": false 42 | }, 43 | "lines": true, 44 | "linewidth": 1, 45 | "links": [], 46 | "nullPointMode": "null", 47 | "percentage": false, 48 | "pointradius": 5, 49 | "points": false, 50 | "renderer": "flot", 51 | "seriesOverrides": [], 52 | "spaceLength": 10, 53 | "stack": false, 54 | "steppedLine": false, 55 | "targets": [ 56 | { 57 | "alias": "$tag_host", 58 | "expr": "", 59 | "format": "time_series", 60 | "groupBy": [ 61 | { 62 | "params": [ 63 | "host" 64 | ], 65 | "type": "tag" 66 | } 67 | ], 68 | "intervalFactor": 1, 69 | "measurement": "cpu_usage", 70 | "orderByTime": "ASC", 71 | "policy": "default", 72 | "refId": "A", 73 | "resultFormat": "time_series", 74 | "select": [ 75 | [ 76 | { 77 | "params": [ 78 | "value" 79 | ], 80 | "type": "field" 81 | } 82 | ] 83 | ], 84 | "tags": [] 85 | } 86 | ], 87 | "thresholds": [], 88 | "timeFrom": null, 89 | "timeShift": null, 90 | "title": "CPU", 91 | "tooltip": { 92 | "shared": true, 93 | "sort": 0, 94 | "value_type": "individual" 95 | }, 96 | "type": "graph", 97 | "xaxis": { 98 | "buckets": null, 99 | "mode": "time", 100 | "name": null, 101 | "show": true, 102 | "values": [] 103 | }, 104 | "yaxes": [ 105 | { 106 | "format": "percent", 107 | "label": null, 108 | "logBase": 1, 109 | "max": null, 110 | "min": null, 111 | "show": true 112 | }, 113 | { 114 | "format": "short", 115 | "label": null, 116 | "logBase": 1, 117 | "max": null, 118 | "min": null, 119 | "show": false 120 | } 121 | ], 122 | "yaxis": { 123 | "align": false, 124 | "alignLevel": null 125 | } 126 | }, 127 | { 128 | "aliasColors": {}, 129 | "bars": true, 130 | "dashLength": 10, 131 | "dashes": false, 132 | "datasource": null, 133 | "fill": 1, 134 | "gridPos": { 135 | "h": 8, 136 | "w": 6, 137 | "x": 12, 138 | "y": 0 139 | }, 140 | "id": 14, 141 | "legend": { 142 | "avg": false, 143 | "current": false, 144 | "max": false, 145 | "min": false, 146 | "show": true, 147 | "total": false, 148 | "values": false 149 | }, 150 | "lines": false, 151 | "linewidth": 1, 152 | "links": [], 153 | "nullPointMode": "null", 154 | "percentage": false, 155 | "pointradius": 5, 156 | "points": false, 157 | "renderer": "flot", 158 | "seriesOverrides": [], 159 | "spaceLength": 10, 160 | "stack": false, 161 | "steppedLine": false, 162 | "targets": [ 163 | { 164 | "alias": "$tag_host", 165 | "expr": "process_open_fds", 166 | "format": "time_series", 167 | "groupBy": [ 168 | { 169 | "params": [ 170 | "host" 171 | ], 172 | "type": "tag" 173 | } 174 | ], 175 | "intervalFactor": 1, 176 | "legendFormat": "{{instance}}", 177 | "measurement": "open_fds", 178 | "orderByTime": "ASC", 179 | "policy": "autogen", 180 | "refId": "A", 181 | "resultFormat": "time_series", 182 | "select": [ 183 | [ 184 | { 185 | "params": [ 186 | "value" 187 | ], 188 | "type": "field" 189 | } 190 | ] 191 | ], 192 | "tags": [] 193 | } 194 | ], 195 | "thresholds": [], 196 | "timeFrom": null, 197 | "timeShift": null, 198 | "title": "Open fds", 199 | "tooltip": { 200 | "shared": true, 201 | "sort": 0, 202 | "value_type": "individual" 203 | }, 204 | "type": "graph", 205 | "xaxis": { 206 | "buckets": null, 207 | "mode": "time", 208 | "name": null, 209 | "show": true, 210 | "values": [] 211 | }, 212 | "yaxes": [ 213 | { 214 | "format": "short", 215 | "label": null, 216 | "logBase": 1, 217 | "max": null, 218 | "min": null, 219 | "show": true 220 | }, 221 | { 222 | "format": "short", 223 | "label": null, 224 | "logBase": 1, 225 | "max": null, 226 | "min": null, 227 | "show": true 228 | } 229 | ], 230 | "yaxis": { 231 | "align": false, 232 | "alignLevel": null 233 | } 234 | }, 235 | { 236 | "aliasColors": {}, 237 | "bars": true, 238 | "dashLength": 10, 239 | "dashes": false, 240 | "datasource": null, 241 | "fill": 1, 242 | "gridPos": { 243 | "h": 8, 244 | "w": 6, 245 | "x": 18, 246 | "y": 0 247 | }, 248 | "id": 20, 249 | "legend": { 250 | "avg": false, 251 | "current": false, 252 | "max": false, 253 | "min": false, 254 | "show": true, 255 | "total": false, 256 | "values": false 257 | }, 258 | "lines": false, 259 | "linewidth": 1, 260 | "links": [], 261 | "nullPointMode": "null", 262 | "percentage": false, 263 | "pointradius": 8, 264 | "points": false, 265 | "renderer": "flot", 266 | "seriesOverrides": [], 267 | "spaceLength": 10, 268 | "stack": false, 269 | "steppedLine": false, 270 | "targets": [ 271 | { 272 | "alias": "$tag_host", 273 | "expr": "nodejs_active_handles_total", 274 | "format": "time_series", 275 | "groupBy": [ 276 | { 277 | "params": [ 278 | "host" 279 | ], 280 | "type": "tag" 281 | } 282 | ], 283 | "intervalFactor": 1, 284 | "legendFormat": "nodejs_active_handles_total-{{instance}}", 285 | "measurement": "active_handlles", 286 | "orderByTime": "ASC", 287 | "policy": "default", 288 | "refId": "A", 289 | "resultFormat": "time_series", 290 | "select": [ 291 | [ 292 | { 293 | "params": [ 294 | "value" 295 | ], 296 | "type": "field" 297 | } 298 | ] 299 | ], 300 | "tags": [] 301 | } 302 | ], 303 | "thresholds": [], 304 | "timeFrom": null, 305 | "timeShift": null, 306 | "title": "Active handles", 307 | "tooltip": { 308 | "shared": true, 309 | "sort": 0, 310 | "value_type": "individual" 311 | }, 312 | "type": "graph", 313 | "xaxis": { 314 | "buckets": null, 315 | "mode": "time", 316 | "name": null, 317 | "show": true, 318 | "values": [] 319 | }, 320 | "yaxes": [ 321 | { 322 | "format": "short", 323 | "label": null, 324 | "logBase": 1, 325 | "max": null, 326 | "min": null, 327 | "show": true 328 | }, 329 | { 330 | "format": "short", 331 | "label": null, 332 | "logBase": 1, 333 | "max": null, 334 | "min": null, 335 | "show": true 336 | } 337 | ], 338 | "yaxis": { 339 | "align": false, 340 | "alignLevel": null 341 | } 342 | }, 343 | { 344 | "aliasColors": {}, 345 | "bars": false, 346 | "dashLength": 10, 347 | "dashes": false, 348 | "datasource": null, 349 | "fill": 1, 350 | "gridPos": { 351 | "h": 8, 352 | "w": 12, 353 | "x": 0, 354 | "y": 8 355 | }, 356 | "id": 34, 357 | "legend": { 358 | "avg": false, 359 | "current": false, 360 | "max": false, 361 | "min": false, 362 | "show": true, 363 | "total": false, 364 | "values": false 365 | }, 366 | "lines": true, 367 | "linewidth": 1, 368 | "links": [], 369 | "nullPointMode": "null", 370 | "percentage": false, 371 | "pointradius": 5, 372 | "points": false, 373 | "renderer": "flot", 374 | "seriesOverrides": [], 375 | "spaceLength": 10, 376 | "stack": false, 377 | "steppedLine": false, 378 | "targets": [ 379 | { 380 | "alias": "$tag_host-external", 381 | "expr": "nodejs_heap_space_size_used_bytes{space=\"new\"}", 382 | "format": "time_series", 383 | "groupBy": [ 384 | { 385 | "params": [ 386 | "host" 387 | ], 388 | "type": "tag" 389 | } 390 | ], 391 | "intervalFactor": 1, 392 | "legendFormat": "{{instance}}-new", 393 | "measurement": "memory_external", 394 | "orderByTime": "ASC", 395 | "policy": "autogen", 396 | "refId": "A", 397 | "resultFormat": "time_series", 398 | "select": [ 399 | [ 400 | { 401 | "params": [ 402 | "value" 403 | ], 404 | "type": "field" 405 | } 406 | ] 407 | ], 408 | "tags": [] 409 | }, 410 | { 411 | "alias": "$tag_host-heapTotal", 412 | "expr": "nodejs_heap_space_size_used_bytes{space=\"old\"}", 413 | "format": "time_series", 414 | "groupBy": [ 415 | { 416 | "params": [ 417 | "host" 418 | ], 419 | "type": "tag" 420 | } 421 | ], 422 | "intervalFactor": 1, 423 | "legendFormat": "{{instance}}-old", 424 | "measurement": "memory_heapTotal", 425 | "orderByTime": "ASC", 426 | "policy": "default", 427 | "refId": "B", 428 | "resultFormat": "time_series", 429 | "select": [ 430 | [ 431 | { 432 | "params": [ 433 | "value" 434 | ], 435 | "type": "field" 436 | } 437 | ] 438 | ], 439 | "tags": [] 440 | }, 441 | { 442 | "alias": "$tag_host-heapUsed", 443 | "expr": "nodejs_heap_space_size_used_bytes{space=\"code\"}", 444 | "format": "time_series", 445 | "groupBy": [ 446 | { 447 | "params": [ 448 | "host" 449 | ], 450 | "type": "tag" 451 | } 452 | ], 453 | "intervalFactor": 1, 454 | "legendFormat": "{{instance}}-code", 455 | "measurement": "memory_heapUsed", 456 | "orderByTime": "ASC", 457 | "policy": "default", 458 | "refId": "C", 459 | "resultFormat": "time_series", 460 | "select": [ 461 | [ 462 | { 463 | "params": [ 464 | "value" 465 | ], 466 | "type": "field" 467 | } 468 | ] 469 | ], 470 | "tags": [] 471 | }, 472 | { 473 | "alias": "$tag_host-rss", 474 | "expr": "nodejs_heap_space_size_used_bytes{space=\"map\"}", 475 | "format": "time_series", 476 | "groupBy": [ 477 | { 478 | "params": [ 479 | "host" 480 | ], 481 | "type": "tag" 482 | } 483 | ], 484 | "intervalFactor": 1, 485 | "legendFormat": "{{instance}}-map", 486 | "measurement": "memory_rss", 487 | "orderByTime": "ASC", 488 | "policy": "default", 489 | "refId": "D", 490 | "resultFormat": "time_series", 491 | "select": [ 492 | [ 493 | { 494 | "params": [ 495 | "value" 496 | ], 497 | "type": "field" 498 | } 499 | ] 500 | ], 501 | "tags": [] 502 | } 503 | ], 504 | "thresholds": [], 505 | "timeFrom": null, 506 | "timeShift": null, 507 | "title": "Memory", 508 | "tooltip": { 509 | "shared": true, 510 | "sort": 0, 511 | "value_type": "individual" 512 | }, 513 | "type": "graph", 514 | "xaxis": { 515 | "buckets": null, 516 | "mode": "time", 517 | "name": null, 518 | "show": true, 519 | "values": [] 520 | }, 521 | "yaxes": [ 522 | { 523 | "format": "decbytes", 524 | "label": null, 525 | "logBase": 1, 526 | "max": null, 527 | "min": null, 528 | "show": true 529 | }, 530 | { 531 | "format": "short", 532 | "label": null, 533 | "logBase": 1, 534 | "max": null, 535 | "min": null, 536 | "show": false 537 | } 538 | ], 539 | "yaxis": { 540 | "align": false, 541 | "alignLevel": null 542 | } 543 | }, 544 | { 545 | "aliasColors": {}, 546 | "bars": true, 547 | "dashLength": 10, 548 | "dashes": false, 549 | "datasource": null, 550 | "fill": 1, 551 | "gridPos": { 552 | "h": 8, 553 | "w": 6, 554 | "x": 12, 555 | "y": 8 556 | }, 557 | "id": 22, 558 | "legend": { 559 | "avg": false, 560 | "current": false, 561 | "max": false, 562 | "min": false, 563 | "show": true, 564 | "total": false, 565 | "values": false 566 | }, 567 | "lines": false, 568 | "linewidth": 1, 569 | "links": [], 570 | "nullPointMode": "null", 571 | "percentage": false, 572 | "pointradius": 5, 573 | "points": false, 574 | "renderer": "flot", 575 | "seriesOverrides": [], 576 | "spaceLength": 10, 577 | "stack": false, 578 | "steppedLine": false, 579 | "targets": [ 580 | { 581 | "alias": "$tag_host", 582 | "expr": "nodejs_active_requests_total", 583 | "format": "time_series", 584 | "groupBy": [ 585 | { 586 | "params": [ 587 | "host" 588 | ], 589 | "type": "tag" 590 | } 591 | ], 592 | "intervalFactor": 1, 593 | "legendFormat": "nodejs_active_requests_total-{{instance}}", 594 | "measurement": "active_requests", 595 | "orderByTime": "ASC", 596 | "policy": "default", 597 | "refId": "A", 598 | "resultFormat": "time_series", 599 | "select": [ 600 | [ 601 | { 602 | "params": [ 603 | "value" 604 | ], 605 | "type": "field" 606 | } 607 | ] 608 | ], 609 | "tags": [] 610 | } 611 | ], 612 | "thresholds": [], 613 | "timeFrom": null, 614 | "timeShift": null, 615 | "title": "Active requests", 616 | "tooltip": { 617 | "shared": true, 618 | "sort": 0, 619 | "value_type": "individual" 620 | }, 621 | "type": "graph", 622 | "xaxis": { 623 | "buckets": null, 624 | "mode": "time", 625 | "name": null, 626 | "show": true, 627 | "values": [] 628 | }, 629 | "yaxes": [ 630 | { 631 | "format": "short", 632 | "label": null, 633 | "logBase": 1, 634 | "max": null, 635 | "min": null, 636 | "show": true 637 | }, 638 | { 639 | "format": "short", 640 | "label": null, 641 | "logBase": 1, 642 | "max": null, 643 | "min": null, 644 | "show": true 645 | } 646 | ], 647 | "yaxis": { 648 | "align": false, 649 | "alignLevel": null 650 | } 651 | }, 652 | { 653 | "columns": [], 654 | "datasource": null, 655 | "fontSize": "100%", 656 | "gridPos": { 657 | "h": 8, 658 | "w": 3, 659 | "x": 18, 660 | "y": 8 661 | }, 662 | "id": 44, 663 | "links": [], 664 | "pageSize": null, 665 | "scroll": true, 666 | "showHeader": true, 667 | "sort": { 668 | "col": 1, 669 | "desc": false 670 | }, 671 | "styles": [ 672 | { 673 | "alias": "Time", 674 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 675 | "pattern": "Time", 676 | "type": "hidden" 677 | }, 678 | { 679 | "alias": "pid", 680 | "colorMode": null, 681 | "colors": [ 682 | "rgba(245, 54, 54, 0.9)", 683 | "rgba(237, 129, 40, 0.89)", 684 | "rgba(50, 172, 45, 0.97)" 685 | ], 686 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 687 | "decimals": 2, 688 | "mappingType": 1, 689 | "pattern": "Metric", 690 | "thresholds": [], 691 | "type": "number", 692 | "unit": "short" 693 | }, 694 | { 695 | "alias": "", 696 | "colorMode": null, 697 | "colors": [ 698 | "rgba(245, 54, 54, 0.9)", 699 | "rgba(237, 129, 40, 0.89)", 700 | "rgba(50, 172, 45, 0.97)" 701 | ], 702 | "decimals": 2, 703 | "pattern": "/.*/", 704 | "thresholds": [], 705 | "type": "number", 706 | "unit": "short" 707 | } 708 | ], 709 | "targets": [ 710 | { 711 | "alias": "$tag_host", 712 | "expr": "", 713 | "format": "table", 714 | "groupBy": [ 715 | { 716 | "params": [ 717 | "host" 718 | ], 719 | "type": "tag" 720 | } 721 | ], 722 | "hide": false, 723 | "intervalFactor": 1, 724 | "measurement": "nodejs_version", 725 | "orderByTime": "ASC", 726 | "policy": "autogen", 727 | "query": "SELECT last(\"value\") AS \"alias\" FROM \"autogen\".\"nodejs_version\" WHERE $timeFilter GROUP BY \"host\"", 728 | "rawQuery": false, 729 | "refId": "A", 730 | "resultFormat": "time_series", 731 | "select": [ 732 | [ 733 | { 734 | "params": [ 735 | "value" 736 | ], 737 | "type": "field" 738 | }, 739 | { 740 | "params": [], 741 | "type": "last" 742 | }, 743 | { 744 | "params": [ 745 | "alias" 746 | ], 747 | "type": "alias" 748 | } 749 | ] 750 | ], 751 | "tags": [] 752 | } 753 | ], 754 | "title": "Node.js version", 755 | "transform": "timeseries_to_rows", 756 | "transparent": false, 757 | "type": "table" 758 | }, 759 | { 760 | "columns": [], 761 | "datasource": null, 762 | "fontSize": "100%", 763 | "gridPos": { 764 | "h": 4, 765 | "w": 3, 766 | "x": 21, 767 | "y": 8 768 | }, 769 | "id": 46, 770 | "links": [], 771 | "pageSize": null, 772 | "scroll": true, 773 | "showHeader": true, 774 | "sort": { 775 | "col": 1, 776 | "desc": false 777 | }, 778 | "styles": [ 779 | { 780 | "alias": "Time", 781 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 782 | "pattern": "Time", 783 | "type": "hidden" 784 | }, 785 | { 786 | "alias": "pid", 787 | "colorMode": null, 788 | "colors": [ 789 | "rgba(245, 54, 54, 0.9)", 790 | "rgba(237, 129, 40, 0.89)", 791 | "rgba(50, 172, 45, 0.97)" 792 | ], 793 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 794 | "decimals": 2, 795 | "mappingType": 1, 796 | "pattern": "Metric", 797 | "thresholds": [], 798 | "type": "number", 799 | "unit": "short" 800 | }, 801 | { 802 | "alias": "", 803 | "colorMode": null, 804 | "colors": [ 805 | "rgba(245, 54, 54, 0.9)", 806 | "rgba(237, 129, 40, 0.89)", 807 | "rgba(50, 172, 45, 0.97)" 808 | ], 809 | "decimals": 2, 810 | "link": false, 811 | "pattern": "/.*/", 812 | "thresholds": [], 813 | "type": "number", 814 | "unit": "short" 815 | } 816 | ], 817 | "targets": [ 818 | { 819 | "alias": "$tag_host", 820 | "expr": "", 821 | "format": "table", 822 | "groupBy": [ 823 | { 824 | "params": [ 825 | "host" 826 | ], 827 | "type": "tag" 828 | } 829 | ], 830 | "intervalFactor": 1, 831 | "measurement": "v8_version", 832 | "orderByTime": "ASC", 833 | "policy": "default", 834 | "refId": "A", 835 | "resultFormat": "time_series", 836 | "select": [ 837 | [ 838 | { 839 | "params": [ 840 | "value" 841 | ], 842 | "type": "field" 843 | }, 844 | { 845 | "params": [], 846 | "type": "last" 847 | } 848 | ] 849 | ], 850 | "tags": [] 851 | } 852 | ], 853 | "title": "V8 version", 854 | "transform": "timeseries_to_rows", 855 | "type": "table" 856 | }, 857 | { 858 | "columns": [], 859 | "datasource": null, 860 | "fontSize": "100%", 861 | "gridPos": { 862 | "h": 4, 863 | "w": 3, 864 | "x": 21, 865 | "y": 12 866 | }, 867 | "hideTimeOverride": false, 868 | "id": 42, 869 | "links": [], 870 | "pageSize": null, 871 | "scroll": true, 872 | "showHeader": true, 873 | "sort": { 874 | "col": 1, 875 | "desc": false 876 | }, 877 | "styles": [ 878 | { 879 | "alias": "Time", 880 | "colorMode": null, 881 | "colors": [ 882 | "rgba(245, 54, 54, 0.9)", 883 | "rgba(237, 129, 40, 0.89)", 884 | "rgba(50, 172, 45, 0.97)" 885 | ], 886 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 887 | "decimals": 2, 888 | "mappingType": 1, 889 | "pattern": "Time", 890 | "thresholds": [], 891 | "type": "hidden", 892 | "unit": "short" 893 | }, 894 | { 895 | "alias": "", 896 | "colorMode": null, 897 | "colors": [ 898 | "rgba(245, 54, 54, 0.9)", 899 | "rgba(237, 129, 40, 0.89)", 900 | "rgba(50, 172, 45, 0.97)" 901 | ], 902 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 903 | "decimals": 0, 904 | "mappingType": 1, 905 | "pattern": "Value", 906 | "thresholds": [], 907 | "type": "number", 908 | "unit": "short" 909 | }, 910 | { 911 | "alias": "pid", 912 | "colorMode": null, 913 | "colors": [ 914 | "rgba(245, 54, 54, 0.9)", 915 | "rgba(237, 129, 40, 0.89)", 916 | "rgba(50, 172, 45, 0.97)" 917 | ], 918 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 919 | "decimals": 0, 920 | "mappingType": 1, 921 | "pattern": "Metric", 922 | "thresholds": [], 923 | "type": "number", 924 | "unit": "short" 925 | }, 926 | { 927 | "alias": "", 928 | "colorMode": null, 929 | "colors": [ 930 | "rgba(245, 54, 54, 0.9)", 931 | "rgba(237, 129, 40, 0.89)", 932 | "rgba(50, 172, 45, 0.97)" 933 | ], 934 | "decimals": 2, 935 | "pattern": "/.*/", 936 | "thresholds": [], 937 | "type": "number", 938 | "unit": "short" 939 | } 940 | ], 941 | "targets": [ 942 | { 943 | "alias": "$tag_host", 944 | "expr": "", 945 | "format": "table", 946 | "groupBy": [ 947 | { 948 | "params": [ 949 | "host" 950 | ], 951 | "type": "tag" 952 | } 953 | ], 954 | "intervalFactor": 1, 955 | "measurement": "max_fds", 956 | "orderByTime": "ASC", 957 | "policy": "default", 958 | "refId": "A", 959 | "resultFormat": "time_series", 960 | "select": [ 961 | [ 962 | { 963 | "params": [ 964 | "value" 965 | ], 966 | "type": "field" 967 | }, 968 | { 969 | "params": [], 970 | "type": "last" 971 | } 972 | ] 973 | ], 974 | "tags": [] 975 | } 976 | ], 977 | "title": "Max fds", 978 | "transform": "timeseries_to_rows", 979 | "type": "table" 980 | }, 981 | { 982 | "aliasColors": {}, 983 | "bars": false, 984 | "dashLength": 10, 985 | "dashes": false, 986 | "datasource": null, 987 | "fill": 1, 988 | "gridPos": { 989 | "h": 8, 990 | "w": 15, 991 | "x": 0, 992 | "y": 16 993 | }, 994 | "id": 38, 995 | "legend": { 996 | "alignAsTable": true, 997 | "avg": true, 998 | "current": false, 999 | "hideEmpty": false, 1000 | "hideZero": false, 1001 | "max": true, 1002 | "min": false, 1003 | "rightSide": true, 1004 | "show": true, 1005 | "total": false, 1006 | "values": true 1007 | }, 1008 | "lines": true, 1009 | "linewidth": 1, 1010 | "links": [], 1011 | "nullPointMode": "null", 1012 | "percentage": false, 1013 | "pointradius": 5, 1014 | "points": false, 1015 | "renderer": "flot", 1016 | "seriesOverrides": [], 1017 | "spaceLength": 10, 1018 | "stack": false, 1019 | "steppedLine": false, 1020 | "targets": [ 1021 | { 1022 | "alias": "$tag_host", 1023 | "groupBy": [ 1024 | { 1025 | "params": [ 1026 | "host" 1027 | ], 1028 | "type": "tag" 1029 | } 1030 | ], 1031 | "hide": false, 1032 | "limit": "", 1033 | "measurement": "event_loop", 1034 | "orderByTime": "ASC", 1035 | "policy": "autogen", 1036 | "refId": "A", 1037 | "resultFormat": "time_series", 1038 | "select": [ 1039 | [ 1040 | { 1041 | "params": [ 1042 | "value" 1043 | ], 1044 | "type": "field" 1045 | } 1046 | ] 1047 | ], 1048 | "tags": [] 1049 | } 1050 | ], 1051 | "thresholds": [], 1052 | "timeFrom": null, 1053 | "timeShift": null, 1054 | "title": "Event loop lag", 1055 | "tooltip": { 1056 | "shared": true, 1057 | "sort": 0, 1058 | "value_type": "individual" 1059 | }, 1060 | "type": "graph", 1061 | "xaxis": { 1062 | "buckets": null, 1063 | "mode": "time", 1064 | "name": null, 1065 | "show": true, 1066 | "values": [] 1067 | }, 1068 | "yaxes": [ 1069 | { 1070 | "format": "ms", 1071 | "label": null, 1072 | "logBase": 1, 1073 | "max": null, 1074 | "min": null, 1075 | "show": true 1076 | }, 1077 | { 1078 | "format": "short", 1079 | "label": null, 1080 | "logBase": 1, 1081 | "max": null, 1082 | "min": null, 1083 | "show": true 1084 | } 1085 | ], 1086 | "yaxis": { 1087 | "align": false, 1088 | "alignLevel": null 1089 | } 1090 | } 1091 | ], 1092 | "refresh": "1s", 1093 | "schemaVersion": 16, 1094 | "style": "dark", 1095 | "tags": [], 1096 | "templating": { 1097 | "list": [] 1098 | }, 1099 | "time": { 1100 | "from": "now-5m", 1101 | "to": "now" 1102 | }, 1103 | "timepicker": { 1104 | "hidden": false, 1105 | "refresh_intervals": [ 1106 | "1s", 1107 | "5s", 1108 | "10s", 1109 | "30s", 1110 | "1m", 1111 | "5m", 1112 | "10m", 1113 | "1h" 1114 | ], 1115 | "time_options": [ 1116 | "5m", 1117 | "15m", 1118 | "1h", 1119 | "6h", 1120 | "12h", 1121 | "24h", 1122 | "2d", 1123 | "7d", 1124 | "30d" 1125 | ] 1126 | }, 1127 | "timezone": "", 1128 | "title": "Node.js dashboard", 1129 | "uid": "GhUkknhik", 1130 | "version": 1 1131 | } --------------------------------------------------------------------------------