npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

tipoff

v0.0.14

Published

TipOff is a program that monitors websites and notifies you when they go down by emailing a Down Report. It creates detailed logs that include errors, website uptimes/downtimes, and operational statistics.

Downloads

22

Readme

#TipOff TipOff is a program that monitors websites and notifies you when they go down by emailing a Down Report. It creates detailed logs that include errors, website uptimes/downtimes, and operational statistics.

The following features are supported:

  • Monitoring websites via HTTP/HTTPS
  • POST & GET requests
  • Multiple checks per website
  • Response pattern matching
  • API for deployment via HTTP/HTTPS
  • Nag Report emails for extended website downtimes
  • Monitoring websites with self-signed certificates

#Installation

npm install -g tipoff

(if you get any errors installing TipOff, make sure that you have the latest version of npm)

#Execution TipOff is started on the command line by running:

  • node /usr/local/lib/node_modules/tipoff/app.js --configPath <path> OR

  • node /usr/local/lib/node_modules/tipoff/server.js --configPath <path>, which uses forever-monitor to run TipOff continously (aka forever).

<path> is the path to directory that contains only TipOff config files, viz.:

  • apiConfig.js
  • config.js
  • loggingConfig.js
  • monitorConfig.js
  • notifierConfig.js
  • serverConfig.js

(see Config Examples)

#Config Files There are 6 config files: monitorConfig, notifierConfig, apiConfig, config, loggingConfig, & serverConfig.

1. monitorConfig is the config file of the monitoring function in which the following are specified in the defaults and/or in an array of monitored websites:

  • name is the name of the website being monitored.

  • url is the url of the website being monitored.

  • sampleRate is the rate in seconds that the website will be monitored. For example, a value of 30 means that the website will be checked every 30 seconds.

  • maxResponseTime is the amount of time in seconds that if the website has not responded by, it is considered down and a timeout error will be logged.

  • attempts is the number of times a website is accessed before an error is logged.

  • patterns are regular expressions that if the website's response matches, it is considered down and a bad patterns error will be logged.

  • post is the form data that will be posted.

  • httpOptions are additional http request options. The most useful ones are ca and headers. Most of the options will be supplied by TipOff based on the website url.

2. notifierConfig is the config file of the notification function in which the following are specified:

  • intervalTimerFreq is the frequency in seconds that Down Reports will be sent. A new Down Report will be sent if at least one of the websites is still down and the up/down status of a website has changed.

    • A Down Report is an email that contains which websites are down and what has changed since the last Down Report was sent.

    • An Up Report will be sent when all of the websites come back up.

  • nagIntervalTimerFreq is the frequency in seconds that Nag Reports will be sent as a reminder if none of the website statuses have changed.

    • A Nag Report is identical to the last sent Down Report
  • transport is used to send emails via Nodemailer. host, port, & auth OR service and auth must be specified.

  • mailOptions only requires from and to. Do not specify subject or text. They will be supplied by TipOff at runtime.

3. apiConfig is the config file of the API web server in which port & options are specified.

  • If no options are specified, an http server will be created. At least key & cert must be specified in options to create an https server (ca can be added if you want to use a self-signed certificate).

4. config is the main config file in which the following is specified:

  • statsFreq is the frequency in seconds that the operational statistics will be logged.

5. loggingConfig is the config file of the loggers, which were created with log4js.

  • A file appender and an Error Report can be configured (see the corresponding example below).

  • I suggest reading the configuration section of the log4js documentation to better understand how to configure loggingConfig.

6. serverConfig is the config file of the server in which pidFile, logFile, outFile, errFile, watch, and watchDirectory are specified.

  • If you decide to run server.js instead of app.js, I suggest reading the forever-monitor to better understand how to configure serverConfig.
var fs = require('fs'); // file system

module.exports = {
	defaults: { // applies sampleRate, maxResponseTime, and attempts if not specified
		sampleRate: 20, // in seconds
		maxResponseTime: 10, // in seconds
		attempts: 2
	},
	websites: [
		{
			name: 'Website',
			url: 'https://website.com/path',
			patterns: [
				/invalid user or password/i
			],
			post: {
				user: 'Joe',
				password: 'Mama'
			}
		},
		{
			name: 'Website Self-Signed',
			url: 'https://localhost:8443/path?query=1&sort=descending',
			sampleRate: 20, // in seconds
			maxResponseTime: 5, // in seconds
			patterns: [
				/exception/i
			],
			httpOptions: {
				ca: [fs.readFileSync('caCert.pem')] // returns contents of the file
			}
		},
		{
			name: 'Facebook',
			url: 'http://www.facebook.com',
			sampleRate: 20, // in seconds
			maxResponseTime: 5, // in seconds
			attempts: 3,
			patterns: [
				/error/i,
				/not found/i
			],
			httpOptions: {
				headers: {
					// make facebook think this request is coming from a browser so it will serve the correct page
					// otherwise facebook serves a blank page
					'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'
				}
			}
		}
	]
};

2. notifierConfig example:

var config = {
	intervalTimerFreq: 30, // in seconds
	nagIntervalTimerFreq: 3600, // in seconds
	transport: {
		service: 'gmail',
		auth: {
			user: '[email protected]',
			pass: 'password'
		}
	},
	mailOptions: {
		from: '[email protected]',
		to: ['[email protected]', '[email protected]']
	}
};


module.exports = config;

3. apiConfig example:

// var fs = require('fs'); // filesystem

module.exports = {
	port: 8080,
	options: {
	//	fs.readFileSync returns contents of the file
		//	key: fs.readFileSync('serverPrivateKey.pem'),
		//	cert: fs.readFileSync('serverCert.pem'),
		//	ca: fs.readFileSync('caCert.pem')
	}
};

4. config example:

module.exports = {
	statsFreq: 0.25 * 60 // in seconds
};

5. loggingConfig example:

module.exports = {
	appenders: [
		{
			// writes all logs to a log file
			type: 'file',
			filename: '/tmp/test.log', // path to log file
			maxLogSize: 20 * 1024 * 1024,
			backups: 3
		},
		{
			// will only send emails for errors
			type: 'logLevelFilter',
			level: 'ERROR',
			appender: {
				type: 'smtp',
				sender: '[email protected]',
				recipients: ['[email protected]', '[email protected]'],
				subject: 'TipOff: Error Report',
				transport: {
					service: 'gmail',
					auth: {
						user: '[email protected]',
						pass: 'password'
					}
				}
			}
		}
	]
};

6. serverConfig example:

module.exports = {
	pidFile: '/tmp/forever.pid',
	logFile: '/tmp/forever.log',
	outFile: '/tmp/forever.out',
	errFile: '/tmp/forever.err',
	watch: true,
	watchDirectory: '/tmp/TipOff.watch'
};

#API Two requests are supported by the API: startGrace and stopGrace. A client must give the API an HTTP or HTTPS GET request to start or stop a grace period.

  • A grace period is the amount of time in minutes that TipOff stops monitoring a specified website so that reports will not be sent even if it goes down. This is useful during website redeployment.

##startGrace The following URL starts a grace period for myWebsite for a period of 5 minutes:

  • https://localhost:8443/startGrace?website=myWebsite&period=5

This example assumes that the API is an HTTPS server i.e. options were specified in the apiConfig and that TipOff is running on the local machine on port 8443.

##stopGrace The following URL stops a grace period for myWebsite:

  • http://localhost:8080/stopGrace?website=myWebsite

This example assumes that the API is an HTTP server i.e. no options were specified in the apiConfig and that TipOff is running on the local machine on port 8080.

#Contact

Send comments and questions to [email protected].