Skip to content

Commit 335c887

Browse files
committed
Merge branch 'topology-custom-metric-1' into topology-custom-metric-2
2 parents bf79eff + dd26de0 commit 335c887

File tree

3 files changed

+219
-0
lines changed

3 files changed

+219
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Color } from '@hypertrace/common';
2+
import { createModelFactory } from '@hypertrace/dashboards/testing';
3+
import { TopologyMetricCategoryModel } from './topology-metric-category.model';
4+
5+
describe('Topology Metric with category model', () => {
6+
const modelFactory = createModelFactory();
7+
8+
test('provides category name correctly', () => {
9+
const spectator = modelFactory(TopologyMetricCategoryModel, {
10+
properties: {
11+
name: 'test name',
12+
minValue: 0,
13+
maxValue: 10,
14+
fillColor: Color.Blue2,
15+
strokeColor: Color.Blue3,
16+
focusColor: Color.Blue4
17+
}
18+
});
19+
20+
expect(spectator.model.getCategoryClassName()).toContain('test-name');
21+
});
22+
});
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { Color } from '@hypertrace/common';
2+
import { createModelFactory } from '@hypertrace/dashboards/testing';
3+
import { MetricAggregationType } from '@hypertrace/distributed-tracing';
4+
import { MetricAggregationSpecificationModel } from '../../specifiers/metric-aggregation-specification.model';
5+
import { TopologyMetricCategoryModel } from './topology-metric-category.model';
6+
import { TopologyMetricWithCategoryModel } from './topology-metric-with-category.model';
7+
8+
describe('Topology Metric with category model', () => {
9+
const modelFactory = createModelFactory();
10+
11+
const createCategoryModel = (
12+
name: string,
13+
minValue: number,
14+
fillColor: Color,
15+
strokeColor: Color,
16+
focusColor: Color,
17+
maxValue?: number
18+
): TopologyMetricCategoryModel => {
19+
const categoryModel = new TopologyMetricCategoryModel();
20+
categoryModel.name = name;
21+
categoryModel.minValue = minValue;
22+
categoryModel.maxValue = maxValue;
23+
categoryModel.fillColor = fillColor;
24+
categoryModel.strokeColor = strokeColor;
25+
categoryModel.focusColor = focusColor;
26+
27+
return categoryModel;
28+
};
29+
test('provides category name correctly', () => {
30+
const specification = new MetricAggregationSpecificationModel();
31+
specification.metric = 'metric-name';
32+
specification.aggregation = MetricAggregationType.Average;
33+
specification.modelOnInit();
34+
35+
const categories = [
36+
createCategoryModel('first', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10),
37+
createCategoryModel('second', 10, Color.Red1, Color.Red3, Color.Red4, 50),
38+
createCategoryModel('third', 50, Color.Blue2, Color.Blue3, Color.Blue4)
39+
];
40+
41+
const spectator = modelFactory(TopologyMetricWithCategoryModel, {
42+
properties: {
43+
specification: specification,
44+
categories: categories
45+
}
46+
});
47+
48+
expect(
49+
spectator.model.extractAndGetDataCategoryForMetric({
50+
[specification.resultAlias()]: { value: 50 }
51+
})
52+
).toEqual(categories[2]);
53+
54+
expect(
55+
spectator.model.extractAndGetDataCategoryForMetric({
56+
[specification.resultAlias()]: { value: 5 }
57+
})
58+
).toEqual(categories[0]);
59+
60+
expect(
61+
spectator.model.extractAndGetDataCategoryForMetric({
62+
[specification.resultAlias()]: { value: 22 }
63+
})
64+
).toEqual(categories[1]);
65+
66+
expect(
67+
spectator.model.extractAndGetDataCategoryForMetric({
68+
[specification.resultAlias()]: { value: -10 }
69+
})
70+
).toEqual(undefined);
71+
});
72+
});
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import { Color } from '@hypertrace/common';
2+
import { MetricAggregationType } from '@hypertrace/distributed-tracing';
3+
import { MetricAggregationSpecificationModel } from '@hypertrace/observability';
4+
import { createServiceFactory } from '@ngneat/spectator/jest';
5+
import { TopologyMetricCategoryModel } from '../../data/graphql/topology/metrics/topology-metric-category.model';
6+
import { TopologyMetricWithCategoryModel } from '../../data/graphql/topology/metrics/topology-metric-with-category.model';
7+
import { TopologyMetricsData } from '../../data/graphql/topology/metrics/topology-metrics.model';
8+
import { TopologyDataSourceModelPropertiesService } from './topology-data-source-model-properties.service';
9+
10+
describe('TopologyDataSourceModelPropertiesService', () => {
11+
const createService = createServiceFactory({
12+
service: TopologyDataSourceModelPropertiesService
13+
});
14+
15+
const createCategoryModel = (
16+
name: string,
17+
minValue: number,
18+
fillColor: Color,
19+
strokeColor: Color,
20+
focusColor: Color,
21+
maxValue?: number
22+
): TopologyMetricCategoryModel => {
23+
const categoryModel = new TopologyMetricCategoryModel();
24+
categoryModel.name = name;
25+
categoryModel.minValue = minValue;
26+
categoryModel.maxValue = maxValue;
27+
categoryModel.fillColor = fillColor;
28+
categoryModel.strokeColor = strokeColor;
29+
categoryModel.focusColor = focusColor;
30+
31+
return categoryModel;
32+
};
33+
34+
const createSpecificationModel = (metric: string, aggregation: MetricAggregationType) => {
35+
const specification = new MetricAggregationSpecificationModel();
36+
specification.metric = metric;
37+
specification.aggregation = aggregation;
38+
39+
specification.modelOnInit();
40+
41+
return specification;
42+
};
43+
44+
const createMetricWithCategory = (
45+
spec: MetricAggregationSpecificationModel,
46+
categories: TopologyMetricCategoryModel[]
47+
) => {
48+
const model = new TopologyMetricWithCategoryModel();
49+
model.specification = spec;
50+
model.categories = categories;
51+
52+
return model;
53+
};
54+
55+
test('should return correct results', () => {
56+
const spectator = createService();
57+
58+
const nodePrimary = createMetricWithCategory(
59+
createSpecificationModel('node-metric-1', MetricAggregationType.Average),
60+
[
61+
createCategoryModel('node-first-1', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10),
62+
createCategoryModel('node-second-1', 10, Color.Red1, Color.Red3, Color.Red4, 50),
63+
createCategoryModel('node-third-1', 50, Color.Blue2, Color.Blue3, Color.Blue4)
64+
]
65+
);
66+
67+
const nodeSecondary = createMetricWithCategory(
68+
createSpecificationModel('node-metric-2', MetricAggregationType.Average),
69+
[
70+
createCategoryModel('node-first-2', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10),
71+
createCategoryModel('node-second-2', 10, Color.Red1, Color.Red3, Color.Red4, 50),
72+
createCategoryModel('node-third-2', 50, Color.Blue2, Color.Blue3, Color.Blue4)
73+
]
74+
);
75+
76+
const nodeOthers = [
77+
createMetricWithCategory(createSpecificationModel('node-metric-5', MetricAggregationType.Average), [
78+
createCategoryModel('node-others-2', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10)
79+
])
80+
];
81+
82+
const nodeMetrics: TopologyMetricsData = {
83+
primary: nodePrimary,
84+
secondary: nodeSecondary,
85+
others: nodeOthers
86+
};
87+
88+
const edgePrimary = createMetricWithCategory(
89+
createSpecificationModel('edge-metric-3', MetricAggregationType.Average),
90+
[
91+
createCategoryModel('edge-first-1', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10),
92+
createCategoryModel('edge-second-1', 10, Color.Red1, Color.Red3, Color.Red4, 50),
93+
createCategoryModel('edge-third-1', 50, Color.Blue2, Color.Blue3, Color.Blue4)
94+
]
95+
);
96+
97+
const edgeSecondary = createMetricWithCategory(
98+
createSpecificationModel('metric-4', MetricAggregationType.Average),
99+
[
100+
createCategoryModel('edge-first-2', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10),
101+
createCategoryModel('edge-second-2', 10, Color.Red1, Color.Red3, Color.Red4, 50),
102+
createCategoryModel('edge-third-2', 50, Color.Blue2, Color.Blue3, Color.Blue4)
103+
]
104+
);
105+
106+
const edgeOthers = [
107+
createMetricWithCategory(createSpecificationModel('metric-4', MetricAggregationType.Average), [
108+
createCategoryModel('edge-others-2', 0, Color.Blue2, Color.Blue3, Color.Blue4, 10)
109+
])
110+
];
111+
112+
const edgeMetrics: TopologyMetricsData = {
113+
primary: edgePrimary,
114+
secondary: edgeSecondary,
115+
others: edgeOthers
116+
};
117+
spectator.service.setModelProperties(nodeMetrics, edgeMetrics);
118+
119+
expect(spectator.service.getPrimaryNodeMetric()).toEqual(nodePrimary);
120+
expect(spectator.service.getSecondaryNodeMetric()).toEqual(nodeSecondary);
121+
122+
expect(spectator.service.getPrimaryEdgeMetric()).toEqual(edgePrimary);
123+
expect(spectator.service.getSecondaryEdgeMetric()).toEqual(edgeSecondary);
124+
});
125+
});

0 commit comments

Comments
 (0)