diff --git a/.gitignore b/.gitignore index 7657c3e..56f43a9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ /.build /Packages /*.xcodeproj -build/ \ No newline at end of file +build/ +.swiftpm/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9399384..0000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: generic -os: osx -osx_image: xcode10.2 -script: - - swift build - - swift test -Xswiftc -DDEBUG diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..ebaade6 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,34 @@ +{ + "object": { + "pins": [ + { + "package": "swift-metrics", + "repositoryURL": "https://github.com/apple/swift-metrics.git", + "state": { + "branch": null, + "revision": "8e5110dcd6584ff5acfec40e31263a8d07cba783", + "version": "1.1.0" + } + }, + { + "package": "swift-nio", + "repositoryURL": "https://github.com/apple/swift-nio.git", + "state": { + "branch": null, + "revision": "ba7970fe396e8198b84c6c1b44b38a1d4e2eb6bd", + "version": "1.14.1" + } + }, + { + "package": "swift-nio-zlib-support", + "repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git", + "state": { + "branch": null, + "revision": "37760e9a52030bb9011972c5213c3350fa9d41fd", + "version": "1.0.0" + } + } + ] + }, + "version": 1 +} diff --git a/Package.swift b/Package.swift index d5a40f7..82c7629 100644 --- a/Package.swift +++ b/Package.swift @@ -9,15 +9,22 @@ let package = Package( name: "SwiftPrometheus", targets: ["Prometheus"]), ], + dependencies: [ + .package(url: "https://github.com/apple/swift-metrics.git", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-nio.git", Version("1.0.0") ..< Version("3.0.0")), + ], targets: [ .target( name: "Prometheus", - dependencies: []), + dependencies: ["NIOConcurrencyHelpers"]), + .target( + name: "PrometheusMetrics", + dependencies: ["Prometheus", "CoreMetrics"]), .target( name: "PrometheusExample", - dependencies: ["Prometheus"]), + dependencies: ["PrometheusMetrics", "Metrics"]), .testTarget( name: "SwiftPrometheusTests", - dependencies: ["Prometheus"]), + dependencies: ["Prometheus", "PrometheusMetrics"]), ] ) diff --git a/README.md b/README.md index 207adc8..da3db0e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.com/MrLotU/SwiftPrometheus.svg?branch=master)](https://travis-ci.com/MrLotU/SwiftPrometheus) [![Swift 5.0](https://img.shields.io/badge/swift-5.0-orange.svg?style=flat)](http://swift.org) +[![CircleCI](https://circleci.com/gh/MrLotU/SwiftPrometheus.svg?style=svg)](https://circleci.com/gh/MrLotU/SwiftPrometheus)[![Swift 5.0](https://img.shields.io/badge/swift-5.0-orange.svg?style=flat)](http://swift.org) # SwiftPrometheus, Prometheus client for Swift @@ -8,14 +8,35 @@ A prometheus client for Swift supporting counters, gauges, histograms, summaries For examples, see [main.swift](./Sources/PrometheusExample/main.swift) +First, we have to create an instance of our `PrometheusClient`: +```swift +import Prometheus +let myProm = PrometheusClient() +``` + +## Usage with Swift-Metrics +_For more details about swift-metrics, check the GitHub repo [here](https://github.com/apple/swift-metrics)_ + +To use SwiftPrometheus with swift-metrics, all the setup required is this: +```swift +import PrometheusMetrics // Auto imports Prometheus too, but adds the swift-metrics compatibility +let myProm = PrometheusClient() +MetricsSystem.bootstrap(myProm) +``` + +To use prometheus specific features in a later stage of your program, or to get your metrics out of the system, there is a convenience method added to `MetricsSystem`: +```swift +// This is the same instance was used in `.bootstrap()` earlier. +let promInstance = try MetricsSystem.prometheus() +``` +You can than use the same APIs that are layed out in the rest of this README + ## Counter Counters go up, and reset when the process restarts. ```swift -let prom = PrometheusClient() - -let counter = prom.createCounter(forType: Int.self, named: "my_counter") +let counter = myProm.createCounter(forType: Int.self, named: "my_counter") counter.inc() // Increment by 1 counter.inc(12) // Increment by given value ``` @@ -25,9 +46,7 @@ counter.inc(12) // Increment by given value Gauges can go up and down ```swift -let prom = PrometheusClient() - -let gauge = prom.createGauge(forType: Int.self, named: "my_gauge") +let gauge = myProm.createGauge(forType: Int.self, named: "my_gauge") gauge.inc() // Increment by 1 gauge.dec(19) // Decrement by given value gauge.set(12) // Set to a given value @@ -38,9 +57,7 @@ gauge.set(12) // Set to a given value Histograms track the size and number of events in buckets. This allows for aggregatable calculation of quantiles. ```swift -let prom = PrometheusClient() - -let histogram = prom.createHistogram(forType: Double.self, named: "my_histogram") +let histogram = myProm.createHistogram(forType: Double.self, named: "my_histogram") histogram.observe(4.7) // Observe the given value ``` @@ -49,9 +66,7 @@ histogram.observe(4.7) // Observe the given value Summaries track the size and number of events ```swift -let prom = PrometheusClient() - -let summary = prom.createSummary(forType: Double.self, named: "my_summary") +let summary = myProm.createSummary(forType: Double.self, named: "my_summary") summary.observe(4.7) // Observe the given value ``` @@ -72,7 +87,7 @@ struct MyInfoStruct: MetricLabels { } } -let prom = PrometheusClient() +let info = myProm.createInfo(named: "my_info", helpText: "Just some info", labelType: MyInfoStruct.self) let info = prom.createInfo(named: "my_info", helpText: "Just some info", labelType: MyInfoStruct.self) @@ -88,7 +103,7 @@ struct RouteLabels: MetricLabels { var route: String = "*" } -let prom = PrometheusClient() +let counter = myProm.createCounter(forType: Int.self, named: "my_counter", helpText: "Just a counter", withLabelType: RouteLabels.self) let counter = prom.createCounter(forType: Int.self, named: "my_counter", helpText: "Just a counter", withLabelType: RouteLabels.self) @@ -101,12 +116,8 @@ To keep SwiftPrometheus as clean and lightweight as possible, there is no way of This could look something like this: ```swift -router.get("/metrics") { request -> Future in - let promise = req.eventLoop.newPromise(String.self) - prom.getMetrics { - promise.succeed(result: $0) - } - return promise.futureResult +router.get("/metrics") { request -> String in + return myProm.collect() } ``` Here, I used [Vapor](https://github.com/vapor/vapor) syntax, but this will work with any web framework, since it's just returning a plain String. diff --git a/Sources/Prometheus/MetricTypes/Counter.swift b/Sources/Prometheus/MetricTypes/Counter.swift index 97d5468..11938da 100644 --- a/Sources/Prometheus/MetricTypes/Counter.swift +++ b/Sources/Prometheus/MetricTypes/Counter.swift @@ -1,9 +1,11 @@ +import NIOConcurrencyHelpers + /// Prometheus Counter metric /// -/// See https://prometheus.io/docs/concepts/metric_types/#counter -public class Counter: Metric, PrometheusHandled { +/// See: https://prometheus.io/docs/concepts/metric_types/#counter +public class PromCounter: PromMetric, PrometheusHandled { /// Prometheus instance that created this Counter - internal let prometheus: PrometheusClient + internal weak var prometheus: PrometheusClient? /// Name of the Counter, required public let name: String @@ -11,17 +13,20 @@ public class Counter: Metric, Prometheus public let help: String? /// Type of the metric, used for formatting - public let _type: MetricType = .counter + public let _type: PromMetricType = .counter /// Current value of the counter internal var value: NumType /// Initial value of the counter - private var initialValue: NumType + private let initialValue: NumType /// Storage of values that have labels attached internal var metrics: [Labels: NumType] = [:] + /// Lock used for thread safety + internal let lock: Lock + /// Creates a new instance of a Counter /// /// - Parameters: @@ -35,14 +40,15 @@ public class Counter: Metric, Prometheus self.initialValue = initialValue self.value = initialValue self.prometheus = p + self.lock = Lock() } /// Gets the metric string for this counter /// /// - Returns: /// Newline seperated Prometheus formatted metric string - public func getMetric(_ done: @escaping (String) -> Void) { - prometheusQueue.async(flags: .barrier) { + public func collect() -> String { + return self.lock.withLock { var output = [String]() if let help = self.help { @@ -57,26 +63,28 @@ public class Counter: Metric, Prometheus output.append("\(self.name)\(labelsString) \(value)") } - done(output.joined(separator: "\n")) + return output.joined(separator: "\n") } } + /// Increments the Counter /// /// - Parameters: /// - amount: Amount to increment the counter with /// - labels: Labels to attach to the value /// - public func inc(_ amount: NumType = 1, _ labels: Labels? = nil, _ done: @escaping (NumType) -> Void = { _ in }) { - prometheusQueue.async(flags: .barrier) { + @discardableResult + public func inc(_ amount: NumType = 1, _ labels: Labels? = nil) -> NumType { + return self.lock.withLock { if let labels = labels { var val = self.metrics[labels] ?? self.initialValue val += amount self.metrics[labels] = val - done(val) + return val } else { self.value += amount - done(self.value) + return self.value } } } @@ -88,10 +96,12 @@ public class Counter: Metric, Prometheus /// /// - Returns: The value of the Counter attached to the provided labels public func get(_ labels: Labels? = nil) -> NumType { - if let labels = labels { - return self.metrics[labels] ?? initialValue - } else { - return self.value + return self.lock.withLock { + if let labels = labels { + return self.metrics[labels] ?? initialValue + } else { + return self.value + } } } } diff --git a/Sources/Prometheus/MetricTypes/Gauge.swift b/Sources/Prometheus/MetricTypes/Gauge.swift index 0757387..35279db 100644 --- a/Sources/Prometheus/MetricTypes/Gauge.swift +++ b/Sources/Prometheus/MetricTypes/Gauge.swift @@ -1,9 +1,11 @@ -/// Prometheus Counter metric +import NIOConcurrencyHelpers + +/// Prometheus Gauge metric /// /// See https://prometheus.io/docs/concepts/metric_types/#gauge -public class Gauge: Metric, PrometheusHandled { +public class PromGauge: PromMetric, PrometheusHandled { /// Prometheus instance that created this Gauge - internal let prometheus: PrometheusClient + internal weak var prometheus: PrometheusClient? /// Name of the Gauge, required public let name: String @@ -11,17 +13,20 @@ public class Gauge: Metric, PrometheusHa public let help: String? /// Type of the metric, used for formatting - public let _type: MetricType = .gauge + public let _type: PromMetricType = .gauge /// Current value of the counter private var value: NumType /// Initial value of the Gauge - private var initialValue: NumType + private let initialValue: NumType /// Storage of values that have labels attached private var metrics: [Labels: NumType] = [:] + /// Lock used for thread safety + private let lock: Lock + /// Creates a new instance of a Gauge /// /// - Parameters: @@ -36,15 +41,15 @@ public class Gauge: Metric, PrometheusHa self.initialValue = initialValue self.value = initialValue self.prometheus = p + self.lock = Lock() } /// Gets the metric string for this Gauge /// - /// - Parameters: - /// - done: Callback passing a newline separated Prometheus-formatted metric string - /// - public func getMetric(_ done: @escaping (String) -> Void) { - prometheusQueue.async(flags: .barrier) { + /// - Returns: + /// Newline seperated Prometheus formatted metric string + public func collect() -> String { + return self.lock.withLock { var output = [String]() if let help = self.help { @@ -59,7 +64,7 @@ public class Gauge: Metric, PrometheusHa output.append("\(self.name)\(labelsString) \(value)") } - done(output.joined(separator: "\n")) + return output.joined(separator: "\n") } } @@ -69,14 +74,15 @@ public class Gauge: Metric, PrometheusHa /// - amount: Amount to set the gauge to /// - labels: Labels to attach to the value /// - public func set(_ amount: NumType, _ labels: Labels? = nil, _ done: @escaping () -> Void = { }) { - prometheusQueue.async(flags: .barrier) { + @discardableResult + public func set(_ amount: NumType, _ labels: Labels? = nil) -> NumType { + return self.lock.withLock { if let labels = labels { self.metrics[labels] = amount - done() + return amount } else { self.value = amount - done() + return self.value } } } @@ -88,16 +94,17 @@ public class Gauge: Metric, PrometheusHa /// - labels: Labels to attach to the value /// - done: Completion handler /// - public func inc(_ amount: NumType, _ labels: Labels? = nil, _ done: @escaping (NumType) -> Void = { _ in }) { - prometheusQueue.async(flags: .barrier) { + @discardableResult + public func inc(_ amount: NumType, _ labels: Labels? = nil) -> NumType { + return self.lock.withLock { if let labels = labels { var val = self.metrics[labels] ?? self.initialValue val += amount self.metrics[labels] = val - done(val) + return val } else { self.value += amount - done(self.value) + return self.value } } } @@ -108,8 +115,9 @@ public class Gauge: Metric, PrometheusHa /// - labels: Labels to attach to the value /// - done: Completion handler /// - public func inc(_ labels: Labels? = nil, _ done: @escaping (NumType) -> Void = { _ in }) { - self.inc(1, labels, done) + @discardableResult + public func inc(_ labels: Labels? = nil) -> NumType { + return self.inc(1, labels) } /// Decrements the Gauge @@ -119,16 +127,17 @@ public class Gauge: Metric, PrometheusHa /// - labels: Labels to attach to the value /// - done: Completion handler /// - public func dec(_ amount: NumType, _ labels: Labels? = nil, _ done: @escaping (NumType) -> Void = { _ in }) { - prometheusQueue.async(flags: .barrier) { + @discardableResult + public func dec(_ amount: NumType, _ labels: Labels? = nil) -> NumType { + return self.lock.withLock { if let labels = labels { var val = self.metrics[labels] ?? self.initialValue val -= amount self.metrics[labels] = val - done(val) + return val } else { self.value -= amount - done(self.value) + return self.value } } } @@ -138,8 +147,9 @@ public class Gauge: Metric, PrometheusHa /// - Parameters: /// - labels: Labels to attach to the value /// - public func dec(_ labels: Labels? = nil, _ done: @escaping (NumType) -> Void = { _ in }) { - self.dec(1, labels, done) + @discardableResult + public func dec(_ labels: Labels? = nil) -> NumType { + return self.dec(1, labels) } /// Gets the value of the Gauge @@ -150,10 +160,12 @@ public class Gauge: Metric, PrometheusHa /// - Returns: The value of the Gauge attached to the provided labels /// public func get(_ labels: Labels? = nil) -> NumType { - if let labels = labels { - return self.metrics[labels] ?? initialValue - } else { - return self.value + return self.lock.withLock { + if let labels = labels { + return self.metrics[labels] ?? initialValue + } else { + return self.value + } } } } diff --git a/Sources/Prometheus/MetricTypes/Histogram.swift b/Sources/Prometheus/MetricTypes/Histogram.swift index 9640f16..31a03bd 100644 --- a/Sources/Prometheus/MetricTypes/Histogram.swift +++ b/Sources/Prometheus/MetricTypes/Histogram.swift @@ -1,8 +1,8 @@ -/// Default buckets used by Histograms -public var defaultBuckets = [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, Double.greatestFiniteMagnitude] +import NIOConcurrencyHelpers /// Label type Histograms can use public protocol HistogramLabels: MetricLabels { + /// Bucket var le: String { get set } } @@ -17,9 +17,9 @@ extension HistogramLabels { /// Prometheus Histogram metric /// /// See https://prometheus.io/docs/concepts/metric_types/#Histogram -public class Histogram: Metric, PrometheusHandled { +public class PromHistogram: PromMetric, PrometheusHandled { /// Prometheus instance that created this Histogram - internal let prometheus: PrometheusClient + internal weak var prometheus: PrometheusClient? /// Name of this Histogram, required public let name: String @@ -27,10 +27,10 @@ public class Histogram: M public let help: String? /// Type of the metric, used for formatting - public let _type: MetricType = .histogram + public let _type: PromMetricType = .histogram /// Bucketed values for this Histogram - private var buckets: [Counter] = [] + private var buckets: [PromCounter] = [] /// Buckets used by this Histogram internal let upperBounds: [Double] @@ -39,10 +39,13 @@ public class Histogram: M internal private(set) var labels: Labels /// Sub Histograms for this Histogram - fileprivate var subHistograms: [Histogram] = [] + fileprivate var subHistograms: [PromHistogram] = [] /// Total value of the Histogram - private let total: Counter + private let sum: PromCounter + + /// Lock used for thread safety + private let lock: Lock /// Creates a new Histogram /// @@ -52,18 +55,20 @@ public class Histogram: M /// - labels: Labels for the Histogram /// - buckets: Buckets to use for the Histogram /// - p: Prometheus instance creating this Histogram - internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ buckets: [Double] = defaultBuckets, _ p: PrometheusClient) { + internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ buckets: [Double] = Prometheus.defaultBuckets, _ p: PrometheusClient) { self.name = name self.help = help self.prometheus = p - self.total = .init("\(self.name)_sum", nil, 0, p) + self.sum = .init("\(self.name)_sum", nil, 0, p) self.labels = labels self.upperBounds = buckets + self.lock = Lock() + buckets.forEach { _ in self.buckets.append(.init("\(name)_bucket", nil, 0, p)) } @@ -71,10 +76,10 @@ public class Histogram: M /// Gets the metric string for this Histogram /// - /// - Parameters: - /// - done: Newline separated Prometheus-formatted metric string - public func getMetric(_ done: @escaping (String) -> Void) { - prometheusQueue.async(flags: .barrier) { + /// - Returns: + /// Newline seperated Prometheus formatted metric string + public func collect() -> String { + return self.lock.withLock { var output = [String]() if let help = self.help { @@ -93,7 +98,7 @@ public class Histogram: M let labelsString = encodeLabels(self.labels, ["le"]) output.append("\(self.name)_count\(labelsString) \(acc)") - output.append("\(self.name)_sum\(labelsString) \(self.total.get())") + output.append("\(self.name)_sum\(labelsString) \(self.sum.get())") self.subHistograms.forEach { subHistogram in var acc: NumType = 0 @@ -107,14 +112,14 @@ public class Histogram: M let labelsString = encodeLabels(subHistogram.labels, ["le"]) output.append("\(subHistogram.name)_count\(labelsString) \(acc)") - output.append("\(subHistogram.name)_sum\(labelsString) \(subHistogram.total.get())") + output.append("\(subHistogram.name)_sum\(labelsString) \(subHistogram.sum.get())") subHistogram.labels.le = "" } self.labels.le = "" - done(output.joined(separator: "\n")) + return output.joined(separator: "\n") } } @@ -123,43 +128,39 @@ public class Histogram: M /// - Parameters: /// - value: Value to observe /// - labels: Labels to attach to the observed value - /// - done: Completion handler - public func observe(_ value: NumType, _ labels: Labels? = nil, _ done: @escaping () -> Void = { }) { - prometheusQueue.async(flags: .barrier) { - let completion: () -> Void = { - self.total.inc(value) - - for (i, bound) in self.upperBounds.enumerated() { - if bound >= value.doubleValue { - self.buckets[i].inc() - break - } - } - done() + public func observe(_ value: NumType, _ labels: Labels? = nil) { + self.lock.withLock { + if let labels = labels, type(of: labels) != type(of: EmptySummaryLabels()) { + guard let his = self.prometheus?.getOrCreateHistogram(with: labels, for: self) else { fatalError("Lingering Histogram") } + his.observe(value) } + self.sum.inc(value) - if let labels = labels, type(of: labels) != type(of: EmptySummaryLabels()) { - let his = self.prometheus.getOrCreateHistogram(with: labels, for: self) - return his.observe(value, nil, completion) + for (i, bound) in self.upperBounds.enumerated() { + if bound >= value.doubleValue { + self.buckets[i].inc() + return + } } - return completion() } } + } extension PrometheusClient { - fileprivate func getOrCreateHistogram(with labels: U, for his: Histogram) -> Histogram { - let histograms = his.subHistograms.filter { (metric) -> Bool in - guard metric.name == his.name, metric.help == his.help, metric.labels == labels else { return false } + /// Helper for histograms & labels + fileprivate func getOrCreateHistogram(with labels: U, for histogram: PromHistogram) -> PromHistogram { + let histograms = histogram.subHistograms.filter { (metric) -> Bool in + guard metric.name == histogram.name, metric.help == histogram.help, metric.labels == labels else { return false } return true } if histograms.count > 2 { fatalError("Somehow got 2 histograms with the same data type") } if let histogram = histograms.first { return histogram } else { - let histogram = Histogram(his.name, his.help, labels, his.upperBounds, self) - his.subHistograms.append(histogram) - return histogram + let newHistogram = PromHistogram(histogram.name, histogram.help, labels, histogram.upperBounds, self) + histogram.subHistograms.append(newHistogram) + return newHistogram } } } diff --git a/Sources/Prometheus/MetricTypes/Info.swift b/Sources/Prometheus/MetricTypes/Info.swift deleted file mode 100644 index 5b5844b..0000000 --- a/Sources/Prometheus/MetricTypes/Info.swift +++ /dev/null @@ -1,60 +0,0 @@ -/// Info metric -/// -/// Info tracks key-value information, usually about a whole target -public class Info: Metric, PrometheusHandled { - /// Prometheus instance that created this Info - internal let prometheus: PrometheusClient - - /// Name of the Info, required - public let name: String - /// Help text of the Info, optional - public let help: String? - - /// Type of the metric, used for formatting - public let _type: MetricType = .info - - /// Labels of the info - /// For Info metrics, these are the actual values the metric is exposing - internal var labels = Labels() - - /// Creates a new Info - /// - /// - Parameters: - /// - name: Name of the Info - /// - help: Help text of the Info - /// - p: Prometheus instance handling this Info - internal init(_ name: String, _ help: String? = nil, _ p: PrometheusClient) { - self.name = name - self.help = help - self.prometheus = p - } - - /// Set the info - /// - /// - Parameters: - /// - labels: Labels to set the Info to - public func info(_ labels: Labels) { - self.labels = labels - } - - /// Gets the metric string for this Info - /// - /// - Parameters: - /// - done: Callback passing a newline separated Prometheus-formatted metric string - /// - public func getMetric(_ done: @escaping (String) -> Void) { - prometheusQueue.async(flags: .barrier) { - var output = [String]() - - if let help = self.help { - output.append("# HELP \(self.name) \(help)") - } - output.append("# TYPE \(self.name) \(self._type)") - - let labelsString = encodeLabels(self.labels) - output.append("\(self.name)\(labelsString) 1.0") - - done(output.joined(separator: "\n")) - } - } -} diff --git a/Sources/Prometheus/MetricTypes/Metric.swift b/Sources/Prometheus/MetricTypes/Metric.swift deleted file mode 100644 index 5f1cee1..0000000 --- a/Sources/Prometheus/MetricTypes/Metric.swift +++ /dev/null @@ -1,34 +0,0 @@ -/// Different types of metrics supported by SwiftPrometheus -public enum MetricType: String { - case counter, gauge, histogram, summary, info -} - -/// Metric protocol -/// -/// See https://prometheus.io/docs/concepts/metric_types/ -public protocol Metric { - var name: String { get } - var help: String? { get } - var _type: MetricType { get } - - func getMetric(_ done: @escaping (String) -> Void) -} - -//extension Metric { -// /// Default headers for a metric -// var headers: String { -// var output = [String]() -// return output.joined(separator: "\n") -// } -//} - -/// Adding a prometheus instance to all -/// metrics -internal protocol PrometheusHandled { - var prometheus: PrometheusClient { get } -} - -/// Base MetricLabels protocol -public protocol MetricLabels: Codable, Hashable { - init() -} diff --git a/Sources/Prometheus/MetricTypes/PromMetric.swift b/Sources/Prometheus/MetricTypes/PromMetric.swift new file mode 100644 index 0000000..ce5d81f --- /dev/null +++ b/Sources/Prometheus/MetricTypes/PromMetric.swift @@ -0,0 +1,63 @@ +/// Different types of metrics supported by SwiftPrometheus +public enum PromMetricType: String { + /// See `PromCounter` + case counter + /// See `PromGauge` + case gauge + /// See `PromHistogram` + case histogram + /// See `PromSummary` + case summary +} + +public enum Prometheus { + /// Default buckets used by Histograms + public static let defaultBuckets = [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, Double.greatestFiniteMagnitude] + + /// Default quantiles used by Summaries + public static let defaultQuantiles = [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999] + +} + +/// Metric protocol +/// +/// See https://prometheus.io/docs/concepts/metric_types/ +public protocol PromMetric { + /// Name of the metric + var name: String { get } + /// Optional help of the metric + var help: String? { get } + /// Type of the metric + var _type: PromMetricType { get } + + /// Retrieves the Prometheus-formatted metric data + func collect() -> String +} + +/// Adding a prometheus instance to all metrics +internal protocol PrometheusHandled { + /// Promtheus client handling this metric + var prometheus: PrometheusClient? { get } +} + +/// Base MetricLabels protocol +/// +/// MetricLabels are used to enrich & specify metrics. +/// +/// struct Labels: MetricLabels { +/// let status: String = "unknown" +/// } +/// let counter = myProm.createCounter(...) +/// counter.inc(12, labels: Labels(status: "failure") +/// counter.inc(1, labels: Labels(status: "success") +/// Will result in the following Prometheus output: +/// +/// # TYPE my_counter counter +/// my_counter 0 +/// my_counter{status="unknown"} 0 +/// my_counter{status="failure"} 12 +/// my_counter{status="success"} 1 +public protocol MetricLabels: Encodable, Hashable { + /// Create empty labels + init() +} diff --git a/Sources/Prometheus/MetricTypes/Summary.swift b/Sources/Prometheus/MetricTypes/Summary.swift index a02f26e..f066ab6 100644 --- a/Sources/Prometheus/MetricTypes/Summary.swift +++ b/Sources/Prometheus/MetricTypes/Summary.swift @@ -1,8 +1,8 @@ -/// Default quantiles used by Summaries -public var defaultQuantiles = [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999] +import NIOConcurrencyHelpers /// Label type Summaries can use public protocol SummaryLabels: MetricLabels { + /// Quantile used to label the summary. var quantile: String { get set } } @@ -17,9 +17,9 @@ extension SummaryLabels { /// Prometheus Counter metric /// /// See https://prometheus.io/docs/concepts/metric_types/#summary -public class Summary: Metric, PrometheusHandled { +public class PromSummary: PromMetric, PrometheusHandled { /// Prometheus instance that created this Summary - internal let prometheus: PrometheusClient + internal weak var prometheus: PrometheusClient? /// Name of this Summary, required public let name: String @@ -27,16 +27,16 @@ public class Summary: Metri public let help: String? /// Type of the metric, used for formatting - public let _type: MetricType = .summary + public let _type: PromMetricType = .summary /// Labels for this Summary internal private(set) var labels: Labels /// Sum of the values in this Summary - private let sum: Counter + private let sum: PromCounter /// Amount of values in this Summary - private let count: Counter + private let count: PromCounter /// Values in this Summary private var values: [NumType] = [] @@ -45,7 +45,10 @@ public class Summary: Metri internal let quantiles: [Double] /// Sub Summaries for this Summary - fileprivate var subSummaries: [Summary] = [] + fileprivate var subSummaries: [PromSummary] = [] + + /// Lock used for thread safety + private let lock: Lock /// Creates a new Summary /// @@ -55,7 +58,7 @@ public class Summary: Metri /// - labels: Labels for the Summary /// - quantiles: Quantiles to use for the Summary /// - p: Prometheus instance creating this Summary - internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ quantiles: [Double] = defaultQuantiles, _ p: PrometheusClient) { + internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ quantiles: [Double] = Prometheus.defaultQuantiles, _ p: PrometheusClient) { self.name = name self.help = help @@ -68,16 +71,16 @@ public class Summary: Metri self.quantiles = quantiles self.labels = labels + + self.lock = Lock() } /// Gets the metric string for this Summary /// - /// - Parameters: - /// - done: Completion handler - /// - metric: String value in prom-format - /// - public func getMetric(_ done: @escaping (_ metric: String) -> Void) { - prometheusQueue.async(flags: .barrier) { + /// - Returns: + /// Newline seperated Prometheus formatted metric string + public func collect() -> String { + return self.lock.withLock { var output = [String]() if let help = self.help { @@ -111,52 +114,52 @@ public class Summary: Metri } self.labels.quantile = "" - - done(output.joined(separator: "\n")) + + return output.joined(separator: "\n") } } + /// Record a value + /// + /// - Parameters: + /// - duration: Duration to record + public func recordNanoseconds(_ duration: Int64) { + guard let v = NumType.init(exactly: duration) else { return } + self.observe(v) + } + /// Observe a value /// /// - Parameters: /// - value: Value to observe /// - labels: Labels to attach to the observed value - /// - done: Completion handler - /// - public func observe(_ value: NumType, _ labels: Labels? = nil, _ done: @escaping () -> Void = { }) { - prometheusQueue.async(flags: .barrier) { - func completion() { - self.count.inc(1) - self.sum.inc(value) - self.values.append(value) - done() - } - + public func observe(_ value: NumType, _ labels: Labels? = nil) { + self.lock.withLock { if let labels = labels, type(of: labels) != type(of: EmptySummaryLabels()) { - let sum = self.prometheus.getOrCreateSummary(withLabels: labels, forSummary: self) - sum.observe(value) { - completion() - } - } else { - completion() + guard let sum = self.prometheus?.getOrCreateSummary(withLabels: labels, forSummary: self) else { fatalError("Lingering Summary") } + sum.observe(value) } + self.count.inc(1) + self.sum.inc(value) + self.values.append(value) } } } extension PrometheusClient { - fileprivate func getOrCreateSummary(withLabels labels: U, forSummary sum: Summary) -> Summary { - let summaries = sum.subSummaries.filter { (metric) -> Bool in - guard metric.name == sum.name, metric.help == sum.help, metric.labels == labels else { return false } + /// Helper for summaries & labels + fileprivate func getOrCreateSummary(withLabels labels: U, forSummary summary: PromSummary) -> PromSummary { + let summaries = summary.subSummaries.filter { (metric) -> Bool in + guard metric.name == summary.name, metric.help == summary.help, metric.labels == labels else { return false } return true } if summaries.count > 2 { fatalError("Somehow got 2 summaries with the same data type") } if let summary = summaries.first { return summary } else { - let summary = Summary(sum.name, sum.help, labels, sum.quantiles, self) - sum.subSummaries.append(summary) - return summary + let newSummary = PromSummary(summary.name, summary.help, labels, summary.quantiles, self) + summary.subSummaries.append(newSummary) + return newSummary } } } diff --git a/Sources/Prometheus/Prometheus.swift b/Sources/Prometheus/Prometheus.swift index 4aa1e59..bd0f6c8 100644 --- a/Sources/Prometheus/Prometheus.swift +++ b/Sources/Prometheus/Prometheus.swift @@ -1,30 +1,49 @@ +import NIOConcurrencyHelpers + /// Prometheus class /// /// See https://prometheus.io/docs/introduction/overview/ public class PrometheusClient { - /// Create a PrometheusClient instance - public init() { } - /// Metrics tracked by this Prometheus instance - internal var metrics: [Metric] = [] + private var metrics: [PromMetric] + + /// To keep track of the type of a metric since it can not change + /// througout the lifetime of the program + private var metricTypeMap: [String: PromMetricType] + + /// Lock used for thread safety + private let lock: Lock + /// Create a PrometheusClient instance + public init() { + self.metrics = [] + self.metricTypeMap = [:] + self.lock = Lock() + } /// Creates prometheus formatted metrics /// /// - Returns: Newline seperated string with metrics for all Metric Trackers of this Prometheus instance - public func getMetrics(_ done: @escaping (String) -> Void) { - prometheusQueue.async(flags: .barrier) { - var list = [String]() - self.metrics.forEach { metric in - metric.getMetric { str in - list.append(str) - - if list.count == self.metrics.count { - done(list.joined(separator: "\n")) - } - } - } + public func collect() -> String { + return self.lock.withLock { + return self.metrics.map { $0.collect() }.joined(separator: "\n") + } + } + + // MARK: - Metric Access + + public func removeMetric(_ metric: PromMetric) { + // `metricTypeMap` is left untouched as those must be consistent + // throughout the lifetime of a program. + return lock.withLock { + self.metrics.removeAll { $0._type == metric._type && $0.name == metric.name } + } + } + + public func getMetricInstance(with name: String, andType type: PromMetricType) -> T? where T: PromMetric { + return lock.withLock { + self.metrics.compactMap { $0 as? T }.filter { $0.name == name && $0._type == type }.first } } @@ -45,13 +64,17 @@ public class PrometheusClient { named name: String, helpText: String? = nil, initialValue: T = 0, - withLabelType labelType: U.Type) -> Counter + withLabelType labelType: U.Type) -> PromCounter { - let counter = Counter(name, helpText, initialValue, self) - prometheusQueue.async(flags: .barrier) { + return self.lock.withLock { + if let type = metricTypeMap[name] { + precondition(type == .counter, "Label \(name) was associated with \(type) before. Can not be used for a counter now.") + } + let counter = PromCounter(name, helpText, initialValue, self) + self.metricTypeMap[name] = .counter self.metrics.append(counter) + return counter } - return counter } /// Creates a counter with the given values @@ -67,7 +90,7 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - initialValue: T = 0) -> Counter + initialValue: T = 0) -> PromCounter { return self.createCounter(forType: type, named: name, helpText: helpText, initialValue: initialValue, withLabelType: EmptyLabels.self) } @@ -89,13 +112,17 @@ public class PrometheusClient { named name: String, helpText: String? = nil, initialValue: T = 0, - withLabelType labelType: U.Type) -> Gauge + withLabelType labelType: U.Type) -> PromGauge { - let gauge = Gauge(name, helpText, initialValue, self) - prometheusQueue.async(flags: .barrier) { + return self.lock.withLock { + if let type = metricTypeMap[name] { + precondition(type == .gauge, "Label \(name) was associated with \(type) before. Can not be used for a gauge now.") + } + let gauge = PromGauge(name, helpText, initialValue, self) + self.metricTypeMap[name] = .gauge self.metrics.append(gauge) + return gauge } - return gauge } /// Creates a gauge with the given values @@ -111,7 +138,7 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - initialValue: T = 0) -> Gauge + initialValue: T = 0) -> PromGauge { return self.createGauge(forType: type, named: name, helpText: helpText, initialValue: initialValue, withLabelType: EmptyLabels.self) } @@ -132,14 +159,18 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - buckets: [Double] = defaultBuckets, - labels: U.Type) -> Histogram + buckets: [Double] = Prometheus.defaultBuckets, + labels: U.Type) -> PromHistogram { - let histogram = Histogram(name, helpText, U(), buckets, self) - prometheusQueue.async(flags: .barrier) { + return self.lock.withLock { + if let type = metricTypeMap[name] { + precondition(type == .histogram, "Label \(name) was associated with \(type) before. Can not be used for a histogram now.") + } + let histogram = PromHistogram(name, helpText, U(), buckets, self) + self.metricTypeMap[name] = .histogram self.metrics.append(histogram) + return histogram } - return histogram } /// Creates a histogram with the given values @@ -155,7 +186,7 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - buckets: [Double] = defaultBuckets) -> Histogram + buckets: [Double] = Prometheus.defaultBuckets) -> PromHistogram { return self.createHistogram(forType: type, named: name, helpText: helpText, buckets: buckets, labels: EmptyHistogramLabels.self) } @@ -176,14 +207,18 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - quantiles: [Double] = defaultQuantiles, - labels: U.Type) -> Summary + quantiles: [Double] = Prometheus.defaultQuantiles, + labels: U.Type) -> PromSummary { - let summary = Summary(name, helpText, U(), quantiles, self) - prometheusQueue.async(flags: .barrier) { + return self.lock.withLock { + if let type = metricTypeMap[name] { + precondition(type == .summary, "Label \(name) was associated with \(type) before. Can not be used for a summary now.") + } + let summary = PromSummary(name, helpText, U(), quantiles, self) + self.metricTypeMap[name] = .summary self.metrics.append(summary) + return summary } - return summary } /// Creates a summary with the given values @@ -199,30 +234,17 @@ public class PrometheusClient { forType type: T.Type, named name: String, helpText: String? = nil, - quantiles: [Double] = defaultQuantiles) -> Summary + quantiles: [Double] = Prometheus.defaultQuantiles) -> PromSummary { return self.createSummary(forType: type, named: name, helpText: helpText, quantiles: quantiles, labels: EmptySummaryLabels.self) } - - // MARK: - Info - - /// Creates an Info metric with the given values - /// - /// - Parameters: - /// - name: Name of the info - /// - helpText: Help text for the info. Usually a short description - /// - labelType: Type of labels this Info can use - /// - /// - Returns Info instance - public func createInfo( - named name: String, - helpText: String? = nil, - labelType: U.Type) -> Info - { - let info = Info(name, helpText, self) - prometheusQueue.async(flags: .barrier) { - self.metrics.append(info) - } - return info - } } + +/// Prometheus specific errors +public enum PrometheusError: Error { + /// Thrown when a user tries to retrive + /// a `PromtheusClient` from `MetricsSystem` + /// but there was no `PrometheusClient` bootstrapped + case prometheusFactoryNotBootstrapped(bootstrappedWith: String) +} + diff --git a/Sources/Prometheus/Utils.swift b/Sources/Prometheus/Utils.swift index 5e65f6a..2d11497 100644 --- a/Sources/Prometheus/Utils.swift +++ b/Sources/Prometheus/Utils.swift @@ -1,28 +1,29 @@ import Foundation -/// Prometheus global dispatch queue -internal let prometheusQueue = DispatchQueue(label: "prometheus.internal", attributes: .concurrent) - /// Empty labels class public struct EmptyLabels: MetricLabels { + /// Creates empty labels public init() { } } /// Empty labels class public struct EmptyHistogramLabels: HistogramLabels { + /// Bucket public var le: String = "" + /// Creates empty labels public init() { } } /// Empty labels class public struct EmptySummaryLabels: SummaryLabels { + /// Quantile public var quantile: String = "" + /// Creates empty labels public init() { } } /// Creates a Prometheus String representation of a `MetricLabels` instance -public func encodeLabels(_ labels: Labels, _ excludingKeys: [String] = []) -> String { - // TODO: Fix this up to a custom decoder or something +func encodeLabels(_ labels: Labels, _ excludingKeys: [String] = []) -> String { do { let data = try JSONEncoder().encode(labels) guard var dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { @@ -46,7 +47,7 @@ extension Double { var description: String { if self == Double.greatestFiniteMagnitude { return "+Inf" - } else if self == Double.leastNormalMagnitude { + } else if self == Double.leastNonzeroMagnitude { return "-Inf" } else { return "\(self)" @@ -56,19 +57,24 @@ extension Double { /// Numbers that can be represented as Double instances public protocol DoubleRepresentable: Numeric { + /// Double value of the number var doubleValue: Double {get} } /// Numbers that convert to other types public protocol ConvertibleNumberType: DoubleRepresentable {} public extension ConvertibleNumberType { + /// Number as a Float var floatValue: Float {get {return Float(doubleValue)}} + /// Number as an Int var intValue: Int {get {return lrint(doubleValue)}} + /// Number as a CGFloat var CGFloatValue: CGFloat {get {return CGFloat(doubleValue)}} } /// Double Representable Conformance extension FixedWidthInteger { + /// Double value of the number public var doubleValue: Double { return Double(self) } diff --git a/Sources/PrometheusExample/main.swift b/Sources/PrometheusExample/main.swift index b4a8a29..ab49168 100644 --- a/Sources/PrometheusExample/main.swift +++ b/Sources/PrometheusExample/main.swift @@ -1,10 +1,53 @@ import Prometheus +import Metrics +import PrometheusMetrics import Foundation -let group = DispatchGroup() - let myProm = PrometheusClient() +MetricsSystem.bootstrap(myProm) + +for _ in 0...Int.random(in: 10...100) { + let c = Counter(label: "test") + c.increment() +} + +for _ in 0...Int.random(in: 10...100) { + let c = Counter(label: "test", dimensions: [("abc", "123")]) + c.increment() +} + +for _ in 0...Int.random(in: 100...500_000) { + let r = Recorder(label: "recorder") + r.record(Double.random(in: 0...20)) +} + +for _ in 0...Int.random(in: 100...500_000) { + let g = Gauge(label: "non_agg_recorder") + g.record(Double.random(in: 0...20)) +} + +for _ in 0...Int.random(in: 100...500_000) { + let t = Timer(label: "timer") + t.recordMicroseconds(Double.random(in: 20...150)) +} + +for _ in 0...Int.random(in: 100...500_000) { + let r = Recorder(label: "recorder", dimensions: [("abc", "123")]) + r.record(Double.random(in: 0...20)) +} + +for _ in 0...Int.random(in: 100...500_000) { + let g = Gauge(label: "non_agg_recorder", dimensions: [("abc", "123")]) + g.record(Double.random(in: 0...20)) +} + +for _ in 0...Int.random(in: 100...500_000) { + let t = Timer(label: "timer", dimensions: [("abc", "123")]) + t.recordMicroseconds(Double.random(in: 20...150)) +} + + struct MyCodable: MetricLabels { var thing: String = "*" } @@ -70,34 +113,5 @@ for _ in 0...Int.random(in: 100...1000) { summary.observe(Double.random(in: 0...10000), SummaryThing("/test")) } -struct MyInfoStruct: MetricLabels { - let version: String - let major: String - - init() { - self.version = "1.0.0" - self.major = "1" - } - - init(_ v: String, _ m: String) { - self.version = v - self.major = m - } -} - -let info = myProm.createInfo(named: "my_info", helpText: "Just some info", labelType: MyInfoStruct.self) - -info.info(MyInfoStruct("2.0.0", "2")) - -group.enter() - -myProm.getMetrics { - print($0) - group.leave() -} - -group.notify(queue: .main) { - exit(EXIT_SUCCESS) -} - -dispatchMain() +let metrics = try! MetricsSystem.prometheus().collect() +print(metrics) diff --git a/Sources/PrometheusMetrics/PrometheusMetrics.swift b/Sources/PrometheusMetrics/PrometheusMetrics.swift new file mode 100644 index 0000000..a2959cc --- /dev/null +++ b/Sources/PrometheusMetrics/PrometheusMetrics.swift @@ -0,0 +1,307 @@ +import Prometheus +import CoreMetrics + +private class MetricsCounter: CounterHandler { + let counter: PromCounter + let labels: DimensionLabels? + + internal init(counter: PromCounter, dimensions: [(String, String)]) { + self.counter = counter + guard !dimensions.isEmpty else { + labels = nil + return + } + self.labels = DimensionLabels(dimensions) + } + + func increment(by: Int64) { + self.counter.inc(by, labels) + } + + func reset() { } +} + +private class MetricsGauge: RecorderHandler { + let gauge: PromGauge + let labels: DimensionLabels? + + internal init(gauge: PromGauge, dimensions: [(String, String)]) { + self.gauge = gauge + guard !dimensions.isEmpty else { + labels = nil + return + } + self.labels = DimensionLabels(dimensions) + } + + func record(_ value: Int64) { + self.record(value.doubleValue) + } + + func record(_ value: Double) { + gauge.inc(value, labels) + } +} + +private class MetricsHistogram: RecorderHandler { + let histogram: PromHistogram + let labels: DimensionHistogramLabels? + + internal init(histogram: PromHistogram, dimensions: [(String, String)]) { + self.histogram = histogram + guard !dimensions.isEmpty else { + labels = nil + return + } + self.labels = DimensionHistogramLabels(dimensions) + } + + func record(_ value: Int64) { + histogram.observe(value.doubleValue, labels) + } + + func record(_ value: Double) { + histogram.observe(value, labels) + } +} + +private class MetricsSummary: TimerHandler { + let summary: PromSummary + let labels: DimensionSummaryLabels? + + internal init(summary: PromSummary, dimensions: [(String, String)]) { + self.summary = summary + guard !dimensions.isEmpty else { + labels = nil + return + } + self.labels = DimensionSummaryLabels(dimensions) + } + + func recordNanoseconds(_ duration: Int64) { + summary.observe(duration, labels) + } +} + +extension PrometheusClient: MetricsFactory { + public func destroyCounter(_ handler: CounterHandler) { + guard let handler = handler as? MetricsCounter else { return } + self.removeMetric(handler.counter) + } + + public func destroyRecorder(_ handler: RecorderHandler) { + if let handler = handler as? MetricsGauge { + self.removeMetric(handler.gauge) + } + if let handler = handler as? MetricsHistogram { + self.removeMetric(handler.histogram) + } + } + + public func destroyTimer(_ handler: TimerHandler) { + guard let handler = handler as? MetricsSummary else { return } + self.removeMetric(handler.summary) + } + + public func makeCounter(label: String, dimensions: [(String, String)]) -> CounterHandler { + let createHandler = { (counter: PromCounter) -> CounterHandler in + return MetricsCounter(counter: counter, dimensions: dimensions) + } + if let counter: PromCounter = self.getMetricInstance(with: label, andType: .counter) { + return createHandler(counter) + } + return createHandler(self.createCounter(forType: Int64.self, named: label, withLabelType: DimensionLabels.self)) + } + + public func makeRecorder(label: String, dimensions: [(String, String)], aggregate: Bool) -> RecorderHandler { + return aggregate ? makeHistogram(label: label, dimensions: dimensions) : makeGauge(label: label, dimensions: dimensions) + } + + private func makeGauge(label: String, dimensions: [(String, String)]) -> RecorderHandler { + let createHandler = { (gauge: PromGauge) -> RecorderHandler in + return MetricsGauge(gauge: gauge, dimensions: dimensions) + } + if let gauge: PromGauge = self.getMetricInstance(with: label, andType: .gauge) { + return createHandler(gauge) + } + return createHandler(createGauge(forType: Double.self, named: label, withLabelType: DimensionLabels.self)) + } + + private func makeHistogram(label: String, dimensions: [(String, String)]) -> RecorderHandler { + let createHandler = { (histogram: PromHistogram) -> RecorderHandler in + return MetricsHistogram(histogram: histogram, dimensions: dimensions) + } + if let histogram: PromHistogram = self.getMetricInstance(with: label, andType: .histogram) { + return createHandler(histogram) + } + return createHandler(createHistogram(forType: Double.self, named: label, labels: DimensionHistogramLabels.self)) + } + + public func makeTimer(label: String, dimensions: [(String, String)]) -> TimerHandler { + let createHandler = { (summary: PromSummary) -> TimerHandler in + return MetricsSummary(summary: summary, dimensions: dimensions) + } + if let summary: PromSummary = self.getMetricInstance(with: label, andType: .summary) { + return createHandler(summary) + } + return createHandler(createSummary(forType: Int64.self, named: label, labels: DimensionSummaryLabels.self)) + } +} + +public extension MetricsSystem { + /// Get the bootstrapped `MetricsSystem` as `PrometheusClient` + /// + /// - Returns: `PrometheusClient` used to bootstrap `MetricsSystem` + /// - Throws: `PrometheusError.PrometheusFactoryNotBootstrapped` + /// if no `PrometheusClient` was used to bootstrap `MetricsSystem` + static func prometheus() throws -> PrometheusClient { + guard let prom = self.factory as? PrometheusClient else { + throw PrometheusError.prometheusFactoryNotBootstrapped(bootstrappedWith: "\(self.factory)") + } + return prom + } +} + +// MARK: - Labels + +/// A generic `String` based `CodingKey` implementation. +private struct StringCodingKey: CodingKey { + /// `CodingKey` conformance. + public var stringValue: String + + /// `CodingKey` conformance. + public var intValue: Int? { + return Int(self.stringValue) + } + + /// Creates a new `StringCodingKey`. + public init(_ string: String) { + self.stringValue = string + } + + /// `CodingKey` conformance. + public init(stringValue: String) { + self.stringValue = stringValue + } + + /// `CodingKey` conformance. + public init(intValue: Int) { + self.stringValue = intValue.description + } +} + + + +/// Helper for dimensions +private struct DimensionLabels: MetricLabels { + let dimensions: [(String, String)] + + init() { + self.dimensions = [] + } + + init(_ dimensions: [(String, String)]) { + self.dimensions = dimensions + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + try self.dimensions.forEach { + try container.encode($0.1, forKey: .init($0.0)) + } + } + + func hash(into hasher: inout Hasher) { + hasher.combine(dimensions.map { "\($0.0)-\($0.1)"}) + } + + fileprivate var identifiers: String { + return dimensions.map { $0.0 }.joined(separator: "-") + } + + static func == (lhs: DimensionLabels, rhs: DimensionLabels) -> Bool { + return lhs.dimensions.map { "\($0.0)-\($0.1)"} == rhs.dimensions.map { "\($0.0)-\($0.1)"} + } +} + +/// Helper for dimensions +private struct DimensionHistogramLabels: HistogramLabels { + /// Bucket + var le: String + /// Dimensions + let dimensions: [(String, String)] + + /// Empty init + init() { + self.le = "" + self.dimensions = [] + } + + /// Init with dimensions + init(_ dimensions: [(String, String)]) { + self.le = "" + self.dimensions = dimensions + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + try self.dimensions.forEach { + try container.encode($0.1, forKey: .init($0.0)) + } + try container.encode(le, forKey: .init("le")) + } + + func hash(into hasher: inout Hasher) { + hasher.combine(dimensions.map { "\($0.0)-\($0.1)"}) + hasher.combine(le) + } + + fileprivate var identifiers: String { + return dimensions.map { $0.0 }.joined(separator: "-") + } + + static func == (lhs: DimensionHistogramLabels, rhs: DimensionHistogramLabels) -> Bool { + return lhs.dimensions.map { "\($0.0)-\($0.1)"} == rhs.dimensions.map { "\($0.0)-\($0.1)"} && rhs.le == lhs.le + } +} + +/// Helper for dimensions +private struct DimensionSummaryLabels: SummaryLabels { + /// Quantile + var quantile: String + /// Dimensions + let dimensions: [(String, String)] + + /// Empty init + init() { + self.quantile = "" + self.dimensions = [] + } + + /// Init with dimensions + init(_ dimensions: [(String, String)]) { + self.quantile = "" + self.dimensions = dimensions + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + try self.dimensions.forEach { + try container.encode($0.1, forKey: .init($0.0)) + } + try container.encode(quantile, forKey: .init("quantile")) + } + + func hash(into hasher: inout Hasher) { + hasher.combine(dimensions.map { "\($0.0)-\($0.1)"}) + hasher.combine(quantile) + } + + fileprivate var identifiers: String { + return dimensions.map { $0.0 }.joined(separator: "-") + } + + static func == (lhs: DimensionSummaryLabels, rhs: DimensionSummaryLabels) -> Bool { + return lhs.dimensions.map { "\($0.0)-\($0.1)"} == rhs.dimensions.map { "\($0.0)-\($0.1)"} && rhs.quantile == lhs.quantile + } +} diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 2da06bc..38e8604 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -3,5 +3,6 @@ import XCTest import SwiftPrometheusTests var tests = [XCTestCaseEntry]() -tests += SwiftPrometheusTests.allTests() -XCTMain(tests) \ No newline at end of file +tests += SwiftPrometheusTests.__allTests() + +XCTMain(tests) diff --git a/Tests/SwiftPrometheusTests/PrometheusMetricsTests.swift b/Tests/SwiftPrometheusTests/PrometheusMetricsTests.swift new file mode 100644 index 0000000..74e6a85 --- /dev/null +++ b/Tests/SwiftPrometheusTests/PrometheusMetricsTests.swift @@ -0,0 +1,138 @@ +import XCTest +@testable import Prometheus +@testable import CoreMetrics +@testable import PrometheusMetrics + +final class PrometheusMetricsTests: XCTestCase { + + var prom: PrometheusClient! + + override func setUp() { + self.prom = PrometheusClient() + MetricsSystem.bootstrapInternal(prom) + } + + override func tearDown() { + self.prom = nil + } + + func testCounter() { + let counter = Counter(label: "my_counter") + counter.increment(by: 10) + let counterTwo = Counter(label: "my_counter", dimensions: [("myValue", "labels")]) + counterTwo.increment(by: 10) + + XCTAssertEqual(prom.collect(), """ + # TYPE my_counter counter + my_counter 10 + my_counter{myValue=\"labels\"} 10 + """) + } + + func testGauge() { + let gauge = Gauge(label: "my_gauge") + + gauge.record(10) + gauge.record(12) + gauge.record(20) + + let gaugeTwo = Gauge(label: "my_gauge", dimensions: [("myValue", "labels")]) + gaugeTwo.record(10) + + XCTAssertEqual(prom.collect(), """ + # TYPE my_gauge gauge + my_gauge 42.0 + my_gauge{myValue=\"labels\"} 10.0 + """) + } + + func testHistogram() { + let recorder = Recorder(label: "my_histogram") + recorder.record(1) + recorder.record(2) + recorder.record(3) + + let recorderTwo = Recorder(label: "my_histogram", dimensions: [("myValue", "labels")]) + recorderTwo.record(3) + + XCTAssertEqual(prom.collect(), """ + # TYPE my_histogram histogram + my_histogram_bucket{le="0.005"} 0.0 + my_histogram_bucket{le="0.01"} 0.0 + my_histogram_bucket{le="0.025"} 0.0 + my_histogram_bucket{le="0.05"} 0.0 + my_histogram_bucket{le="0.075"} 0.0 + my_histogram_bucket{le="0.1"} 0.0 + my_histogram_bucket{le="0.25"} 0.0 + my_histogram_bucket{le="0.5"} 0.0 + my_histogram_bucket{le="0.75"} 0.0 + my_histogram_bucket{le="1.0"} 1.0 + my_histogram_bucket{le="2.5"} 2.0 + my_histogram_bucket{le="5.0"} 4.0 + my_histogram_bucket{le="7.5"} 4.0 + my_histogram_bucket{le="10.0"} 4.0 + my_histogram_bucket{le="+Inf"} 4.0 + my_histogram_count 4.0 + my_histogram_sum 9.0 + my_histogram_bucket{myValue="labels", le="0.005"} 0.0 + my_histogram_bucket{myValue="labels", le="0.01"} 0.0 + my_histogram_bucket{myValue="labels", le="0.025"} 0.0 + my_histogram_bucket{myValue="labels", le="0.05"} 0.0 + my_histogram_bucket{myValue="labels", le="0.075"} 0.0 + my_histogram_bucket{myValue="labels", le="0.1"} 0.0 + my_histogram_bucket{myValue="labels", le="0.25"} 0.0 + my_histogram_bucket{myValue="labels", le="0.5"} 0.0 + my_histogram_bucket{myValue="labels", le="0.75"} 0.0 + my_histogram_bucket{myValue="labels", le="1.0"} 0.0 + my_histogram_bucket{myValue="labels", le="2.5"} 0.0 + my_histogram_bucket{myValue="labels", le="5.0"} 1.0 + my_histogram_bucket{myValue="labels", le="7.5"} 1.0 + my_histogram_bucket{myValue="labels", le="10.0"} 1.0 + my_histogram_bucket{myValue="labels", le="+Inf"} 1.0 + my_histogram_count{myValue="labels"} 1.0 + my_histogram_sum{myValue="labels"} 3.0 + """) + } + + func testSummary() { + let summary = Timer(label: "my_summary") + + summary.recordNanoseconds(1) + summary.recordNanoseconds(2) + summary.recordNanoseconds(4) + summary.recordNanoseconds(10000) + + let summaryTwo = Timer(label: "my_summary", dimensions: [("myValue", "labels")]) + summaryTwo.recordNanoseconds(123) + + XCTAssertEqual(prom.collect(), """ + # TYPE my_summary summary + my_summary{quantile="0.01"} 1.0 + my_summary{quantile="0.05"} 1.0 + my_summary{quantile="0.5"} 4.0 + my_summary{quantile="0.9"} 10000.0 + my_summary{quantile="0.95"} 10000.0 + my_summary{quantile="0.99"} 10000.0 + my_summary{quantile="0.999"} 10000.0 + my_summary_count 5 + my_summary_sum 10130 + my_summary{quantile="0.01", myValue="labels"} 123.0 + my_summary{quantile="0.05", myValue="labels"} 123.0 + my_summary{quantile="0.5", myValue="labels"} 123.0 + my_summary{quantile="0.9", myValue="labels"} 123.0 + my_summary{quantile="0.95", myValue="labels"} 123.0 + my_summary{quantile="0.99", myValue="labels"} 123.0 + my_summary{quantile="0.999", myValue="labels"} 123.0 + my_summary_count{myValue="labels"} 1 + my_summary_sum{myValue="labels"} 123 + """) + } + + func testMetricDestroying() { + let counter = Counter(label: "my_counter") + counter.increment() + counter.destroy() + XCTAssertEqual(prom.collect(), "") + } +} + diff --git a/Tests/SwiftPrometheusTests/SwiftPrometheusTests.swift b/Tests/SwiftPrometheusTests/SwiftPrometheusTests.swift index db9cfbc..271c363 100644 --- a/Tests/SwiftPrometheusTests/SwiftPrometheusTests.swift +++ b/Tests/SwiftPrometheusTests/SwiftPrometheusTests.swift @@ -41,7 +41,6 @@ final class SwiftPrometheusTests: XCTestCase { } } - var prom: PrometheusClient! override func setUp() { @@ -53,155 +52,53 @@ final class SwiftPrometheusTests: XCTestCase { } func testCounter() { - let semaphore = DispatchSemaphore(value: 0) - let counter = prom.createCounter(forType: Int.self, named: "my_counter", helpText: "Counter for testing", initialValue: 10, withLabelType: BaseLabels.self) XCTAssertEqual(counter.get(), 10) - counter.inc(10) { value in - XCTAssertEqual(value, 20) - semaphore.signal() - } - semaphore.wait() + counter.inc(10) XCTAssertEqual(counter.get(), 20) - - counter.inc(10, BaseLabels(myValue: "labels")) { value in - XCTAssertEqual(value, 20) - semaphore.signal() - } - semaphore.wait() + counter.inc(10, BaseLabels(myValue: "labels")) XCTAssertEqual(counter.get(), 20) XCTAssertEqual(counter.get(BaseLabels(myValue: "labels")), 20) - counter.getMetric { metric in - XCTAssertEqual(metric, "# HELP my_counter Counter for testing\n# TYPE my_counter counter\nmy_counter 20\nmy_counter{myValue=\"labels\"} 20") - semaphore.signal() - } - semaphore.wait() + XCTAssertEqual(counter.collect(), "# HELP my_counter Counter for testing\n# TYPE my_counter counter\nmy_counter 20\nmy_counter{myValue=\"labels\"} 20") } func testGauge() { - let semaphore = DispatchSemaphore(value: 0) - let gauge = prom.createGauge(forType: Int.self, named: "my_gauge", helpText: "Gauge for testing", initialValue: 10, withLabelType: BaseLabels.self) XCTAssertEqual(gauge.get(), 10) - gauge.inc(10) { value in - XCTAssertEqual(value, 20) - semaphore.signal() - } - semaphore.wait() - + gauge.inc(10) XCTAssertEqual(gauge.get(), 20) - gauge.dec(12) { value in - XCTAssertEqual(value, 8) - semaphore.signal() - } - semaphore.wait() - + gauge.dec(12) XCTAssertEqual(gauge.get(), 8) - gauge.set(20) { - semaphore.signal() - } - semaphore.wait() - - gauge.inc(10, BaseLabels(myValue: "labels")) { value in - XCTAssertEqual(value, 20) - semaphore.signal() - } - semaphore.wait() - + gauge.set(20) + gauge.inc(10, BaseLabels(myValue: "labels")) XCTAssertEqual(gauge.get(), 20) XCTAssertEqual(gauge.get(BaseLabels(myValue: "labels")), 20) - gauge.getMetric { metric in - XCTAssertEqual(metric, "# HELP my_gauge Gauge for testing\n# TYPE my_gauge gauge\nmy_gauge 20\nmy_gauge{myValue=\"labels\"} 20") - semaphore.signal() - } - semaphore.wait() + XCTAssertEqual(gauge.collect(), "# HELP my_gauge Gauge for testing\n# TYPE my_gauge gauge\nmy_gauge 20\nmy_gauge{myValue=\"labels\"} 20") } func testHistogram() { - let semaphore = DispatchSemaphore(value: 0) - let histogram = prom.createHistogram(forType: Double.self, named: "my_histogram", helpText: "Histogram for testing", buckets: [0.5, 1, 2, 3, 5, Double.greatestFiniteMagnitude], labels: BaseHistogramLabels.self) - histogram.observe(1) { - semaphore.signal() - } - semaphore.wait() - histogram.observe(2) { - semaphore.signal() - } - semaphore.wait() - histogram.observe(3) { - semaphore.signal() - } - semaphore.wait() - histogram.observe(3, .init(myValue: "labels")) { - semaphore.signal() - } - semaphore.wait() - - var metricOutput = "" - histogram.getMetric { metric in - metricOutput = metric - semaphore.signal() - } - semaphore.wait() - - XCTAssertEqual(metricOutput, "# HELP my_histogram Histogram for testing\n# TYPE my_histogram histogram\nmy_histogram_bucket{myValue=\"*\", le=\"0.5\"} 0.0\nmy_histogram_bucket{myValue=\"*\", le=\"1.0\"} 1.0\nmy_histogram_bucket{myValue=\"*\", le=\"2.0\"} 2.0\nmy_histogram_bucket{myValue=\"*\", le=\"3.0\"} 4.0\nmy_histogram_bucket{myValue=\"*\", le=\"5.0\"} 4.0\nmy_histogram_bucket{myValue=\"*\", le=\"+Inf\"} 4.0\nmy_histogram_count{myValue=\"*\"} 4.0\nmy_histogram_sum{myValue=\"*\"} 9.0\nmy_histogram_bucket{myValue=\"labels\", le=\"0.5\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"1.0\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"2.0\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"3.0\"} 1.0\nmy_histogram_bucket{myValue=\"labels\", le=\"5.0\"} 1.0\nmy_histogram_bucket{myValue=\"labels\", le=\"+Inf\"} 1.0\nmy_histogram_count{myValue=\"labels\"} 1.0\nmy_histogram_sum{myValue=\"labels\"} 3.0") - } - - func testInfo() { - let info = prom.createInfo(named: "my_info", helpText: "Info for testing", labelType: BaseLabels.self) - info.info(.init(myValue: "testing")) + histogram.observe(1) + histogram.observe(2) + histogram.observe(3) - let semaphore = DispatchSemaphore(value: 0) - info.getMetric { metric in - XCTAssertEqual(metric, "# HELP my_info Info for testing\n# TYPE my_info info\nmy_info{myValue=\"testing\"} 1.0") - semaphore.signal() - } - semaphore.wait() + histogram.observe(3, .init(myValue: "labels")) + + XCTAssertEqual(histogram.collect(), "# HELP my_histogram Histogram for testing\n# TYPE my_histogram histogram\nmy_histogram_bucket{myValue=\"*\", le=\"0.5\"} 0.0\nmy_histogram_bucket{myValue=\"*\", le=\"1.0\"} 1.0\nmy_histogram_bucket{myValue=\"*\", le=\"2.0\"} 2.0\nmy_histogram_bucket{myValue=\"*\", le=\"3.0\"} 4.0\nmy_histogram_bucket{myValue=\"*\", le=\"5.0\"} 4.0\nmy_histogram_bucket{myValue=\"*\", le=\"+Inf\"} 4.0\nmy_histogram_count{myValue=\"*\"} 4.0\nmy_histogram_sum{myValue=\"*\"} 9.0\nmy_histogram_bucket{myValue=\"labels\", le=\"0.5\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"1.0\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"2.0\"} 0.0\nmy_histogram_bucket{myValue=\"labels\", le=\"3.0\"} 1.0\nmy_histogram_bucket{myValue=\"labels\", le=\"5.0\"} 1.0\nmy_histogram_bucket{myValue=\"labels\", le=\"+Inf\"} 1.0\nmy_histogram_count{myValue=\"labels\"} 1.0\nmy_histogram_sum{myValue=\"labels\"} 3.0") } func testSummary() { - let semaphore = DispatchSemaphore(value: 0) - let summary = prom.createSummary(forType: Double.self, named: "my_summary", helpText: "Summary for testing", quantiles: [0.5, 0.9, 0.99], labels: BaseSummaryLabels.self) - summary.observe(1) { - semaphore.signal() - } - semaphore.wait() - summary.observe(2) { - semaphore.signal() - } - semaphore.wait() - summary.observe(4) { - semaphore.signal() - } - semaphore.wait() - summary.observe(10000) { - semaphore.signal() - } - semaphore.wait() - summary.observe(123, .init(myValue: "labels")) { - semaphore.signal() - } - semaphore.wait() - - var outputMetric = "" - summary.getMetric { metric in - outputMetric = metric - semaphore.signal() - } - semaphore.wait() - - XCTAssertEqual(outputMetric, "# HELP my_summary Summary for testing\n# TYPE my_summary summary\nmy_summary{quantile=\"0.5\", myValue=\"*\"} 4.0\nmy_summary{quantile=\"0.9\", myValue=\"*\"} 10000.0\nmy_summary{quantile=\"0.99\", myValue=\"*\"} 10000.0\nmy_summary_count{myValue=\"*\"} 5.0\nmy_summary_sum{myValue=\"*\"} 10130.0\nmy_summary{quantile=\"0.5\", myValue=\"labels\"} 123.0\nmy_summary{quantile=\"0.9\", myValue=\"labels\"} 123.0\nmy_summary{quantile=\"0.99\", myValue=\"labels\"} 123.0\nmy_summary_count{myValue=\"labels\"} 1.0\nmy_summary_sum{myValue=\"labels\"} 123.0") + + summary.observe(1) + summary.observe(2) + summary.observe(4) + summary.observe(10000) + + summary.observe(123, .init(myValue: "labels")) + + XCTAssertEqual(summary.collect(), "# HELP my_summary Summary for testing\n# TYPE my_summary summary\nmy_summary{quantile=\"0.5\", myValue=\"*\"} 4.0\nmy_summary{quantile=\"0.9\", myValue=\"*\"} 10000.0\nmy_summary{quantile=\"0.99\", myValue=\"*\"} 10000.0\nmy_summary_count{myValue=\"*\"} 5.0\nmy_summary_sum{myValue=\"*\"} 10130.0\nmy_summary{quantile=\"0.5\", myValue=\"labels\"} 123.0\nmy_summary{quantile=\"0.9\", myValue=\"labels\"} 123.0\nmy_summary{quantile=\"0.99\", myValue=\"labels\"} 123.0\nmy_summary_count{myValue=\"labels\"} 1.0\nmy_summary_sum{myValue=\"labels\"} 123.0") } - - static var allTests = [ - ("testCounter", testCounter), - ("testGauge", testGauge), - ("testHistogram", testHistogram), - ("testInfo", testInfo), - ("testSummary", testSummary) - ] } diff --git a/Tests/SwiftPrometheusTests/XCTestManifests.swift b/Tests/SwiftPrometheusTests/XCTestManifests.swift index 0e92176..fa78f93 100644 --- a/Tests/SwiftPrometheusTests/XCTestManifests.swift +++ b/Tests/SwiftPrometheusTests/XCTestManifests.swift @@ -1,9 +1,35 @@ +#if !canImport(ObjectiveC) import XCTest -#if !os(macOS) -public func allTests() -> [XCTestCaseEntry] { +extension PrometheusMetricsTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PrometheusMetricsTests = [ + ("testCounter", testCounter), + ("testGauge", testGauge), + ("testHistogram", testHistogram), + ("testMetricDestroying", testMetricDestroying), + ("testSummary", testSummary), + ] +} + +extension SwiftPrometheusTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__SwiftPrometheusTests = [ + ("testCounter", testCounter), + ("testGauge", testGauge), + ("testHistogram", testHistogram), + ("testSummary", testSummary), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { return [ - testCase(SwiftPrometheusTests.allTests), + testCase(PrometheusMetricsTests.__allTests__PrometheusMetricsTests), + testCase(SwiftPrometheusTests.__allTests__SwiftPrometheusTests), ] } -#endif \ No newline at end of file +#endif diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..244954d --- /dev/null +++ b/circle.yml @@ -0,0 +1,43 @@ +version: 2 + +jobs: + swift4: + docker: + - image: swift:4.2 + steps: + - checkout + - run: apt-get update; apt-get install -y libssl-dev zlib1g-dev + - run: swift build + - run: swift test + swift5: + docker: + - image: swift:5.0 + steps: + - checkout + - run: apt-get update; apt-get install -y libssl-dev zlib1g-dev + - run: swift build + - run: swift test + bionic: + docker: + - image: vapor/swift:5.1-bionic + steps: + - checkout + - run: apt-get update; apt-get install -y libssl-dev zlib1g-dev + - run: swift build + - run: swift test + bionic-release: + docker: + - image: vapor/swift:5.1-bionic + steps: + - checkout + - run: apt-get update; apt-get install -y libssl-dev zlib1g-dev + - run: swift build -c release + +workflows: + version: 2 + tests: + jobs: + - bionic + - bionic-release + - swift4 + - swift5 diff --git a/docs/Classes.html b/docs/Classes.html deleted file mode 100644 index 1deb749..0000000 --- a/docs/Classes.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - Classes Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Classes

-

The following classes are available globally.

- -
-
- -
-
-
- -
-
- -
-
- -
-
-
    -
  • -
    - - - - Info - -
    -
    -
    -
    -
    -
    -

    Info metric

    - -

    Info tracks key-value information, usually about a whole target

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class Info<Labels> : Metric, PrometheusHandled where Labels : MetricLabels
    - -
    -
    - -
    -
    -
  • -
-
-
- -
-
- -
-
-
- -
-
- - - - diff --git a/docs/Classes/Counter.html b/docs/Classes/Counter.html deleted file mode 100644 index 1dc77db..0000000 --- a/docs/Classes/Counter.html +++ /dev/null @@ -1,443 +0,0 @@ - - - - Counter Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Counter

-
-
-
public class Counter<NumType, Labels> : Metric, PrometheusHandled where NumType : Numeric, Labels : MetricLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#counter

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Counter, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Counter, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ amount: NumType = 1, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to increment the counter with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - get(_:) - -
    -
    -
    -
    -
    -
    -

    Gets the value of the Counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func get(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to get the value for

    -
    -
    -
    -
    -

    Return Value

    -

    The value of the Counter attached to the provided labels

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Classes/Gauge.html b/docs/Classes/Gauge.html deleted file mode 100644 index a4d6f9c..0000000 --- a/docs/Classes/Gauge.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - Gauge Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Gauge

-
-
-
public class Gauge<NumType, Labels> : Metric, PrometheusHandled where NumType : Numeric, Labels : MetricLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#gauge

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Gauge, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Gauge, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - set(_:_:) - -
    -
    -
    -
    -
    -
    -

    Sets the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func set(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to set the gauge to

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to increment the Gauge with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - dec(_:_:) - -
    -
    -
    -
    -
    -
    -

    Decrements the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func dec(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to decrement the Gauge with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - dec(_:) - -
    -
    -
    -
    -
    -
    -

    Decrements the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func dec(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - get(_:) - -
    -
    -
    -
    -
    -
    -

    Gets the value of the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func get(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to get the value for

    -
    -
    -
    -
    -

    Return Value

    -

    The value of the Gauge attached to the provided labels

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Classes/Histogram.html b/docs/Classes/Histogram.html deleted file mode 100644 index 3820152..0000000 --- a/docs/Classes/Histogram.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - Histogram Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Histogram

-
-
-
public class Histogram<NumType, Labels> : Metric, PrometheusHandled where NumType : DoubleRepresentable, Labels : HistogramLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#Histogram

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of this Histogram, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of this Histogram, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Histogram

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - observe(_:_:) - -
    -
    -
    -
    -
    -
    -

    Observe a value

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func observe(_ value: NumType, _ labels: Labels? = nil)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - value - - -
    -

    Value to observe

    -
    -
    - - labels - - -
    -

    Labels to attach to the observed value

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Classes/Info.html b/docs/Classes/Info.html deleted file mode 100644 index d51cd30..0000000 --- a/docs/Classes/Info.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - Info Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Info

-
-
-
public class Info<Labels> : Metric, PrometheusHandled where Labels : MetricLabels
- -
-
-

Info metric

- -

Info tracks key-value information, usually about a whole target

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Info, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Info, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - info(_:) - -
    -
    -
    -
    -
    -
    -

    Set the info

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func info(_ labels: Labels)
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to set the Info to

    -
    -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Info

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Classes/Prometheus.html b/docs/Classes/Prometheus.html deleted file mode 100644 index 04c5d29..0000000 --- a/docs/Classes/Prometheus.html +++ /dev/null @@ -1,1194 +0,0 @@ - - - - Prometheus Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Prometheus

-
-
-
public class Prometheus
- -
-
-

Prometheus class

- -

See https://prometheus.io/docs/introduction/overview/

- -
-
- -
-
-
-
    -
  • -
    - - - - shared - -
    -
    -
    -
    -
    -
    -

    Singleton instance

    - -

    Use this to create Metric trackers and retrieve your data, -so you don’t have to keep track of an instance.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static let shared: Prometheus
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetrics() - -
    -
    -
    -
    -
    -
    -

    Creates prometheus formatted metrics

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetrics() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated string with metrics for all Metric Trackers of this Prometheus instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a counter with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createCounter<T: Numeric, U: MetricLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0,
    -    withLabelType labelType: U.Type) -> Counter<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the counter will count

    -
    -
    - - name - - -
    -

    Name of the counter

    -
    -
    - - helpText - - -
    -

    Help text for the counter. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the counter to, defaults to 0

    -
    -
    - - labelType - - -
    -

    Type of labels this counter can use. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Counter instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a counter with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createCounter<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0) -> Counter<T, EmptyLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the counter will count

    -
    -
    - - name - - -
    -

    Name of the counter

    -
    -
    - - helpText - - -
    -

    Help text for the counter. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the counter to, defaults to 0

    -
    -
    -
    -
    -

    Return Value

    -

    Counter instance

    -
    - -
    -
    -
  • -
-
-
-
- - - -

Gauge

-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Creates a gauge with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createGauge<T: Numeric, U: MetricLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0,
    -    withLabelType labelType: U.Type) -> Gauge<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the gauge will hold

    -
    -
    - - name - - -
    -

    Name of the gauge

    -
    -
    - - helpText - - -
    -

    Help text for the gauge. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the gauge to, defaults to 0

    -
    -
    - - labelType - - -
    -

    Type of labels this gauge can use. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Gauge instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a gauge with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createGauge<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0) -> Gauge<T, EmptyLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the gauge will count

    -
    -
    - - name - - -
    -

    Name of the gauge

    -
    -
    - - helpText - - -
    -

    Help text for the gauge. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the gauge to, defaults to 0

    -
    -
    -
    -
    -

    Return Value

    -

    Gauge instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a histogram with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createHistogram<T: Numeric, U: HistogramLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    buckets: [Double] = defaultBuckets,
    -    labels: U.Type) -> Histogram<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the histogram will observe

    -
    -
    - - name - - -
    -

    Name of the histogram

    -
    -
    - - helpText - - -
    -

    Help text for the histogram. Usually a short description

    -
    -
    - - buckets - - -
    -

    Buckets to divide values over

    -
    -
    - - labels - - -
    -

    Labels to give this histogram. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Histogram instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a histogram with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createHistogram<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    buckets: [Double] = defaultBuckets) -> Histogram<T, EmptyHistogramLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the histogram will observe

    -
    -
    - - name - - -
    -

    Name of the histogram

    -
    -
    - - helpText - - -
    -

    Help text for the histogram. Usually a short description

    -
    -
    - - buckets - - -
    -

    Buckets to divide values over

    -
    -
    -
    -
    -

    Return Value

    -

    Histogram instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a summary with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createSummary<T: Numeric, U: SummaryLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    quantiles: [Double] = defaultQuantiles,
    -    labels: U.Type) -> Summary<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the summary will observe

    -
    -
    - - name - - -
    -

    Name of the summary

    -
    -
    - - helpText - - -
    -

    Help text for the summary. Usually a short description

    -
    -
    - - quantiles - - -
    -

    Quantiles to caluculate

    -
    -
    - - labels - - -
    -

    Labels to give this summary. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Summary instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a summary with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createSummary<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    quantiles: [Double] = defaultQuantiles) -> Summary<T, EmptySummaryLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the summary will observe

    -
    -
    - - name - - -
    -

    Name of the summary

    -
    -
    - - helpText - - -
    -

    Help text for the summary. Usually a short description

    -
    -
    - - quantiles - - -
    -

    Quantiles to caluculate

    -
    -
    -
    -
    -

    Return Value

    -

    Summary instance

    -
    - -
    -
    -
  • -
-
-
-
- - - -

Info

-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Creates an Info metric with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createInfo<U: MetricLabels>(
    -    named name: String,
    -    helpText: String? = nil,
    -    labelType: U.Type) -> Info<U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - name - - -
    -

    Name of the info

    -
    -
    - - helpText - - -
    -

    Help text for the info. Usually a short description

    -
    -
    - - labelType - - -
    -

    Type of labels this Info can use

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Classes/Summary.html b/docs/Classes/Summary.html deleted file mode 100644 index 142e4d0..0000000 --- a/docs/Classes/Summary.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - Summary Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Summary

-
-
-
public class Summary<NumType, Labels> : Metric, PrometheusHandled where NumType : DoubleRepresentable, Labels : SummaryLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#summary

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of this Summary, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of this Summary, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Summary

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - observe(_:_:) - -
    -
    -
    -
    -
    -
    -

    Observe a value

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func observe(_ value: NumType, _ labels: Labels? = nil)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - value - - -
    -

    Value to observe

    -
    -
    - - labels - - -
    -

    Labels to attach to the observed value

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Enums.html b/docs/Enums.html deleted file mode 100644 index 1ead040..0000000 --- a/docs/Enums.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - Enumerations Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Enumerations

-

The following enumerations are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - MetricType - -
    -
    -
    -
    -
    -
    -

    Different types of metrics supported by SwiftPrometheus

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum MetricType : String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Enums/MetricType.html b/docs/Enums/MetricType.html deleted file mode 100644 index 3410057..0000000 --- a/docs/Enums/MetricType.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - MetricType Enumeration Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

MetricType

-
-
-
public enum MetricType : String
- -
-
-

Different types of metrics supported by SwiftPrometheus

- -
-
- -
-
-
-
    -
  • -
    - - - - counter - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case counter
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - gauge - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case gauge
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - histogram - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case histogram
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - summary - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case summary
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - info - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case info
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Extensions.html b/docs/Extensions.html deleted file mode 100644 index 5995288..0000000 --- a/docs/Extensions.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - Extensions Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Extensions

-

The following extensions are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - FixedWidthInteger - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    protocol FixedWidthInteger : BinaryInteger, LosslessStringConvertible, _BitwiseOperations where Self.Magnitude : FixedWidthInteger, Self.Magnitude : UnsignedInteger, Self.Stride : FixedWidthInteger, Self.Stride : SignedInteger
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - Double - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct Double
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - CGFloat - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct CGFloat
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - Float - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct Float
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Extensions/CGFloat.html b/docs/Extensions/CGFloat.html deleted file mode 100644 index 004b6c5..0000000 --- a/docs/Extensions/CGFloat.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - CGFloat Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

CGFloat

-
-
-
struct CGFloat
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Extensions/Double.html b/docs/Extensions/Double.html deleted file mode 100644 index c09bf1f..0000000 --- a/docs/Extensions/Double.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - Double Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Double

-
-
-
struct Double
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Extensions/FixedWidthInteger.html b/docs/Extensions/FixedWidthInteger.html deleted file mode 100644 index 0ea1638..0000000 --- a/docs/Extensions/FixedWidthInteger.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - FixedWidthInteger Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

FixedWidthInteger

-
-
-
protocol FixedWidthInteger : BinaryInteger, LosslessStringConvertible, _BitwiseOperations where Self.Magnitude : FixedWidthInteger, Self.Magnitude : UnsignedInteger, Self.Stride : FixedWidthInteger, Self.Stride : SignedInteger
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Extensions/Float.html b/docs/Extensions/Float.html deleted file mode 100644 index 9e10b1c..0000000 --- a/docs/Extensions/Float.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - Float Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Float

-
-
-
struct Float
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Functions.html b/docs/Functions.html deleted file mode 100644 index 1551230..0000000 --- a/docs/Functions.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - Functions Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Functions

-

The following functions are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - encodeLabels(_:_:) - -
    -
    -
    -
    -
    -
    -

    Creates a Prometheus String representation of a MetricLabels instance

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func encodeLabels<Labels: MetricLabels>(_ labels: Labels, _ excludingKeys: [String] = []) -> String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Global Variables.html b/docs/Global Variables.html deleted file mode 100644 index 6cfa85f..0000000 --- a/docs/Global Variables.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - Global Variables Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Global Variables

-

The following global variables are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - defaultBuckets - -
    -
    -
    -
    -
    -
    -

    Default buckets used by Histograms

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var defaultBuckets: [Double]
    - -
    -
    - -
    -
    -
  • -
-
-
-
    -
  • -
    - - - - defaultQuantiles - -
    -
    -
    -
    -
    -
    -

    Default quantiles used by Summaries

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var defaultQuantiles: [Double]
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols.html b/docs/Protocols.html deleted file mode 100644 index 9ddc6a0..0000000 --- a/docs/Protocols.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - Protocols Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Protocols

-

The following protocols are available globally.

- -
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
- - - - diff --git a/docs/Protocols/ConvertibleNumberType.html b/docs/Protocols/ConvertibleNumberType.html deleted file mode 100644 index aa0c407..0000000 --- a/docs/Protocols/ConvertibleNumberType.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - ConvertibleNumberType Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

ConvertibleNumberType

-
-
-
public protocol ConvertibleNumberType : DoubleRepresentable
- -
-
-

Numbers that convert to other types

- -
-
- -
-
-
-
    -
  • -
    - - - - floatValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var floatValue: Float { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - intValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var intValue: Int { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - CGFloatValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var CGFloatValue: CGFloat { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols/DoubleRepresentable.html b/docs/Protocols/DoubleRepresentable.html deleted file mode 100644 index 585b08c..0000000 --- a/docs/Protocols/DoubleRepresentable.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - DoubleRepresentable Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

DoubleRepresentable

-
-
-
public protocol DoubleRepresentable : Numeric
- -
-
-

Numbers that can be represented as Double instances

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols/HistogramLabels.html b/docs/Protocols/HistogramLabels.html deleted file mode 100644 index 573e7c1..0000000 --- a/docs/Protocols/HistogramLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - HistogramLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

HistogramLabels

-
-
-
public protocol HistogramLabels : MetricLabels
- -
-
-

Label type Histograms can use

- -
-
- -
-
-
-
    -
  • -
    - - - - le - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var le: String { get set }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols/Metric.html b/docs/Protocols/Metric.html deleted file mode 100644 index 78efd53..0000000 --- a/docs/Protocols/Metric.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - Metric Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Metric

-
-
-
public protocol Metric
- -
-
-

Metric protocol

- -

See https://prometheus.io/docs/concepts/metric_types/

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var name: String { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var help: String? { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var _type: MetricType { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    func getMetric() -> String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols/MetricLabels.html b/docs/Protocols/MetricLabels.html deleted file mode 100644 index 1538237..0000000 --- a/docs/Protocols/MetricLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - MetricLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

MetricLabels

-
-
-
public protocol MetricLabels : Decodable, Encodable, Hashable
- -
-
-

Base MetricLabels protocol

- -
-
- -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Protocols/SummaryLabels.html b/docs/Protocols/SummaryLabels.html deleted file mode 100644 index 73ff920..0000000 --- a/docs/Protocols/SummaryLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - SummaryLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

SummaryLabels

-
-
-
public protocol SummaryLabels : MetricLabels
- -
-
-

Label type Summaries can use

- -
-
- -
-
-
-
    -
  • -
    - - - - quantile - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var quantile: String { get set }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Structs.html b/docs/Structs.html deleted file mode 100644 index c02fa62..0000000 --- a/docs/Structs.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - Structures Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Structures

-

The following structures are available globally.

- -
-
- -
-
-
- -
-
-
- -
-
- - - - diff --git a/docs/Structs/EmptyHistogramLabels.html b/docs/Structs/EmptyHistogramLabels.html deleted file mode 100644 index be7ac9b..0000000 --- a/docs/Structs/EmptyHistogramLabels.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - EmptyHistogramLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptyHistogramLabels

-
-
-
public struct EmptyHistogramLabels : HistogramLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - le - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var le: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Structs/EmptyLabels.html b/docs/Structs/EmptyLabels.html deleted file mode 100644 index 28464e8..0000000 --- a/docs/Structs/EmptyLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - EmptyLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptyLabels

-
-
-
public struct EmptyLabels : MetricLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/Structs/EmptySummaryLabels.html b/docs/Structs/EmptySummaryLabels.html deleted file mode 100644 index 21b4d8b..0000000 --- a/docs/Structs/EmptySummaryLabels.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - EmptySummaryLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptySummaryLabels

-
-
-
public struct EmptySummaryLabels : SummaryLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - quantile - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var quantile: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/badge.svg b/docs/badge.svg deleted file mode 100644 index 921d353..0000000 --- a/docs/badge.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - documentation - - - documentation - - - 72% - - - 72% - - - diff --git a/docs/css/highlight.css b/docs/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css deleted file mode 100644 index c83db5b..0000000 --- a/docs/css/jazzy.css +++ /dev/null @@ -1,368 +0,0 @@ -*, *:before, *:after { - box-sizing: inherit; } - -body { - margin: 0; - background: #fff; - color: #333; - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: .2px; - -webkit-font-smoothing: antialiased; - box-sizing: border-box; } - -h1 { - font-size: 2rem; - font-weight: 700; - margin: 1.275em 0 0.6em; } - -h2 { - font-size: 1.75rem; - font-weight: 700; - margin: 1.275em 0 0.3em; } - -h3 { - font-size: 1.5rem; - font-weight: 700; - margin: 1em 0 0.3em; } - -h4 { - font-size: 1.25rem; - font-weight: 700; - margin: 1.275em 0 0.85em; } - -h5 { - font-size: 1rem; - font-weight: 700; - margin: 1.275em 0 0.85em; } - -h6 { - font-size: 1rem; - font-weight: 700; - margin: 1.275em 0 0.85em; - color: #777; } - -p { - margin: 0 0 1em; } - -ul, ol { - padding: 0 0 0 2em; - margin: 0 0 0.85em; } - -blockquote { - margin: 0 0 0.85em; - padding: 0 15px; - color: #858585; - border-left: 4px solid #e5e5e5; } - -img { - max-width: 100%; } - -a { - color: #4183c4; - text-decoration: none; } - a:hover, a:focus { - outline: 0; - text-decoration: underline; } - -table { - background: #fff; - width: 100%; - border-collapse: collapse; - border-spacing: 0; - overflow: auto; - margin: 0 0 0.85em; } - -tr:nth-child(2n) { - background-color: #fbfbfb; } - -th, td { - padding: 6px 13px; - border: 1px solid #ddd; } - -pre { - margin: 0 0 1.275em; - padding: .85em 1em; - overflow: auto; - background: #f7f7f7; - font-size: .85em; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } - -code { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } - -p > code, li > code { - background: #f7f7f7; - padding: .2em; } - p > code:before, p > code:after, li > code:before, li > code:after { - letter-spacing: -.2em; - content: "\00a0"; } - -pre code { - padding: 0; - white-space: pre; } - -.content-wrapper { - display: flex; - flex-direction: column; } - @media (min-width: 768px) { - .content-wrapper { - flex-direction: row; } } - -.header { - display: flex; - padding: 8px; - font-size: 0.875em; - background: #444; - color: #999; } - -.header-col { - margin: 0; - padding: 0 8px; } - -.header-col--primary { - flex: 1; } - -.header-link { - color: #fff; } - -.header-icon { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - -.breadcrumbs { - font-size: 0.875em; - padding: 8px 16px; - margin: 0; - background: #fbfbfb; - border-bottom: 1px solid #ddd; } - -.carat { - height: 10px; - margin: 0 5px; } - -.navigation { - order: 2; } - @media (min-width: 768px) { - .navigation { - order: 1; - width: 25%; - max-width: 300px; - padding-bottom: 64px; - overflow: hidden; - word-wrap: normal; - background: #fbfbfb; - border-right: 1px solid #ddd; } } - -.nav-groups { - list-style-type: none; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #ddd; - padding: 8px 0 8px 16px; } - -.nav-group-name-link { - color: #333; } - -.nav-group-tasks { - margin: 8px 0; - padding: 0 0 0 8px; } - -.nav-group-task { - font-size: 1em; - list-style-type: none; - white-space: nowrap; } - -.nav-group-task-link { - color: #808080; } - -.main-content { - order: 1; } - @media (min-width: 768px) { - .main-content { - order: 2; - flex: 1; - padding-bottom: 60px; } } - -.section { - padding: 0 32px; - border-bottom: 1px solid #ddd; } - -.section-content { - max-width: 834px; - margin: 0 auto; - padding: 16px 0; } - -.section-name { - color: #666; - display: block; } - -.declaration .highlight { - overflow-x: initial; - padding: 8px 0; - margin: 0; - background-color: transparent; - border: none; } - -.task-group-section { - border-top: 1px solid #ddd; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; } - -.item-container { - padding: 0; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; } - .item .token { - padding-left: 3px; - margin-left: 0px; - font-size: 1rem; } - .item .declaration-note { - font-size: .85em; - color: #808080; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #ddd; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - left: 21px; - top: 7px; - display: block; - position: absolute; - width: 12px; - height: 12px; - border-left: 1px solid #ddd; - border-top: 1px solid #ddd; - background: #fff; - transform: rotate(45deg); } - -.height-container { - display: none; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #fff; - border: 1px solid #ddd; - border-top-width: 0; - padding-top: 10px; - padding-bottom: 5px; - padding: 8px 16px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4183c4; } - -.aside-warning { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #ddd; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -.footer { - padding: 8px 16px; - background: #444; - color: #ddd; - font-size: 0.8em; } - .footer p { - margin: 8px 0; } - .footer a { - color: #fff; } - -html.dash .header, html.dash .breadcrumbs, html.dash .navigation { - display: none; } -html.dash .height-container { - display: block; } - -form[role=search] input { - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 24px; - padding: 0 10px; - margin: 0; - border: none; - border-radius: 1em; } - .loading form[role=search] input { - background: white url(../img/spinner.gif) center right 4px no-repeat; } -form[role=search] .tt-menu { - margin: 0; - min-width: 300px; - background: #fbfbfb; - color: #333; - border: 1px solid #ddd; } -form[role=search] .tt-highlight { - font-weight: bold; } -form[role=search] .tt-suggestion { - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 0 8px; } - form[role=search] .tt-suggestion span { - display: table-cell; - white-space: nowrap; } - form[role=search] .tt-suggestion .doc-parent-name { - width: 100%; - text-align: right; - font-weight: normal; - font-size: 0.9em; - padding-left: 16px; } -form[role=search] .tt-suggestion:hover, -form[role=search] .tt-suggestion.tt-cursor { - cursor: pointer; - background-color: #4183c4; - color: #fff; } -form[role=search] .tt-suggestion:hover .doc-parent-name, -form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { - color: #fff; } diff --git a/docs/docsets/.docset/Contents/Info.plist b/docs/docsets/.docset/Contents/Info.plist deleted file mode 100644 index 61863ec..0000000 --- a/docs/docsets/.docset/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleIdentifier - com.jazzy. - CFBundleName - - DocSetPlatformFamily - - isDashDocset - - dashIndexFilePath - index.html - isJavaScriptEnabled - - DashDocSetFamily - dashtoc - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html deleted file mode 100644 index 1deb749..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - Classes Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Classes

-

The following classes are available globally.

- -
-
- -
-
-
- -
-
- -
-
- -
-
-
    -
  • -
    - - - - Info - -
    -
    -
    -
    -
    -
    -

    Info metric

    - -

    Info tracks key-value information, usually about a whole target

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class Info<Labels> : Metric, PrometheusHandled where Labels : MetricLabels
    - -
    -
    - -
    -
    -
  • -
-
-
- -
-
- -
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Counter.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Counter.html deleted file mode 100644 index 1dc77db..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Counter.html +++ /dev/null @@ -1,443 +0,0 @@ - - - - Counter Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Counter

-
-
-
public class Counter<NumType, Labels> : Metric, PrometheusHandled where NumType : Numeric, Labels : MetricLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#counter

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Counter, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Counter, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ amount: NumType = 1, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to increment the counter with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - get(_:) - -
    -
    -
    -
    -
    -
    -

    Gets the value of the Counter

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func get(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to get the value for

    -
    -
    -
    -
    -

    Return Value

    -

    The value of the Counter attached to the provided labels

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Gauge.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Gauge.html deleted file mode 100644 index a4d6f9c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Gauge.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - Gauge Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Gauge

-
-
-
public class Gauge<NumType, Labels> : Metric, PrometheusHandled where NumType : Numeric, Labels : MetricLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#gauge

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Gauge, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Gauge, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - set(_:_:) - -
    -
    -
    -
    -
    -
    -

    Sets the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func set(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to set the gauge to

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to increment the Gauge with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - inc(_:) - -
    -
    -
    -
    -
    -
    -

    Increments the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func inc(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - dec(_:_:) - -
    -
    -
    -
    -
    -
    -

    Decrements the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func dec(_ amount: NumType, _ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - amount - - -
    -

    Amount to decrement the Gauge with

    -
    -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - dec(_:) - -
    -
    -
    -
    -
    -
    -

    Decrements the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    @discardableResult
    -public func dec(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to attach to the value

    -
    -
    -
    -
    -

    Return Value

    -

    The new value

    -
    - -
    -
    -
  • -
  • -
    - - - - get(_:) - -
    -
    -
    -
    -
    -
    -

    Gets the value of the Gauge

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func get(_ labels: Labels? = nil) -> NumType
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to get the value for

    -
    -
    -
    -
    -

    Return Value

    -

    The value of the Gauge attached to the provided labels

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Histogram.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Histogram.html deleted file mode 100644 index 3820152..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Histogram.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - Histogram Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Histogram

-
-
-
public class Histogram<NumType, Labels> : Metric, PrometheusHandled where NumType : DoubleRepresentable, Labels : HistogramLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#Histogram

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of this Histogram, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of this Histogram, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Histogram

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - observe(_:_:) - -
    -
    -
    -
    -
    -
    -

    Observe a value

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func observe(_ value: NumType, _ labels: Labels? = nil)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - value - - -
    -

    Value to observe

    -
    -
    - - labels - - -
    -

    Labels to attach to the observed value

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Info.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Info.html deleted file mode 100644 index d51cd30..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Info.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - Info Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Info

-
-
-
public class Info<Labels> : Metric, PrometheusHandled where Labels : MetricLabels
- -
-
-

Info metric

- -

Info tracks key-value information, usually about a whole target

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of the Info, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of the Info, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - info(_:) - -
    -
    -
    -
    -
    -
    -

    Set the info

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func info(_ labels: Labels)
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - labels - - -
    -

    Labels to set the Info to

    -
    -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Info

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Prometheus.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Prometheus.html deleted file mode 100644 index 04c5d29..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Prometheus.html +++ /dev/null @@ -1,1194 +0,0 @@ - - - - Prometheus Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Prometheus

-
-
-
public class Prometheus
- -
-
-

Prometheus class

- -

See https://prometheus.io/docs/introduction/overview/

- -
-
- -
-
-
-
    -
  • -
    - - - - shared - -
    -
    -
    -
    -
    -
    -

    Singleton instance

    - -

    Use this to create Metric trackers and retrieve your data, -so you don’t have to keep track of an instance.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public static let shared: Prometheus
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetrics() - -
    -
    -
    -
    -
    -
    -

    Creates prometheus formatted metrics

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetrics() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated string with metrics for all Metric Trackers of this Prometheus instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a counter with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createCounter<T: Numeric, U: MetricLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0,
    -    withLabelType labelType: U.Type) -> Counter<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the counter will count

    -
    -
    - - name - - -
    -

    Name of the counter

    -
    -
    - - helpText - - -
    -

    Help text for the counter. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the counter to, defaults to 0

    -
    -
    - - labelType - - -
    -

    Type of labels this counter can use. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Counter instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a counter with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createCounter<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0) -> Counter<T, EmptyLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the counter will count

    -
    -
    - - name - - -
    -

    Name of the counter

    -
    -
    - - helpText - - -
    -

    Help text for the counter. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the counter to, defaults to 0

    -
    -
    -
    -
    -

    Return Value

    -

    Counter instance

    -
    - -
    -
    -
  • -
-
-
-
- - - -

Gauge

-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Creates a gauge with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createGauge<T: Numeric, U: MetricLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0,
    -    withLabelType labelType: U.Type) -> Gauge<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the gauge will hold

    -
    -
    - - name - - -
    -

    Name of the gauge

    -
    -
    - - helpText - - -
    -

    Help text for the gauge. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the gauge to, defaults to 0

    -
    -
    - - labelType - - -
    -

    Type of labels this gauge can use. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Gauge instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a gauge with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createGauge<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    initialValue: T = 0) -> Gauge<T, EmptyLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    Type the gauge will count

    -
    -
    - - name - - -
    -

    Name of the gauge

    -
    -
    - - helpText - - -
    -

    Help text for the gauge. Usually a short description

    -
    -
    - - initialValue - - -
    -

    An initial value to set the gauge to, defaults to 0

    -
    -
    -
    -
    -

    Return Value

    -

    Gauge instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a histogram with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createHistogram<T: Numeric, U: HistogramLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    buckets: [Double] = defaultBuckets,
    -    labels: U.Type) -> Histogram<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the histogram will observe

    -
    -
    - - name - - -
    -

    Name of the histogram

    -
    -
    - - helpText - - -
    -

    Help text for the histogram. Usually a short description

    -
    -
    - - buckets - - -
    -

    Buckets to divide values over

    -
    -
    - - labels - - -
    -

    Labels to give this histogram. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Histogram instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a histogram with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createHistogram<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    buckets: [Double] = defaultBuckets) -> Histogram<T, EmptyHistogramLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the histogram will observe

    -
    -
    - - name - - -
    -

    Name of the histogram

    -
    -
    - - helpText - - -
    -

    Help text for the histogram. Usually a short description

    -
    -
    - - buckets - - -
    -

    Buckets to divide values over

    -
    -
    -
    -
    -

    Return Value

    -

    Histogram instance

    -
    - -
    -
    -
  • -
-
-
- -
    -
  • - -
    -
    -
    -
    -
    -

    Creates a summary with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createSummary<T: Numeric, U: SummaryLabels>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    quantiles: [Double] = defaultQuantiles,
    -    labels: U.Type) -> Summary<T, U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the summary will observe

    -
    -
    - - name - - -
    -

    Name of the summary

    -
    -
    - - helpText - - -
    -

    Help text for the summary. Usually a short description

    -
    -
    - - quantiles - - -
    -

    Quantiles to caluculate

    -
    -
    - - labels - - -
    -

    Labels to give this summary. Can be left out to default to no labels

    -
    -
    -
    -
    -

    Return Value

    -

    Summary instance

    -
    - -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Creates a summary with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createSummary<T: Numeric>(
    -    forType type: T.Type,
    -    named name: String,
    -    helpText: String? = nil,
    -    quantiles: [Double] = defaultQuantiles) -> Summary<T, EmptySummaryLabels>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - - - - - -
    - - type - - -
    -

    The type the summary will observe

    -
    -
    - - name - - -
    -

    Name of the summary

    -
    -
    - - helpText - - -
    -

    Help text for the summary. Usually a short description

    -
    -
    - - quantiles - - -
    -

    Quantiles to caluculate

    -
    -
    -
    -
    -

    Return Value

    -

    Summary instance

    -
    - -
    -
    -
  • -
-
-
-
- - - -

Info

-
-
-
    -
  • - -
    -
    -
    -
    -
    -

    Creates an Info metric with the given values

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func createInfo<U: MetricLabels>(
    -    named name: String,
    -    helpText: String? = nil,
    -    labelType: U.Type) -> Info<U>
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - name - - -
    -

    Name of the info

    -
    -
    - - helpText - - -
    -

    Help text for the info. Usually a short description

    -
    -
    - - labelType - - -
    -

    Type of labels this Info can use

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Summary.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Summary.html deleted file mode 100644 index 142e4d0..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Summary.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - Summary Class Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Summary

-
-
-
public class Summary<NumType, Labels> : Metric, PrometheusHandled where NumType : DoubleRepresentable, Labels : SummaryLabels
- -
-
-

Prometheus Counter metric

- -

See https://prometheus.io/docs/concepts/metric_types/#summary

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    -

    Name of this Summary, required

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let name: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    -

    Help text of this Summary, optional

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let help: String?
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    -

    Type of the metric, used for formatting

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public let _type: MetricType
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    -

    Gets the metric string for this Summary

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func getMetric() -> String
    - -
    -
    -
    -

    Return Value

    -

    Newline seperated Prometheus formatted metric string

    -
    - -
    -
    -
  • -
  • -
    - - - - observe(_:_:) - -
    -
    -
    -
    -
    -
    -

    Observe a value

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func observe(_ value: NumType, _ labels: Labels? = nil)
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - value - - -
    -

    Value to observe

    -
    -
    - - labels - - -
    -

    Labels to attach to the observed value

    -
    -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums.html deleted file mode 100644 index 1ead040..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - Enumerations Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Enumerations

-

The following enumerations are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - MetricType - -
    -
    -
    -
    -
    -
    -

    Different types of metrics supported by SwiftPrometheus

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum MetricType : String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums/MetricType.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums/MetricType.html deleted file mode 100644 index 3410057..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums/MetricType.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - MetricType Enumeration Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

MetricType

-
-
-
public enum MetricType : String
- -
-
-

Different types of metrics supported by SwiftPrometheus

- -
-
- -
-
-
-
    -
  • -
    - - - - counter - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case counter
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - gauge - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case gauge
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - histogram - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case histogram
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - summary - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case summary
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - info - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case info
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html deleted file mode 100644 index 5995288..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - Extensions Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Extensions

-

The following extensions are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - FixedWidthInteger - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    protocol FixedWidthInteger : BinaryInteger, LosslessStringConvertible, _BitwiseOperations where Self.Magnitude : FixedWidthInteger, Self.Magnitude : UnsignedInteger, Self.Stride : FixedWidthInteger, Self.Stride : SignedInteger
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - Double - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct Double
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - CGFloat - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct CGFloat
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - Float - -
    -
    -
    -
    -
    -
    -

    Double Representable Conformance

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    struct Float
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CGFloat.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CGFloat.html deleted file mode 100644 index 004b6c5..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CGFloat.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - CGFloat Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

CGFloat

-
-
-
struct CGFloat
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Double.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Double.html deleted file mode 100644 index c09bf1f..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Double.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - Double Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Double

-
-
-
struct Double
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/FixedWidthInteger.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/FixedWidthInteger.html deleted file mode 100644 index 0ea1638..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/FixedWidthInteger.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - FixedWidthInteger Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

FixedWidthInteger

-
-
-
protocol FixedWidthInteger : BinaryInteger, LosslessStringConvertible, _BitwiseOperations where Self.Magnitude : FixedWidthInteger, Self.Magnitude : UnsignedInteger, Self.Stride : FixedWidthInteger, Self.Stride : SignedInteger
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Float.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Float.html deleted file mode 100644 index 9e10b1c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Float.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - Float Extension Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Float

-
-
-
struct Float
- -
-
-

Double Representable Conformance

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Functions.html b/docs/docsets/.docset/Contents/Resources/Documents/Functions.html deleted file mode 100644 index 1551230..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Functions.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - Functions Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Functions

-

The following functions are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - encodeLabels(_:_:) - -
    -
    -
    -
    -
    -
    -

    Creates a Prometheus String representation of a MetricLabels instance

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func encodeLabels<Labels: MetricLabels>(_ labels: Labels, _ excludingKeys: [String] = []) -> String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html b/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html deleted file mode 100644 index 6cfa85f..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Global Variables.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - Global Variables Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Global Variables

-

The following global variables are available globally.

- -
-
- -
-
-
-
    -
  • -
    - - - - defaultBuckets - -
    -
    -
    -
    -
    -
    -

    Default buckets used by Histograms

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var defaultBuckets: [Double]
    - -
    -
    - -
    -
    -
  • -
-
-
-
    -
  • -
    - - - - defaultQuantiles - -
    -
    -
    -
    -
    -
    -

    Default quantiles used by Summaries

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var defaultQuantiles: [Double]
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html deleted file mode 100644 index 9ddc6a0..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - Protocols Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Protocols

-

The following protocols are available globally.

- -
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/ConvertibleNumberType.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/ConvertibleNumberType.html deleted file mode 100644 index aa0c407..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/ConvertibleNumberType.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - ConvertibleNumberType Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

ConvertibleNumberType

-
-
-
public protocol ConvertibleNumberType : DoubleRepresentable
- -
-
-

Numbers that convert to other types

- -
-
- -
-
-
-
    -
  • -
    - - - - floatValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var floatValue: Float { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - intValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var intValue: Int { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - CGFloatValue - - - Extension method - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var CGFloatValue: CGFloat { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/DoubleRepresentable.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/DoubleRepresentable.html deleted file mode 100644 index 585b08c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/DoubleRepresentable.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - DoubleRepresentable Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

DoubleRepresentable

-
-
-
public protocol DoubleRepresentable : Numeric
- -
-
-

Numbers that can be represented as Double instances

- -
-
- -
-
-
-
    -
  • -
    - - - - doubleValue - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var doubleValue: Double { get }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/HistogramLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/HistogramLabels.html deleted file mode 100644 index 573e7c1..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/HistogramLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - HistogramLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

HistogramLabels

-
-
-
public protocol HistogramLabels : MetricLabels
- -
-
-

Label type Histograms can use

- -
-
- -
-
-
-
    -
  • -
    - - - - le - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var le: String { get set }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Metric.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Metric.html deleted file mode 100644 index 78efd53..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Metric.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - Metric Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Metric

-
-
-
public protocol Metric
- -
-
-

Metric protocol

- -

See https://prometheus.io/docs/concepts/metric_types/

- -
-
- -
-
-
-
    -
  • -
    - - - - name - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var name: String { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - help - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var help: String? { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - _type - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var _type: MetricType { get }
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - getMetric() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    func getMetric() -> String
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/MetricLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/MetricLabels.html deleted file mode 100644 index 1538237..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/MetricLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - MetricLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

MetricLabels

-
-
-
public protocol MetricLabels : Decodable, Encodable, Hashable
- -
-
-

Base MetricLabels protocol

- -
-
- -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/SummaryLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/SummaryLabels.html deleted file mode 100644 index 73ff920..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/SummaryLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - SummaryLabels Protocol Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

SummaryLabels

-
-
-
public protocol SummaryLabels : MetricLabels
- -
-
-

Label type Summaries can use

- -
-
- -
-
-
-
    -
  • -
    - - - - quantile - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    var quantile: String { get set }
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs.html deleted file mode 100644 index c02fa62..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - Structures Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

Structures

-

The following structures are available globally.

- -
-
- -
-
-
- -
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyHistogramLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyHistogramLabels.html deleted file mode 100644 index be7ac9b..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyHistogramLabels.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - EmptyHistogramLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptyHistogramLabels

-
-
-
public struct EmptyHistogramLabels : HistogramLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - le - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var le: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyLabels.html deleted file mode 100644 index 28464e8..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptyLabels.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - EmptyLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptyLabels

-
-
-
public struct EmptyLabels : MetricLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptySummaryLabels.html b/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptySummaryLabels.html deleted file mode 100644 index 21b4d8b..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Structs/EmptySummaryLabels.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - EmptySummaryLabels Structure Reference - - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
-

EmptySummaryLabels

-
-
-
public struct EmptySummaryLabels : SummaryLabels
- -
-
-

Empty labels class

- -
-
- -
-
-
-
    -
  • -
    - - - - quantile - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public var quantile: String
    - -
    -
    - -
    -
    -
  • -
  • -
    - - - - init() - -
    -
    -
    -
    -
    -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init()
    - -
    -
    - -
    -
    -
  • -
-
-
-
- -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css deleted file mode 100644 index c83db5b..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css +++ /dev/null @@ -1,368 +0,0 @@ -*, *:before, *:after { - box-sizing: inherit; } - -body { - margin: 0; - background: #fff; - color: #333; - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - letter-spacing: .2px; - -webkit-font-smoothing: antialiased; - box-sizing: border-box; } - -h1 { - font-size: 2rem; - font-weight: 700; - margin: 1.275em 0 0.6em; } - -h2 { - font-size: 1.75rem; - font-weight: 700; - margin: 1.275em 0 0.3em; } - -h3 { - font-size: 1.5rem; - font-weight: 700; - margin: 1em 0 0.3em; } - -h4 { - font-size: 1.25rem; - font-weight: 700; - margin: 1.275em 0 0.85em; } - -h5 { - font-size: 1rem; - font-weight: 700; - margin: 1.275em 0 0.85em; } - -h6 { - font-size: 1rem; - font-weight: 700; - margin: 1.275em 0 0.85em; - color: #777; } - -p { - margin: 0 0 1em; } - -ul, ol { - padding: 0 0 0 2em; - margin: 0 0 0.85em; } - -blockquote { - margin: 0 0 0.85em; - padding: 0 15px; - color: #858585; - border-left: 4px solid #e5e5e5; } - -img { - max-width: 100%; } - -a { - color: #4183c4; - text-decoration: none; } - a:hover, a:focus { - outline: 0; - text-decoration: underline; } - -table { - background: #fff; - width: 100%; - border-collapse: collapse; - border-spacing: 0; - overflow: auto; - margin: 0 0 0.85em; } - -tr:nth-child(2n) { - background-color: #fbfbfb; } - -th, td { - padding: 6px 13px; - border: 1px solid #ddd; } - -pre { - margin: 0 0 1.275em; - padding: .85em 1em; - overflow: auto; - background: #f7f7f7; - font-size: .85em; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } - -code { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } - -p > code, li > code { - background: #f7f7f7; - padding: .2em; } - p > code:before, p > code:after, li > code:before, li > code:after { - letter-spacing: -.2em; - content: "\00a0"; } - -pre code { - padding: 0; - white-space: pre; } - -.content-wrapper { - display: flex; - flex-direction: column; } - @media (min-width: 768px) { - .content-wrapper { - flex-direction: row; } } - -.header { - display: flex; - padding: 8px; - font-size: 0.875em; - background: #444; - color: #999; } - -.header-col { - margin: 0; - padding: 0 8px; } - -.header-col--primary { - flex: 1; } - -.header-link { - color: #fff; } - -.header-icon { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - -.breadcrumbs { - font-size: 0.875em; - padding: 8px 16px; - margin: 0; - background: #fbfbfb; - border-bottom: 1px solid #ddd; } - -.carat { - height: 10px; - margin: 0 5px; } - -.navigation { - order: 2; } - @media (min-width: 768px) { - .navigation { - order: 1; - width: 25%; - max-width: 300px; - padding-bottom: 64px; - overflow: hidden; - word-wrap: normal; - background: #fbfbfb; - border-right: 1px solid #ddd; } } - -.nav-groups { - list-style-type: none; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #ddd; - padding: 8px 0 8px 16px; } - -.nav-group-name-link { - color: #333; } - -.nav-group-tasks { - margin: 8px 0; - padding: 0 0 0 8px; } - -.nav-group-task { - font-size: 1em; - list-style-type: none; - white-space: nowrap; } - -.nav-group-task-link { - color: #808080; } - -.main-content { - order: 1; } - @media (min-width: 768px) { - .main-content { - order: 2; - flex: 1; - padding-bottom: 60px; } } - -.section { - padding: 0 32px; - border-bottom: 1px solid #ddd; } - -.section-content { - max-width: 834px; - margin: 0 auto; - padding: 16px 0; } - -.section-name { - color: #666; - display: block; } - -.declaration .highlight { - overflow-x: initial; - padding: 8px 0; - margin: 0; - background-color: transparent; - border: none; } - -.task-group-section { - border-top: 1px solid #ddd; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; } - -.item-container { - padding: 0; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; } - .item .token { - padding-left: 3px; - margin-left: 0px; - font-size: 1rem; } - .item .declaration-note { - font-size: .85em; - color: #808080; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #ddd; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - left: 21px; - top: 7px; - display: block; - position: absolute; - width: 12px; - height: 12px; - border-left: 1px solid #ddd; - border-top: 1px solid #ddd; - background: #fff; - transform: rotate(45deg); } - -.height-container { - display: none; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #fff; - border: 1px solid #ddd; - border-top-width: 0; - padding-top: 10px; - padding-bottom: 5px; - padding: 8px 16px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4183c4; } - -.aside-warning { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #ddd; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -.footer { - padding: 8px 16px; - background: #444; - color: #ddd; - font-size: 0.8em; } - .footer p { - margin: 8px 0; } - .footer a { - color: #fff; } - -html.dash .header, html.dash .breadcrumbs, html.dash .navigation { - display: none; } -html.dash .height-container { - display: block; } - -form[role=search] input { - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 24px; - padding: 0 10px; - margin: 0; - border: none; - border-radius: 1em; } - .loading form[role=search] input { - background: white url(../img/spinner.gif) center right 4px no-repeat; } -form[role=search] .tt-menu { - margin: 0; - min-width: 300px; - background: #fbfbfb; - color: #333; - border: 1px solid #ddd; } -form[role=search] .tt-highlight { - font-weight: bold; } -form[role=search] .tt-suggestion { - font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 0 8px; } - form[role=search] .tt-suggestion span { - display: table-cell; - white-space: nowrap; } - form[role=search] .tt-suggestion .doc-parent-name { - width: 100%; - text-align: right; - font-weight: normal; - font-size: 0.9em; - padding-left: 16px; } -form[role=search] .tt-suggestion:hover, -form[role=search] .tt-suggestion.tt-cursor { - cursor: pointer; - background-color: #4183c4; - color: #fff; } -form[role=search] .tt-suggestion:hover .doc-parent-name, -form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { - color: #fff; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png deleted file mode 100755 index 29d2f7f..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png deleted file mode 100755 index 6f694c7..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png deleted file mode 100755 index 628da97..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/spinner.gif b/docs/docsets/.docset/Contents/Resources/Documents/img/spinner.gif deleted file mode 100644 index e3038d0..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/spinner.gif and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/index.html b/docs/docsets/.docset/Contents/Resources/Documents/index.html deleted file mode 100644 index c5470d3..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/index.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - Reference - - - - - - - - - - - - - - - -
-

- - Docs - - (72% documented) -

- -

-

- -
-

- -

- - - View on GitHub - -

- -

- - - Install in Dash - -

-
- - - -
- -
- -
-
- -

Build Status Swift 4.2

-

SwiftPrometheus, Prometheus client for Swift

- -

A prometheus client for Swift supporting counters, gauges, histograms, summaries and info.

-

Usage

- -

For examples, see main.swift

-

Counter

- -

Counters go up, and reset when the process restarts.

-
let counter = Prometheus.shared.createCounter(forType: Int.self, named: "my_counter")
-counter.inc() // Increment by 1
-counter.inc(12) // Increment by given value 
-
-

Gauge

- -

Gauges can go up and down

-
let gauge = Prometheus.shared.createGauge(forType: Int.self, named: "my_gauge")
-gauge.inc() // Increment by 1
-gauge.dec(19) // Decrement by given value
-gauge.set(12) // Set to a given value
-
-

Histogram

- -

Histograms track the size and number of events in buckets. This allows for aggregatable calculation of quantiles.

-
let histogram = Prometheus.shared.createHistogram(forType: Double.self, named: "my_histogram")
-histogram.observe(4.7) // Observe the given value
-
-

Summary

- -

Summaries track the size and number of events

-
let summary = Prometheus.shared.createSummary(forType: Double.self, named: "my_summary")
-summary.observe(4.7) // Observe the given value
-
-

Info

- -

Info tracks key-value information, usually about a whole target.

-
struct MyInfoStruct: MetricLabels {
-   let value: String
-
-   init() {
-       self.value = "abc"
-   }
-
-   init(_ v: String) {
-       self.value = v
-   }
-}
-
-let info = Prometheus.shared.createInfo(named: "my_info", helpText: "Just some info", labelType: MyInfoStruct.self)
-
-info.info(MyInfoStruct("def"))
-
-

Labels

- -

All metric types support adding labels, allowing for grouping of related metrics.

- -

Example with a counter:

-
struct RouteLabels: MetricLabels {
-   var route: String = "*"
-}
-
-let counter = Prometheus.shared.createCounter(forType: Int.self, named: "my_counter", helpText: "Just a counter", withLabelType: RouteLabels.self)
-
-counter.inc(12, .init(route: "/"))
-
-

Exporting

- -

To keep SwiftPrometheus as clean and leight weitght as possible, there is no way of exporting metrics to Prometheus. All you can do is get a formatted string that Prometheus can use, so you can integrate it in your own Serverside Swift application

- -

This could look something like this:

-
router.get("/metrics") { request -> String in
-    return Prometheus.shared.getMetrics()
-}
-
- -

Here, I used Vapor syntax, but this will work with any web framework, since it’s just returning a plain String.

-

Contributing

- -

All contributions are most welcome!

- -

If you think of some crazy cool new feature that should be included, please create an issue. Or, if you want to implement it yourself, fork this repo and submit a PR!

- -

If you find a bug or have issues, please create an issue explaining your problems. Please include as much information as possible, so it’s easier for me to reproduce (Framework, OS, Swift version, terminal output, etc.)

- -
-
- - -
-
- - - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js deleted file mode 100755 index 009c80d..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js +++ /dev/null @@ -1,43 +0,0 @@ -window.jazzy = {'docset': false} -if (typeof window.dash != 'undefined') { - document.documentElement.className += ' dash' - window.jazzy.docset = true -} -if (navigator.userAgent.match(/xcode/i)) { - document.documentElement.className += ' xcode' - window.jazzy.docset = true -} - -// On doc load, toggle the URL hash discussion if present -$(document).ready(function() { - if (!window.jazzy.docset) { - var linkToHash = $('a[href="' + window.location.hash +'"]'); - linkToHash.trigger("click"); - } -}); - -// On token click, toggle its discussion and animate token.marginLeft -$(".token").click(function(event) { - if (window.jazzy.docset) { - return; - } - var link = $(this); - var animationDuration = 300; - $content = link.parent().parent().next(); - $content.slideToggle(animationDuration); - - // Keeps the document from jumping to the hash. - var href = $(this).attr('href'); - if (history.pushState) { - history.pushState({}, '', href); - } else { - location.hash = href; - } - event.preventDefault(); -}); - -// Dumb down quotes within code blocks that delimit strings instead of quotations -// https://github.com/realm/jazzy/issues/714 -$("code q").replaceWith(function () { - return ["\"", $(this).contents(), "\""]; -}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js deleted file mode 100644 index 54be83c..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js +++ /dev/null @@ -1,62 +0,0 @@ -$(function(){ - var searchIndex = lunr(function() { - this.ref('url'); - this.field('name'); - }); - - var $typeahead = $('[data-typeahead]'); - var $form = $typeahead.parents('form'); - var searchURL = $form.attr('action'); - - function displayTemplate(result) { - return result.name; - } - - function suggestionTemplate(result) { - var t = '
'; - t += '' + result.name + ''; - if (result.parent_name) { - t += '' + result.parent_name + ''; - } - t += '
'; - return t; - } - - $typeahead.one('focus', function() { - $form.addClass('loading'); - - $.getJSON(searchURL).then(function(searchData) { - $.each(searchData, function (url, doc) { - searchIndex.add({url: url, name: doc.name}); - }); - - $typeahead.typeahead( - { - highlight: true, - minLength: 3 - }, - { - limit: 10, - display: displayTemplate, - templates: { suggestion: suggestionTemplate }, - source: function(query, sync) { - var results = searchIndex.search(query).map(function(result) { - var doc = searchData[result.ref]; - doc.url = result.ref; - return doc; - }); - sync(results); - } - } - ); - $form.removeClass('loading'); - $typeahead.trigger('focus'); - }); - }); - - var baseURL = searchURL.slice(0, -"search.json".length); - - $typeahead.on('typeahead:select', function(e, result) { - window.location = baseURL + result.url; - }); -}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js deleted file mode 100755 index ab28a24..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; -if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("