-
Notifications
You must be signed in to change notification settings - Fork 67
/
Span.model.ts
110 lines (98 loc) 路 2.67 KB
/
Span.model.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import {
SemanticGroupNames,
SemanticGroupNamesToSystem,
SemanticGroupsSignature,
} from 'constants/SemanticGroupNames.constants';
import {Attributes} from 'constants/SpanAttribute.constants';
import {TSpanFlatAttribute} from 'types/Span.types';
import SpanAttribute from './SpanAttribute.model';
import {Model, TTraceSchemas} from '../types/Common.types';
const SemanticGroupNamesList = Object.values(SemanticGroupNames);
export type TRawSpan = TTraceSchemas['Span'];
type Span = Model<
TRawSpan,
{
attributes: Record<string, SpanAttribute>;
type: SemanticGroupNames;
duration: string;
signature: TSpanFlatAttribute[];
attributeList: TSpanFlatAttribute[];
children?: Span[];
kind: string;
service: string;
system: string;
}
>;
const getSpanSignature = (
attributes: Record<string, SpanAttribute>,
type: SemanticGroupNames
): TSpanFlatAttribute[] => {
const attributeNameList = SemanticGroupsSignature[type];
return attributeNameList.reduce<TSpanFlatAttribute[]>((list, attributeName) => {
const attribute = attributes[attributeName];
return attribute
? list.concat([
{
key: attributeName,
value: attribute.value,
},
])
: list;
}, []);
};
const defaultSpan: TRawSpan = {
id: '',
parentId: '',
name: '',
kind: '',
attributes: {},
startTime: 0,
endTime: 0,
};
const Span = ({
id = '',
attributes = {},
startTime = 0,
endTime = 0,
parentId = '',
name = '',
kind = '',
} = defaultSpan): Span => {
const mappedAttributeList: TSpanFlatAttribute[] = [
{key: 'name', value: name},
{key: 'kind', value: kind},
];
const attributeList = Object.entries(attributes)
.map<TSpanFlatAttribute>(([key, value]) => ({
value: String(value),
key,
}))
.concat(mappedAttributeList);
const attributesMap = attributeList.reduce((map, rawSpanAttribute) => {
const spanAttribute = SpanAttribute(rawSpanAttribute);
return {...map, [spanAttribute.name]: SpanAttribute(rawSpanAttribute)};
}, {});
const duration = attributes[Attributes.TRACETEST_SPAN_DURATION] || '0ns';
const type =
SemanticGroupNamesList.find(
semanticGroupName => semanticGroupName === attributes[Attributes.TRACETEST_SPAN_TYPE]
) || SemanticGroupNames.General;
const service = attributes?.[Attributes.SERVICE_NAME] ?? '';
const system = attributes?.[SemanticGroupNamesToSystem[type]] ?? '';
return {
id,
parentId,
name,
kind,
startTime,
endTime,
attributes: attributesMap,
attributeList,
type,
duration,
signature: getSpanSignature(attributesMap, type),
service,
system,
};
};
export default Span;