Skip to content

Commit 267b967

Browse files
author
arthosofteq
authored
Merge pull request #924 from RedisInsight/fix/bulk-actions-telemetry
add telemtry for bulk actions
2 parents b2a49cb + 7799efc commit 267b967

12 files changed

+118
-5
lines changed

redisinsight/api/src/constants/telemetry-events.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ export enum TelemetryEvents {
5151
PubSubMessagePublished = 'PUBSUB_MESSAGE_PUBLISHED',
5252
PubSubChannelSubscribed = 'PUBSUB_CHANNEL_SUBSCRIBED',
5353
PubSubChannelUnsubscribed = 'PUBSUB_CHANNEL_UNSUBSCRIBED',
54+
55+
// Bulk Actions
56+
BulkActionsStarted = 'BULK_ACTIONS_STARTED',
57+
BulkActionsStopped = 'BULK_ACTIONS_STOPPED',
5458
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { EventEmitter2 } from '@nestjs/event-emitter';
3+
import { TelemetryEvents } from 'src/constants';
4+
import { TelemetryBaseService } from 'src/modules/shared/services/base/telemetry.base.service';
5+
import { CommandExecutionStatus } from 'src/modules/cli/dto/cli.dto';
6+
import { RedisError, ReplyError } from 'src/models';
7+
import { IBulkActionOverview } from 'src/modules/bulk-actions/interfaces/bulk-action-overview.interface';
8+
9+
export interface IExecResult {
10+
response: any;
11+
status: CommandExecutionStatus;
12+
error?: RedisError | ReplyError | Error,
13+
}
14+
15+
@Injectable()
16+
export class BulkActionsAnalyticsService extends TelemetryBaseService {
17+
private events: Map<TelemetryEvents, Function> = new Map();
18+
19+
constructor(protected eventEmitter: EventEmitter2) {
20+
super(eventEmitter);
21+
this.events.set(TelemetryEvents.BulkActionsStarted, this.sendActionStarted.bind(this));
22+
this.events.set(TelemetryEvents.BulkActionsStopped, this.sendActionStopped.bind(this));
23+
}
24+
25+
sendActionStarted(overview: IBulkActionOverview): void {
26+
try {
27+
this.sendEvent(
28+
TelemetryEvents.BulkActionsStarted,
29+
{
30+
databaseId: overview.databaseId,
31+
type: overview.type,
32+
duration: overview.duration,
33+
filter: {
34+
match: overview.filter.match === '*' ? '*' : 'PATTERN',
35+
type: overview.filter.type,
36+
},
37+
progress: {
38+
scanned: overview.progress.scanned,
39+
total: overview.progress.total,
40+
},
41+
},
42+
);
43+
} catch (e) {
44+
// continue regardless of error
45+
}
46+
}
47+
48+
sendActionStopped(overview: IBulkActionOverview): void {
49+
try {
50+
this.sendEvent(
51+
TelemetryEvents.BulkActionsStopped,
52+
{
53+
databaseId: overview.databaseId,
54+
type: overview.type,
55+
duration: overview.duration,
56+
filter: {
57+
match: overview.filter.match === '*' ? '*' : 'PATTERN',
58+
type: overview.filter.type,
59+
},
60+
progress: {
61+
scanned: overview.progress.scanned,
62+
total: overview.progress.total,
63+
},
64+
summary: {
65+
processed: overview.summary.processed,
66+
succeed: overview.summary.succeed,
67+
failed: overview.summary.failed,
68+
},
69+
},
70+
);
71+
} catch (e) {
72+
// continue regardless of error
73+
}
74+
}
75+
76+
getEventsEmitters(): Map<TelemetryEvents, Function> {
77+
return this.events;
78+
}
79+
}

redisinsight/api/src/modules/bulk-actions/bulk-actions.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BulkActionsService } from 'src/modules/bulk-actions/bulk-actions.servic
33
import { BulkActionsProvider } from 'src/modules/bulk-actions/providers/bulk-actions.provider';
44
import { BulkActionsGateway } from 'src/modules/bulk-actions/bulk-actions.gateway';
55
import { SharedModule } from 'src/modules/shared/shared.module';
6+
import { BulkActionsAnalyticsService } from 'src/modules/bulk-actions/bulk-actions-analytics.service';
67

78
@Module({
89
imports: [
@@ -12,6 +13,7 @@ import { SharedModule } from 'src/modules/shared/shared.module';
1213
BulkActionsGateway,
1314
BulkActionsService,
1415
BulkActionsProvider,
16+
BulkActionsAnalyticsService,
1517
],
1618
})
1719
export class BulkActionsModule {}

redisinsight/api/src/modules/bulk-actions/bulk-actions.service.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { CreateBulkActionDto } from 'src/modules/bulk-actions/dto/create-bulk-ac
1111
import { BulkActionFilter } from 'src/modules/bulk-actions/models/bulk-action-filter';
1212
import { BulkAction } from 'src/modules/bulk-actions/models/bulk-action';
1313
import { BulkActionsService } from 'src/modules/bulk-actions/bulk-actions.service';
14+
import { BulkActionsAnalyticsService } from 'src/modules/bulk-actions/bulk-actions-analytics.service';
1415

1516
export const mockSocket1 = new MockedSocket();
1617
mockSocket1.id = '1';
@@ -38,6 +39,7 @@ const mockCreateBulkActionDto = Object.assign(new CreateBulkActionDto(), {
3839

3940
const mockBulkAction = new BulkAction(
4041
mockCreateBulkActionDto.id,
42+
mockCreateBulkActionDto.databaseId,
4143
mockCreateBulkActionDto.type,
4244
mockBulkActionFilter,
4345
mockSocket1,
@@ -65,6 +67,13 @@ describe('BulkActionsService', () => {
6567
abortUsersBulkActions: jest.fn().mockReturnValue(2),
6668
}),
6769
},
70+
{
71+
provide: BulkActionsAnalyticsService,
72+
useFactory: () => ({
73+
sendActionStarted: jest.fn(),
74+
sendActionStopped: jest.fn(),
75+
}),
76+
},
6877
],
6978
}).compile();
7079

redisinsight/api/src/modules/bulk-actions/bulk-actions.service.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1+
import { Socket } from 'socket.io';
12
import { Injectable } from '@nestjs/common';
23
import { BulkActionsProvider } from 'src/modules/bulk-actions/providers/bulk-actions.provider';
34
import { CreateBulkActionDto } from 'src/modules/bulk-actions/dto/create-bulk-action.dto';
45
import { BulkActionIdDto } from 'src/modules/bulk-actions/dto/bulk-action-id.dto';
5-
import { Socket } from 'socket.io';
6+
import { BulkActionsAnalyticsService } from 'src/modules/bulk-actions/bulk-actions-analytics.service';
67

78
@Injectable()
89
export class BulkActionsService {
910
constructor(
1011
private readonly bulkActionsProvider: BulkActionsProvider,
12+
private readonly analyticsService: BulkActionsAnalyticsService,
1113
) {}
1214

1315
async create(dto: CreateBulkActionDto, socket: Socket) {
1416
const bulkAction = await this.bulkActionsProvider.create(dto, socket);
15-
return bulkAction.getOverview();
17+
const overview = bulkAction.getOverview();
18+
19+
this.analyticsService.sendActionStarted(overview);
20+
21+
return overview;
1622
}
1723

1824
async get(dto: BulkActionIdDto) {
@@ -22,7 +28,11 @@ export class BulkActionsService {
2228

2329
async abort(dto: BulkActionIdDto) {
2430
const bulkAction = await this.bulkActionsProvider.abort(dto.id);
25-
return bulkAction.getOverview();
31+
const overview = bulkAction.getOverview();
32+
33+
this.analyticsService.sendActionStopped(overview);
34+
35+
return overview;
2636
}
2737

2838
disconnect(socketId: string) {

redisinsight/api/src/modules/bulk-actions/interfaces/bulk-action-overview.interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IBulkActionFilterOverview } from './bulk-action-filter-overview.interfa
55

66
export interface IBulkActionOverview {
77
id: string,
8+
databaseId: string,
89
duration: number,
910
type: BulkActionType,
1011
status: BulkActionStatus,

redisinsight/api/src/modules/bulk-actions/models/bulk-action.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ describe('AbstractBulkActionSimpleRunner', () => {
7777

7878
bulkAction = new BulkAction(
7979
mockCreateBulkActionDto.id,
80+
mockCreateBulkActionDto.databaseId,
8081
mockCreateBulkActionDto.type,
8182
mockBulkActionFilter,
8283
mockSocket,

redisinsight/api/src/modules/bulk-actions/models/bulk-action.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export class BulkAction implements IBulkAction {
1212

1313
private readonly id: string;
1414

15+
private readonly databaseId: string;
16+
1517
private startTime: number = Date.now();
1618

1719
private endTime: number;
@@ -28,8 +30,9 @@ export class BulkAction implements IBulkAction {
2830

2931
private readonly debounce: Function;
3032

31-
constructor(id, type, filter, socket) {
33+
constructor(id, databaseId, type, filter, socket) {
3234
this.id = id;
35+
this.databaseId = databaseId;
3336
this.type = type;
3437
this.filter = filter;
3538
this.socket = socket;
@@ -133,6 +136,7 @@ export class BulkAction implements IBulkAction {
133136

134137
return {
135138
id: this.id,
139+
databaseId: this.databaseId,
136140
type: this.type,
137141
duration: (this.endTime || Date.now()) - this.startTime,
138142
status: this.status,

redisinsight/api/src/modules/bulk-actions/models/runners/abstract.bulk-action.runner.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ describe('AbstractBulkActionRunner', () => {
3434
beforeEach(() => {
3535
bulkAction = new BulkAction(
3636
mockCreateBulkActionDto.id,
37+
mockCreateBulkActionDto.databaseId,
3738
mockCreateBulkActionDto.type,
3839
mockBulkActionFilter,
3940
mockSocket,

redisinsight/api/src/modules/bulk-actions/models/runners/simple/abstract.bulk-action.simple.runner.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ describe('AbstractBulkActionSimpleRunner', () => {
4343

4444
bulkAction = new BulkAction(
4545
mockCreateBulkActionDto.id,
46+
mockCreateBulkActionDto.databaseId,
4647
mockCreateBulkActionDto.type,
4748
mockBulkActionFilter,
4849
mockSocket,

0 commit comments

Comments
 (0)