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

enhanced-express-monitor

v1.0.3

Published

Enhanced Express Status Monitor with database logging

Downloads

43

Readme

enhanced-express-monitor

enhanced-express-monitor on npm npm Open Source Helpers

Enhanced version of express-status-monitor with database logging capabilities using Prisma and SQL Server.

Monitoring Page

Installation & setup

  1. Run npm install enhanced-express-monitor --save
  2. Before any other middleware or router add following line: app.use(require('enhanced-express-monitor')());
  3. Run server and go to /status

Note: This plugin works on Node versions >= 12.x

Database Setup

This package includes database logging using Prisma with SQL Server. Follow these steps to set up:

  1. In your main project, create a .env file in the root directory if it doesn't exist already. Add the following line, replacing the placeholders with your actual database details:

    DATABASE_URL="sqlserver://localhost:1433;database=your_database;user=your_username;password=your_password;trustServerCertificate=true"
  2. In your main project's root directory, create a prisma folder if it doesn't exist. Inside this folder, create a schema.prisma file with the following content:

    datasource db {
      provider = "sqlserver"
      url      = env("DATABASE_URL")
    }
    
    generator client {
      provider = "prisma-client-js"
    }
    
    model StatusLog {
      id        Int      @id @default(autoincrement())
      timestamp DateTime
      cpuCount  Int
      memory    Float
      pid       Int
      ppid      Int
      ctime     BigInt
      elapsed   Float
      load1     Float
      load5     Float
      load15    Float
      heapTotal BigInt
      heapUsed  BigInt
      response2xx Int
      response3xx Int
      response4xx Int
      response5xx Int
      responseMean Float
      createdAt DateTime @default(now())
    }
  3. In your main project's root directory, run the following commands:

    npx prisma generate
    npx prisma db push

    This will generate the Prisma client and create the necessary table in your database.

Usage

In your main project, initialize the middleware in your Express app:

const express = require('express');
const statusMonitor = require('enhanced-express-monitor');

const app = express();

app.use(statusMonitor({
  path: '/status',
  databaseLoggingInterval: 60 // Log to database every 60 seconds
}));

// ... rest of your Express app setup

Make sure your SQL Server instance is running and accessible before starting your application.

Viewing Status

Once your app is running, you can view the status page by navigating to the path you specified (e.g., http://localhost:3000/status).

Run examples

  1. Go to cd examples/
  2. Run npm i
  3. Run server npm start
  4. Go to http://0.0.0.0:3000

Options

Monitor can be configured by passing options object into expressMonitor constructor.

Default config:

title: 'Express Status',    // Default title
theme: 'default.css',       // Default styles
path: '/status',
databaseLoggingInterval: 60 // Default database logging interval
socketPath: '/socket.io',   // In case you use a custom path
websocket: existingSocketIoInstance,
spans: [{
  interval: 1,              // Every second
  retention: 60             // Keep 60 datapoints in memory
}, {
  interval: 5,              // Every 5 seconds
  retention: 60
}, {
  interval: 15,             // Every 15 seconds
  retention: 60
}],
chartVisibility: {
  cpu: true,
  mem: true,
  load: true,
  eventLoop: true,
  heap: true,
  responseTime: true,
  rps: true,
  statusCodes: true
},
healthChecks: [],
ignoreStartsWith: '/admin'

Health Checks

You can add a series of health checks to the configuration that will appear below the other stats. The health check will be considered successful if the endpoint returns a 200 status code.

// config
healthChecks: [{
  protocol: 'http',
  host: 'localhost',
  path: '/admin/health/ex1',
  port: '3000'
}, {
  protocol: 'http',
  host: 'localhost',
  path: '/admin/health/ex2',
  port: '3000'
}]

Health Checks

Securing endpoint

The HTML page handler is exposed as a pageRoute property on the main middleware function. So the middleware is mounted to intercept all requests while the HTML page handler will be authenticated.

Example using https://www.npmjs.com/package/connect-ensure-login

const ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn()

const statusMonitor = require('express-status-monitor')();
app.use(statusMonitor);
app.get('/status', ensureLoggedIn, statusMonitor.pageRoute)

Credits to @mattiaerre

Example using http-auth

const auth = require('http-auth');
const basic = auth.basic({realm: 'Monitor Area'}, function(user, pass, callback) {
  callback(user === 'username' && pass === 'password');
});

// Set '' to config path to avoid middleware serving the html page (path must be a string not equal to the wanted route)
const statusMonitor = require('express-status-monitor')({ path: '' });
app.use(statusMonitor.middleware); // use the "middleware only" property to manage websockets
app.get('/status', basic.check(statusMonitor.pageRoute)); // use the pageRoute property to serve the dashboard html page

Using module with socket.io in project

If you're using socket.io in your project, this module could break your project because this module by default will spawn its own socket.io instance. To mitigate that, fill websocket parameter with your main socket.io instance as well as port parameter.

Tests and coverage

In order to run test and coverage use the following npm commands:

npm test
npm run coverage

License

MIT License © Dynobase