Skip to content

Commit 6e31106

Browse files
authored
Merge pull request #5252 from cloudflare/mar/stw-r2-checksum-dup
Fix R2 tracing to use unique tags for each checksum type instead of overwriting shared tags
2 parents dfdf6b7 + b1afdfc commit 6e31106

File tree

3 files changed

+76
-15
lines changed

3 files changed

+76
-15
lines changed

src/workerd/api/r2-bucket.c++

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -328,27 +328,22 @@ void addHeadResultSpanTags(
328328
kj::str(toISOString(js, headResult.getUploaded()).asPtr()));
329329
auto checksums = headResult.getChecksums();
330330
KJ_IF_SOME(md5, checksums.get()->md5) {
331-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.value"_kjc, kj::encodeHex(md5));
332-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.type"_kjc, kj::str("md5"));
331+
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.md5"_kjc, kj::encodeHex(md5));
333332
}
334333
KJ_IF_SOME(sha1, checksums.get()->sha1) {
335-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.value"_kjc, kj::encodeHex(sha1));
336-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.type"_kjc, kj::str("sha1"));
334+
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.sha1"_kjc, kj::encodeHex(sha1));
337335
}
338336
KJ_IF_SOME(sha256, checksums.get()->sha256) {
339337
traceContext.userSpan.setTag(
340-
"cloudflare.r2.response.checksum.value"_kjc, kj::encodeHex(sha256));
341-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.type"_kjc, kj::str("sha256"));
338+
"cloudflare.r2.response.checksum.sha256"_kjc, kj::encodeHex(sha256));
342339
}
343340
KJ_IF_SOME(sha384, checksums.get()->sha384) {
344341
traceContext.userSpan.setTag(
345-
"cloudflare.r2.response.checksum.value"_kjc, kj::encodeHex(sha384));
346-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.type"_kjc, kj::str("sha384"));
342+
"cloudflare.r2.response.checksum.sha384"_kjc, kj::encodeHex(sha384));
347343
}
348344
KJ_IF_SOME(sha512, checksums.get()->sha512) {
349345
traceContext.userSpan.setTag(
350-
"cloudflare.r2.response.checksum.value"_kjc, kj::encodeHex(sha512));
351-
traceContext.userSpan.setTag("cloudflare.r2.response.checksum.type"_kjc, kj::str("sha512"));
346+
"cloudflare.r2.response.checksum.sha512"_kjc, kj::encodeHex(sha512));
352347
}
353348

354349
traceContext.userSpan.setTag(

src/workerd/api/r2-instrumentation-test.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ export const test = {
10771077
'cloudflare.binding.name': 'BUCKET',
10781078
'cloudflare.r2.operation': 'PutObject',
10791079
'cloudflare.r2.bucket': 'r2-test',
1080-
'cloudflare.r2.request.key': 'md5checksum',
1080+
'cloudflare.r2.request.key': 'multipleChecksums',
10811081
'cloudflare.r2.request.checksum.type': 'md5',
10821082
'cloudflare.r2.request.checksum.value':
10831083
'9a0364b9e99bb480dd25e1f0284c8555',
@@ -1086,6 +1086,33 @@ export const test = {
10861086
'cloudflare.r2.response.etag': 'objectEtag',
10871087
'cloudflare.r2.response.size': 123,
10881088
'cloudflare.r2.response.uploaded': '2024-08-27T14:00:57.918Z',
1089+
'cloudflare.r2.response.checksum.md5':
1090+
'9a0364b9e99bb480dd25e1f0284c8555',
1091+
'cloudflare.r2.response.checksum.sha1':
1092+
'2a0364b9e99bb480dd25e1f0284c855511223344',
1093+
'cloudflare.r2.response.checksum.sha256':
1094+
'3a0364b9e99bb480dd25e1f0284c8555112233445566778899aabbccddeeff00',
1095+
'cloudflare.r2.response.storage_class': 'Standard',
1096+
'cloudflare.r2.response.custom_metadata': true,
1097+
closed: true,
1098+
},
1099+
{
1100+
name: 'r2_head',
1101+
'cloudflare.binding.type': 'r2',
1102+
'cloudflare.binding.name': 'BUCKET',
1103+
'cloudflare.r2.operation': 'HeadObject',
1104+
'cloudflare.r2.bucket': 'r2-test',
1105+
'cloudflare.r2.request.key': 'multipleChecksums',
1106+
'cloudflare.r2.response.success': true,
1107+
'cloudflare.r2.response.etag': 'objectEtag',
1108+
'cloudflare.r2.response.size': 123,
1109+
'cloudflare.r2.response.uploaded': '2024-08-27T14:00:57.918Z',
1110+
'cloudflare.r2.response.checksum.md5':
1111+
'9a0364b9e99bb480dd25e1f0284c8555',
1112+
'cloudflare.r2.response.checksum.sha1':
1113+
'2a0364b9e99bb480dd25e1f0284c855511223344',
1114+
'cloudflare.r2.response.checksum.sha256':
1115+
'3a0364b9e99bb480dd25e1f0284c8555112233445566778899aabbccddeeff00',
10891116
'cloudflare.r2.response.storage_class': 'Standard',
10901117
'cloudflare.r2.response.custom_metadata': true,
10911118
closed: true,

src/workerd/api/r2-test.js

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ const md5Buffer = new Uint8Array([
4545
0x9a, 0x03, 0x64, 0xb9, 0xe9, 0x9b, 0xb4, 0x80, 0xdd, 0x25, 0xe1, 0xf0, 0x28,
4646
0x4c, 0x85, 0x55,
4747
]);
48+
// Test SHA1 checksum
49+
const sha1Buffer = new Uint8Array([
50+
0x2a, 0x03, 0x64, 0xb9, 0xe9, 0x9b, 0xb4, 0x80, 0xdd, 0x25, 0xe1, 0xf0, 0x28,
51+
0x4c, 0x85, 0x55, 0x11, 0x22, 0x33, 0x44,
52+
]);
53+
// Test SHA256 checksum
54+
const sha256Buffer = new Uint8Array([
55+
0x3a, 0x03, 0x64, 0xb9, 0xe9, 0x9b, 0xb4, 0x80, 0xdd, 0x25, 0xe1, 0xf0, 0x28,
56+
0x4c, 0x85, 0x55, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
57+
0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00,
58+
]);
4859
const objResponse = {
4960
name: key,
5061
version: 'objectVersion',
@@ -359,10 +370,18 @@ export default {
359370
});
360371
}
361372
}
362-
case 'md5checksum': {
373+
case 'multipleChecksums': {
374+
const toHex = (buffer) =>
375+
Array.from(buffer, (b) => b.toString(16).padStart(2, '0')).join(
376+
''
377+
);
363378
return Response.json({
364379
...objResponse,
365-
md5: md5Buffer,
380+
checksums: {
381+
0: toHex(md5Buffer), // md5
382+
1: toHex(sha1Buffer), // sha1
383+
2: toHex(sha256Buffer), // sha256
384+
},
366385
});
367386
}
368387
}
@@ -554,6 +573,22 @@ export default {
554573
body,
555574
});
556575
}
576+
case 'multipleChecksums': {
577+
const toHex = (buffer) =>
578+
Array.from(buffer, (b) => b.toString(16).padStart(2, '0')).join(
579+
''
580+
);
581+
return buildGetResponse({
582+
head: {
583+
checksums: {
584+
0: toHex(md5Buffer), // md5
585+
1: toHex(sha1Buffer), // sha1
586+
2: toHex(sha256Buffer), // sha256
587+
},
588+
},
589+
body: jsonRequest.method === 'get' ? body : undefined,
590+
});
591+
}
557592
}
558593
throw new Error('Unexpected GET');
559594
}
@@ -893,11 +928,15 @@ export default {
893928
}
894929
// Checksums
895930
{
896-
// This exists purely to test the instrumentation
897-
let resp = await env.BUCKET.put('md5checksum', body, {
931+
// This tests the instrumentation with multiple checksums to ensure proper tag handling
932+
let resp = await env.BUCKET.put('multipleChecksums', body, {
898933
md5: md5Buffer,
899934
});
900935
assert.ok(resp);
936+
937+
// Also test HEAD operation to verify checksum tags
938+
const headResp = await env.BUCKET.head('multipleChecksums');
939+
assert.ok(headResp);
901940
}
902941
},
903942
};

0 commit comments

Comments
 (0)