Skip to content

Commit 4261105

Browse files
authored
Merge branch 'googleapis:main' into main
2 parents 4b173ba + 0342e74 commit 4261105

20 files changed

+2758
-485
lines changed

observability-test/batch-transaction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ describe('BatchTransaction', () => {
139139
batchTransaction = new BatchTransaction(SESSION as {} as Session);
140140
batchTransaction.session = SESSION as {} as Session;
141141
batchTransaction.id = ID;
142-
batchTransaction.observabilityOptions = {tracerProvider: provider};
142+
batchTransaction._observabilityOptions = {tracerProvider: provider};
143143
REQUEST.callsFake((_, callback) => callback(null, RESPONSE));
144144
});
145145

observability-test/database.ts

Lines changed: 147 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {Instance, Spanner} from '../src';
3939
import * as pfy from '@google-cloud/promisify';
4040
import {grpc} from 'google-gax';
4141
import {MockError} from '../test/mockserver/mockspanner';
42+
const {generateWithAllSpansHaveDBName} = require('./helper');
4243

4344
const fakePfy = extend({}, pfy, {
4445
promisifyAll(klass, options) {
@@ -235,16 +236,20 @@ describe('Database', () => {
235236
DatabaseCached = Object.assign({}, Database);
236237
});
237238

239+
const withAllSpansHaveDBName = generateWithAllSpansHaveDBName(
240+
INSTANCE.formattedName_ + '/databases/' + NAME
241+
);
242+
238243
beforeEach(() => {
239244
fakeCodec.encode = util.noop;
240245
extend(Database, DatabaseCached);
241-
database = new Database(INSTANCE, NAME, POOL_OPTIONS);
242-
database.parent = INSTANCE;
243-
database.databaseRole = 'parent_role';
244-
database.observabilityConfig = {
246+
INSTANCE._observabilityOptions = {
245247
tracerProvider: provider,
246248
enableExtendedTracing: false,
247249
};
250+
database = new Database(INSTANCE, NAME, POOL_OPTIONS);
251+
database.parent = INSTANCE;
252+
database.databaseRole = 'parent_role';
248253
const gaxOpts = {};
249254
const options: {
250255
a: string;
@@ -285,6 +290,8 @@ describe('Database', () => {
285290
const spans = traceExporter.getFinishedSpans();
286291
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
287292

293+
withAllSpansHaveDBName(spans);
294+
288295
const actualSpanNames: string[] = [];
289296
const actualEventNames: string[] = [];
290297
spans.forEach(span => {
@@ -333,6 +340,7 @@ describe('Database', () => {
333340
traceExporter.forceFlush();
334341
const spans = traceExporter.getFinishedSpans();
335342
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
343+
withAllSpansHaveDBName(spans);
336344

337345
const actualSpanNames: string[] = [];
338346
const actualEventNames: string[] = [];
@@ -375,6 +383,115 @@ describe('Database', () => {
375383
});
376384
});
377385

386+
describe('batchCreateSessions', () => {
387+
it('without error', done => {
388+
const ARGS = [null, [{}]];
389+
database.request = (config, callback) => {
390+
callback(...ARGS);
391+
};
392+
393+
database.batchCreateSessions(10, (err, sessions) => {
394+
assert.ifError(err);
395+
assert.ok(sessions);
396+
397+
traceExporter.forceFlush();
398+
const spans = traceExporter.getFinishedSpans();
399+
400+
const actualSpanNames: string[] = [];
401+
const actualEventNames: string[] = [];
402+
spans.forEach(span => {
403+
actualSpanNames.push(span.name);
404+
span.events.forEach(event => {
405+
actualEventNames.push(event.name);
406+
});
407+
});
408+
409+
const expectedSpanNames = ['CloudSpanner.Database.batchCreateSessions'];
410+
assert.deepStrictEqual(
411+
actualSpanNames,
412+
expectedSpanNames,
413+
`span names mismatch:\n\tGot: ${actualSpanNames}\n\tWant: ${expectedSpanNames}`
414+
);
415+
416+
// Ensure that the span didn't encounter an error.
417+
const firstSpan = spans[0];
418+
assert.strictEqual(
419+
SpanStatusCode.UNSET,
420+
firstSpan.status.code,
421+
'Unexpected span status code'
422+
);
423+
assert.strictEqual(
424+
undefined,
425+
firstSpan.status.message,
426+
'Mismatched span status message'
427+
);
428+
429+
// We don't expect events.
430+
const expectedEventNames = [];
431+
assert.deepStrictEqual(
432+
actualEventNames,
433+
expectedEventNames,
434+
`Unexpected events:\n\tGot: ${actualEventNames}\n\tWant: ${expectedEventNames}`
435+
);
436+
437+
done();
438+
});
439+
});
440+
441+
it('with error', done => {
442+
const ARGS = [new Error('batchCreateSessions.error'), null];
443+
database.request = (config, callback) => {
444+
callback(...ARGS);
445+
};
446+
447+
database.batchCreateSessions(10, (err, sessions) => {
448+
assert.ok(err);
449+
assert.ok(!sessions);
450+
traceExporter.forceFlush();
451+
const spans = traceExporter.getFinishedSpans();
452+
453+
const actualSpanNames: string[] = [];
454+
const actualEventNames: string[] = [];
455+
spans.forEach(span => {
456+
actualSpanNames.push(span.name);
457+
span.events.forEach(event => {
458+
actualEventNames.push(event.name);
459+
});
460+
});
461+
462+
const expectedSpanNames = ['CloudSpanner.Database.batchCreateSessions'];
463+
assert.deepStrictEqual(
464+
actualSpanNames,
465+
expectedSpanNames,
466+
`span names mismatch:\n\tGot: ${actualSpanNames}\n\tWant: ${expectedSpanNames}`
467+
);
468+
469+
// Ensure that the span actually produced an error that was recorded.
470+
const firstSpan = spans[0];
471+
assert.strictEqual(
472+
SpanStatusCode.ERROR,
473+
firstSpan.status.code,
474+
'Expected an ERROR span status'
475+
);
476+
assert.strictEqual(
477+
'batchCreateSessions.error',
478+
firstSpan.status.message,
479+
'Mismatched span status message'
480+
);
481+
482+
// We don't expect events.
483+
const expectedEventNames = [];
484+
assert.deepStrictEqual(
485+
actualEventNames,
486+
expectedEventNames,
487+
`Unexpected events:\n\tGot: ${actualEventNames}\n\tWant: ${expectedEventNames}`
488+
);
489+
490+
done();
491+
});
492+
});
493+
});
494+
378495
describe('getSnapshot', () => {
379496
let fakePool: FakeSessionPool;
380497
let fakeSession: FakeSession;
@@ -409,11 +526,12 @@ describe('Database', () => {
409526

410527
getSessionStub.callsFake(callback => callback(fakeError, null));
411528

412-
database.getSnapshot((err, snapshot) => {
529+
database.getSnapshot(err => {
413530
assert.strictEqual(err, fakeError);
414531
traceExporter.forceFlush();
415532
const spans = traceExporter.getFinishedSpans();
416533
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
534+
withAllSpansHaveDBName(spans);
417535

418536
const actualSpanNames: string[] = [];
419537
const actualEventNames: string[] = [];
@@ -495,6 +613,7 @@ describe('Database', () => {
495613

496614
const spans = traceExporter.getFinishedSpans();
497615
assert.strictEqual(spans.length, 2, 'Exactly 2 spans expected');
616+
withAllSpansHaveDBName(spans);
498617

499618
const actualSpanNames: string[] = [];
500619
const actualEventNames: string[] = [];
@@ -597,6 +716,8 @@ describe('Database', () => {
597716

598717
const spans = traceExporter.getFinishedSpans();
599718
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
719+
withAllSpansHaveDBName(spans);
720+
600721
const actualEventNames: string[] = [];
601722
const actualSpanNames: string[] = [];
602723
spans.forEach(span => {
@@ -662,6 +783,7 @@ describe('Database', () => {
662783
assert.strictEqual(resp, RESPONSE);
663784
const spans = traceExporter.getFinishedSpans();
664785
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
786+
withAllSpansHaveDBName(spans);
665787

666788
const actualEventNames: string[] = [];
667789
const actualSpanNames: string[] = [];
@@ -727,6 +849,8 @@ describe('Database', () => {
727849

728850
const spans = traceExporter.getFinishedSpans();
729851
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
852+
withAllSpansHaveDBName(spans);
853+
730854
const actualSpanNames: string[] = [];
731855
const actualEventNames: string[] = [];
732856
spans.forEach(span => {
@@ -802,6 +926,8 @@ describe('Database', () => {
802926

803927
const spans = traceExporter.getFinishedSpans();
804928
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
929+
withAllSpansHaveDBName(spans);
930+
805931
const actualEventNames: string[] = [];
806932
const actualSpanNames: string[] = [];
807933
spans.forEach(span => {
@@ -849,6 +975,8 @@ describe('Database', () => {
849975
assert.strictEqual(transaction, fakeTransaction);
850976

851977
const spans = traceExporter.getFinishedSpans();
978+
withAllSpansHaveDBName(spans);
979+
852980
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
853981
const actualEventNames: string[] = [];
854982
const actualSpanNames: string[] = [];
@@ -928,6 +1056,7 @@ describe('Database', () => {
9281056

9291057
const spans = traceExporter.getFinishedSpans();
9301058
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1059+
withAllSpansHaveDBName(spans);
9311060

9321061
const actualEventNames: string[] = [];
9331062
const actualSpanNames: string[] = [];
@@ -982,6 +1111,7 @@ describe('Database', () => {
9821111

9831112
const spans = traceExporter.getFinishedSpans();
9841113
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1114+
withAllSpansHaveDBName(spans);
9851115

9861116
const actualEventNames: string[] = [];
9871117
const actualSpanNames: string[] = [];
@@ -1027,7 +1157,6 @@ describe('Database', () => {
10271157
});
10281158

10291159
it('with error on null mutation should catch thrown error', done => {
1030-
const fakeError = new Error('err');
10311160
try {
10321161
database.writeAtLeastOnce(null, (err, res) => {});
10331162
} catch (err) {
@@ -1040,6 +1169,8 @@ describe('Database', () => {
10401169

10411170
const spans = traceExporter.getFinishedSpans();
10421171
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1172+
withAllSpansHaveDBName(spans);
1173+
10431174
const actualSpanNames: string[] = [];
10441175
const actualEventNames: string[] = [];
10451176
spans.forEach(span => {
@@ -1114,6 +1245,8 @@ describe('Database', () => {
11141245

11151246
const spans = traceExporter.getFinishedSpans();
11161247
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1248+
withAllSpansHaveDBName(spans);
1249+
11171250
const actualSpanNames: string[] = [];
11181251
const actualEventNames: string[] = [];
11191252
spans.forEach(span => {
@@ -1165,6 +1298,8 @@ describe('Database', () => {
11651298

11661299
const spans = traceExporter.getFinishedSpans();
11671300
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1301+
withAllSpansHaveDBName(spans);
1302+
11681303
const actualSpanNames: string[] = [];
11691304
const actualEventNames: string[] = [];
11701305
spans.forEach(span => {
@@ -1268,6 +1403,8 @@ describe('Database', () => {
12681403

12691404
const spans = traceExporter.getFinishedSpans();
12701405
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1406+
withAllSpansHaveDBName(spans);
1407+
12711408
const actualEventNames: string[] = [];
12721409
const actualSpanNames: string[] = [];
12731410
spans.forEach(span => {
@@ -1319,6 +1456,8 @@ describe('Database', () => {
13191456

13201457
const spans = traceExporter.getFinishedSpans();
13211458
assert.strictEqual(spans.length, 1, 'Exactly 1 span expected');
1459+
withAllSpansHaveDBName(spans);
1460+
13221461
const actualEventNames: string[] = [];
13231462
const actualSpanNames: string[] = [];
13241463
spans.forEach(span => {
@@ -1383,6 +1522,8 @@ describe('Database', () => {
13831522

13841523
const spans = traceExporter.getFinishedSpans();
13851524
assert.strictEqual(spans.length, 2, 'Exactly 1 span expected');
1525+
withAllSpansHaveDBName(spans);
1526+
13861527
const actualSpanNames: string[] = [];
13871528
const actualEventNames: string[] = [];
13881529
spans.forEach(span => {

observability-test/helper.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616

1717
import {ContextManager, context} from '@opentelemetry/api';
18+
import * as assert from 'assert';
19+
const {ReadableSpan} = require('@opentelemetry/sdk-trace-base');
20+
import {SEMATTRS_DB_NAME} from '@opentelemetry/semantic-conventions';
1821

1922
/**
2023
* This utility exists as a test helper because mocha has builtin "context"
@@ -32,3 +35,15 @@ export function disableContextAndManager(manager: ContextManager) {
3235
manager.disable();
3336
context.disable();
3437
}
38+
39+
export function generateWithAllSpansHaveDBName(dbName: String): Function {
40+
return function (spans: (typeof ReadableSpan)[]) {
41+
spans.forEach(span => {
42+
assert.deepStrictEqual(
43+
span.attributes[SEMATTRS_DB_NAME],
44+
dbName,
45+
`Span ${span.name} has mismatched DB_NAME`
46+
);
47+
});
48+
};
49+
}

0 commit comments

Comments
 (0)