[Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.HTTP_URL]: url, fallback: isFallback,
it('must change direction to entry for server rpc kind', () => { const span = new Span(tracerInstance, 'rpc'); span.setTag(opentracing.Tags.SPAN_KIND, opentracing.Tags.SPAN_KIND_RPC_SERVER); expect(span.span.data.sdk.type).to.equal('entry'); });
it('should start and finish span with https', async () => { // WARNING: nock doesn't work well with https instrumentation // create real request await request('https://risingstack.com') expect(cls.startChildSpan).to.be.calledWith(tracer, instrumentation.OPERATION_NAME, { tags: { [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.HTTP_URL]: 'https://risingstack.com:443/', [Tags.HTTP_METHOD]: 'GET' } }) expect(mockChildSpan.setTag).to.have.calledWith(Tags.HTTP_STATUS_CODE, 200) expect(mockChildSpan.finish).to.have.callCount(1) })
it('should start and finish span with http', async () => { nock('http://risingstack.com') .get('/foo') .reply(200) await request({ uri: 'http://risingstack.com/foo', query: { token: 'secret' } }) expect(cls.startChildSpan).to.be.calledWith(tracer, instrumentation.OPERATION_NAME, { tags: { [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.HTTP_URL]: 'http://risingstack.com:80/foo', [Tags.HTTP_METHOD]: 'GET' } }) expect(mockChildSpan.setTag).to.have.calledWith(Tags.HTTP_STATUS_CODE, 200) expect(mockChildSpan.finish).to.have.callCount(1) })
function nextWrapFactory (tracers) { return function nextWrap (next) { return function nextTrace (cb) { const operationName = `${OPERATION_NAME}_cursor` const statement = JSON.stringify(this.cmd) const spans = tracers.map((tracer) => cls.startChildSpan(tracer, operationName, { tags: { [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.DB_TYPE]: DB_TYPE, [Tags.DB_STATEMENT]: statement } })) debug(`Operation started ${OPERATION_NAME}`, { [Tags.DB_TYPE]: DB_TYPE, [Tags.DB_STATEMENT]: statement }) return next.call(this, wrapCallback(tracers, spans, operationName, cb)) } } }
/** * Called by Tracer when a span is finished * @method reportFinish * @param {Span} span */ reportFinish (span) { assert(span instanceof Span, 'span is required') // Ignore by tag value const isIgnored = Object.entries(this._options.ignoreTags).some(([tagKey, regexp]) => { const tagValue = span.getTag(tagKey) return tagValue && tagValue.match(regexp) }) if (isIgnored) { return } // Operation metrics this._reportOperationFinish(span) // HTTP Request if (span.getTag(Tags.SPAN_KIND) === Tags.SPAN_KIND_RPC_SERVER && (span.getTag(Tags.HTTP_URL) || span.getTag(Tags.HTTP_METHOD) || span.getTag(Tags.HTTP_STATUS_CODE))) { this._reportHttpRequestFinish(span) } }
it('must change direction to exit for producer rpc kind', () => { const span = new Span(tracerInstance, 'rpc'); span.setTag(opentracing.Tags.SPAN_KIND, 'producer'); expect(span.span.data.sdk.type).to.equal('exit'); });
span.setTag(Tags.HTTP_METHOD, 'GET') span.setTag(Tags.HTTP_STATUS_CODE, 200) span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_RPC_SERVER) clock.tick(100) span.finish()
tags[opentracing.Tags.SPAN_KIND] = opentracing.Tags.SPAN_KIND_RPC_CLIENT; tags[opentracing.Tags.ERROR] = true; tags.foo = 'bar';
const spans = tracers.map((tracer) => cls.startChildSpan(tracer, operationName, { tags: { [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.DB_TYPE]: DB_TYPE, [Tags.DB_STATEMENT]: statement
const span = tracer.startSpan('authorizing-request', { childOf: parentSpanContext, tags: {[Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER} });
function wrapFactory (tracers, command) { return function (original) { return function mongoOperationTrace (ns, ops, options, callback) { const operationName = `${OPERATION_NAME}_${command}` const statement = JSON.stringify(ops) const spans = tracers.map((tracer) => cls.startChildSpan(tracer, operationName, { tags: { [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, [Tags.DB_TYPE]: DB_TYPE, [Tags.DB_STATEMENT]: statement, [Tags.DB_INSTANCE]: ns } })) debug(`Operation started ${operationName}`, { [Tags.DB_TYPE]: DB_TYPE, [Tags.DB_STATEMENT]: statement, [Tags.DB_INSTANCE]: ns }) if (typeof options === 'function') { return original.call(this, ns, ops, wrapCallback(tracers, spans, operationName, options)) } return original.call(this, ns, ops, options, wrapCallback(tracers, spans, operationName, callback)) } } }
span1.setTag(Tags.HTTP_METHOD, 'GET') span1.setTag(Tags.HTTP_STATUS_CODE, 200) span1.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_RPC_SERVER) clock.tick(100) span1.finish() span2.setTag(Tags.HTTP_METHOD, 'POST') span2.setTag(Tags.HTTP_STATUS_CODE, 201) span2.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_RPC_SERVER) clock.tick(300) span2.finish()
it('must change direction to exit for client rpc kind', () => { const span = new Span(tracerInstance, 'rpc'); span.setTag(opentracing.Tags.SPAN_KIND, opentracing.Tags.SPAN_KIND_RPC_CLIENT); expect(span.span.data.sdk.type).to.equal('exit'); });
it('must change direction to entry for consumer rpc kind', () => { const span = new Span(tracerInstance, 'rpc'); span.setTag(opentracing.Tags.SPAN_KIND, 'consumer'); expect(span.span.data.sdk.type).to.equal('entry'); });