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

gb-watchdog

v2.3.2

Published

Continuous integration testing framework. Report to slack and elasticsearch.

Downloads

3

Readme

Coverage Status CircleCI

Installation

Greenkeeper badge

npm install gb-watchdog

API

  • /status endpoint returns 200 if all sub services are available and monitoring is active
  • /schedules endpoint allows the addition and removal of schedules. Start/stop scheduler.
  • /results endpoint returns results, supports ES query argument if connected to ES

App

  • Scheduler uses later.js to schedule/execute test runs
  • Reporter records results to slack and elasticsearch

Use

The following will walk you through creating a project that uses the watchdog framework.

###Step 1 - create a test runner folder.

mkdir my-watchdog
cd my-watchdog
npm init
npm install -g mocha

Create a file in your project directory called index.js And put something like the following in the file.

var Watchdog = require('gb-watchdog');
var configuration = {
    // API key is used to secure the service. 
    // Defaults to no API key.
    // If a key is defined here, you must add a header to all subsequent calls to the service 
    // in the form: `api_key=XXX-XXX-XXX-XXX`
    apiKey: 'XXX-XXX-XXX-XXX',
    
    // Defaults to no Sysdig integration. Send alerts to sysdig on failure.
    sysdigApiKey: 'XXX-XXX-XXX',
    
    // Defaults to no elasticsearch integration, only in-memory
    // If provided, you need to specify host, indexSuffix, and apiVersion. Optionally logLevel
    elasticsearch: {
        host:       'localhost:9200',
        indexSuffix: 'my_results_index',
        apiVersion: 2.2
    },
    
    // Defaults to no blip server
    blipServer: {
      host: 'server.something.com',
      port: 8080,
      serviceName: 'watchdog',
      environment: 'testing'
    },
    
    // Defaualts to no slack integration
    slack: {
        url:        'http://my-webhook-url.com',
        username:   'bot-name',
        channel:    '#error-channel'
    },
    
    // Defaults to 7000
    port: 7000
};

var watchdog = new Watchdog(configuration);

// Start API
watchdog.run();

// Create schedule for mocha test file that already exist in the filesystam
watchdog.services.scheduler.add('myScheduleName',
  'run test-upload.js every 4 minutes except Saturday,Sunday');

// Or REST command
// curl -XPOST localhost:7000/schedules \
//   -d '{"name":"myScheduleName", "schedule":"run path/test.js every 4 minutes except Saturday,Sunday"}'

###Step 2 - Create a test

Install a few dependencies.

npm install chai request-promise --save

And then create the file reference in index.js called test-upload.js

const chai           = require('chai');
const expect         = chai.expect;
const rp             = require('request-promise');

options =  {
    uri: 'https://someservice.example.com/data/v1/upload',
    method: 'POST',
    json: true,
    formData: {
        config: `clientKey: XXX-XXX-XXX-XXX`
    }
}

twoRecords = {
    value: `{id: 1, title: 'record 1'}
            {id: 2, title: 'record 2'}`,
    options: { filename: 'data.json' }
}

describe('upload service', ()=> {

    beforeEach(function(done){
        options.formData.data = {
            value: `{id: 1, action: 'delete'}
                    {id: 2, action: 'delete'}`,
            options: { filename: 'data.json' }
        }
        rp(options).then(function (parsedBody) {
            expect(parsedBody.status.code).to.eql(200);
            done()
        }).catch(done);
    })

  it('upload 2 records', (done)=> {
    options.formData.data = twoRecords

    rp(options).then(function (parsedBody) {
        expect(parsedBody.status.code).to.eql(200);
        expect(parsedBody.status.additionalInfo.masterCount).to.eql(2);
        expect(parsedBody.status.additionalInfo.invalidRecordCount).to.eql(0);
        done()
    }).catch(done);

  });
}

###Step 3 - Run the tests

Run this file using

  node index.js

Wait until it has run. You can check the status of the scheduler to see if it has run yet, and when it will next run.

// Get the status of the scheduler and testRunner
var schedulerStatus = watchdog.services.scheduler.status();
{
    state: 'running',
    schedules: {
        myScheduleName: {
            prevRun: '2016-05-18T14:46:13+00:00',
            nextRun: '2016-05-18T16:46:13+00:00'
        }
    }
}

// This returns the latest test result, or the current state if one is runnning
// If the test is currently running, you'll see incomplete tests, and end will be null
var testRunnerStatus = watchdog.services.testRunner.status();
{
    start:      '2016-05-18T14:46:13+00:00',
    end:        '2016-05-18T14:46:13+00:00',
    duration:   100, // ms
    passes:     10,
    fails:      1,
    incomplete: 5,
    total:      16,
    schedule:   {
        name:   'someSchedule',
        files:  ['testFile.js']
    },
    tests: [
        {
            name:       'should be first test',
            duration:   2
        },
        {
            name:       'failing test',
            duration:   1000,
            error:      'expected true to be false',
            stack:      'line 200 is broken'
        },
        ......
    ]
}

// Or REST command
// curl localhost:7000/status
{
    scheduler:  { /* scheduler status object */ },
    testRunner: { /* testrunner status object */ },
}

You can also get a history of results over time. If you're storing this in elasticsearch, you can supply a query to limit the response.

var esQuery = {
    query: {
        bool: {
            must: [
                {
                    term: {
                        passes: 5
                    }
                }
            ]
        }
    }
};

var results = watchdog.services.history.getResults(esQuery);
[
    {
        start:      '2016-05-18T14:46:13+00:00',
        end:        '2016-05-18T14:46:13+00:00',
        duration:   100, // ms
        passes:     5,
        fails:      1,
        incomplete: 5,
        total:      11,
        schedule:   {
            name:   'someSchedule',
            files:  ['testFile.js']
        },
        tests: [
            {
                name:       'should be first test',
                duration:   2
            },
            {
                name:       'failing test',
                duration:   1000,
                error:      'expected true to be false',
                stack:      'line 200 is broken'
            },
            ......
        ]
    },
    {
        start:      '2016-05-18T14:46:13+00:00',
        end:        '2016-05-18T14:46:13+00:00',
        duration:   100, // ms
        passes:     5,
        fails:      10,
        incomplete: 0,
        total:      15,
        schedule:   {
            name:   'someSchedule',
            files:  ['testFile.js']
        },
        tests: [
            {
                name:       'should be first test',
                duration:   2
            },
            {
                name:       'failing test',
                duration:   1000,
                error:      'expected true to be false',
                stack:      'line 200 is broken'
            },
            ......
        ]
    },
    .......
]

// Or REST commnd
// curl localhost:7000/results

To start/stop the scheduler:

// Stop scheduler (started by default)
watchdog.services.scheduler.stop(); 

// Or REST command
// curl -XPOST localhost:7000/schedules/_stop

// Start scheduler
watchdog.services.scheduler.start(); 

// Or REST command
// curl -XPOST localhost:7000/schedules/_start

It's important to note that the data will be added and read from the index watchdog_<indexSuffix>. So pick different suffixes for different applications.

Future

  • Offer hooks rollback to previous version if tests fail
  • Add/remove tests at runtime