accessing bull-queue to view job stats from nodejs

Yury Stanev picture Yury Stanev · Jul 22, 2019 · Viewed 7.7k times · Source

I need to access bull-queue to view job stats and show on the page. I'm using bull-repl to access the queue from CLI, as follows:

> bull-repl 
BULL-REPL> connect marathon reddis://localhost:6379
Connected to reddis://localhost:6379, queue: marathon
BULL-REPL | marathon> stats
┌───────────┬────────┐
│  (index)  │ Values │
├───────────┼────────┤
│  waiting  │   0    │
│  active   │   0    │
│ completed │   55   │
│  failed   │   1    │
│  delayed  │   0    │
│  paused   │   0    │
└───────────┴────────┘

I'm trying to do the same thing from JS with the following code:

const shell = require('shelljs');
const ccommandExistsSync = require('command-exists').sync;

function installBullRepl(){
    if(ccommandExistsSync('bull-repl')){
        queueStats();
    } else{
        shell.exec('npm i -g bull-repl');
        queueStats();
    }
}

function queueStats(){
    let stats;

    shell.exec('bull-repl'); // launch `bull-repl`
    shell.exec('connect marathon reddis://localhost:6379'); // connect to redis instance
    stats = shell.exec(`stats`); // display count of jobs by groups

    return stats;
}

installBullRepl();

The first shell.exec runs, launching bull-repl, but the rest of the code that needs to be run inside the tool never executes, I assume it's because the shelljs runs each command independently. How can I get the last two commands to run within the tool?

Answer

Yury Stanev picture Yury Stanev · Jul 23, 2019

Queue#getJobCounts

getJobCounts() : Promise<JobCounts>

Returns a promise that will return the job counts for the given queue.

  interface JobCounts {
    waiting: number,
    active: number,
    completed: number,
    failed: number,
    delayed: number
  }
}

To connect to the queue in Redis db and return and number of jobs by state do the following.

const Queue = require('bull');
const marathonQueue = new Queue('marathon', 'redis://127.0.0.1:6379');
marathonQueue.getJobCounts().then(res => console.log('Job Count:\n',res));