123 lines
3.5 KiB
TypeScript
123 lines
3.5 KiB
TypeScript
/*!
|
|
* Copyright 2019, OpenTelemetry Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import * as childProcess from 'child_process';
|
|
import { SpanKind, Attributes, Event, Span, Status } from '@opentelemetry/api';
|
|
import * as assert from 'assert';
|
|
import { ReadableSpan } from '@opentelemetry/tracing';
|
|
import {
|
|
hrTimeToMilliseconds,
|
|
hrTimeToMicroseconds,
|
|
} from '@opentelemetry/core';
|
|
|
|
export function startDocker(db: 'redis' | 'mysql' | 'postgres') {
|
|
let dockerRunCmd;
|
|
switch (db) {
|
|
case 'redis':
|
|
dockerRunCmd = `docker run -d -p 63790:6379 --name ot${db} ${db}:alpine`;
|
|
break;
|
|
|
|
case 'mysql':
|
|
dockerRunCmd = `docker run --rm -d -e MYSQL_ROOT_PASSWORD=rootpw -e MYSQL_DATABASE=test_db -e MYSQL_USER=otel -e MYSQL_PASSWORD=secret -p 33306:3306 --name ot${db} circleci/${db}:5.7`;
|
|
break;
|
|
|
|
case 'postgres':
|
|
dockerRunCmd = `docker run -d -p 54320:5432 --name ot${db} ${db}:alpine`;
|
|
break;
|
|
}
|
|
|
|
const tasks = [run(dockerRunCmd)];
|
|
|
|
for (let i = 0; i < tasks.length; i++) {
|
|
const task = tasks[i];
|
|
if (task && task.code !== 0) {
|
|
console.error('Failed to start container!');
|
|
console.error(task.output);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
export function cleanUpDocker(db: 'redis' | 'mysql' | 'postgres') {
|
|
run(`docker stop ot${db}`);
|
|
run(`docker rm ot${db}`);
|
|
}
|
|
|
|
function run(cmd: string) {
|
|
try {
|
|
const proc = childProcess.spawnSync(cmd, {
|
|
shell: true,
|
|
});
|
|
return {
|
|
code: proc.status,
|
|
output: proc.output
|
|
.map(v => String.fromCharCode.apply(null, v as any))
|
|
.join(''),
|
|
};
|
|
} catch (e) {
|
|
console.log(e);
|
|
return;
|
|
}
|
|
}
|
|
|
|
export const assertSpan = (
|
|
span: ReadableSpan,
|
|
kind: SpanKind,
|
|
attributes: Attributes,
|
|
events: Event[],
|
|
status: Status
|
|
) => {
|
|
assert.strictEqual(span.spanContext.traceId.length, 32);
|
|
assert.strictEqual(span.spanContext.spanId.length, 16);
|
|
assert.strictEqual(span.kind, kind);
|
|
|
|
assert.ok(span.endTime);
|
|
assert.strictEqual(span.links.length, 0);
|
|
|
|
assert.ok(
|
|
hrTimeToMicroseconds(span.startTime) < hrTimeToMicroseconds(span.endTime)
|
|
);
|
|
assert.ok(hrTimeToMilliseconds(span.endTime) > 0);
|
|
|
|
// attributes
|
|
assert.deepStrictEqual(span.attributes, attributes);
|
|
|
|
// events
|
|
assert.deepStrictEqual(span.events, events);
|
|
|
|
assert.strictEqual(span.status.code, status.code);
|
|
if (status.message) {
|
|
assert.strictEqual(span.status.message, status.message);
|
|
}
|
|
};
|
|
|
|
// Check if childSpan was propagated from parentSpan
|
|
export const assertPropagation = (
|
|
childSpan: ReadableSpan,
|
|
parentSpan: Span
|
|
) => {
|
|
const targetSpanContext = childSpan.spanContext;
|
|
const sourceSpanContext = parentSpan.context();
|
|
assert.strictEqual(targetSpanContext.traceId, sourceSpanContext.traceId);
|
|
assert.strictEqual(childSpan.parentSpanId, sourceSpanContext.spanId);
|
|
assert.strictEqual(
|
|
targetSpanContext.traceFlags,
|
|
sourceSpanContext.traceFlags
|
|
);
|
|
assert.notStrictEqual(targetSpanContext.spanId, sourceSpanContext.spanId);
|
|
};
|