From ef33885fd31390a1a24aa3d78ebc95b0e67b9b52 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Thu, 27 Aug 2026 14:43:00 +0300 Subject: [PATCH] ref(cloudflare): Use conventions constants for R2 span ops and attrs --- .../instrumentations/worker/instrumentR2.ts | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/packages/cloudflare/src/instrumentations/worker/instrumentR2.ts b/packages/cloudflare/src/instrumentations/worker/instrumentR2.ts index d452dfd073ef..7d6ad24ae3e2 100644 --- a/packages/cloudflare/src/instrumentations/worker/instrumentR2.ts +++ b/packages/cloudflare/src/instrumentations/worker/instrumentR2.ts @@ -1,28 +1,48 @@ import type { R2Bucket, R2ListOptions, R2MultipartUpload } from '@cloudflare/workers-types'; -import { isObjectLike, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/core'; +import { + CLOUDFLARE_R2_BUCKET, + CLOUDFLARE_R2_OPERATION, + CLOUDFLARE_R2_REQUEST_DELIMITER, + CLOUDFLARE_R2_REQUEST_KEY, + CLOUDFLARE_R2_REQUEST_PART_NUMBER, + CLOUDFLARE_R2_REQUEST_PREFIX, + SENTRY_OP, +} from '@sentry/conventions/attributes'; +import { + OBJECT_DELETE, + OBJECT_GET, + OBJECT_HEAD, + OBJECT_LIST, + OBJECT_MULTIPART_UPLOAD_ABORT, + OBJECT_MULTIPART_UPLOAD_COMPLETE, + OBJECT_MULTIPART_UPLOAD_CREATE, + OBJECT_PUT, + OBJECT_UPLOAD_PART, +} from '@sentry/conventions/op'; +import { isObjectLike, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startSpan } from '@sentry/core'; const ORIGIN = 'auto.faas.cloudflare.r2'; const R2_OPERATIONS = { - get: { spanName: 'r2_get', op: 'object.get', operation: 'GetObject' }, - head: { spanName: 'r2_head', op: 'object.head', operation: 'HeadObject' }, - put: { spanName: 'r2_put', op: 'object.put', operation: 'PutObject' }, - delete: { spanName: 'r2_delete', op: 'object.delete', operation: 'DeleteObject' }, - list: { spanName: 'r2_list', op: 'object.list', operation: 'ListObjects' }, - uploadPart: { spanName: 'r2_uploadPart', op: 'object.upload_part', operation: 'UploadPart' }, + get: { spanName: 'r2_get', op: OBJECT_GET, operation: 'GetObject' }, + head: { spanName: 'r2_head', op: OBJECT_HEAD, operation: 'HeadObject' }, + put: { spanName: 'r2_put', op: OBJECT_PUT, operation: 'PutObject' }, + delete: { spanName: 'r2_delete', op: OBJECT_DELETE, operation: 'DeleteObject' }, + list: { spanName: 'r2_list', op: OBJECT_LIST, operation: 'ListObjects' }, + uploadPart: { spanName: 'r2_uploadPart', op: OBJECT_UPLOAD_PART, operation: 'UploadPart' }, abortMultipartUpload: { spanName: 'r2_abortMultipartUpload', - op: 'object.multipart_upload.abort', + op: OBJECT_MULTIPART_UPLOAD_ABORT, operation: 'AbortMultipartUpload', }, createMultipartUpload: { spanName: 'r2_createMultipartUpload', - op: 'object.multipart_upload.create', + op: OBJECT_MULTIPART_UPLOAD_CREATE, operation: 'CreateMultipartUpload', }, completeMultipartUpload: { spanName: 'r2_completeMultipartUpload', - op: 'object.multipart_upload.complete', + op: OBJECT_MULTIPART_UPLOAD_COMPLETE, operation: 'CompleteMultipartUpload', }, } as const; @@ -41,12 +61,12 @@ function createSpanOptions(bindingName: string, r2Op: R2OperationKey, key?: stri op, name: spanName, attributes: { - 'cloudflare.r2.operation': operation, - 'cloudflare.r2.bucket': bindingName, - ...(requestKey !== undefined && { 'cloudflare.r2.request.key': requestKey }), - ...(isR2ListOptions(key) && key.prefix !== undefined && { 'cloudflare.r2.request.prefix': key.prefix }), - ...(isR2ListOptions(key) && key.delimiter !== undefined && { 'cloudflare.r2.request.delimiter': key.delimiter }), - [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op, + [CLOUDFLARE_R2_OPERATION]: operation, + [CLOUDFLARE_R2_BUCKET]: bindingName, + ...(requestKey !== undefined && { [CLOUDFLARE_R2_REQUEST_KEY]: requestKey }), + ...(isR2ListOptions(key) && key.prefix !== undefined && { [CLOUDFLARE_R2_REQUEST_PREFIX]: key.prefix }), + ...(isR2ListOptions(key) && key.delimiter !== undefined && { [CLOUDFLARE_R2_REQUEST_DELIMITER]: key.delimiter }), + [SENTRY_OP]: op, [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN, }, }; @@ -62,13 +82,14 @@ function instrumentR2MultipartUpload(upload: R2MultipartUpload, bindingName: str return function (this: unknown, ...args: Parameters) { const [partNumber] = args; + const spanOptions = createSpanOptions(bindingName, 'uploadPart', key); return startSpan( { - ...createSpanOptions(bindingName, 'uploadPart', key), + ...spanOptions, attributes: { - ...createSpanOptions(bindingName, 'uploadPart', key).attributes, - 'cloudflare.r2.request.part_number': partNumber, + ...spanOptions.attributes, + [CLOUDFLARE_R2_REQUEST_PART_NUMBER]: partNumber, }, }, () => Reflect.apply(original, target, args),