-
Notifications
You must be signed in to change notification settings - Fork 4
/
collector.ts
63 lines (53 loc) · 1.38 KB
/
collector.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
import { Metric } from "./metric.ts";
import { Registry } from "./registry.ts";
export class Collector {
private _name: string;
private _help: string;
private _type: string;
private metrics: Map<string, Metric>;
private registries: Registry[];
constructor(
name: string,
help: string,
type: string,
registries?: Registry[],
) {
if (!isValidMetricName(name)) {
throw new Error("invalid metric name");
}
this._name = name;
this._help = escapeHelpString(help);
this._type = type;
this.metrics = new Map();
this.registries = registries || [Registry.default];
this.registries.forEach((registry) => registry.register(this));
}
get name(): string {
return this._name;
}
get help(): string {
return this._help;
}
get type(): string {
return this._type;
}
collect(): Metric[] {
return [...this.metrics.values()];
}
getOrSetMetric(metric: Metric): Metric {
const saved = this.metrics.get(metric.description);
if (saved !== undefined) {
return saved;
}
this.metrics.set(metric.description, metric);
return metric;
}
}
export function isValidMetricName(name: string): boolean {
return /^[a-zA-Z_:][a-zA-Z0-9_:]*$/.test(name);
}
export function escapeHelpString(help: string): string {
return help
.replace(/\\/g, "\\\\") // backslash
.replace(/\n/g, "\\\n"); // new line
}