Skip to content

Add Benchmarks for metrics #106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Benchmarks/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.DS_Store
/.build
/Packages
xcuserdata/
DerivedData/
.swiftpm/configuration/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc
.benchmarkBaselines/
64 changes: 64 additions & 0 deletions Benchmarks/Benchmarks/PrometheusBenchmarks/Benchmarks.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import Benchmark
import Prometheus

let registry = PrometheusCollectorRegistry()

public func makeLabels(_ idx: Int) -> [(String, String)] {
[
("job", "api_server_\(idx)"),
("handler", "/api/handler_\(idx)"),
("status_code", "200"),
("version", "\(idx).0.0"),
]
}

let benchmarks = {
Benchmark.defaultConfiguration.maxDuration = .seconds(5)
Benchmark.defaultConfiguration.scalingFactor = .kilo
// Benchmark.defaultConfiguration.metrics = [.wallClock, .throughput, .mallocCountTotal]
Benchmark.defaultConfiguration.metrics = [.mallocCountTotal]

Benchmark("Counter #1") { benchmark in
runCounterBench(benchmark.scaledIterations)
}

Benchmark("Counter #2") { benchmark, run in
for _ in benchmark.scaledIterations {
run()
}
} setup: {
setupCounterBench()
}

Benchmark("Gauge") { benchmark in
runGaugeBench(benchmark.scaledIterations)
}

Benchmark("DurationHistogram") { benchmark in
runDurationHistogramBench(benchmark.scaledIterations)
}

Benchmark("RegistryEmit - 5000 metrics",
configuration: .init(scalingFactor: .one)) { benchmark, run in
for _ in benchmark.scaledIterations {
run()
}
} setup: {
setupRegistryExport(numberOfMetrics: 5000)
}
}
31 changes: 31 additions & 0 deletions Benchmarks/Benchmarks/PrometheusBenchmarks/Counter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import Benchmark
import Prometheus

public func runCounterBench(_ iterations: Range<Int>) {
let ctr = registry.makeCounter(name: "counter_1", labels: makeLabels(1))
for _ in iterations {
blackHole(ctr.increment())
}
}

public func setupCounterBench() -> () -> Void {
let ctr = registry.makeCounter(name: "counter_2", labels: makeLabels(2))
return {
blackHole(ctr.increment())
}
}
30 changes: 30 additions & 0 deletions Benchmarks/Benchmarks/PrometheusBenchmarks/DurationHistogram.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import Benchmark
import Prometheus

public func runDurationHistogramBench(_ iterations: Range<Int>) {
let histogram = registry.makeDurationHistogram(name: "histogram_1", labels: makeLabels(3),
buckets: [
.milliseconds(100),
.milliseconds(250),
.milliseconds(500),
.seconds(1),
])
for _ in iterations {
blackHole(histogram.record(Duration.milliseconds(400)))
}
}
31 changes: 31 additions & 0 deletions Benchmarks/Benchmarks/PrometheusBenchmarks/Gauge.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import Benchmark
import Prometheus

public func runGaugeBench(_ iterations: Range<Int>) {
let gauge = registry.makeGauge(name: "gauge_1", labels: makeLabels(2))
for _ in iterations {
blackHole(gauge.increment())
}
}

public func setupGaugeBench() -> () -> Void {
let gauge = registry.makeGauge(name: "gauge_1", labels: makeLabels(2))
return {
blackHole(gauge.increment())
}
}
43 changes: 43 additions & 0 deletions Benchmarks/Benchmarks/PrometheusBenchmarks/RegistryEmit.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import Benchmark
import Prometheus

public func setupRegistryExport(numberOfMetrics: Int) -> () -> Void {
let registryExport = PrometheusCollectorRegistry()

var counterArray = [Counter]()
var gaugeArray = [Gauge]()
var buffer = [UInt8]()

let counterExportSize = 620_000
counterArray.reserveCapacity(numberOfMetrics)
gaugeArray.reserveCapacity(numberOfMetrics)
buffer.reserveCapacity(counterExportSize)

for i in 0..<(numberOfMetrics / 2) {
let counter = registryExport.makeCounter(name: "http_requests_total", labels: makeLabels(i))
counter.increment()
counterArray.append(counter)

let gauge = registryExport.makeGauge(name: "export_gauge_\(i)", labels: makeLabels(i))
gauge.increment()
gaugeArray.append(gauge)
}
return {
blackHole(registryExport.emit(into: &buffer))
}
}
113 changes: 113 additions & 0 deletions Benchmarks/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions Benchmarks/Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// swift-tools-version:5.7
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftPrometheus open source project
//
// Copyright (c) 2018-2023 SwiftPrometheus project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftPrometheus project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

import PackageDescription

let package = Package(
name: "benchmarks",
platforms: [
.macOS(.v13),
],
dependencies: [
.package(path: "../"),
.package(url: "https://github.com/ordo-one/package-benchmark.git", from: "1.11.2"),
],
targets: [
.executableTarget(
name: "PrometheusBenchmarks",
dependencies: [
.product(name: "Benchmark", package: "package-benchmark"),
.product(name: "Prometheus", package: "swift-prometheus"),
],
path: "Benchmarks/PrometheusBenchmarks",
plugins: [
.plugin(name: "BenchmarkPlugin", package: "package-benchmark"),
]
),
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 2
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"mallocCountTotal" : 1
}
Loading