11import type { R2Bucket , R2ListOptions , R2MultipartUpload } from '@cloudflare/workers-types' ;
2- import { isObjectLike , SEMANTIC_ATTRIBUTE_SENTRY_OP , SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN , startSpan } from '@sentry/core' ;
2+ import {
3+ CLOUDFLARE_R2_BUCKET ,
4+ CLOUDFLARE_R2_OPERATION ,
5+ CLOUDFLARE_R2_REQUEST_DELIMITER ,
6+ CLOUDFLARE_R2_REQUEST_KEY ,
7+ CLOUDFLARE_R2_REQUEST_PART_NUMBER ,
8+ CLOUDFLARE_R2_REQUEST_PREFIX ,
9+ SENTRY_OP ,
10+ } from '@sentry/conventions/attributes' ;
11+ import {
12+ OBJECT_DELETE ,
13+ OBJECT_GET ,
14+ OBJECT_HEAD ,
15+ OBJECT_LIST ,
16+ OBJECT_MULTIPART_UPLOAD_ABORT ,
17+ OBJECT_MULTIPART_UPLOAD_COMPLETE ,
18+ OBJECT_MULTIPART_UPLOAD_CREATE ,
19+ OBJECT_PUT ,
20+ OBJECT_UPLOAD_PART ,
21+ } from '@sentry/conventions/op' ;
22+ import { isObjectLike , SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN , startSpan } from '@sentry/core' ;
323
424const ORIGIN = 'auto.faas.cloudflare.r2' ;
525
626const R2_OPERATIONS = {
7- get : { spanName : 'r2_get' , op : 'object.get' , operation : 'GetObject' } ,
8- head : { spanName : 'r2_head' , op : 'object.head' , operation : 'HeadObject' } ,
9- put : { spanName : 'r2_put' , op : 'object.put' , operation : 'PutObject' } ,
10- delete : { spanName : 'r2_delete' , op : 'object.delete' , operation : 'DeleteObject' } ,
11- list : { spanName : 'r2_list' , op : 'object.list' , operation : 'ListObjects' } ,
12- uploadPart : { spanName : 'r2_uploadPart' , op : 'object.upload_part' , operation : 'UploadPart' } ,
27+ get : { spanName : 'r2_get' , op : OBJECT_GET , operation : 'GetObject' } ,
28+ head : { spanName : 'r2_head' , op : OBJECT_HEAD , operation : 'HeadObject' } ,
29+ put : { spanName : 'r2_put' , op : OBJECT_PUT , operation : 'PutObject' } ,
30+ delete : { spanName : 'r2_delete' , op : OBJECT_DELETE , operation : 'DeleteObject' } ,
31+ list : { spanName : 'r2_list' , op : OBJECT_LIST , operation : 'ListObjects' } ,
32+ uploadPart : { spanName : 'r2_uploadPart' , op : OBJECT_UPLOAD_PART , operation : 'UploadPart' } ,
1333 abortMultipartUpload : {
1434 spanName : 'r2_abortMultipartUpload' ,
15- op : 'object.multipart_upload.abort' ,
35+ op : OBJECT_MULTIPART_UPLOAD_ABORT ,
1636 operation : 'AbortMultipartUpload' ,
1737 } ,
1838 createMultipartUpload : {
1939 spanName : 'r2_createMultipartUpload' ,
20- op : 'object.multipart_upload.create' ,
40+ op : OBJECT_MULTIPART_UPLOAD_CREATE ,
2141 operation : 'CreateMultipartUpload' ,
2242 } ,
2343 completeMultipartUpload : {
2444 spanName : 'r2_completeMultipartUpload' ,
25- op : 'object.multipart_upload.complete' ,
45+ op : OBJECT_MULTIPART_UPLOAD_COMPLETE ,
2646 operation : 'CompleteMultipartUpload' ,
2747 } ,
2848} as const ;
@@ -41,12 +61,12 @@ function createSpanOptions(bindingName: string, r2Op: R2OperationKey, key?: stri
4161 op,
4262 name : spanName ,
4363 attributes : {
44- 'cloudflare.r2.operation' : operation ,
45- 'cloudflare.r2.bucket' : bindingName ,
46- ...( requestKey !== undefined && { 'cloudflare.r2.request.key' : requestKey } ) ,
47- ...( isR2ListOptions ( key ) && key . prefix !== undefined && { 'cloudflare.r2.request.prefix' : key . prefix } ) ,
48- ...( isR2ListOptions ( key ) && key . delimiter !== undefined && { 'cloudflare.r2.request.delimiter' : key . delimiter } ) ,
49- [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : op ,
64+ [ CLOUDFLARE_R2_OPERATION ] : operation ,
65+ [ CLOUDFLARE_R2_BUCKET ] : bindingName ,
66+ ...( requestKey !== undefined && { [ CLOUDFLARE_R2_REQUEST_KEY ] : requestKey } ) ,
67+ ...( isR2ListOptions ( key ) && key . prefix !== undefined && { [ CLOUDFLARE_R2_REQUEST_PREFIX ] : key . prefix } ) ,
68+ ...( isR2ListOptions ( key ) && key . delimiter !== undefined && { [ CLOUDFLARE_R2_REQUEST_DELIMITER ] : key . delimiter } ) ,
69+ [ SENTRY_OP ] : op ,
5070 [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : ORIGIN ,
5171 } ,
5272 } ;
@@ -62,13 +82,14 @@ function instrumentR2MultipartUpload(upload: R2MultipartUpload, bindingName: str
6282
6383 return function ( this : unknown , ...args : Parameters < R2MultipartUpload [ 'uploadPart' ] > ) {
6484 const [ partNumber ] = args ;
85+ const spanOptions = createSpanOptions ( bindingName , 'uploadPart' , key ) ;
6586
6687 return startSpan (
6788 {
68- ...createSpanOptions ( bindingName , 'uploadPart' , key ) ,
89+ ...spanOptions ,
6990 attributes : {
70- ...createSpanOptions ( bindingName , 'uploadPart' , key ) . attributes ,
71- 'cloudflare.r2.request.part_number' : partNumber ,
91+ ...spanOptions . attributes ,
92+ [ CLOUDFLARE_R2_REQUEST_PART_NUMBER ] : partNumber ,
7293 } ,
7394 } ,
7495 ( ) => Reflect . apply ( original , target , args ) ,
0 commit comments