+
{links && links.length > 0 && }
{title}
diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/index.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/index.tsx
index 8d42d318acc..afa360a0a8e 100644
--- a/public/app/features/explore/TraceView/components/TracePageHeader/index.tsx
+++ b/public/app/features/explore/TraceView/components/TracePageHeader/index.tsx
@@ -13,3 +13,4 @@
// limitations under the License.
export { default } from './TracePageHeader';
+export { NewTracePageHeader } from './NewTracePageHeader';
diff --git a/public/app/features/explore/TraceView/components/index.ts b/public/app/features/explore/TraceView/components/index.ts
index bf4885b2b08..e2ea228bac6 100644
--- a/public/app/features/explore/TraceView/components/index.ts
+++ b/public/app/features/explore/TraceView/components/index.ts
@@ -1,5 +1,6 @@
export { default as TraceTimelineViewer } from './TraceTimelineViewer';
export { default as TracePageHeader } from './TracePageHeader';
+export { NewTracePageHeader } from './TracePageHeader';
export { default as SpanBarSettings } from './settings/SpanBarSettings';
export * from './types';
export * from './TraceTimelineViewer/types';
diff --git a/public/app/features/explore/TraceView/components/model/find-trace-name.test.ts b/public/app/features/explore/TraceView/components/model/find-trace-name.test.ts
index d27cc98bdc4..8dedcd277a9 100644
--- a/public/app/features/explore/TraceView/components/model/find-trace-name.test.ts
+++ b/public/app/features/explore/TraceView/components/model/find-trace-name.test.ts
@@ -14,7 +14,7 @@
import { TraceSpan } from '../types';
-import { _getTraceNameImpl as getTraceName } from './trace-viewer';
+import { getHeaderTags, _getTraceNameImpl as getTraceName } from './trace-viewer';
describe('getTraceName', () => {
const firstSpanId = 'firstSpanId';
@@ -221,6 +221,50 @@ describe('getTraceName', () => {
],
},
];
+ const spansWithHeaderTags = [
+ {
+ spanID: firstSpanId,
+ traceID: currentTraceId,
+ startTime: t + 200,
+ process: {},
+ references: [],
+ tags: [],
+ },
+ {
+ spanID: secondSpanId,
+ traceID: currentTraceId,
+ startTime: t + 100,
+ process: {},
+ references: [],
+ tags: [
+ {
+ key: 'http.method',
+ value: 'POST',
+ },
+ {
+ key: 'http.status_code',
+ value: '200',
+ },
+ ],
+ },
+ {
+ spanID: thirdSpanId,
+ traceID: currentTraceId,
+ startTime: t,
+ process: {},
+ references: [],
+ tags: [
+ {
+ key: 'http.status_code',
+ value: '400',
+ },
+ {
+ key: 'http.url',
+ value: '/test:80',
+ },
+ ],
+ },
+ ];
const fullTraceName = `${serviceName}: ${operationName}`;
@@ -243,4 +287,22 @@ describe('getTraceName', () => {
it('returns an id of root span with no refs', () => {
expect(getTraceName(spansWithOneRootWithNoRefs as unknown as TraceSpan[])).toEqual(fullTraceName);
});
+
+ it('returns span with header tags', () => {
+ expect(getHeaderTags(spansWithHeaderTags as unknown as TraceSpan[])).toEqual({
+ method: [
+ {
+ key: 'http.method',
+ value: 'POST',
+ },
+ ],
+ status: [
+ {
+ key: 'http.status_code',
+ value: '200',
+ },
+ ],
+ url: [],
+ });
+ });
});
diff --git a/public/app/features/explore/TraceView/components/model/trace-viewer.ts b/public/app/features/explore/TraceView/components/model/trace-viewer.ts
index 857c4750587..9e68aa9ea45 100644
--- a/public/app/features/explore/TraceView/components/model/trace-viewer.ts
+++ b/public/app/features/explore/TraceView/components/model/trace-viewer.ts
@@ -55,3 +55,31 @@ export const getTraceName = memoize(_getTraceNameImpl, (spans: TraceSpan[]) => {
}
return spans[0].traceID;
});
+
+export function findHeaderTags(spans: TraceSpan[]) {
+ for (let i = 0; i < spans.length; i++) {
+ const method = spans[i].tags.filter((tag) => {
+ return tag.key === 'http.method';
+ });
+
+ const status = spans[i].tags.filter((tag) => {
+ return tag.key === 'http.status_code';
+ });
+
+ const url = spans[i].tags.filter((tag) => {
+ return tag.key === 'http.url' || tag.key === 'http.target' || tag.key === 'http.path';
+ });
+
+ if (method.length > 0 || status.length > 0 || url.length > 0) {
+ return { method, status, url };
+ }
+ }
+ return {};
+}
+
+export const getHeaderTags = memoize(findHeaderTags, (spans: TraceSpan[]) => {
+ if (!spans.length) {
+ return 0;
+ }
+ return spans[0].traceID;
+});