Skip to content

Commit 1d39fde

Browse files
Merge pull request #2226 from RedisInsight/be/feature/RI-4667_Telemetry_improvements
2 parents 803c459 + 088e730 commit 1d39fde

File tree

6 files changed

+88
-2
lines changed

6 files changed

+88
-2
lines changed

redisinsight/api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"start": "nest start",
2424
"start:dev": "cross-env NODE_ENV=development BUILD_TYPE=DOCKER_ON_PREMISE SERVER_STATIC_CONTENT=1 nest start --watch",
2525
"start:debug": "nest start --debug --watch",
26-
"start:stage": "cross-env NODE_ENV=staging SERVER_STATIC_CONTENT=true node dist/src/main",
26+
"start:stage": "cross-env NODE_ENV=staging BUILD_TYPE=DOCKER_ON_PREMISE SERVER_STATIC_CONTENT=true node dist/src/main",
2727
"start:prod": "cross-env NODE_ENV=production node dist/src/main",
2828
"test": "cross-env NODE_ENV=test ./node_modules/.bin/jest -w 1",
2929
"test:watch": "cross-env NODE_ENV=test jest --watch -w 1",

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ export enum TelemetryEvents {
7272
FeatureFlagConfigUpdateError = 'FEATURE_FLAG_CONFIG_UPDATE_ERROR',
7373
FeatureFlagInvalidRemoteConfig = 'FEATURE_FLAG_INVALID_REMOTE_CONFIG',
7474
FeatureFlagRecalculated = 'FEATURE_FLAG_RECALCULATED',
75+
76+
// Insights
77+
InsightsRecommendationGenerated = 'INSIGHTS_RECOMMENDATION_GENERATED',
7578
}
7679

7780
export enum CommandType {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { EventEmitter2 } from '@nestjs/event-emitter';
3+
import {
4+
mockDatabase,
5+
mockDatabaseRecommendation,
6+
mockDatabaseWithTlsAuth,
7+
} from 'src/__mocks__';
8+
import { TelemetryEvents } from 'src/constants';
9+
import { DatabaseRecommendationAnalytics } from './database-recommendation.analytics';
10+
11+
const provider = 'cloud'
12+
13+
describe('DatabaseRecommendationAnalytics', () => {
14+
let service: DatabaseRecommendationAnalytics;
15+
let sendEventSpy;
16+
let sendFailedEventSpy;
17+
18+
beforeEach(async () => {
19+
const module: TestingModule = await Test.createTestingModule({
20+
providers: [
21+
EventEmitter2,
22+
DatabaseRecommendationAnalytics,
23+
],
24+
}).compile();
25+
26+
service = await module.get(DatabaseRecommendationAnalytics);
27+
sendEventSpy = jest.spyOn(service as any, 'sendEvent');
28+
sendFailedEventSpy = jest.spyOn(service as any, 'sendFailedEvent');
29+
});
30+
31+
describe('sendInstanceAddedEvent', () => {
32+
it('should emit event with recommendationName and provider', () => {
33+
service.sendCreatedRecommendationEvent(
34+
mockDatabaseRecommendation,
35+
mockDatabaseWithTlsAuth,
36+
);
37+
38+
expect(sendEventSpy).toHaveBeenCalledWith(
39+
TelemetryEvents.InsightsRecommendationGenerated,
40+
{
41+
recommendationName: mockDatabaseRecommendation.name,
42+
databaseId: mockDatabase.id,
43+
provider: mockDatabaseWithTlsAuth.provider,
44+
},
45+
);
46+
});
47+
});
48+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { EventEmitter2 } from '@nestjs/event-emitter';
3+
import { TelemetryBaseService } from 'src/modules/analytics/telemetry.base.service';
4+
import { TelemetryEvents } from 'src/constants';
5+
import { DatabaseRecommendation } from './models';
6+
import { Database } from '../database/models/database';
7+
8+
@Injectable()
9+
export class DatabaseRecommendationAnalytics extends TelemetryBaseService {
10+
constructor(protected eventEmitter: EventEmitter2) {
11+
super(eventEmitter);
12+
}
13+
14+
sendCreatedRecommendationEvent(recommendation: DatabaseRecommendation, database: Database): void {
15+
try {
16+
this.sendEvent(
17+
TelemetryEvents.InsightsRecommendationGenerated,
18+
{
19+
recommendationName: recommendation.name,
20+
databaseId: database.id,
21+
provider: database.provider,
22+
},
23+
);
24+
} catch (e) {
25+
}
26+
}
27+
}

redisinsight/api/src/modules/database-recommendation/database-recommendation.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { DatabaseRecommendationGateway } from 'src/modules/database-recommendati
1010
import {
1111
DatabaseRecommendationEmitter,
1212
} from 'src/modules/database-recommendation/providers/database-recommendation.emitter';
13+
import { DatabaseRecommendationAnalytics } from 'src/modules/database-recommendation/database-recommendation.analytics';
1314

1415
@Module({})
1516
export class DatabaseRecommendationModule {
@@ -25,6 +26,7 @@ export class DatabaseRecommendationModule {
2526
RecommendationProvider,
2627
DatabaseRecommendationGateway,
2728
DatabaseRecommendationEmitter,
29+
DatabaseRecommendationAnalytics,
2830
{
2931
provide: DatabaseRecommendationRepository,
3032
useClass: databaseRecommendationRepository,

redisinsight/api/src/modules/database-recommendation/database-recommendation.service.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from 'src/modules/database-recommendation/dto/database-recommendations.response';
1212
import { Recommendation } from 'src/modules/database-analysis/models/recommendation';
1313
import { ModifyDatabaseRecommendationDto, DeleteDatabaseRecommendationResponse } from './dto';
14+
import { DatabaseRecommendationAnalytics } from './database-recommendation.analytics';
1415
import { DatabaseService } from '../database/database.service';
1516

1617
@Injectable()
@@ -21,6 +22,7 @@ export class DatabaseRecommendationService {
2122
private readonly databaseRecommendationRepository: DatabaseRecommendationRepository,
2223
private readonly scanner: RecommendationScanner,
2324
private readonly databaseService: DatabaseService,
25+
private readonly analytics: DatabaseRecommendationAnalytics,
2426
) {}
2527

2628
/**
@@ -33,7 +35,11 @@ export class DatabaseRecommendationService {
3335
DatabaseRecommendation,
3436
{ databaseId: clientMetadata?.databaseId, name: recommendationName },
3537
);
36-
return this.databaseRecommendationRepository.create(entity);
38+
39+
const recommendation = await this.databaseRecommendationRepository.create(entity)
40+
const database = await this.databaseService.get(clientMetadata?.databaseId)
41+
this.analytics.sendCreatedRecommendationEvent(recommendation, database)
42+
return recommendation;
3743
}
3844

3945
/**

0 commit comments

Comments
 (0)