tigerbeetle 0.0.34 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- data/ext/tb_client/pkg.tar.gz +0 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
//! Runs a set of macro-benchmarks whose result is displayed at <https://tigerbeetle.github.io>.
|
|
2
|
+
//!
|
|
3
|
+
//! Specifically:
|
|
4
|
+
//!
|
|
5
|
+
//! - This script is run by the CI infrastructure on every merge to main.
|
|
6
|
+
//! - It runs a set of "benchmarks", where a "benchmark" can be anything (eg, measuring the size of
|
|
7
|
+
//! the binary).
|
|
8
|
+
//! - The results of all measurements are serialized as a single JSON object, `Run`.
|
|
9
|
+
//! - The key part: this JSON is then stored in a "distributed database" for our visualization
|
|
10
|
+
//! front-end to pick up. This "database" is just a newline-delimited JSON file in a git repo
|
|
11
|
+
//!
|
|
12
|
+
//! To generate a DEVHUBDB_PAT (used by cfo and CI):
|
|
13
|
+
//! 1. Go to https://github.com/settings/personal-access-tokens/new
|
|
14
|
+
//! 2. Fill out token name (e.g. "cfo/ci devhubdb token").
|
|
15
|
+
//! 3. Resource owner: "tigerbeetle"
|
|
16
|
+
//! 4. Expiry: "366 days" (maximum available)
|
|
17
|
+
//! 5. Repository access: "Only select repositories"
|
|
18
|
+
//! 6. Select repositories: "tigerbeetle/devhubdb"
|
|
19
|
+
//! 7. Add permissions: "Metadata"
|
|
20
|
+
//! 8. Add permissions: "Contents"; Access: "Read and write".
|
|
21
|
+
//! 9. "Generate token".
|
|
22
|
+
//! 10. (Copy token.)
|
|
23
|
+
//!
|
|
24
|
+
//! To update token in TigerBeetle CI:
|
|
25
|
+
//! 1. https://github.com/tigerbeetle/tigerbeetle/settings/environments
|
|
26
|
+
//! 2. Click "devhub".
|
|
27
|
+
//! 3. Environment Secrets > Edit DEVHUBDB_PAT
|
|
28
|
+
//! 4. Paste token; "Update secret"
|
|
29
|
+
//!
|
|
30
|
+
//! (Also need to update the DEVHUBDB_PAT environment variable passed to the CFO supervisors.)
|
|
31
|
+
const std = @import("std");
|
|
32
|
+
const assert = std.debug.assert;
|
|
33
|
+
|
|
34
|
+
const stdx = @import("stdx");
|
|
35
|
+
const Shell = @import("../shell.zig");
|
|
36
|
+
const changelog = @import("./changelog.zig");
|
|
37
|
+
const Release = @import("../multiversion.zig").Release;
|
|
38
|
+
|
|
39
|
+
const MiB = stdx.MiB;
|
|
40
|
+
|
|
41
|
+
const log = std.log;
|
|
42
|
+
|
|
43
|
+
pub const CLIArgs = struct {
|
|
44
|
+
sha: []const u8,
|
|
45
|
+
skip_kcov: bool = false,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
pub fn main(shell: *Shell, _: std.mem.Allocator, cli_args: CLIArgs) !void {
|
|
49
|
+
try devhub_metrics(shell, cli_args);
|
|
50
|
+
|
|
51
|
+
if (!cli_args.skip_kcov) {
|
|
52
|
+
try devhub_coverage(shell);
|
|
53
|
+
} else {
|
|
54
|
+
log.info("--skip-kcov enabled, not computing coverage.", .{});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn devhub_coverage(shell: *Shell) !void {
|
|
59
|
+
var section = try shell.open_section("coverage");
|
|
60
|
+
defer section.close();
|
|
61
|
+
|
|
62
|
+
const kcov_version = shell.exec_stdout("kcov --version", .{}) catch {
|
|
63
|
+
return error.NoKcov;
|
|
64
|
+
};
|
|
65
|
+
log.info("kcov version {s}", .{kcov_version});
|
|
66
|
+
|
|
67
|
+
try shell.exec_zig("build test:unit:build", .{});
|
|
68
|
+
try shell.exec_zig("build vopr:build", .{});
|
|
69
|
+
try shell.exec_zig("build fuzz:build", .{});
|
|
70
|
+
|
|
71
|
+
// Put results into src/devhub, as that folder is deployed as GitHub pages.
|
|
72
|
+
try shell.project_root.deleteTree("./src/devhub/coverage");
|
|
73
|
+
try shell.project_root.makePath("./src/devhub/coverage");
|
|
74
|
+
|
|
75
|
+
const kcov: []const []const u8 = &.{ "kcov", "--include-path=./src", "./src/devhub/coverage" };
|
|
76
|
+
inline for (.{
|
|
77
|
+
"{kcov} ./zig-out/bin/test-unit",
|
|
78
|
+
"{kcov} ./zig-out/bin/fuzz --events-max=500000 lsm_tree 92",
|
|
79
|
+
"{kcov} ./zig-out/bin/fuzz --events-max=500000 lsm_forest 92",
|
|
80
|
+
"{kcov} ./zig-out/bin/vopr 92",
|
|
81
|
+
}) |command| {
|
|
82
|
+
try shell.exec(command, .{ .kcov = kcov });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
var coverage_dir = try shell.cwd.openDir("./src/devhub/coverage", .{ .iterate = true });
|
|
86
|
+
defer coverage_dir.close();
|
|
87
|
+
|
|
88
|
+
// kcov adds some symlinks to the output, which prevents upload to GitHub actions from working.
|
|
89
|
+
var it = coverage_dir.iterate();
|
|
90
|
+
while (try it.next()) |entry| {
|
|
91
|
+
if (entry.kind == .sym_link) {
|
|
92
|
+
try coverage_dir.deleteFile(entry.name);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fn devhub_metrics(shell: *Shell, cli_args: CLIArgs) !void {
|
|
98
|
+
var section = try shell.open_section("metrics");
|
|
99
|
+
defer section.close();
|
|
100
|
+
|
|
101
|
+
const commit_timestamp_str =
|
|
102
|
+
try shell.exec_stdout("git show -s --format=%ct {sha}", .{ .sha = cli_args.sha });
|
|
103
|
+
const commit_timestamp = try std.fmt.parseInt(u64, commit_timestamp_str, 10);
|
|
104
|
+
|
|
105
|
+
// Only build the TigerBeetle binary to test build speed and build size. Throw it away once
|
|
106
|
+
// done, and use a release build from `zig-out/dist/` to run the benchmark.
|
|
107
|
+
var timer = try std.time.Timer.start();
|
|
108
|
+
|
|
109
|
+
const build_time_debug_ms = blk: {
|
|
110
|
+
timer.reset();
|
|
111
|
+
try shell.exec_zig("build install", .{});
|
|
112
|
+
defer shell.project_root.deleteFile("tigerbeetle") catch unreachable;
|
|
113
|
+
|
|
114
|
+
break :blk timer.read() / std.time.ns_per_ms;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const build_time_ms, const executable_size_bytes = blk: {
|
|
118
|
+
timer.reset();
|
|
119
|
+
try shell.project_root.deleteTree(".zig-cache");
|
|
120
|
+
try shell.exec_zig("build -Drelease install", .{});
|
|
121
|
+
defer shell.project_root.deleteFile("tigerbeetle") catch unreachable;
|
|
122
|
+
|
|
123
|
+
break :blk .{
|
|
124
|
+
timer.lap() / std.time.ns_per_ms,
|
|
125
|
+
(try shell.cwd.statFile("tigerbeetle")).size,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// When doing a release, the latest release in the changelog on main will be newer than the
|
|
130
|
+
// latest release on GitHub. In this case, don't pass in --no-changelog - as doing that causes
|
|
131
|
+
// the release code to try and look for a version which doesn't yet exist!
|
|
132
|
+
const no_changelog_flag = blk: {
|
|
133
|
+
const changelog_text = try shell.project_root.readFileAlloc(
|
|
134
|
+
shell.arena.allocator(),
|
|
135
|
+
"CHANGELOG.md",
|
|
136
|
+
1 * MiB,
|
|
137
|
+
);
|
|
138
|
+
var changelog_iteratator = changelog.ChangelogIterator.init(changelog_text);
|
|
139
|
+
|
|
140
|
+
const last_release_changelog = changelog_iteratator.next_changelog().?.release orelse
|
|
141
|
+
break :blk true;
|
|
142
|
+
const last_release_published = try Release.parse(try shell.exec_stdout(
|
|
143
|
+
"gh release list --json tagName --jq {query} --limit 1",
|
|
144
|
+
.{ .query = ".[].tagName" },
|
|
145
|
+
));
|
|
146
|
+
|
|
147
|
+
if (Release.less_than({}, last_release_published, last_release_changelog)) {
|
|
148
|
+
break :blk false;
|
|
149
|
+
} else {
|
|
150
|
+
break :blk true;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
if (no_changelog_flag) {
|
|
155
|
+
try shell.exec_zig(
|
|
156
|
+
\\build scripts -- release --build --no-changelog --sha={sha}
|
|
157
|
+
\\ --language=zig --devhub
|
|
158
|
+
, .{ .sha = cli_args.sha });
|
|
159
|
+
} else {
|
|
160
|
+
try shell.exec_zig(
|
|
161
|
+
\\build scripts -- release --build --sha={sha}
|
|
162
|
+
\\ --language=zig --devhub
|
|
163
|
+
, .{ .sha = cli_args.sha });
|
|
164
|
+
}
|
|
165
|
+
try shell.project_root.deleteFile("tigerbeetle");
|
|
166
|
+
|
|
167
|
+
try shell.unzip_executable(
|
|
168
|
+
"zig-out/dist/tigerbeetle/tigerbeetle-x86_64-linux.zip",
|
|
169
|
+
"tigerbeetle",
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// `--log-debug-replica` is explicitly enabled, to measure the performance hit from debug
|
|
173
|
+
// logging and count the log lines.
|
|
174
|
+
const benchmark_result, const benchmark_stderr = try shell.exec_stdout_stderr(
|
|
175
|
+
"./tigerbeetle benchmark --validate --checksum-performance --log-debug-replica " ++
|
|
176
|
+
"--file=datafile-devhub",
|
|
177
|
+
.{},
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const integrity_time_ms = blk: {
|
|
181
|
+
timer.reset();
|
|
182
|
+
|
|
183
|
+
try shell.exec(
|
|
184
|
+
"./tigerbeetle inspect integrity datafile-devhub",
|
|
185
|
+
.{},
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
break :blk timer.read() / std.time.ns_per_ms;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
shell.cwd.deleteFile("datafile-devhub") catch unreachable;
|
|
192
|
+
|
|
193
|
+
const replica_log_lines = std.mem.count(u8, benchmark_stderr, "\n");
|
|
194
|
+
const tps = try get_measurement(benchmark_result, "load accepted", "tx/s");
|
|
195
|
+
const batch_p100_ms = try get_measurement(benchmark_result, "batch latency p100", "ms");
|
|
196
|
+
const query_p100_ms = try get_measurement(benchmark_result, "query latency p100", "ms");
|
|
197
|
+
const rss_bytes = try get_measurement(benchmark_result, "rss", "bytes");
|
|
198
|
+
const datafile_bytes = try get_measurement(benchmark_result, "datafile", "bytes");
|
|
199
|
+
const datafile_empty_bytes = try get_measurement(benchmark_result, "datafile empty", "bytes");
|
|
200
|
+
const checksum_message_size_max_us = try get_measurement(
|
|
201
|
+
benchmark_result,
|
|
202
|
+
"checksum message size max",
|
|
203
|
+
"us",
|
|
204
|
+
);
|
|
205
|
+
const format_time_ms = blk: {
|
|
206
|
+
timer.reset();
|
|
207
|
+
|
|
208
|
+
try shell.exec(
|
|
209
|
+
"./tigerbeetle format --cluster=0 --replica=0 --replica-count=1 datafile-devhub",
|
|
210
|
+
.{},
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
break :blk timer.read() / std.time.ns_per_ms;
|
|
214
|
+
};
|
|
215
|
+
defer shell.cwd.deleteFile("datafile-devhub") catch unreachable;
|
|
216
|
+
|
|
217
|
+
const stats_count = blk: {
|
|
218
|
+
const stats_inspect_result = try shell.exec_stdout("./tigerbeetle inspect metrics", .{});
|
|
219
|
+
var stats_count: u32 = 0;
|
|
220
|
+
var lines = std.mem.splitScalar(
|
|
221
|
+
u8,
|
|
222
|
+
stats_inspect_result,
|
|
223
|
+
'\n',
|
|
224
|
+
);
|
|
225
|
+
while (lines.next()) |line| {
|
|
226
|
+
// line looks like
|
|
227
|
+
// timing: compact_mutable_suffix(tree)=136
|
|
228
|
+
if (line.len != 0) {
|
|
229
|
+
_, const value_string = stdx.cut(line, "=").?;
|
|
230
|
+
stats_count += try std.fmt.parseInt(u32, value_string, 10);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
break :blk stats_count;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const startup_time_ms, const repl_single_command_ms = blk: {
|
|
237
|
+
timer.reset();
|
|
238
|
+
|
|
239
|
+
var process = try shell.spawn(
|
|
240
|
+
.{
|
|
241
|
+
.stdin_behavior = .Pipe,
|
|
242
|
+
.stdout_behavior = .Pipe,
|
|
243
|
+
.stderr_behavior = .Ignore,
|
|
244
|
+
},
|
|
245
|
+
"./tigerbeetle start --addresses=0 --cache-grid=8GiB datafile-devhub",
|
|
246
|
+
.{},
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
defer {
|
|
250
|
+
process.stdin.?.close();
|
|
251
|
+
process.stdin = null;
|
|
252
|
+
_ = process.wait() catch {};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
var port_buffer: [std.fmt.count("{}\n", .{std.math.maxInt(u16)})]u8 = undefined;
|
|
256
|
+
const port_buffer_len = try process.stdout.?.readAll(&port_buffer);
|
|
257
|
+
const port = try std.fmt.parseInt(u16, port_buffer[0 .. port_buffer_len - 1], 10);
|
|
258
|
+
|
|
259
|
+
// TODO: This sends a ping manually; once register connection speed has been fixed, this can
|
|
260
|
+
// use the benchmark or repl via CLI.
|
|
261
|
+
//
|
|
262
|
+
// Use Header directly with a blocking TCP connection here, to avoid pulling in half of TB.
|
|
263
|
+
const Header = @import("../vsr/message_header.zig").Header;
|
|
264
|
+
|
|
265
|
+
var ping = Header.PingClient{
|
|
266
|
+
.command = .ping_client,
|
|
267
|
+
.cluster = 0,
|
|
268
|
+
.release = Release.minimum,
|
|
269
|
+
.client = 1,
|
|
270
|
+
.ping_timestamp_monotonic = 0,
|
|
271
|
+
};
|
|
272
|
+
ping.set_checksum_body(&[0]u8{});
|
|
273
|
+
ping.set_checksum();
|
|
274
|
+
|
|
275
|
+
// The release of the built binary is not readily available, since it's set by
|
|
276
|
+
// `zig build scripts -- release`. Instead, the ping above is sent with
|
|
277
|
+
// .release == Release.minimum. This will always be below a release build's
|
|
278
|
+
// release_client_min, so expect the eviction.
|
|
279
|
+
var eviction: Header.Eviction = undefined;
|
|
280
|
+
|
|
281
|
+
const peer = try std.net.Address.parseIp4("127.0.0.1", port);
|
|
282
|
+
const stream = try std.net.tcpConnectToAddress(peer);
|
|
283
|
+
defer stream.close();
|
|
284
|
+
|
|
285
|
+
var writer = stream.writer();
|
|
286
|
+
try writer.writeAll(std.mem.asBytes(&ping)[0..@sizeOf(Header)]);
|
|
287
|
+
|
|
288
|
+
const reader = stream.reader();
|
|
289
|
+
_ = try reader.readAll(std.mem.asBytes(&eviction)[0..@sizeOf(Header)]);
|
|
290
|
+
|
|
291
|
+
assert(eviction.command == .eviction);
|
|
292
|
+
assert(eviction.valid_checksum());
|
|
293
|
+
assert(eviction.valid_checksum_body(&[0]u8{}));
|
|
294
|
+
|
|
295
|
+
const startup_time_ms = timer.read() / std.time.ns_per_ms;
|
|
296
|
+
|
|
297
|
+
// While there's a running instance, check how long the repl takes to connect and run a
|
|
298
|
+
// command.
|
|
299
|
+
timer.reset();
|
|
300
|
+
|
|
301
|
+
try shell.exec(
|
|
302
|
+
"./tigerbeetle repl --addresses={port} --cluster=0 --command={command}",
|
|
303
|
+
.{ .port = port, .command = "create_accounts id=1 ledger=1 code=1" },
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
const repl_single_command_ms = timer.read() / std.time.ns_per_ms;
|
|
307
|
+
|
|
308
|
+
break :blk .{ startup_time_ms, repl_single_command_ms };
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const ci_pipeline_duration_s: ?u64 = blk: {
|
|
312
|
+
const times_gh = try shell.exec_stdout("gh run list -c {sha} -e merge_group " ++
|
|
313
|
+
"--json startedAt,updatedAt -L 1 --template {template}", .{
|
|
314
|
+
.sha = cli_args.sha,
|
|
315
|
+
.template = "{{range .}}{{.startedAt}} {{.updatedAt}}{{end}}",
|
|
316
|
+
});
|
|
317
|
+
const iso8601_started_at, const iso8601_updated_at =
|
|
318
|
+
stdx.cut(times_gh, " ") orelse break :blk null;
|
|
319
|
+
|
|
320
|
+
const epoch_started_at = try shell.iso8601_to_timestamp_seconds(iso8601_started_at);
|
|
321
|
+
const epoch_updated_at = try shell.iso8601_to_timestamp_seconds(iso8601_updated_at);
|
|
322
|
+
|
|
323
|
+
break :blk epoch_updated_at - epoch_started_at;
|
|
324
|
+
} orelse blk: {
|
|
325
|
+
// Return 0 instead of null when running locally or without DEVHUBDB_PAT set - the results
|
|
326
|
+
// won't be uploaded, and this allows the rest of the code to succeed.
|
|
327
|
+
if ((shell.env_get("DEVHUBDB_PAT") catch null) == null) {
|
|
328
|
+
break :blk 0;
|
|
329
|
+
} else {
|
|
330
|
+
break :blk null;
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
const batch = MetricBatch{
|
|
335
|
+
.timestamp = commit_timestamp,
|
|
336
|
+
.attributes = .{
|
|
337
|
+
.git_repo = "https://github.com/tigerbeetle/tigerbeetle",
|
|
338
|
+
.git_commit = cli_args.sha,
|
|
339
|
+
.branch = "main",
|
|
340
|
+
},
|
|
341
|
+
.metrics = &[_]Metric{
|
|
342
|
+
.{ .name = "ci pipeline duration", .value = ci_pipeline_duration_s.?, .unit = "s" },
|
|
343
|
+
.{ .name = "executable size", .value = executable_size_bytes, .unit = "bytes" },
|
|
344
|
+
.{ .name = "TPS", .value = tps, .unit = "count" },
|
|
345
|
+
.{ .name = "batch p100", .value = batch_p100_ms, .unit = "ms" },
|
|
346
|
+
.{ .name = "query p100", .value = query_p100_ms, .unit = "ms" },
|
|
347
|
+
.{ .name = "RSS", .value = rss_bytes, .unit = "bytes" },
|
|
348
|
+
.{ .name = "datafile", .value = datafile_bytes, .unit = "bytes" },
|
|
349
|
+
.{ .name = "datafile empty", .value = datafile_empty_bytes, .unit = "bytes" },
|
|
350
|
+
.{ .name = "replica log lines", .value = replica_log_lines, .unit = "count" },
|
|
351
|
+
.{
|
|
352
|
+
.name = "checksum(message_size_max)",
|
|
353
|
+
.value = checksum_message_size_max_us,
|
|
354
|
+
.unit = "us",
|
|
355
|
+
},
|
|
356
|
+
.{ .name = "build time debug", .value = build_time_debug_ms, .unit = "ms" },
|
|
357
|
+
.{ .name = "build time", .value = build_time_ms, .unit = "ms" },
|
|
358
|
+
.{ .name = "format time", .value = format_time_ms, .unit = "ms" },
|
|
359
|
+
.{ .name = "startup time - 8GiB grid cache", .value = startup_time_ms, .unit = "ms" },
|
|
360
|
+
.{ .name = "stats count", .value = stats_count, .unit = "count" },
|
|
361
|
+
.{ .name = "repl single command", .value = repl_single_command_ms, .unit = "ms" },
|
|
362
|
+
.{ .name = "inspect integrity time", .value = integrity_time_ms, .unit = "ms" },
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
upload_run(shell, &batch) catch |err| {
|
|
367
|
+
log.err("failed to upload devhubdb metrics: {}", .{err});
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
upload_nyrkio(shell, &batch) catch |err| {
|
|
371
|
+
log.err("failed to upload Nyrkiö metrics: {}", .{err});
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
for (batch.metrics) |metric| {
|
|
375
|
+
std.log.info("{s} = {} {s}", .{ metric.name, metric.value, metric.unit });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
fn get_measurement(
|
|
380
|
+
benchmark_stdout: []const u8,
|
|
381
|
+
comptime label: []const u8,
|
|
382
|
+
comptime unit: []const u8,
|
|
383
|
+
) !u64 {
|
|
384
|
+
errdefer {
|
|
385
|
+
std.log.err("can't extract '" ++ label ++ "' measurement", .{});
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
_, const rest = stdx.cut(benchmark_stdout, label ++ " = ") orelse
|
|
389
|
+
return error.BadMeasurement;
|
|
390
|
+
const value_string, _ = stdx.cut(rest, " " ++ unit) orelse return error.BadMeasurement;
|
|
391
|
+
|
|
392
|
+
return try std.fmt.parseInt(u64, value_string, 10);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
fn upload_run(shell: *Shell, batch: *const MetricBatch) !void {
|
|
396
|
+
const token = try shell.env_get("DEVHUBDB_PAT");
|
|
397
|
+
try shell.exec(
|
|
398
|
+
\\git clone --single-branch --depth 1
|
|
399
|
+
\\ https://oauth2:{token}@github.com/tigerbeetle/devhubdb.git
|
|
400
|
+
\\ devhubdb
|
|
401
|
+
, .{
|
|
402
|
+
.token = token,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
try shell.pushd("./devhubdb");
|
|
406
|
+
defer shell.popd();
|
|
407
|
+
|
|
408
|
+
for (0..32) |_| {
|
|
409
|
+
try shell.exec("git fetch origin main", .{});
|
|
410
|
+
try shell.exec("git reset --hard origin/main", .{});
|
|
411
|
+
|
|
412
|
+
{
|
|
413
|
+
const file = try shell.cwd.openFile("./devhub/data.json", .{
|
|
414
|
+
.mode = .write_only,
|
|
415
|
+
});
|
|
416
|
+
defer file.close();
|
|
417
|
+
|
|
418
|
+
try file.seekFromEnd(0);
|
|
419
|
+
try std.json.stringify(batch, .{}, file.writer());
|
|
420
|
+
try file.writeAll("\n");
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
try shell.exec("git add ./devhub/data.json", .{});
|
|
424
|
+
try shell.git_env_setup(.{ .use_hostname = false });
|
|
425
|
+
try shell.exec("git commit -m 📈", .{});
|
|
426
|
+
if (shell.exec("git push", .{})) {
|
|
427
|
+
log.info("metrics uploaded", .{});
|
|
428
|
+
break;
|
|
429
|
+
} else |_| {
|
|
430
|
+
log.info("conflict, retrying", .{});
|
|
431
|
+
}
|
|
432
|
+
} else {
|
|
433
|
+
log.err("can't push new data to devhub", .{});
|
|
434
|
+
return error.CanNotPush;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const Metric = struct {
|
|
439
|
+
name: []const u8,
|
|
440
|
+
unit: []const u8,
|
|
441
|
+
value: u64,
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const MetricBatch = struct {
|
|
445
|
+
timestamp: u64,
|
|
446
|
+
metrics: []const Metric,
|
|
447
|
+
attributes: struct {
|
|
448
|
+
git_repo: []const u8,
|
|
449
|
+
branch: []const u8,
|
|
450
|
+
git_commit: []const u8,
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
fn upload_nyrkio(shell: *Shell, batch: *const MetricBatch) !void {
|
|
455
|
+
const url = "https://nyrkio.com/api/v0/result/devhub";
|
|
456
|
+
const token = try shell.env_get("NYRKIO_TOKEN");
|
|
457
|
+
const payload = try std.json.stringifyAlloc(
|
|
458
|
+
shell.arena.allocator(),
|
|
459
|
+
[_]*const MetricBatch{batch}, // Nyrkiö needs an _array_ of batches.
|
|
460
|
+
.{},
|
|
461
|
+
);
|
|
462
|
+
_ = try shell.http_post(url, payload, .{
|
|
463
|
+
.content_type = .json,
|
|
464
|
+
.authorization = try shell.fmt("Bearer {s}", .{token}),
|
|
465
|
+
});
|
|
466
|
+
}
|