opentelemetry-js/packages/opentelemetry-test-utils/testUtils.ts

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);
};