Emcee

Форк
0
/
WorkerAlivenessMetricCapturer.swift 
74 строки · 2.2 Кб
1
import DateProvider
2
import Foundation
3
import Metrics
4
import MetricsExtensions
5
import QueueModels
6
import Timer
7
import WorkerAlivenessModels
8
import WorkerAlivenessProvider
9

10
public final class WorkerAlivenessMetricCapturer {
11
    private let dateProvider: DateProvider
12
    private let timer: DispatchBasedTimer
13
    private let queueHostname: String
14
    private let version: Version
15
    private let workerAlivenessProvider: WorkerAlivenessProvider
16
    private let globalMetricRecorder: GlobalMetricRecorder
17

18
    public init(
19
        dateProvider: DateProvider,
20
        reportInterval: DispatchTimeInterval,
21
        queueHostname: String,
22
        version: Version,
23
        workerAlivenessProvider: WorkerAlivenessProvider,
24
        globalMetricRecorder: GlobalMetricRecorder
25
    ) {
26
        self.dateProvider = dateProvider
27
        self.timer = DispatchBasedTimer(repeating: reportInterval, leeway: .seconds(1))
28
        self.queueHostname = queueHostname
29
        self.version = version
30
        self.workerAlivenessProvider = workerAlivenessProvider
31
        self.globalMetricRecorder = globalMetricRecorder
32
    }
33
    
34
    public func start() {
35
        timer.start { [weak self] timer in
36
            guard let strongSelf = self else {
37
                return timer.stop()
38
            }
39
            let aliveness = strongSelf.workerAlivenessProvider.workerAliveness
40
            strongSelf.captureMetrics(aliveness: aliveness)
41
        }
42
    }
43
    
44
    public func stop() {
45
        timer.stop()
46
    }
47
    
48
    private func captureMetrics(
49
        aliveness: [WorkerId: WorkerAliveness]
50
    ) {
51
        let metrics: [WorkerStatusMetric] = aliveness.map {
52
            WorkerStatusMetric(
53
                workerId: $0.key,
54
                status: $0.value.metricComponentName,
55
                version: version,
56
                queueHost: queueHostname,
57
                timestamp: dateProvider.currentDate()
58
            )
59
        }
60
        globalMetricRecorder.capture(metrics)
61
    }
62
}
63

64
private extension WorkerAliveness {
65
    var metricComponentName: String {
66
        if !registered { return "notRegistered" }
67
        if disabled { return "disabled" }
68
        if silent {
69
            return "silent"
70
        } else {
71
            return "alive"
72
        }
73
    }
74
}
75

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.