CommandLineToolkit
54 строки · 1.7 Кб
1import Foundation
2import Graphite
3import Statsd
4
5// swiftlint:disable async
6// swiftlint:disable sync
7public final class MetricRecorderImpl: MutableMetricRecorder {
8private var graphiteMetricHandler: GraphiteMetricHandler
9private var statsdMetricHandler: StatsdMetricHandler
10private let queue: DispatchQueue
11
12public init(
13graphiteMetricHandler: GraphiteMetricHandler,
14statsdMetricHandler: StatsdMetricHandler,
15queue: DispatchQueue = DispatchQueue(label: "MetricRecorderImpl.syncQueue")
16) {
17self.graphiteMetricHandler = graphiteMetricHandler
18self.statsdMetricHandler = statsdMetricHandler
19self.queue = queue
20}
21
22public func setGraphiteMetric(handler: GraphiteMetricHandler) {
23queue.async { [weak self] in
24self?.graphiteMetricHandler.tearDown(timeout: 10)
25self?.graphiteMetricHandler = handler
26}
27}
28
29public func setStatsdMetric(handler: StatsdMetricHandler) {
30queue.async { [weak self] in
31self?.statsdMetricHandler.tearDown(timeout: 10)
32self?.statsdMetricHandler = handler
33}
34}
35
36public func capture(_ metric: GraphiteMetric) {
37queue.async { [weak self] in
38self?.graphiteMetricHandler.handle(metric: metric)
39}
40}
41
42public func capture(_ metric: StatsdMetric) {
43queue.async { [weak self] in
44self?.statsdMetricHandler.handle(metric: metric)
45}
46}
47
48public func tearDown(timeout: TimeInterval) {
49queue.sync {
50self.graphiteMetricHandler.tearDown(timeout: timeout)
51self.statsdMetricHandler.tearDown(timeout: timeout)
52}
53}
54}
55