UNPKG

nestjs-otel

Version:
110 lines 4.56 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const api_1 = require("@opentelemetry/api"); const sdk_node_1 = require("@opentelemetry/sdk-node"); const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node"); const common_1 = require("@nestjs/common"); const span_1 = require("./span"); const TestDecoratorThatSetsMetadata = () => (0, common_1.SetMetadata)('some-metadata', true); class TestSpan { singleSpan() { } doubleSpan() { return this.singleSpan(); } error() { throw new Error('hello world'); } metadata() { } } __decorate([ (0, span_1.Span)(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], TestSpan.prototype, "singleSpan", null); __decorate([ (0, span_1.Span)(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], TestSpan.prototype, "doubleSpan", null); __decorate([ (0, span_1.Span)(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], TestSpan.prototype, "error", null); __decorate([ (0, span_1.Span)(), TestDecoratorThatSetsMetadata(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], TestSpan.prototype, "metadata", null); describe('Span', () => { let instance; let traceExporter; let spanProcessor; let provider; beforeAll(async () => { instance = new TestSpan(); traceExporter = new sdk_node_1.tracing.InMemorySpanExporter(); spanProcessor = new sdk_node_1.tracing.SimpleSpanProcessor(traceExporter); provider = new sdk_trace_node_1.NodeTracerProvider(); provider.addSpanProcessor(spanProcessor); provider.register(); }); afterEach(async () => { spanProcessor.forceFlush(); traceExporter.reset(); }); afterAll(async () => { await provider.shutdown(); }); it('should maintain reflect metadataa', async () => { expect(Reflect.getMetadata('some-metadata', instance.metadata)).toEqual(true); }); it('should set correct span', async () => { instance.singleSpan(); const spans = traceExporter.getFinishedSpans(); expect(spans).toHaveLength(1); expect(spans.map(span => span.name)).toEqual(['TestSpan.singleSpan']); }); it('should set correct span even when calling other method with Span decorator', async () => { instance.doubleSpan(); const spans = traceExporter.getFinishedSpans(); expect(spans).toHaveLength(2); expect(spans.map(span => span.name)).toEqual(['TestSpan.singleSpan', 'TestSpan.doubleSpan']); }); it('should propagate errors', () => { expect(instance.error).toThrowError('hello world'); }); it('should set setStatus to ERROR and message to error message', async () => { expect(instance.error).toThrowError('hello world'); const spans = traceExporter.getFinishedSpans(); expect(spans).toHaveLength(1); expect(spans[0].status).toEqual({ code: api_1.SpanStatusCode.ERROR, message: 'hello world' }); }); it('should set recordException with error', () => { expect(instance.error).toThrowError('hello world'); const spans = traceExporter.getFinishedSpans(); expect(spans).toHaveLength(1); expect(spans[0].events).toHaveLength(1); expect(spans[0].events[0]).toEqual({ name: 'exception', attributes: expect.anything(), time: expect.anything(), }); }); }); //# sourceMappingURL=span.spec.js.map