Skip to content

Commit bf79eff

Browse files
committed
refactor: migrating to new topology custom metric
1 parent b128254 commit bf79eff

13 files changed

+373
-353
lines changed

projects/observability/src/pages/apis/topology/application-flow.component.ts

Lines changed: 180 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import { ChangeDetectionStrategy, Component } from '@angular/core';
22
import { MetricAggregationType } from '@hypertrace/distributed-tracing';
33
import { ModelJson } from '@hypertrace/hyperdash';
4+
import {
5+
defaultPrimaryEdgeMetricCategories,
6+
defaultSecondaryEdgeMetricCategories
7+
} from './../../../shared/dashboard/widgets/topology/metric/edge-metric-category';
8+
import {
9+
defaultPrimaryNodeMetricCategories,
10+
defaultSecondaryNodeMetricCategories
11+
} from './../../../shared/dashboard/widgets/topology/metric/node-metric-category';
412

513
@Component({
614
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -26,78 +34,182 @@ export class ApplicationFlowComponent {
2634
type: 'topology-data-source',
2735
entity: 'SERVICE',
2836
'downstream-entities': ['SERVICE', 'BACKEND'],
29-
'node-metrics': [
30-
{
31-
type: 'percentile-latency-metric-aggregation',
32-
'display-name': 'P99 Latency'
37+
'edge-metrics': {
38+
type: 'topology-metrics',
39+
primary: {
40+
type: 'topology-metric-with-category',
41+
specification: {
42+
type: 'percentile-latency-metric-aggregation',
43+
'display-name': 'P99 Latency'
44+
},
45+
categories: [
46+
{
47+
type: 'topology-metric-category',
48+
...defaultPrimaryEdgeMetricCategories[0]
49+
},
50+
{
51+
type: 'topology-metric-category',
52+
...defaultPrimaryEdgeMetricCategories[1]
53+
},
54+
{
55+
type: 'topology-metric-category',
56+
...defaultPrimaryEdgeMetricCategories[2]
57+
},
58+
{
59+
type: 'topology-metric-category',
60+
...defaultPrimaryEdgeMetricCategories[3]
61+
},
62+
{
63+
type: 'topology-metric-category',
64+
...defaultPrimaryEdgeMetricCategories[4]
65+
}
66+
]
3367
},
34-
{
35-
type: 'metric-aggregation',
36-
metric: 'duration',
37-
aggregation: MetricAggregationType.P50,
38-
'display-name': 'P50 Latency'
68+
secondary: {
69+
type: 'topology-metric-with-category',
70+
specification: {
71+
type: 'error-percentage-metric-aggregation',
72+
aggregation: MetricAggregationType.Average,
73+
'display-name': 'Error %'
74+
},
75+
categories: [
76+
{
77+
type: 'topology-metric-category',
78+
...defaultSecondaryEdgeMetricCategories[0]
79+
},
80+
{
81+
type: 'topology-metric-category',
82+
...defaultSecondaryEdgeMetricCategories[1]
83+
}
84+
]
3985
},
40-
{
41-
type: 'error-percentage-metric-aggregation',
42-
aggregation: MetricAggregationType.Average,
43-
'display-name': 'Error %'
86+
others: [
87+
{
88+
type: 'topology-metric-with-category',
89+
specification: {
90+
type: 'metric-aggregation',
91+
metric: 'duration',
92+
aggregation: MetricAggregationType.P50,
93+
'display-name': 'P50 Latency'
94+
}
95+
},
96+
{
97+
type: 'topology-metric-with-category',
98+
specification: {
99+
type: 'metric-aggregation',
100+
metric: 'errorCount',
101+
aggregation: MetricAggregationType.Sum,
102+
'display-name': 'Error Count'
103+
}
104+
},
105+
{
106+
type: 'topology-metric-with-category',
107+
specification: {
108+
type: 'metric-aggregation',
109+
metric: 'numCalls',
110+
aggregation: MetricAggregationType.AvgrateSecond,
111+
'display-name': 'Call Rate/sec'
112+
}
113+
},
114+
{
115+
type: 'topology-metric-with-category',
116+
specification: {
117+
type: 'metric-aggregation',
118+
metric: 'numCalls',
119+
aggregation: MetricAggregationType.Sum,
120+
'display-name': 'Call Count'
121+
}
122+
}
123+
]
124+
},
125+
'node-metrics': {
126+
type: 'topology-metrics',
127+
primary: {
128+
type: 'topology-metric-with-category',
129+
specification: {
130+
type: 'percentile-latency-metric-aggregation',
131+
'display-name': 'P99 Latency'
132+
},
133+
categories: [
134+
{
135+
type: 'topology-metric-category',
136+
...defaultPrimaryNodeMetricCategories[0]
137+
},
138+
{
139+
type: 'topology-metric-category',
140+
...defaultPrimaryNodeMetricCategories[1]
141+
},
142+
{
143+
type: 'topology-metric-category',
144+
...defaultPrimaryNodeMetricCategories[2]
145+
},
146+
{
147+
type: 'topology-metric-category',
148+
...defaultPrimaryNodeMetricCategories[3]
149+
},
150+
{
151+
type: 'topology-metric-category',
152+
...defaultPrimaryNodeMetricCategories[4]
153+
}
154+
]
44155
},
45-
46-
{
47-
type: 'metric-aggregation',
48-
metric: 'errorCount',
49-
aggregation: MetricAggregationType.Sum,
50-
'display-name': 'Error Count'
51-
},
52-
{
53-
type: 'metric-aggregation',
54-
metric: 'numCalls',
55-
aggregation: MetricAggregationType.AvgrateSecond,
56-
'display-name': 'Call Rate/sec'
57-
},
58-
{
59-
type: 'metric-aggregation',
60-
metric: 'numCalls',
61-
aggregation: MetricAggregationType.Sum,
62-
'display-name': 'Call Count'
63-
}
64-
],
65-
'edge-metrics': [
66-
{
67-
type: 'percentile-latency-metric-aggregation',
68-
'display-name': 'P99 Latency'
69-
},
70-
{
71-
type: 'metric-aggregation',
72-
metric: 'duration',
73-
aggregation: MetricAggregationType.P50,
74-
'display-name': 'P50 Latency'
75-
},
76-
{
77-
type: 'error-percentage-metric-aggregation',
78-
aggregation: MetricAggregationType.Average,
79-
'display-name': 'Error %'
80-
},
81-
82-
{
83-
type: 'metric-aggregation',
84-
metric: 'errorCount',
85-
aggregation: MetricAggregationType.Sum,
86-
'display-name': 'Error Count'
87-
},
88-
{
89-
type: 'metric-aggregation',
90-
metric: 'numCalls',
91-
aggregation: MetricAggregationType.AvgrateSecond,
92-
'display-name': 'Call Rate/sec'
156+
secondary: {
157+
type: 'topology-metric-with-category',
158+
specification: {
159+
type: 'error-percentage-metric-aggregation',
160+
aggregation: MetricAggregationType.Average,
161+
'display-name': 'Error %'
162+
},
163+
categories: [
164+
{
165+
type: 'topology-metric-category',
166+
...defaultSecondaryNodeMetricCategories[0]
167+
},
168+
{
169+
type: 'topology-metric-category',
170+
...defaultSecondaryNodeMetricCategories[1]
171+
}
172+
]
93173
},
94-
{
95-
type: 'metric-aggregation',
96-
metric: 'numCalls',
97-
aggregation: MetricAggregationType.Sum,
98-
'display-name': 'Call Count'
99-
}
100-
]
174+
others: [
175+
{
176+
type: 'topology-metric-with-category',
177+
specification: {
178+
type: 'metric-aggregation',
179+
metric: 'duration',
180+
aggregation: MetricAggregationType.P50,
181+
'display-name': 'P50 Latency'
182+
}
183+
},
184+
{
185+
type: 'topology-metric-with-category',
186+
specification: {
187+
type: 'metric-aggregation',
188+
metric: 'errorCount',
189+
aggregation: MetricAggregationType.Sum,
190+
'display-name': 'Error Count'
191+
}
192+
},
193+
{
194+
type: 'topology-metric-with-category',
195+
specification: {
196+
type: 'metric-aggregation',
197+
metric: 'numCalls',
198+
aggregation: MetricAggregationType.AvgrateSecond,
199+
'display-name': 'Call Rate/sec'
200+
}
201+
},
202+
{
203+
type: 'topology-metric-with-category',
204+
specification: {
205+
type: 'metric-aggregation',
206+
metric: 'numCalls',
207+
aggregation: MetricAggregationType.Sum,
208+
'display-name': 'Call Count'
209+
}
210+
}
211+
]
212+
}
101213
}
102214
}
103215
]

projects/observability/src/shared/dashboard/data/graphql/observability-graphql-data-source.module.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import { PercentileLatencyAggregationSpecificationModel } from './specifiers/per
2828
import { EntityTableDataSourceModel } from './table/entity/entity-table-data-source.model';
2929
import { ExploreTableDataSourceModel } from './table/explore/explore-table-data-source.model';
3030
import { InteractionsTableDataSourceModel } from './table/interactions/interactions-table-data-source.model';
31+
import { TopologyMetricCategoryModel } from './topology/metrics/topology-metric-category.model';
32+
import { TopologyMetricWithCategoryModel } from './topology/metrics/topology-metric-with-category.model';
33+
import { TopologyMetricsModel } from './topology/metrics/topology-metrics.model';
3134
import { TopologyDataSourceModel } from './topology/topology-data-source.model';
3235
import { TraceMetricAggregationDataSourceModel } from './trace/aggregation/trace-metric-aggregation-data-source.model';
3336
import { TraceDonutDataSourceModel } from './trace/donut/trace-donut-data-source.model';
@@ -53,6 +56,9 @@ import { ApiTraceWaterfallDataSourceModel } from './waterfall/api-trace-waterfal
5356
EntityMetricTimeseriesDataSourceModel,
5457
EntityMetricAggregationDataSourceModel,
5558
TopologyDataSourceModel,
59+
TopologyMetricsModel,
60+
TopologyMetricWithCategoryModel,
61+
TopologyMetricCategoryModel,
5662
EntityTableDataSourceModel,
5763
InteractionsTableDataSourceModel,
5864
EntityAttributeDataSourceModel,

projects/observability/src/shared/dashboard/data/graphql/topology/topology-data-source.model.ts

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { ArrayPropertyTypeInstance, EnumPropertyTypeInstance, ENUM_TYPE } from '@hypertrace/dashboards';
22
import { GraphQlDataSourceModel, SpecificationBuilder } from '@hypertrace/distributed-tracing';
33
import { GraphQlRequestCacheability, GraphQlRequestOptions } from '@hypertrace/graphql-client';
4-
import { ARRAY_PROPERTY, Model, ModelProperty, ModelPropertyType } from '@hypertrace/hyperdash';
4+
import {
5+
ARRAY_PROPERTY,
6+
Model,
7+
ModelModelPropertyTypeInstance,
8+
ModelProperty,
9+
ModelPropertyType
10+
} from '@hypertrace/hyperdash';
511
import { uniq } from 'lodash-es';
612
import { Observable } from 'rxjs';
713
import { map } from 'rxjs/operators';
@@ -14,7 +20,7 @@ import {
1420
TopologyEdgeSpecification,
1521
TopologyNodeSpecification
1622
} from '../../../../graphql/request/handlers/entities/query/topology/entity-topology-graphql-query-handler.service';
17-
import { EntityMetricAggregationDataSourceModel } from '../entity/aggregation/entity-metric-aggregation-data-source.model';
23+
import { TopologyMetricsData, TopologyMetricsModel } from './metrics/topology-metrics.model';
1824

1925
@Model({
2026
type: 'topology-data-source'
@@ -61,27 +67,21 @@ export class TopologyDataSourceModel extends GraphQlDataSourceModel<TopologyData
6167
key: 'node-metrics',
6268
// tslint:disable-next-line: no-object-literal-type-assertion
6369
type: {
64-
key: ARRAY_PROPERTY.type,
65-
subtype: {
66-
key: ModelPropertyType.TYPE,
67-
defaultModelClass: EntityMetricAggregationDataSourceModel
68-
}
69-
} as ArrayPropertyTypeInstance
70+
key: ModelPropertyType.TYPE,
71+
defaultModelClass: TopologyMetricsModel
72+
} as ModelModelPropertyTypeInstance
7073
})
71-
public nodeMetricSpecifications: MetricAggregationSpecification[] = [];
74+
public nodeMetricsModel!: TopologyMetricsModel;
7275

7376
@ModelProperty({
7477
key: 'edge-metrics',
7578
// tslint:disable-next-line: no-object-literal-type-assertion
7679
type: {
77-
key: ARRAY_PROPERTY.type,
78-
subtype: {
79-
key: ModelPropertyType.TYPE,
80-
defaultModelClass: EntityMetricAggregationDataSourceModel
81-
}
82-
} as ArrayPropertyTypeInstance
80+
key: ModelPropertyType.TYPE,
81+
defaultModelClass: TopologyMetricsModel
82+
} as ModelModelPropertyTypeInstance
8383
})
84-
public edgeMetricSpecifications: MetricAggregationSpecification[] = [];
84+
public edgeMetricsModel!: TopologyMetricsModel;
8585

8686
private readonly specBuilder: SpecificationBuilder = new SpecificationBuilder();
8787
private readonly requestOptions: GraphQlRequestOptions = {
@@ -91,7 +91,7 @@ export class TopologyDataSourceModel extends GraphQlDataSourceModel<TopologyData
9191
public getData(): Observable<TopologyData> {
9292
const rootEntitySpec = this.buildEntitySpec();
9393
const edgeSpec = {
94-
metricSpecifications: this.edgeMetricSpecifications
94+
metricSpecifications: this.getAllMetricSpecifications(this.edgeMetricsModel)
9595
};
9696

9797
return this.query<EntityTopologyGraphQlQueryHandlerService>(
@@ -116,7 +116,9 @@ export class TopologyDataSourceModel extends GraphQlDataSourceModel<TopologyData
116116
this.entityType,
117117
...this.defaultedEntityTypeArray(this.upstreamEntityTypes),
118118
...this.defaultedEntityTypeArray(this.downstreamEntityTypes)
119-
])
119+
]),
120+
nodeMetrics: this.nodeMetricsModel,
121+
edgeMetrics: this.edgeMetricsModel
120122
}))
121123
);
122124
}
@@ -134,7 +136,7 @@ export class TopologyDataSourceModel extends GraphQlDataSourceModel<TopologyData
134136
private buildEntitySpec(): TopologyNodeSpecification {
135137
// TODO support different specs for different node types
136138
return {
137-
metricSpecifications: this.nodeMetricSpecifications,
139+
metricSpecifications: this.getAllMetricSpecifications(this.nodeMetricsModel),
138140
titleSpecification: this.specBuilder.attributeSpecificationForKey('name')
139141
};
140142
}
@@ -144,11 +146,21 @@ export class TopologyDataSourceModel extends GraphQlDataSourceModel<TopologyData
144146
): ObservabilityEntityType[] {
145147
return typeArray;
146148
}
149+
150+
private getAllMetricSpecifications(metrics: TopologyMetricsModel): MetricAggregationSpecification[] {
151+
return [
152+
metrics.primary.specification,
153+
...(metrics.secondary ? [metrics.secondary.specification] : []),
154+
...(metrics.others ? metrics.others.map(_ => _.specification) : [])
155+
];
156+
}
147157
}
148158

149159
export interface TopologyData {
150160
nodes: EntityNode[];
151161
nodeTypes: ObservabilityEntityType[];
152162
nodeSpecification: TopologyNodeSpecification;
153163
edgeSpecification: TopologyEdgeSpecification;
164+
nodeMetrics: TopologyMetricsData;
165+
edgeMetrics: TopologyMetricsData;
154166
}

0 commit comments

Comments
 (0)