From bd70bb655554a606eff4f2a24027427e95d76a68 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Wed, 19 Nov 2025 15:05:03 +0100 Subject: [PATCH] Basic Sentry Metric Functionality (#1064) --- apps/backend/src/api/routes/auth.controller.ts | 2 ++ .../routes/v1/public.integrations.controller.ts | 13 ++++++++++++- .../src/database/prisma/posts/posts.service.ts | 2 ++ package.json | 6 +++--- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index f576f38f..338bf962 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -21,6 +21,7 @@ import { EmailService } from '@gitroom/nestjs-libraries/services/email.service'; import { RealIP } from 'nestjs-real-ip'; import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent'; import { Provider } from '@prisma/client'; +import * as Sentry from '@sentry/nestjs'; @ApiTags('Auth') @Controller('/auth') @@ -101,6 +102,7 @@ export class AuthController { } } + Sentry.metrics.count("new_user", 1); response.header('onboarding', 'true'); response.status(200).json({ register: true, diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index 7f27ad09..2655f699 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -30,12 +30,13 @@ import { UploadDto } from '@gitroom/nestjs-libraries/dtos/media/upload.dto'; import axios from 'axios'; import { Readable } from 'stream'; import { lookup } from 'mime-types'; +import * as Sentry from '@sentry/nestjs'; @ApiTags('Public API') @Controller('/public/v1') export class PublicIntegrationsController { private storage = UploadFactory.createStorage(); - + constructor( private _integrationService: IntegrationService, private _postsService: PostsService, @@ -48,6 +49,7 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File ) { + Sentry.metrics.count("public_api-request", 1); if (!file) { throw new HttpException({ msg: 'No file provided' }, 400); } @@ -65,6 +67,7 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Body() body: UploadDto ) { + Sentry.metrics.count("public_api-request", 1); const response = await axios.get(body.url, { responseType: 'arraybuffer', }); @@ -96,6 +99,7 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Param('id') id?: string ) { + Sentry.metrics.count("public_api-request", 1); return { date: await this._postsService.findFreeDateTime(org.id, id) }; } @@ -104,6 +108,7 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Query() query: GetPostsDto ) { + Sentry.metrics.count("public_api-request", 1); const posts = await this._postsService.getPosts(org.id, query); return { posts, @@ -117,6 +122,7 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Body() rawBody: any ) { + Sentry.metrics.count("public_api-request", 1); const body = await this._postsService.mapTypeToPost( rawBody, org.id, @@ -133,17 +139,20 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Param() body: { id: string } ) { + Sentry.metrics.count("public_api-request", 1); const getPostById = await this._postsService.getPost(org.id, body.id); return this._postsService.deletePost(org.id, getPostById.group); } @Get('/is-connected') async getActiveIntegrations(@GetOrgFromRequest() org: Organization) { + Sentry.metrics.count("public_api-request", 1); return { connected: true }; } @Get('/integrations') async listIntegration(@GetOrgFromRequest() org: Organization) { + Sentry.metrics.count("public_api-request", 1); return (await this._integrationService.getIntegrationsList(org.id)).map( (org) => ({ id: org.id, @@ -167,11 +176,13 @@ export class PublicIntegrationsController { @GetOrgFromRequest() org: Organization, @Body() body: VideoDto ) { + Sentry.metrics.count("public_api-request", 1); return this._mediaService.generateVideo(org, body); } @Post('/video/function') videoFunction(@Body() body: VideoFunctionDto) { + Sentry.metrics.count("public_api-request", 1); return this._mediaService.videoFunction( body.identifier, body.functionName, diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index fea33271..12163659 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -38,6 +38,7 @@ import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; dayjs.extend(utc); +import * as Sentry from '@sentry/nestjs'; type PostWithConditionals = Post & { integration?: Integration; @@ -717,6 +718,7 @@ export class PostsService { }); } + Sentry.metrics.count("post_created", 1); postList.push({ postId: posts[0].id, integration: post.integration.id, diff --git a/package.json b/package.json index a4c1e46c..be1d4604 100644 --- a/package.json +++ b/package.json @@ -78,9 +78,9 @@ "@neynar/react": "^0.9.7", "@postiz/wallets": "^0.0.1", "@prisma/client": "^6.5.0", - "@sentry/nestjs": "^10.12.0", - "@sentry/nextjs": "^10.12.0", - "@sentry/profiling-node": "^10.12.0", + "@sentry/nestjs": "^10.25.0", + "@sentry/nextjs": "^10.25.0", + "@sentry/profiling-node": "^10.25.0", "@solana/wallet-adapter-react": "^0.15.35", "@solana/wallet-adapter-react-ui": "^0.9.35", "@swc/helpers": "0.5.13",