文件
hyb-oa/server/tests/unit/observability/tracing.test.js
T

91 行
3.0 KiB
JavaScript

const { initTracing, shutdownTracing } = require("../../../src/observability/tracing");
function buildDependencies({ constructError = null } = {}) {
const instances = [];
const resourceFromAttributes = vi.fn((attributes) => ({ attributes }));
const getNodeAutoInstrumentations = vi.fn((options) => ({ options }));
const logger = { log: vi.fn(), error: vi.fn() };
class TestNodeSDK {
constructor(options) {
if (constructError) {
throw constructError;
}
this.options = options;
this.start = vi.fn();
this.shutdown = vi.fn(async () => {});
instances.push(this);
}
}
return {
overrides: {
NodeSDK: TestNodeSDK,
ConsoleSpanExporter: class TestConsoleSpanExporter {},
resourceFromAttributes,
getNodeAutoInstrumentations,
logger,
},
instances,
resourceFromAttributes,
getNodeAutoInstrumentations,
logger,
};
}
describe("observability tracing", () => {
afterEach(async () => {
await shutdownTracing();
});
it("does not initialize the SDK when traces are disabled", () => {
const dependencies = buildDependencies();
expect(initTracing({ otelTracesEnabled: false }, dependencies.overrides)).toBeNull();
expect(dependencies.instances).toHaveLength(0);
});
it("initializes the SDK with the service resource and filesystem instrumentation disabled", () => {
const dependencies = buildDependencies();
const result = initTracing({ otelTracesEnabled: true }, dependencies.overrides);
expect(result).toBe(dependencies.instances[0]);
expect(dependencies.resourceFromAttributes).toHaveBeenCalledWith({ "service.name": "hyb-oa-server" });
expect(dependencies.getNodeAutoInstrumentations).toHaveBeenCalledWith({
"@opentelemetry/instrumentation-fs": { enabled: false },
});
expect(result.start).toHaveBeenCalledOnce();
expect(dependencies.logger.log).toHaveBeenCalledWith("OTel tracing initialized");
});
it("supports a distinct worker service name", () => {
const dependencies = buildDependencies();
initTracing({ otelTracesEnabled: true }, {
...dependencies.overrides,
serviceName: "hyb-oa-worker",
});
expect(dependencies.resourceFromAttributes).toHaveBeenCalledWith({ "service.name": "hyb-oa-worker" });
});
it("contains initialization failures and leaves tracing disabled", () => {
const error = new Error("otel_init_failed");
const dependencies = buildDependencies({ constructError: error });
expect(initTracing({ otelTracesEnabled: true }, dependencies.overrides)).toBeNull();
expect(dependencies.logger.error).toHaveBeenCalledWith("Error initializing OTel tracing", error);
});
it("shuts down an initialized SDK once", async () => {
const dependencies = buildDependencies();
const instance = initTracing({ otelTracesEnabled: true }, dependencies.overrides);
await shutdownTracing();
await shutdownTracing();
expect(instance.shutdown).toHaveBeenCalledOnce();
});
});