diff --git a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanBarRow.tsx b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanBarRow.tsx index d9189c9123..199fd0abf3 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanBarRow.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanBarRow.tsx @@ -48,6 +48,12 @@ type SpanBarRowProps = { serviceName: string; } | TNil; + noInstrumentedServer?: + | { + color: string; + serviceName: string; + } + | TNil; showErrorIcon: boolean; getViewedBounds: ViewedBoundsFunctionType; traceStartTime: number; @@ -87,6 +93,7 @@ export default class SpanBarRow extends React.PureComponent { isMatchingFilter, numTicks, rpc, + noInstrumentedServer, showErrorIcon, getViewedBounds, traceStartTime, @@ -151,6 +158,16 @@ export default class SpanBarRow extends React.PureComponent { {rpc.serviceName} )} + {noInstrumentedServer && ( + + {' '} + + {noInstrumentedServer.serviceName} + + )} {rpc ? rpc.operationName : operationName} diff --git a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.test.js b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.test.js index df79107432..62e6d1b773 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.test.js +++ b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.test.js @@ -355,6 +355,23 @@ describe('', () => { ) ).toBe(true); }); + + it('renders a SpanBarRow with a client span and no instrumented server span', () => { + const externServiceName = 'externalServiceTest'; + const leafSpan = trace.spans.find(span => !span.hasChildren); + const leafSpanIndex = trace.spans.indexOf(leafSpan); + const clientTags = [ + { key: 'span.kind', value: 'client' }, + { key: 'peer.service', value: externServiceName }, + ...leafSpan.tags, + ]; + const altTrace = updateSpan(trace, leafSpanIndex, { tags: clientTags }); + wrapper.setProps({ trace: altTrace }); + const rowWrapper = mount(instance.renderRow('some-key', {}, leafSpanIndex, {})); + const spanBarRow = rowWrapper.find(SpanBarRow); + expect(spanBarRow.length).toBe(1); + expect(spanBarRow.prop('noInstrumentedServer')).not.toBeNull(); + }); }); describe('shouldScrollToFirstUiFindMatch', () => { diff --git a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.tsx b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.tsx index 8187a8a32b..d139da234d 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.tsx +++ b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/VirtualizedTraceView.tsx @@ -31,6 +31,7 @@ import { createViewedBoundsFunc, findServerChildSpan, isErrorSpan, + isKindClient, spanContainsErredSpan, ViewedBoundsFunctionType, } from './utils'; @@ -44,6 +45,7 @@ import TTraceTimeline from '../../../types/TTraceTimeline'; import './VirtualizedTraceView.css'; import updateUiFind from '../../../utils/update-ui-find'; +import { PEER_SERVICE } from '../../../constants/tag-keys'; type RowState = { isDetail: boolean; @@ -360,6 +362,17 @@ export class VirtualizedTraceViewImpl extends React.Component kv.key === PEER_SERVICE); + // Leaf, kind == client and has peer.service tag, is likely a client span that does a request + // to an uninstrumented/external service + let noInstrumentedServer = null; + if (!span.hasChildren && peerServiceKV && isKindClient(span)) { + noInstrumentedServer = { + serviceName: peerServiceKV.value, + color: colorGenerator.getColorByKey(peerServiceKV.value), + }; + } + return (
+ span.tags.some(({ key, value }) => key === 'span.kind' && value === 'client'); + export { formatDuration } from '../../../utils/date';