diff --git a/packages/jaeger-ui/src/model/transform-trace-data.tsx b/packages/jaeger-ui/src/model/transform-trace-data.tsx index 78183e5904..df4965e5c5 100644 --- a/packages/jaeger-ui/src/model/transform-trace-data.tsx +++ b/packages/jaeger-ui/src/model/transform-trace-data.tsx @@ -15,10 +15,32 @@ import _isEqual from 'lodash/isEqual'; import { getTraceSpanIdsAsTree } from '../selectors/trace'; -import { Process, Span, SpanData, Trace, TraceData } from '../types/trace'; +import { KeyValuePair, Process, Span, SpanData, Trace, TraceData } from '../types/trace'; import TreeNode from '../utils/TreeNode'; type SpanWithProcess = SpanData & { process: Process }; +/* +{ + key: string; + value: any; +}; + */ +function deduplicateTags(spanTags: Array) { + let hasDuplicated: boolean = false; + const tags: Array = spanTags.reduce>((uniqueTags, tag) => { + if ( + !uniqueTags.some(t => { + return t.key === tag.key && t.value === tag.value; + }) + ) { + uniqueTags.push(tag); + } else { + hasDuplicated = true; + } + return uniqueTags; + }, []); + return { tags, hasDuplicated }; +} /** * NOTE: Mutates `data` - Transform the HTTP response data into the form the app @@ -93,6 +115,9 @@ export default function transformTraceData(data: TraceData & { spans: SpanWithPr span.relativeStartTime = span.startTime - traceStartTime; span.depth = depth - 1; span.hasChildren = node.children.length > 0; + const tagsInfo = deduplicateTags(span.tags); + span.tags = tagsInfo.tags; + span.hasDuplicatedTags = tagsInfo.hasDuplicated; span.references.forEach(ref => { const refSpan = spanMap.get(ref.spanID) as Span; if (refSpan) { diff --git a/packages/jaeger-ui/src/types/trace.tsx b/packages/jaeger-ui/src/types/trace.tsx index 8fcc5db853..63fdcfce18 100644 --- a/packages/jaeger-ui/src/types/trace.tsx +++ b/packages/jaeger-ui/src/types/trace.tsx @@ -61,6 +61,7 @@ export type Span = SpanData & { hasChildren: boolean; process: Process; relativeStartTime: number; + hasDuplicatedTags: boolean; }; export type TraceData = {