-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbase.ts
More file actions
92 lines (82 loc) · 2.55 KB
/
Copy pathbase.ts
File metadata and controls
92 lines (82 loc) · 2.55 KB
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
import { Logger } from '@ovotech/winston-logger';
import { StatsD } from 'hot-shots';
interface Point {
tags: { [name: string]: string };
measurement: string;
value?: number;
}
export abstract class MetricsTracker {
constructor(
protected dogstatsd: StatsD,
protected logger: Logger,
protected staticMeta?: {
[key: string]: any;
},
) {
this.sendPointsToDatadog = this.sendPointsToDatadog.bind(this);
}
protected async trackPoints(
measurementName: string,
tags: { [name: string]: string },
values: { [name: string]: number },
) {
for (const [name, value] of Object.entries(values)) {
this.trackPoint(`${measurementName}.${name}`, tags, value);
}
}
protected async trackPoint(measurementName: string, tags: { [name: string]: string }, value?: number) {
const validTags = this.getValidTags(tags);
this.logInvalidTags(measurementName, tags);
try {
this.sendPointsToDatadog({
measurement: measurementName,
tags: {
...this.staticMeta,
...validTags,
},
value,
});
return;
} catch (err: any) {
this.logger.error('Error tracking Datadog metric', {
metric: measurementName,
tags: JSON.stringify(validTags),
error: err,
});
return;
}
}
private async sendPointsToDatadog(point: Point) {
const { measurement, tags, value } = point;
//datadog metrics tag
this.dogstatsd.distribution(measurement, value || 1, { ...tags });
}
private getInvalidTagNames(tags: { [name: string]: string }, measurementName: string) {
try {
return Object.entries(tags)
.filter(([_, value]) => value?.length === 0)
.reduce((names: string[], [key, _]) => names.concat([key]), []);
} catch (error: any) {
this.logger.error('Error Datadog metric - getInvalidTagNames', {
metric: measurementName,
tags: JSON.stringify(tags),
error: error,
});
return [];
}
}
private getValidTags(tags: { [name: string]: string }) {
return Object.entries(tags)
.filter(([_, value]) => value?.length > 0)
.reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});
}
private logInvalidTags(measurementName: string, tags: { [name: string]: string }) {
const invalidTagNames = this.getInvalidTagNames(tags, measurementName);
if (invalidTagNames.length) {
this.logger.warn('Attempted to track tags with no value', {
metric: measurementName,
tagNames: invalidTagNames.sort().join(', '),
});
}
}
}