Skip to content

Commit

Permalink
add some sentry spans
Browse files Browse the repository at this point in the history
  • Loading branch information
InventivetalentDev committed Jan 26, 2025
1 parent 3f5919b commit 875d36c
Show file tree
Hide file tree
Showing 6 changed files with 729 additions and 655 deletions.
107 changes: 59 additions & 48 deletions src/generator/v2/V2GenerateHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { GenerateV2Request } from "../../routes/v2/types";
import { V2GenerateResponseBody } from "../../typings/v2/V2GenerateResponseBody";
import { V2SkinResponse } from "../../typings/v2/V2SkinResponse";
import { container } from "../../inversify.config";
import * as Sentry from "@sentry/node";

export const MC_TEXTURE_PREFIX = "https://textures.minecraft.net/texture/";

Expand Down Expand Up @@ -62,59 +63,69 @@ export class V2GenerateHandler {


static skinToJson(skin: IPopulatedSkin2Document, duplicate: boolean = false): SkinInfo2 {
if (!skin.data) {
throw new Error("Skin data is missing");
}
return {
uuid: skin.uuid,
shortId: skin.shortId,
name: skin.meta.name,
visibility: skin.meta.visibility,
variant: skin.meta.variant,
texture: {
data: {
value: skin.data.value,
signature: skin.data.signature
return Sentry.startSpan({
op: 'generate_handler',
name: 'skinToJson'
}, span => {
if (!skin.data) {
throw new Error("Skin data is missing");
}
return {
uuid: skin.uuid,
shortId: skin.shortId,
name: skin.meta.name,
visibility: skin.meta.visibility,
variant: skin.meta.variant,
texture: {
data: {
value: skin.data.value,
signature: skin.data.signature
},
hash: {
skin: skin.data.hash?.skin.minecraft,
cape: skin.data.hash?.cape?.minecraft
},
url: {
skin: MC_TEXTURE_PREFIX + skin.data.hash?.skin.minecraft,
cape: skin.data.hash?.cape?.minecraft ? (MC_TEXTURE_PREFIX + skin.data.hash?.cape?.minecraft) : undefined
}
},
hash: {
skin: skin.data.hash?.skin.minecraft,
cape: skin.data.hash?.cape?.minecraft
generator: {
timestamp: skin.data.createdAt.getTime(),
account: skin.data.generatedBy.account?.substring(0, 16),
server: skin.data.generatedBy.server,
worker: skin.data.generatedBy.worker,
version: 'unknown', //TODO
duration: skin.data.queue?.end?.getTime() - skin.data.queue?.start?.getTime() || 0
},
url: {
skin: MC_TEXTURE_PREFIX + skin.data.hash?.skin.minecraft,
cape: skin.data.hash?.cape?.minecraft ? (MC_TEXTURE_PREFIX + skin.data.hash?.cape?.minecraft) : undefined
}
},
generator: {
timestamp: skin.data.createdAt.getTime(),
account: skin.data.generatedBy.account?.substring(0, 16),
server: skin.data.generatedBy.server,
worker: skin.data.generatedBy.worker,
version: 'unknown', //TODO
duration: skin.data.queue?.end?.getTime() - skin.data.queue?.start?.getTime() || 0
},
tags: skin.tags?.map(t => ({tag: t.tag})),
views: skin.interaction.views,
duplicate: duplicate
};
tags: skin.tags?.map(t => ({tag: t.tag})),
views: skin.interaction.views,
duplicate: duplicate
};
});
}

static makeRateLimitInfo(req: GenerateV2Request): RateLimitInfo {
const now = Date.now();
return {
next: {
absolute: req.nextRequest || now,
relative: Math.max(0, (req.nextRequest || now) - now)
},
delay: {
millis: req.minDelay || 0,
seconds: req.minDelay ? req.minDelay / 1000 : 0
},
limit: {
limit: req.maxPerMinute || 0,
remaining: Math.max(0, (req.maxPerMinute || 0) - (req.requestsThisMinute || 0))
}
};
return Sentry.startSpan({
op: 'generate_handler',
name: 'makeRateLimitInfo'
}, span => {
const now = Date.now();
return {
next: {
absolute: req.nextRequest || now,
relative: Math.max(0, (req.nextRequest || now) - now)
},
delay: {
millis: req.minDelay || 0,
seconds: req.minDelay ? req.minDelay / 1000 : 0
},
limit: {
limit: req.maxPerMinute || 0,
remaining: Math.max(0, (req.maxPerMinute || 0) - (req.requestsThisMinute || 0))
}
};
});
}

}
Expand Down
76 changes: 41 additions & 35 deletions src/generator/v2/V2UploadHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import * as fs from "node:fs";
import { Readable } from "stream";
import { readFile } from "fs/promises";
import { Log } from "../../Log";
import * as Sentry from "@sentry/node";

export class V2UploadHandler extends V2GenerateHandler {

Expand All @@ -22,45 +23,50 @@ export class V2UploadHandler extends V2GenerateHandler {
}

async getImageBuffer(): Promise<BufferResult> {
const file: Maybe<Express.Multer.File> = this.req.file;
if (!file) {
throw new GeneratorError('missing_file', "No file uploaded", {
httpCode: 400,
source: ErrorSource.CLIENT
});
}
return await Sentry.startSpan({
op: 'upload_handler',
name: 'getImageBuffer'
}, async span => {
const file: Maybe<Express.Multer.File> = this.req.file;
if (!file) {
throw new GeneratorError('missing_file', "No file uploaded", {
httpCode: 400,
source: ErrorSource.CLIENT
});
}

Log.l.debug(`${ this.req.breadcrumbC } FILE: "${ file.filename || file.originalname }"`);
Log.l.debug(`${ this.req.breadcrumbC } FILE: "${ file.filename || file.originalname }"`);

this.tempFile = await Temp.file({
dir: UPL_DIR
});

if (file.buffer) {
await new Promise((resolve, reject) => {
Readable.from(file.buffer)
.pipe(new ExifTransformer()) // strip metadata
.pipe(fs.createWriteStream(this.tempFile!.path))
.on('finish', resolve)
.on('error', reject);
});
} else if (file.path) {
await new Promise((resolve, reject) => {
fs.createReadStream(file.path)
.pipe(new ExifTransformer()) // strip metadata
.pipe(fs.createWriteStream(this.tempFile!.path))
.on('finish', resolve)
.on('error', reject);
this.tempFile = await Temp.file({
dir: UPL_DIR
});
} else {
throw new GeneratorError('missing_file', "No file uploaded", {
httpCode: 400,
source: ErrorSource.CLIENT
});
}

const buffer = await readFile(this.tempFile.path);
return {buffer};
if (file.buffer) {
await new Promise((resolve, reject) => {
Readable.from(file.buffer)
.pipe(new ExifTransformer()) // strip metadata
.pipe(fs.createWriteStream(this.tempFile!.path))
.on('finish', resolve)
.on('error', reject);
});
} else if (file.path) {
await new Promise((resolve, reject) => {
fs.createReadStream(file.path)
.pipe(new ExifTransformer()) // strip metadata
.pipe(fs.createWriteStream(this.tempFile!.path))
.on('finish', resolve)
.on('error', reject);
});
} else {
throw new GeneratorError('missing_file', "No file uploaded", {
httpCode: 400,
source: ErrorSource.CLIENT
});
}

const buffer = await readFile(this.tempFile.path);
return {buffer};
});
}

cleanupImage() {
Expand Down
Loading

0 comments on commit 875d36c

Please sign in to comment.