s-r-x / bull-monitor Goto Github PK
View Code? Open in Web Editor NEW๐ Standard UI for Bull and BullMQ.
Home Page: https://s-r-x.github.io/bull-monitor/
License: MIT License
๐ Standard UI for Bull and BullMQ.
Home Page: https://s-r-x.github.io/bull-monitor/
License: MIT License
It would be nice to have read-only support which hides/disables any write operations like pausing queue, adding job, clearing stats etc. Maybe this is already there but don't see anywhere the initialization specifications.
Would be nice to have command line tool for quick start without having to write any code.
Curently it seems that any one can access the bull-monitor page, how to protect the page with password or jwt token?
@module({
imports: [BullModule.registerQueue({ name: Q_AUDIO_NAME })],
providers: [BullMonitorService],
})
export class BullMonitorModule implements NestModule {
constructor(private monitor: BullMonitorService) {}
async configure(consumer: MiddlewareConsumer) {
await this.monitor.init();
consumer.apply(this.monitor.router).forRoutes('/bull-monitor');
}
}
Hi, is possible to have an advanced job search?
Currently, job id search is not that useful for us because of the number of the same jobs that run on the same day or time.
To give you an example how our list looks like:
How about being able to deep search inside of each job? like we can search job data's key value? Thanks!
Im getting Cannot return null for non-nullable field RedisInfo.total_system_memory_human
when i try to see redis info, when connected to redis cloud.
Any ideas?
(Love this UI, great job)
Looking for a better navigation URL for queue and job, so after refreshing browser that we won't lose the view and we can also easy to share queues or jobs.
^ Example above that could produce URLs like:
Also, would be great to add a share button for each job.
Thanks!!!
filter jobs before send it to client
The version of ioredis used, doesn't work with Redis ACLs, as it doesn't pass a user to AUTH.
I tested the old version you use, and get the following error, but with e.g. 5.0.5 and the same URL it works completely.
[ioredis] Unhandled error event: ReplyError: WRONGPASS invalid username-password pair or user is disabled.
at parseError (/root/node_modules/redis-parser/lib/parser.js:179:12)
at parseType (/root/node_modules/redis-parser/lib/parser.js:302:14)
'get' and 'set' accessor must have the same type.
queues getter/setter
https://github.com/s-r-x/bull-monitor/blob/main/packages/root/package.json#L42
The latest version of bull js is 4.7.0 so this library is quite behind.
https://github.com/OptimalBits/bull/blob/develop/CHANGELOG.md
undocumented "stuck" job status
I've tried to set this up with my nestjs queue consumer but i keep getting the following error: when trying to use BullMonitorFastify
[Nest] 30444 - 10/02/2022, 17:09:20 ERROR [ExceptionsHandler] this.willStart is not a function
TypeError: this.willStart is not a function
at ApolloServer.createHandler (C:\x\node_modules\apollo-server-fastify\src\ApolloServer.ts:44:35)
at plugin (C:\x\node_modules\@bull-monitor\fastify\src\index.ts:12:21)
at Object.use (C:\x\node_modules\@nestjs\core\middleware\utils.js:51:24)
at C:\x\node_modules\@nestjs\core\router\router-proxy.js:9:23
at Holder.done (C:\x\node_modules\middie\engine.js:107:13)
at Object.run (C:\x\node_modules\middie\engine.js:59:12)
at Object.runMiddie (C:\x\node_modules\middie\index.js:41:21)
at hookIterator (C:\x\node_modules\fastify\lib\hooks.js:237:10)
at next (C:\x\node_modules\fastify\lib\hooks.js:164:16)
at hookRunner (C:\x\node_modules\fastify\lib\hooks.js:187:3)
bull-monitor.service.ts
import { BullMonitorFastify } from '@bull-monitor/fastify';
import { InjectQueue } from '@nestjs/bull';
import { Injectable } from '@nestjs/common';
import { Queue } from 'bull';
import { BullAdapter } from '@bull-monitor/root/dist/bull-adapter';
import { QueueName } from '@composer/queue/enums/index.enum';
@Injectable()
export class BullMonitorService extends BullMonitorFastify {
constructor(
@InjectQueue(QueueName.FEED) feedQueue: Queue,
@InjectQueue(QueueName.STOCK) stockQueue: Queue
) {
super({
queues: [new BullAdapter(feedQueue), new BullAdapter(stockQueue)],
});
}
}
My QueueServiceModule (aka AppModule)
import { MiddlewareConsumer, Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { QueueName } from '@composer/queue/enums/queues.enum';
import { StockConsumer } from './consumers/stock.consumer';
import { FeedConsumer } from './consumers/feed.consumer';
import { HttpModule } from '@nestjs/axios';
import { StockModule } from '@composer/stock';
import { ClientModule } from '@composer/client';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService, ConfigModule } from '@nestjs/config';
import { CoreModule } from '@composer/core';
import { IntegrationsModule } from '@composer/integrations';
import configuration from '@composer/core/config/configuration';
import { BullMonitorService } from './bull-monitor.service';
@Module({
imports: [
CoreModule,
ConfigModule.forRoot({
load: [configuration],
}),
BullModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
redis: {
port: parseInt(configService.get('bullMq.redis.port')),
host: configService.get('bullMq.redis.host'),
password: configService.get('bullMq.redis.password'),
tls: {
servername: configService.get('bullMq.redis.host'),
},
},
defaultJobOptions: configService.get('bullMq.defaultJobOptions'),
}),
inject: [ConfigService],
}),
BullModule.registerQueue(
{
name: QueueName.STOCK,
},
{
name: QueueName.FEED,
}
),
HttpModule,
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
type: 'mssql',
host: configService.get('database.host'),
port: parseInt(configService.get('database.port')),
username: configService.get('database.username'),
password: configService.get('database.password'),
options: {
enableArithAbort: true,
trustServerCertificate: true,
},
pool: {
min: 0,
max: 100,
},
maxQueryExecutionTime: 500,
logger: 'advanced-console',
autoLoadEntities: true,
}),
inject: [ConfigService],
}),
IntegrationsModule,
StockModule,
ClientModule,
],
providers: [StockConsumer, FeedConsumer, BullMonitorService],
})
export class QueueServiceModule {
constructor(private monitor: BullMonitorService) {}
async configure(consumer: MiddlewareConsumer) {
await this.monitor.init();
consumer.apply(this.monitor.plugin).forRoutes('/bull-monitor');
}
}
The metrics section shows only most recent (about 150) data points. Does the backend erase the older ones ? Can we have a way to select the duration and or may be a scroller to view the old metrics also.
Hi! Thanks for #26, but it seems not working.
Would be nice to have link to this Github repository from the monitoring dashboard.
How to add in nestjs?
Any plans on being able to search for jobs by name and not just id?
I'm trying to integrate @bull-monitor/express
in in loopback4. I somehow integrate the Bull-monitor-express in loopback4. below is an example that I have followed.
import { BullMonitorExpress } from '@bull-monitor/express';
import Express from 'express';
const port = 3000;
const baseUrl = '/some/nested/url';
(async () => {
const app = Express();
const monitor = new BullMonitorExpress({ queues: [] });
await monitor.init();
app.use(baseUrl, monitor.router);
app.listen(port, () => console.log(http://localhost:${port}${baseUrl}
));
})();
if I pass queues while new BullMonitorExpress({ queues})
is instantiating its perfectly working fine. but I'm not able to pass queues post instantiation of new BullMonitorExpress({ queues: []})
.
I'm not able to find any thing regarding this in the document. can somebody help me with this?
Render job's stacktrace somewhere if one is not empty(maybe inside the timeline popover or above the data)
Currently, data search term input performs a "like" query inside the object values, when it should be exact equal IMHO
example:
If i type: Product
onto the term, it matches items with term ProductOption
when it should only match Product
(exact equal ===).
My sugestion is to add "like wildcards" support to this field, so it will become:
Product
=== Product
Product%
=== ProductOption
%ProductOption%
=== AProductOption
Jhon
=== Jhon
Jhon%
=== Jhon Doe
%Jhon%
=== Marcus Jhon Doe
Hi,
Can this have a retry multiple failed jobs feature?
I think the table should be easy to migrate with checkbox: https://material-ui.com/components/tables/#data-table
Thanks!
@s-r-x it would be nice to be able to export multiple jobs as a JSON file. Thanks!
I am using Bull for the very first time.
I've written a small NestJS app based on Fastify.
Could someone please guide me through how to setup bull-monitor with NestJS Fastify?
Hello,
im looking for search in all status. i look this page : https://github.com/s-r-x/bull-monitor/blob/main/search-examples.md
jsonata is very good, i like it. But i cant find my job same time. its may complated, failed or waiting i dont know..
Is there any documentation regarding how to use:
Hey guys, how are you doing? Are you planning to implement a login page? I'd love to protect my project with a login page.
If you don't, I'm thinking to create a pull request with this feature.
Repeatable jobs could not be added correctly via "Add Job".
The job is placed in the "delayed" state and is also executed at the specified time, but never again afterwards. If I create the job directly via the Bull library with the exact same parameters, it remains in the "delayed" state until (if) an end condition occurs.
My concrete example (without end condition):
Job
{ "payload": ... }
Options
{ "repeat": { "every": 60000 } }
The job is even given an ID that indicates that it is a "repeatable job", but it is not executed again.
I keep getting a rendering error when the job progress is an object { "percents:" 100, "currentStep": "finished" }
:
Error: Int cannot represent non-integer value: { percents: 100, currentStep: "finished" }: {"response":{"errors":[{"message":"Int cannot represent non-integer value: { percents: 100, currentStep: \"finished\" }","locations":[{"line":5,"column":5}],"path":["jobs",0,"progress"],"extensions":{"code":"INTERNAL_SERVER_ERROR","exception":{"message":"Int cannot represent non-integer value: { percents: 100, currentStep: \"finished\" }"}...
Maybe it should be a way to with discard the progress, or be able to have an option to map the int value with the right key
Is there a plan to support bullmq?
where offset >= 0 and limit > 0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.