Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation


PM2 programmatic integration



PMX allows you to create advanced interactions with PM2 and Keymetrics.io.

Table of Contents

Installation

Install pmx with npm:

$ npm install pmx --save

Expose Metrics: Measure anything

PMX allows you to expose code metrics from your code to the PM2 monit command or the Keymetrics Dashboard, in realtime and over time.

4 measurements are available:

  • Simple metrics: Values that can be read instantly
    • eg. Monitor variable value
  • Counter: Things that increment or decrement
    • eg. Downloads being processed, user connected
  • Meter: Things that are measured as events / interval
    • eg. Request per minute for a http server
  • Histogram: Keeps a reservoir of statistically relevant values biased towards the last 5 minutes to explore their distribution
    • eg. Monitor the mean of execution of a query into database

Metric: Simple value reporting

This allow to expose values that can be read instantly.

varprobe=pmx.probe();// Here the value function will be called each second to get the value// returned by Object.keys(users).lengthvarmetric=probe.metric({name : 'Realtime user',value : function(){returnObject.keys(users).length;}});// Here we are going to call valvar.set() to set the new valuevarmetric_2=probe.metric({name : 'Realtime Value'});metric_2.set(23);

Options

  • name: Probe name
  • value: (optional) function that allows to monitor a global variable

Counter: Sequential value change

Things that increment or decrement.

varprobe=pmx.probe();// The counter will start at 0varcounter=probe.counter({name : 'Current req processed'});http.createServer(function(req,res){// Increment the counter, counter will eq 1counter.inc();req.on('end',function(){// Decrement the counter, counter will eq 0counter.dec();});});

Options

  • name: Probe name

Meter: Average calculated values

Things that are measured as events / interval.

varprobe=pmx.probe();varmeter=probe.meter({name : 'req/sec',samples : 1// This is per second. To get per min set this value to 60});http.createServer(function(req,res){meter.mark();res.end({success:true});});

Options

  • name: Probe name
  • samples: (optional)(default: 1) Rate unit. Defaults to 1 sec.
  • timeframe: (optional)(default: 60) timeframe over which events will be analyzed. Defaults to 60 sec.

Histogram

Keeps a resevoir of statistically relevant values biased towards the last 5 minutes to explore their distribution.

varprobe=pmx.probe();varhistogram=probe.histogram({name : 'latency',measurement : 'mean'});varlatency=0;setInterval(function(){latency=Math.round(Math.random()*100);histogram.update(latency);},100);

Options

  • name: Probe name
  • agg_type : (optional)(default: none) Can be sum, max, min, avg (default) or none. It will impact the way the probe data are aggregated within the Keymetrics backend. Use none if this is irrelevant (eg: constant or string value).
  • alert : (optional)(default: null) For Meter and Counter probes. Creates an alert object (see below).

Expose Functions: Trigger Functions remotely

Remotely trigger functions from Keymetrics. These metrics takes place in the main Keymetrics Dashboard page under the Custom Action section.

Simple actions

Simple action allows to trigger a function from Keymetrics. The function takes a function as a parameter (reply here) and need to be called once the job is finished.

Example:

varpmx=require('pmx');pmx.action('db:clean',function(reply){clean.db(function(){/** * reply() must be called at the end of the action */reply({success : true});});});

Scoped actions (beta)

Scoped Actions are advanced remote actions that can be also triggered from Keymetrics.

Two arguments are passed to the function, data (optional data sent from Keymetrics) and res that allows to emit log data and to end the scoped action.

Example:

pmx.scopedAction('long running lsof',function(data,res){varchild=spawn('lsof',[]);child.stdout.on('data',function(chunk){chunk.toString().split('\n').forEach(function(line){res.send(line);// This send log to Keymetrics to be saved (for tracking)});});child.stdout.on('end',function(chunk){res.end('end');// This end the scoped action});child.on('error',function(e){res.error(e);// This report an error to Keymetrics});});

Alert System for Custom Metrics

(Specific to Keymetrics)

This alert system can monitor a Probe value and launch an exception when hitting a particular value.

Example for a cpu_usage variable:

varmetric=probe.metric({name : 'CPU usage',value : function(){returncpu_usage;},alert : {mode : 'threshold',value : 95,msg : 'Detected over 95% CPU usage',// optionalfunc : function(){//optionalconsole.error('Detected over 95% CPU usage');},cmp : "<"// optional}});

Options

  • mode : threshold, threshold-avg.
  • value : Value that will be used for the exception check.
  • msg : String used for the exception.
  • func : optional. Function declenched when exception reached.
  • cmp : optional. If current Probe value is not <, >, = to Threshold value the exception is launched. Can also be a function used for exception check taking 2 arguments and returning a bool.
  • interval : optional, threshold-avg mode. Sample length for monitored value (180 seconds default).
  • timeout : optional, threshold-avg mode. Time after which mean comparison starts (30 000 milliseconds default).

Report Alerts: Errors / Uncaught Exceptions

(Specific to Keymetrics)

By default once PM2 is linked to Keymetrics, you will be alerted of any uncaught exception. These errors are accessible in the Issue tab of Keymetrics.

Custom alert notification

If you need to alert about any critical errors you can do it programmatically:

varpmx=require('pmx');pmx.notify({success : false});pmx.notify('This is an error');pmx.notify(newError('This is an error'));

Add Verbosity to an Alert: Express Error handler

When an uncaught exception is happening you can track from which routes it has been thrown. To do that you have to attach the middleware pmx.expressErrorHandler at then end of your routes mounting:

varpmx=require('pmx');// All my routesapp.get('/'...);app.post(...);// All my routes// Here I attach the middleware to get more verbosity on exception thrownapp.use(pmx.expressErrorHandler());

Emit Events

Emit events and get historical and statistics. This is available in the Events page of Keymetrics.

varpmx=require('pmx');pmx.emit('user:register',{user : 'Alex registered',email : 'thorustor@gmail.com'});

Application level network traffic monitoring / Display used ports

You can monitor the network usage of a specific application by adding the option network: true when initializing PMX. If you enable the flag ports: true when you init pmx it will show which ports your app is listenting on.

These metrics will be shown in the Keymetrics Dashboard in the Custom Metrics section.

Example:

pmx.init({[...]network : true,// Allow application level network monitoringports : true// Display ports used by the application});

Advanced PMX configuration

varpmx=require('pmx').init({network : true,// (default: false) Network monitoring at the application levelports : true,// (default: false) Shows which ports your app is listening on// can be 'express', 'hapi', 'http', 'restify'excludedHooks: []});

License

MIT

GA

About

(DEPRECATED) use @pm2/io instead (drop-in replacement) https://github.com/keymetrics/pm2-io-apm

Topics

Resources

Stars

264 stars

Watchers

17 watching

Forks

Releases

Packages

Used by

Contributors

Languages