diff --git a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx
index 7456debdbe..b0aa6b41e4 100644
--- a/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx
+++ b/packages/jaeger-ui/src/components/TracePage/TracePageHeader/TracePageHeader.tsx
@@ -150,7 +150,7 @@ export function TracePageHeaderFn(props: TracePageHeaderEmbedProps & { forwarded
const title = (
- {' '}
+ {' '}
{trace.traceID.slice(0, 7)}
);
diff --git a/packages/jaeger-ui/src/model/find-trace-name.test.js b/packages/jaeger-ui/src/model/find-trace-name.test.js
index b9963555dd..881a450d02 100644
--- a/packages/jaeger-ui/src/model/find-trace-name.test.js
+++ b/packages/jaeger-ui/src/model/find-trace-name.test.js
@@ -219,26 +219,29 @@ describe('getTraceName', () => {
],
},
];
+ const getTraceNameWrapper = jest.fn(spans =>
+ getTraceName(spans, `${spans.length}${getTraceNameWrapper.mock.calls.length}`)
+ );
const fullTraceName = `${serviceName}: ${operationName}`;
it('returns an empty string if given spans with no root among them', () => {
- expect(getTraceName(spansWithNoRoots)).toEqual('');
+ expect(getTraceNameWrapper(spansWithNoRoots)).toEqual('');
});
it('returns an id of root span with the earliest startTime', () => {
- expect(getTraceName(spansWithMultipleRootsDifferentByStartTime)).toEqual(fullTraceName);
+ expect(getTraceNameWrapper(spansWithMultipleRootsDifferentByStartTime)).toEqual(fullTraceName);
});
it('returns an id of root span without any refs', () => {
- expect(getTraceName(spansWithMultipleRootsWithOneWithoutRefs)).toEqual(fullTraceName);
+ expect(getTraceNameWrapper(spansWithMultipleRootsWithOneWithoutRefs)).toEqual(fullTraceName);
});
it('returns an id of root span with remote ref', () => {
- expect(getTraceName(spansWithOneRootWithRemoteRef)).toEqual(fullTraceName);
+ expect(getTraceNameWrapper(spansWithOneRootWithRemoteRef)).toEqual(fullTraceName);
});
it('returns an id of root span with no refs', () => {
- expect(getTraceName(spansWithOneRootWithNoRefs)).toEqual(fullTraceName);
+ expect(getTraceNameWrapper(spansWithOneRootWithNoRefs)).toEqual(fullTraceName);
});
});
diff --git a/packages/jaeger-ui/src/model/trace-viewer.tsx b/packages/jaeger-ui/src/model/trace-viewer.tsx
index 049d6dcf6a..eb70fdb5fe 100644
--- a/packages/jaeger-ui/src/model/trace-viewer.tsx
+++ b/packages/jaeger-ui/src/model/trace-viewer.tsx
@@ -12,12 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+import _memoize from 'lodash/memoize';
+
import { Span } from '../types/trace';
type spansDict = { [index: string]: Span };
-// eslint-disable-next-line import/prefer-default-export
-export function getTraceName(spans: Span[]) {
+function getTraceNameImpl(spans: Span[], traceID: string) {
const allTraceSpans: spansDict = spans.reduce((dict, span) => ({ ...dict, [span.spanID]: span }), {});
const rootSpan = spans
.filter(sp => {
@@ -38,3 +39,6 @@ export function getTraceName(spans: Span[]) {
return rootSpan ? `${rootSpan.process.serviceName}: ${rootSpan.operationName}` : '';
}
+
+// eslint-disable-next-line import/prefer-default-export
+export const getTraceName = _memoize(getTraceNameImpl, (_spans, traceID) => traceID);
diff --git a/packages/jaeger-ui/src/model/transform-trace-data.tsx b/packages/jaeger-ui/src/model/transform-trace-data.tsx
index 3ec49f73ce..902dd3f2a5 100644
--- a/packages/jaeger-ui/src/model/transform-trace-data.tsx
+++ b/packages/jaeger-ui/src/model/transform-trace-data.tsx
@@ -160,7 +160,7 @@ export default function transformTraceData(data: TraceData & { spans: SpanData[]
});
spans.push(span);
});
- const traceName = getTraceName(spans);
+ const traceName = getTraceName(spans, traceID);
const services = Object.keys(svcCounts).map(name => ({ name, numberOfSpans: svcCounts[name] }));
return {
services,