From eccbce711540a9872612e71b47c12ca4e01188cf Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sat, 27 Mar 2021 18:06:09 +0530 Subject: [PATCH 1/8] feat: show exit calls breakup in span detail --- .../span-exit-calls.component.test.ts | 38 ++++++++++++++ .../exit-calls/span-exit-calls.component.ts | 52 +++++++++++++++++++ .../exit-calls/span-exit-calls.module.ts | 11 ++++ .../components/span-detail/span-data.ts | 1 + .../span-detail/span-detail.component.ts | 5 ++ .../span-detail/span-detail.module.ts | 4 +- .../api-trace-detail-data-source.model.ts | 6 ++- .../waterfall/waterfall/waterfall-chart.ts | 1 + 8 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts create mode 100644 projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.ts create mode 100644 projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.module.ts diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts new file mode 100644 index 000000000..462237f76 --- /dev/null +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts @@ -0,0 +1,38 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { fakeAsync } from '@angular/core/testing'; +import { IconLibraryTestingModule } from '@hypertrace/assets-library'; +import { NavigationService } from '@hypertrace/common'; +import { runFakeRxjs } from '@hypertrace/test-utils'; +import { createHostFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { SpanExitCallsComponent } from './span-exit-calls.component'; +import { SpanExitCallsModule } from './span-exit-calls.module'; + +describe('SpanExitCallsComponent', () => { + let spectator: Spectator; + + const createHost = createHostFactory({ + component: SpanExitCallsComponent, + imports: [SpanExitCallsModule, HttpClientTestingModule, IconLibraryTestingModule], + declareComponent: false, + providers: [mockProvider(NavigationService)] + }); + + it('should render data correctly', fakeAsync(() => { + spectator = createHost(``, { + hostProps: { exitCalls: { 'name 1': '10', 'name 2': '11' } } + }); + + runFakeRxjs(({ expectObservable }) => { + expect(spectator.component.dataSource).toBeDefined(); + expectObservable(spectator.component.dataSource!.getData(undefined!)).toBe('(x|)', { + x: { + data: [ + { name: 'name 1', calls: '10' }, + { name: 'name 2', calls: '11' } + ], + totalCount: 3 + } + }); + }); + })); +}); diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.ts new file mode 100644 index 000000000..136648ff3 --- /dev/null +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.ts @@ -0,0 +1,52 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { Dictionary } from '@hypertrace/common'; +import { TableColumnConfig, TableDataResponse, TableDataSource, TableRow } from '@hypertrace/components'; +import { Observable, of } from 'rxjs'; + +@Component({ + selector: 'ht-span-exit-calls', + changeDetection: ChangeDetectionStrategy.OnPush, + template: `
+ +
` +}) +export class SpanExitCallsComponent implements OnInit { + @Input() + public exitCalls?: Dictionary; + + public dataSource?: TableDataSource; + public columnConfigs: TableColumnConfig[] = [ + { + id: 'name', + name: 'name', + title: 'Service', + visible: true, + width: '80%', + sortable: false, + filterable: false + }, + { + id: 'calls', + name: 'calls', + title: 'Calls', + visible: true, + sortable: false, + filterable: false + } + ]; + + public ngOnInit(): void { + this.buildDataSource(); + } + + private buildDataSource(): void { + this.dataSource = { + getData: (): Observable> => + of({ + data: Object.entries(this.exitCalls ?? {}).map(item => ({ name: item[0], calls: item[1] })), + totalCount: Object.keys(this.exitCalls ?? {}).length + }), + getScope: () => undefined + }; + } +} diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.module.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.module.ts new file mode 100644 index 000000000..90cb53328 --- /dev/null +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { TableModule } from '@hypertrace/components'; +import { SpanExitCallsComponent } from './span-exit-calls.component'; + +@NgModule({ + declarations: [SpanExitCallsComponent], + exports: [SpanExitCallsComponent], + imports: [CommonModule, TableModule] +}) +export class SpanExitCallsModule {} diff --git a/projects/distributed-tracing/src/shared/components/span-detail/span-data.ts b/projects/distributed-tracing/src/shared/components/span-detail/span-data.ts index 02614b9bb..94100c3e8 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/span-data.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/span-data.ts @@ -11,4 +11,5 @@ export interface SpanData { responseBody: string; tags: Dictionary; requestUrl: string; + exitCallsBreakup?: Dictionary; } diff --git a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts index 58565f967..d27046ea7 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts @@ -43,6 +43,9 @@ import { SpanDetailLayoutStyle } from './span-detail-layout-style'; + + + ` @@ -62,11 +65,13 @@ export class SpanDetailComponent implements OnChanges { public showRequestTab?: boolean; public showResponseTab?: boolean; + public showExitCallsTab?: boolean; public ngOnChanges(changes: TypedSimpleChanges): void { if (changes.spanData) { this.showRequestTab = !isEmpty(this.spanData?.requestHeaders) || !isEmpty(this.spanData?.requestBody); this.showResponseTab = !isEmpty(this.spanData?.responseHeaders) || !isEmpty(this.spanData?.responseBody); + this.showExitCallsTab = Object.keys(this.spanData?.exitCallsBreakup ?? {}).length > 0; } } } diff --git a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.module.ts b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.module.ts index 944c63dd0..2bd41a72b 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.module.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.module.ts @@ -11,6 +11,7 @@ import { ToggleButtonModule, TooltipModule } from '@hypertrace/components'; +import { SpanExitCallsModule } from './exit-calls/span-exit-calls.module'; import { SpanDetailTitleHeaderModule } from './headers/title/span-detail-title-header.module'; import { SpanRequestDetailModule } from './request/span-request-detail.module'; import { SpanResponseDetailModule } from './response/span-response-detail.module'; @@ -32,7 +33,8 @@ import { SpanTagsDetailModule } from './tags/span-tags-detail.module'; JsonViewerModule, LoadAsyncModule, ListViewModule, - SpanDetailTitleHeaderModule + SpanDetailTitleHeaderModule, + SpanExitCallsModule ], declarations: [SpanDetailComponent], exports: [SpanDetailComponent] diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts index 2ee627732..f042959d9 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts @@ -1,6 +1,7 @@ import { Model } from '@hypertrace/hyperdash'; import { Trace, traceIdKey } from '../../../../graphql/model/schema/trace'; +import { Dictionary } from '@hypertrace/common'; import { TraceDetailData, TraceDetailDataSourceModel } from './trace-detail-data-source.model'; @Model({ @@ -8,6 +9,7 @@ import { TraceDetailData, TraceDetailDataSourceModel } from './trace-detail-data }) export class ApiTraceDetailDataSourceModel extends TraceDetailDataSourceModel { protected getTraceAttributes(): string[] { + // TODO : request for 'apiCalleeNameCount' here return [...super.getTraceAttributes(), 'traceId']; } @@ -15,11 +17,13 @@ export class ApiTraceDetailDataSourceModel extends TraceDetailDataSourceModel { return { ...super.constructTraceDetailData(trace), traceId: trace.traceId as string, // For API Trace traceId is real Trace ID. NOT Symbol('traceId'). - entrySpanId: trace[traceIdKey] // API Trace Symbol('traceId') same as apiTraceId which is actually Entry Span ID + entrySpanId: trace[traceIdKey], // API Trace Symbol('traceId') same as apiTraceId which is actually Entry Span ID, + exitCallsBreakup: trace.exitCallsBreakup as Dictionary }; } } export interface ApiTraceDetailData extends TraceDetailData { entrySpanId: string; + exitCallsBreakup: Dictionary; } diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts index 0e3df8b4c..49f66ca4c 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts @@ -22,6 +22,7 @@ export interface WaterfallData { responseHeaders?: Dictionary; responseBody?: string; tags: Dictionary; + exitCallsBreakup?: Dictionary; } export interface WaterfallDataNode extends WaterfallData, Omit { From e50fc262769a39d7b78e87345b973e7bf5b77a7b Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sat, 27 Mar 2021 18:13:36 +0530 Subject: [PATCH 2/8] fix: update waterfall data source --- .../waterfall/api-trace-waterfall-data-source.model.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts b/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts index 4a99a5304..2c839d0bf 100644 --- a/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts +++ b/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts @@ -50,6 +50,7 @@ export class ApiTraceWaterfallDataSourceModel extends GraphQlDataSourceModel + tags: span.spanTags as Dictionary, + exitCallsBreakup: span.exitCallsBreakup as Dictionary }; } } From 6f2fc3b516df3f7356f4affe3b71ad9e4e9bc541 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sat, 27 Mar 2021 19:14:52 +0530 Subject: [PATCH 3/8] fix: fix test --- .../exit-calls/span-exit-calls.component.test.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts index 462237f76..73049dee4 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts @@ -1,9 +1,11 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { fakeAsync } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; import { IconLibraryTestingModule } from '@hypertrace/assets-library'; import { NavigationService } from '@hypertrace/common'; import { runFakeRxjs } from '@hypertrace/test-utils'; import { createHostFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { EMPTY } from 'rxjs'; import { SpanExitCallsComponent } from './span-exit-calls.component'; import { SpanExitCallsModule } from './span-exit-calls.module'; @@ -14,7 +16,14 @@ describe('SpanExitCallsComponent', () => { component: SpanExitCallsComponent, imports: [SpanExitCallsModule, HttpClientTestingModule, IconLibraryTestingModule], declareComponent: false, - providers: [mockProvider(NavigationService)] + providers: [ + mockProvider(ActivatedRoute, { + queryParamMap: EMPTY + }), + mockProvider(NavigationService, { + navigation$: EMPTY + }) + ] }); it('should render data correctly', fakeAsync(() => { @@ -30,7 +39,7 @@ describe('SpanExitCallsComponent', () => { { name: 'name 1', calls: '10' }, { name: 'name 2', calls: '11' } ], - totalCount: 3 + totalCount: 2 } }); }); From c477f9fb53952e93c003d156e49e44c0365431a3 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sun, 28 Mar 2021 13:00:52 +0530 Subject: [PATCH 4/8] fix: update test --- .../span-detail/exit-calls/span-exit-calls.component.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts index 73049dee4..76aef70bc 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts @@ -26,7 +26,7 @@ describe('SpanExitCallsComponent', () => { ] }); - it('should render data correctly', fakeAsync(() => { + test('should render data correctly', fakeAsync(() => { spectator = createHost(``, { hostProps: { exitCalls: { 'name 1': '10', 'name 2': '11' } } }); From ecc534fb86a4d488ec4979933d908e389c6a0d53 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Sun, 28 Mar 2021 13:27:35 +0530 Subject: [PATCH 5/8] fix: fix test --- .../span-detail/exit-calls/span-exit-calls.component.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts index 76aef70bc..d4a7e07e1 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/exit-calls/span-exit-calls.component.test.ts @@ -1,5 +1,5 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { fakeAsync } from '@angular/core/testing'; +import { fakeAsync, flush } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { IconLibraryTestingModule } from '@hypertrace/assets-library'; import { NavigationService } from '@hypertrace/common'; @@ -42,6 +42,8 @@ describe('SpanExitCallsComponent', () => { totalCount: 2 } }); + + flush(); }); })); }); From fb59931d87c30c491f3602d0f3788f2ffb9cdafa Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Mon, 29 Mar 2021 15:27:22 +0530 Subject: [PATCH 6/8] fix: updates --- .../shared/components/span-detail/span-detail.component.ts | 2 +- .../trace-detail/data/api-trace-detail-data-source.model.ts | 4 ++-- .../dashboard/widgets/waterfall/waterfall/waterfall-chart.ts | 1 - .../waterfall/api-trace-waterfall-data-source.model.ts | 4 +--- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts index d27046ea7..8c518c2fc 100644 --- a/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts +++ b/projects/distributed-tracing/src/shared/components/span-detail/span-detail.component.ts @@ -71,7 +71,7 @@ export class SpanDetailComponent implements OnChanges { if (changes.spanData) { this.showRequestTab = !isEmpty(this.spanData?.requestHeaders) || !isEmpty(this.spanData?.requestBody); this.showResponseTab = !isEmpty(this.spanData?.responseHeaders) || !isEmpty(this.spanData?.responseBody); - this.showExitCallsTab = Object.keys(this.spanData?.exitCallsBreakup ?? {}).length > 0; + this.showExitCallsTab = !isEmpty(this.spanData?.exitCallsBreakup); } } } diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts index f042959d9..efbaf10c9 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts @@ -10,7 +10,7 @@ import { TraceDetailData, TraceDetailDataSourceModel } from './trace-detail-data export class ApiTraceDetailDataSourceModel extends TraceDetailDataSourceModel { protected getTraceAttributes(): string[] { // TODO : request for 'apiCalleeNameCount' here - return [...super.getTraceAttributes(), 'traceId']; + return [...super.getTraceAttributes(), 'traceId', 'apiCalleeNameCount']; } protected constructTraceDetailData(trace: Trace): ApiTraceDetailData { @@ -18,7 +18,7 @@ export class ApiTraceDetailDataSourceModel extends TraceDetailDataSourceModel { ...super.constructTraceDetailData(trace), traceId: trace.traceId as string, // For API Trace traceId is real Trace ID. NOT Symbol('traceId'). entrySpanId: trace[traceIdKey], // API Trace Symbol('traceId') same as apiTraceId which is actually Entry Span ID, - exitCallsBreakup: trace.exitCallsBreakup as Dictionary + exitCallsBreakup: trace.apiCalleeNameCount as Dictionary }; } } diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts index 49f66ca4c..0e3df8b4c 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/waterfall/waterfall/waterfall-chart.ts @@ -22,7 +22,6 @@ export interface WaterfallData { responseHeaders?: Dictionary; responseBody?: string; tags: Dictionary; - exitCallsBreakup?: Dictionary; } export interface WaterfallDataNode extends WaterfallData, Omit { diff --git a/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts b/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts index 2c839d0bf..4a99a5304 100644 --- a/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts +++ b/projects/observability/src/shared/dashboard/data/graphql/waterfall/api-trace-waterfall-data-source.model.ts @@ -50,7 +50,6 @@ export class ApiTraceWaterfallDataSourceModel extends GraphQlDataSourceModel, - exitCallsBreakup: span.exitCallsBreakup as Dictionary + tags: span.spanTags as Dictionary }; } } From e634aa309fae256a43ef312ae5e032c432d73222 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Mon, 29 Mar 2021 15:36:13 +0530 Subject: [PATCH 7/8] fix: update test --- .../data/api-trace-detail-data-source.model.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.test.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.test.ts index 98e609844..ddf0d0e2e 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.test.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.test.ts @@ -79,7 +79,8 @@ describe('Trace detail data source model', () => { traceProperties: expect.arrayContaining([ expect.objectContaining({ name: 'tags' }), expect.objectContaining({ name: 'traceId' }), - expect.objectContaining({ name: 'statusCode' }) + expect.objectContaining({ name: 'statusCode' }), + expect.objectContaining({ name: 'apiCalleeNameCount' }) ]) }) ); @@ -99,7 +100,8 @@ describe('Trace detail data source model', () => { traceProperties: expect.arrayContaining([ expect.objectContaining({ name: 'tags' }), expect.objectContaining({ name: 'traceId' }), - expect.objectContaining({ name: 'statusCode' }) + expect.objectContaining({ name: 'statusCode' }), + expect.objectContaining({ name: 'apiCalleeNameCount' }) ]) }) ); From febefcffea274e8d4d893a9f57be1f90cb34b543 Mon Sep 17 00:00:00 2001 From: Arjunlal B Date: Mon, 29 Mar 2021 15:37:35 +0530 Subject: [PATCH 8/8] fix: remove comment line --- .../trace-detail/data/api-trace-detail-data-source.model.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts index efbaf10c9..ca733ca0c 100644 --- a/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts +++ b/projects/distributed-tracing/src/shared/dashboard/widgets/trace-detail/data/api-trace-detail-data-source.model.ts @@ -9,7 +9,6 @@ import { TraceDetailData, TraceDetailDataSourceModel } from './trace-detail-data }) export class ApiTraceDetailDataSourceModel extends TraceDetailDataSourceModel { protected getTraceAttributes(): string[] { - // TODO : request for 'apiCalleeNameCount' here return [...super.getTraceAttributes(), 'traceId', 'apiCalleeNameCount']; }