Emcee
74 строки · 2.2 Кб
1import DateProvider
2import Foundation
3import Metrics
4import MetricsExtensions
5import QueueModels
6import Timer
7import WorkerAlivenessModels
8import WorkerAlivenessProvider
9
10public final class WorkerAlivenessMetricCapturer {
11private let dateProvider: DateProvider
12private let timer: DispatchBasedTimer
13private let queueHostname: String
14private let version: Version
15private let workerAlivenessProvider: WorkerAlivenessProvider
16private let globalMetricRecorder: GlobalMetricRecorder
17
18public init(
19dateProvider: DateProvider,
20reportInterval: DispatchTimeInterval,
21queueHostname: String,
22version: Version,
23workerAlivenessProvider: WorkerAlivenessProvider,
24globalMetricRecorder: GlobalMetricRecorder
25) {
26self.dateProvider = dateProvider
27self.timer = DispatchBasedTimer(repeating: reportInterval, leeway: .seconds(1))
28self.queueHostname = queueHostname
29self.version = version
30self.workerAlivenessProvider = workerAlivenessProvider
31self.globalMetricRecorder = globalMetricRecorder
32}
33
34public func start() {
35timer.start { [weak self] timer in
36guard let strongSelf = self else {
37return timer.stop()
38}
39let aliveness = strongSelf.workerAlivenessProvider.workerAliveness
40strongSelf.captureMetrics(aliveness: aliveness)
41}
42}
43
44public func stop() {
45timer.stop()
46}
47
48private func captureMetrics(
49aliveness: [WorkerId: WorkerAliveness]
50) {
51let metrics: [WorkerStatusMetric] = aliveness.map {
52WorkerStatusMetric(
53workerId: $0.key,
54status: $0.value.metricComponentName,
55version: version,
56queueHost: queueHostname,
57timestamp: dateProvider.currentDate()
58)
59}
60globalMetricRecorder.capture(metrics)
61}
62}
63
64private extension WorkerAliveness {
65var metricComponentName: String {
66if !registered { return "notRegistered" }
67if disabled { return "disabled" }
68if silent {
69return "silent"
70} else {
71return "alive"
72}
73}
74}
75