Skip to content
File

Blob: src/workerd/api/tests/kv-instrumentation-test.js

javascript394 lines
1// Copyright (c) 2017-2023 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4import * as assert from 'node:assert';
5import {
6 invocationPromises,
7 spans,
8 testTailHandler,
9} from 'test:instrumentation-tail';
10 
11// Use shared instrumentation test tail worker
12export default testTailHandler;
13 
14export const test = {
15 async test() {
16 // Wait for all the tailStream executions to finish
17 await Promise.allSettled(invocationPromises);
18 
19 // Recorded streaming tail worker events, in insertion order, filtering spans not associated
20 // with KV, including jsRpc calls
21 let received = Array.from(spans.values()).filter((span) =>
22 span.name.match('kv')
23 );
24 
25 // spans emitted by kv-test.js in execution order
26 let expected = [
27 {
28 name: 'kv_get',
29 'db.system.name': 'cloudflare-kv',
30 'db.operation.name': 'get',
31 'cloudflare.binding.name': 'KV',
32 'cloudflare.binding.type': 'KV',
33 'cloudflare.kv.query.keys': 'key1, key"2',
34 'cloudflare.kv.query.keys.count': 2n,
35 'cloudflare.kv.response.size': 85n,
36 'cloudflare.kv.response.returned_rows': 2n,
37 closed: true,
38 },
39 {
40 name: 'kv_get',
41 'db.system.name': 'cloudflare-kv',
42 'db.operation.name': 'get',
43 'cloudflare.binding.name': 'KV',
44 'cloudflare.binding.type': 'KV',
45 'cloudflare.kv.query.keys': 'key1, key2',
46 'cloudflare.kv.query.keys.count': 2n,
47 'cloudflare.kv.response.size': 79n,
48 'cloudflare.kv.response.returned_rows': 2n,
49 closed: true,
50 },
51 {
52 name: 'kv_get',
53 'db.system.name': 'cloudflare-kv',
54 'db.operation.name': 'get',
55 'cloudflare.binding.name': 'KV',
56 'cloudflare.binding.type': 'KV',
57 'cloudflare.kv.query.keys':
58 'key0, key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16, key17, key18, key19, key20, key21, key22, key23, key24, key25, key26, key27, key28, key29, key30, key31, key32, key33, key34, key35, key36, key37, key38, key39, key40, key41, key42, key43, key44, key45, key46, key47, key48, key49, key50, key51, key52, key53, key54, key55, key56, key57, key58, key59, key60, key61, key62, key63, key64, key65, key66, key67, key68, key69, key70, key71, key72, key73, k...',
59 'cloudflare.kv.query.keys.count': 100n,
60 'cloudflare.kv.response.size': 4081n,
61 'cloudflare.kv.response.returned_rows': 100n,
62 closed: true,
63 },
64 {
65 name: 'kv_get',
66 'db.system.name': 'cloudflare-kv',
67 'db.operation.name': 'get',
68 'cloudflare.binding.name': 'KV',
69 'cloudflare.binding.type': 'KV',
70 'cloudflare.kv.query.keys':
71 'key0, key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16, key17, key18, key19, key20, key21, key22, key23, key24, key25, key26, key27, key28, key29, key30, key31, key32, key33, key34, key35, key36, key37, key38, key39, key40, key41, key42, key43, key44, key45, key46, key47, key48, key49, key50, key51, key52, key53, key54, key55, key56, key57, key58, key59, key60, key61, key62, key63, key64, key65, key66, key67, key68, key69, key70, key71, key72, key73, k...',
72 'cloudflare.kv.query.keys.count': 101n,
73 closed: true,
74 },
75 {
76 name: 'kv_get',
77 'db.system.name': 'cloudflare-kv',
78 'db.operation.name': 'get',
79 'cloudflare.binding.name': 'KV',
80 'cloudflare.binding.type': 'KV',
81 'cloudflare.kv.query.keys': 'key1, not-found',
82 'cloudflare.kv.query.keys.count': 2n,
83 'cloudflare.kv.query.cache_ttl': 100n,
84 'cloudflare.kv.response.size': 57n,
85 'cloudflare.kv.response.returned_rows': 2n,
86 closed: true,
87 },
88 {
89 name: 'kv_get',
90 'db.system.name': 'cloudflare-kv',
91 'db.operation.name': 'get',
92 'cloudflare.binding.name': 'KV',
93 'cloudflare.binding.type': 'KV',
94 'cloudflare.kv.query.keys': '',
95 'cloudflare.kv.query.keys.count': 0n,
96 closed: true,
97 },
98 {
99 name: 'kv_get',
100 'db.system.name': 'cloudflare-kv',
101 'db.operation.name': 'get',
102 'cloudflare.binding.name': 'KV',
103 'cloudflare.binding.type': 'KV',
104 'cloudflare.kv.query.keys': 'key1, key2',
105 'cloudflare.kv.query.keys.count': 2n,
106 'cloudflare.kv.query.type': 'json',
107 'cloudflare.kv.response.size': 67n,
108 'cloudflare.kv.response.returned_rows': 2n,
109 closed: true,
110 },
111 {
112 name: 'kv_get',
113 'db.system.name': 'cloudflare-kv',
114 'db.operation.name': 'get',
115 'cloudflare.binding.name': 'KV',
116 'cloudflare.binding.type': 'KV',
117 'cloudflare.kv.query.keys': 'key-not-json, key2',
118 'cloudflare.kv.query.keys.count': 2n,
119 'cloudflare.kv.query.type': 'json',
120 closed: true,
121 },
122 {
123 name: 'kv_get',
124 'db.system.name': 'cloudflare-kv',
125 'db.operation.name': 'get',
126 'cloudflare.binding.name': 'KV',
127 'cloudflare.binding.type': 'KV',
128 'cloudflare.kv.query.keys': 'key-not-json, key2',
129 'cloudflare.kv.query.keys.count': 2n,
130 'cloudflare.kv.query.type': 'arrayBuffer',
131 closed: true,
132 },
133 {
134 name: 'kv_get',
135 'db.system.name': 'cloudflare-kv',
136 'db.operation.name': 'get',
137 'cloudflare.binding.name': 'KV',
138 'cloudflare.binding.type': 'KV',
139 'cloudflare.kv.query.keys': 'key-not-json, key2',
140 'cloudflare.kv.query.keys.count': 2n,
141 'cloudflare.kv.query.type': 'banana',
142 closed: true,
143 },
144 {
145 name: 'kv_getWithMetadata',
146 'db.system.name': 'cloudflare-kv',
147 'db.operation.name': 'get',
148 'cloudflare.binding.name': 'KV',
149 'cloudflare.binding.type': 'KV',
150 'cloudflare.kv.query.keys': 'key1',
151 'cloudflare.kv.query.keys.count': 1n,
152 'cloudflare.kv.response.cache_status': 'HIT',
153 'cloudflare.kv.response.metadata': true,
154 'cloudflare.kv.response.size': 10n,
155 'cloudflare.kv.response.returned_rows': 1n,
156 closed: true,
157 },
158 {
159 name: 'kv_getWithMetadata',
160 'db.system.name': 'cloudflare-kv',
161 'db.operation.name': 'get',
162 'cloudflare.binding.name': 'KV',
163 'cloudflare.binding.type': 'KV',
164 'cloudflare.kv.query.keys': 'key1',
165 'cloudflare.kv.query.keys.count': 1n,
166 'cloudflare.kv.response.size': 80n,
167 'cloudflare.kv.response.returned_rows': 1n,
168 closed: true,
169 },
170 {
171 name: 'kv_getWithMetadata',
172 'db.system.name': 'cloudflare-kv',
173 'db.operation.name': 'get',
174 'cloudflare.binding.name': 'KV',
175 'cloudflare.binding.type': 'KV',
176 'cloudflare.kv.query.keys': 'key1',
177 'cloudflare.kv.query.keys.count': 1n,
178 'cloudflare.kv.query.type': 'json',
179 'cloudflare.kv.response.size': 74n,
180 'cloudflare.kv.response.returned_rows': 1n,
181 closed: true,
182 },
183 {
184 name: 'kv_getWithMetadata',
185 'db.system.name': 'cloudflare-kv',
186 'db.operation.name': 'get',
187 'cloudflare.binding.name': 'KV',
188 'cloudflare.binding.type': 'KV',
189 'cloudflare.kv.query.keys': 'key1, key2',
190 'cloudflare.kv.query.keys.count': 2n,
191 'cloudflare.kv.query.type': 'json',
192 'cloudflare.kv.response.size': 147n,
193 'cloudflare.kv.response.returned_rows': 2n,
194 closed: true,
195 },
196 {
197 name: 'kv_get',
198 'db.system.name': 'cloudflare-kv',
199 'db.operation.name': 'get',
200 'cloudflare.binding.name': 'KV',
201 'cloudflare.binding.type': 'KV',
202 'cloudflare.kv.query.keys': 'success',
203 'cloudflare.kv.query.keys.count': 1n,
204 'cloudflare.kv.response.cache_status': 'HIT',
205 'cloudflare.kv.response.metadata': true,
206 'cloudflare.kv.response.size': 13n,
207 'cloudflare.kv.response.returned_rows': 1n,
208 closed: true,
209 },
210 {
211 name: 'kv_get',
212 'db.system.name': 'cloudflare-kv',
213 'db.operation.name': 'get',
214 'cloudflare.binding.name': 'KV',
215 'cloudflare.binding.type': 'KV',
216 'cloudflare.kv.query.keys': 'fail-client',
217 'cloudflare.kv.query.keys.count': 1n,
218 closed: true,
219 },
220 {
221 name: 'kv_get',
222 'db.system.name': 'cloudflare-kv',
223 'db.operation.name': 'get',
224 'cloudflare.binding.name': 'KV',
225 'cloudflare.binding.type': 'KV',
226 'cloudflare.kv.query.keys': 'fail-server',
227 'cloudflare.kv.query.keys.count': 1n,
228 closed: true,
229 },
230 {
231 name: 'kv_get',
232 'db.system.name': 'cloudflare-kv',
233 'db.operation.name': 'get',
234 'cloudflare.binding.name': 'KV',
235 'cloudflare.binding.type': 'KV',
236 'cloudflare.kv.query.keys': 'get-json',
237 'cloudflare.kv.query.keys.count': 1n,
238 'cloudflare.kv.response.cache_status': 'HIT',
239 'cloudflare.kv.response.metadata': true,
240 'cloudflare.kv.response.size': 20n,
241 'cloudflare.kv.response.returned_rows': 1n,
242 closed: true,
243 },
244 {
245 name: 'kv_get',
246 'db.system.name': 'cloudflare-kv',
247 'db.operation.name': 'get',
248 'cloudflare.binding.name': 'KV',
249 'cloudflare.binding.type': 'KV',
250 'cloudflare.kv.query.keys': 'get-json',
251 'cloudflare.kv.query.keys.count': 1n,
252 'cloudflare.kv.query.type': 'json',
253 'cloudflare.kv.response.cache_status': 'HIT',
254 'cloudflare.kv.response.metadata': true,
255 'cloudflare.kv.response.size': 20n,
256 'cloudflare.kv.response.returned_rows': 1n,
257 closed: true,
258 },
259 {
260 name: 'kv_get',
261 'db.system.name': 'cloudflare-kv',
262 'db.operation.name': 'get',
263 'cloudflare.binding.name': 'KV',
264 'cloudflare.binding.type': 'KV',
265 'cloudflare.kv.query.keys': 'success',
266 'cloudflare.kv.query.keys.count': 1n,
267 'cloudflare.kv.query.type': 'stream',
268 'cloudflare.kv.response.cache_status': 'HIT',
269 'cloudflare.kv.response.metadata': true,
270 'cloudflare.kv.response.size': 13n,
271 'cloudflare.kv.response.returned_rows': 1n,
272 closed: true,
273 },
274 {
275 name: 'kv_get',
276 'db.system.name': 'cloudflare-kv',
277 'db.operation.name': 'get',
278 'cloudflare.binding.name': 'KV',
279 'cloudflare.binding.type': 'KV',
280 'cloudflare.kv.query.keys': 'success',
281 'cloudflare.kv.query.keys.count': 1n,
282 'cloudflare.kv.query.type': 'arrayBuffer',
283 'cloudflare.kv.response.cache_status': 'HIT',
284 'cloudflare.kv.response.metadata': true,
285 'cloudflare.kv.response.size': 13n,
286 'cloudflare.kv.response.returned_rows': 1n,
287 closed: true,
288 },
289 {
290 name: 'kv_list',
291 'db.system.name': 'cloudflare-kv',
292 'db.operation.name': 'list',
293 'cloudflare.binding.name': 'KV',
294 'cloudflare.binding.type': 'KV',
295 'cloudflare.kv.query.prefix': 'te',
296 'cloudflare.kv.response.cache_status': 'HIT',
297 'cloudflare.kv.response.size': 291n,
298 'cloudflare.kv.response.list_complete': false,
299 'cloudflare.kv.response.cursor': '6Ck1la0VxJ0djhidm1MdX2FyD',
300 'cloudflare.kv.response.expiration': 1234n,
301 'cloudflare.kv.response.returned_rows': 3n,
302 closed: true,
303 },
304 {
305 name: 'kv_list',
306 'db.system.name': 'cloudflare-kv',
307 'db.operation.name': 'list',
308 'cloudflare.binding.name': 'KV',
309 'cloudflare.binding.type': 'KV',
310 'cloudflare.kv.query.limit': 100n,
311 'cloudflare.kv.query.prefix': 'te',
312 'cloudflare.kv.query.cursor': '123',
313 'cloudflare.kv.response.cache_status': 'HIT',
314 'cloudflare.kv.response.size': 6939n,
315 'cloudflare.kv.response.list_complete': true,
316 'cloudflare.kv.response.expiration': 1234n,
317 'cloudflare.kv.response.returned_rows': 100n,
318 closed: true,
319 },
320 {
321 name: 'kv_list',
322 'db.system.name': 'cloudflare-kv',
323 'db.operation.name': 'list',
324 'cloudflare.binding.name': 'KV',
325 'cloudflare.binding.type': 'KV',
326 'cloudflare.kv.query.prefix': 'not-found',
327 'cloudflare.kv.response.cache_status': 'HIT',
328 'cloudflare.kv.response.size': 32n,
329 'cloudflare.kv.response.list_complete': true,
330 'cloudflare.kv.response.returned_rows': 0n,
331 closed: true,
332 },
333 {
334 name: 'kv_put',
335 'db.system.name': 'cloudflare-kv',
336 'db.operation.name': 'put',
337 'cloudflare.binding.name': 'KV',
338 'cloudflare.binding.type': 'KV',
339 'cloudflare.kv.query.keys': 'foo_with_exp',
340 'cloudflare.kv.query.keys.count': 1n,
341 'cloudflare.kv.query.expiration': 10n,
342 'cloudflare.kv.query.value_type': 'text',
343 'cloudflare.kv.query.payload.size': 4n,
344 closed: true,
345 },
346 {
347 name: 'kv_put',
348 'db.system.name': 'cloudflare-kv',
349 'db.operation.name': 'put',
350 'cloudflare.binding.name': 'KV',
351 'cloudflare.binding.type': 'KV',
352 'cloudflare.kv.query.keys': 'foo_with_expTtl',
353 'cloudflare.kv.query.keys.count': 1n,
354 'cloudflare.kv.query.expiration_ttl': 15n,
355 'cloudflare.kv.query.value_type': 'text',
356 'cloudflare.kv.query.payload.size': 23n,
357 closed: true,
358 },
359 {
360 name: 'kv_put',
361 'db.system.name': 'cloudflare-kv',
362 'db.operation.name': 'put',
363 'cloudflare.binding.name': 'KV',
364 'cloudflare.binding.type': 'KV',
365 'cloudflare.kv.query.keys': 'foo_with_expTtl',
366 'cloudflare.kv.query.keys.count': 1n,
367 'cloudflare.kv.query.expiration_ttl': 15n,
368 'cloudflare.kv.query.value_type': 'ArrayBuffer',
369 'cloudflare.kv.query.payload.size': 256n,
370 closed: true,
371 },
372 ];
373 
374 assert.equal(
375 received.length,
376 expected.length,
377 `Expected ${expected.length} received ${received.length} spans`
378 );
379 let errors = [];
380 for (let i = 0; i < received.length; i++) {
381 try {
382 assert.deepStrictEqual(received[i], expected[i]);
383 } catch (e) {
384 console.error(`value: ${i} does not match`);
385 console.log(e);
386 errors.push(e);
387 }
388 }
389 if (errors.length > 0) {
390 throw 'kv spans are incorrect';
391 }
392 },
393};