Skip to content

Commit cc38d53

Browse files
committed
feat: add transaction histogram
Add transaction histogram for tracking operations per transaction: - num_op_per_transaction: Distribution of operation count per transaction Extended test/transaction_statistics.erl with histogram test case verifying histogram data structure.
1 parent dc80b98 commit cc38d53

File tree

5 files changed

+55
-1
lines changed

5 files changed

+55
-1
lines changed

c_src/atoms.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@ extern ERL_NIF_TERM ATOM_WAL_FILE_SYNC_MICROS;
422422
extern ERL_NIF_TERM ATOM_BYTES_PER_READ;
423423
extern ERL_NIF_TERM ATOM_BYTES_PER_WRITE;
424424

425+
// Transaction Histogram
426+
extern ERL_NIF_TERM ATOM_NUM_OP_PER_TRANSACTION;
427+
425428
// Compaction Statistics Tickers
426429
extern ERL_NIF_TERM ATOM_COMPACT_READ_BYTES;
427430
extern ERL_NIF_TERM ATOM_COMPACT_WRITE_BYTES;

c_src/erocksdb.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,9 @@ ERL_NIF_TERM ATOM_WAL_FILE_SYNC_MICROS;
624624
ERL_NIF_TERM ATOM_BYTES_PER_READ;
625625
ERL_NIF_TERM ATOM_BYTES_PER_WRITE;
626626

627+
// Transaction Histogram
628+
ERL_NIF_TERM ATOM_NUM_OP_PER_TRANSACTION;
629+
627630
// Compaction Statistics Tickers
628631
ERL_NIF_TERM ATOM_COMPACT_READ_BYTES;
629632
ERL_NIF_TERM ATOM_COMPACT_WRITE_BYTES;
@@ -1144,6 +1147,9 @@ try
11441147
ATOM(erocksdb::ATOM_BYTES_PER_READ, "bytes_per_read");
11451148
ATOM(erocksdb::ATOM_BYTES_PER_WRITE, "bytes_per_write");
11461149

1150+
// Transaction Histogram
1151+
ATOM(erocksdb::ATOM_NUM_OP_PER_TRANSACTION, "num_op_per_transaction");
1152+
11471153
// Compaction Statistics Tickers
11481154
ATOM(erocksdb::ATOM_COMPACT_READ_BYTES, "compact_read_bytes");
11491155
ATOM(erocksdb::ATOM_COMPACT_WRITE_BYTES, "compact_write_bytes");

c_src/statistics.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,12 @@ bool HistogramAtomToEnum(ERL_NIF_TERM atom, rocksdb::Histograms* histogram)
777777
*histogram = rocksdb::BYTES_PER_WRITE;
778778
return true;
779779
}
780+
// Transaction Histogram
781+
else if (atom == ATOM_NUM_OP_PER_TRANSACTION)
782+
{
783+
*histogram = rocksdb::NUM_OP_PER_TRANSACTION;
784+
return true;
785+
}
780786
return false;
781787
}
782788

src/rocksdb.erl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,8 @@
554554
bytes_per_read |
555555
bytes_per_write.
556556

557+
-type transaction_histogram() :: num_op_per_transaction.
558+
557559
-type compaction_ticker() :: compact_read_bytes |
558560
compact_write_bytes |
559561
flush_write_bytes |
@@ -2231,7 +2233,7 @@ statistics_ticker(_Statistics, _Ticker) ->
22312233
%% Returns histogram information including median, percentiles, average, etc.
22322234
%% For integrated BlobDB, relevant histograms are blob_db_blob_file_write_micros,
22332235
%% blob_db_blob_file_read_micros, blob_db_compression_micros, etc.
2234-
-spec statistics_histogram(statistics_handle(), blob_db_histogram() | core_operation_histogram() | io_sync_histogram()) -> {ok, histogram_info()}.
2236+
-spec statistics_histogram(statistics_handle(), blob_db_histogram() | core_operation_histogram() | io_sync_histogram() | transaction_histogram()) -> {ok, histogram_info()}.
22352237
statistics_histogram(_Statistics, _Histogram) ->
22362238
?nif_stub.
22372239

test/transaction_statistics.erl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,40 @@ all_transaction_tickers_readable_test() ->
184184
end,
185185
ok.
186186

187+
num_op_per_transaction_histogram_test() ->
188+
?rm_rf("test_txn_ops_hist"),
189+
{ok, Stats} = rocksdb:new_statistics(),
190+
{ok, Db, _} = rocksdb:open_pessimistic_transaction_db(
191+
"test_txn_ops_hist",
192+
[{create_if_missing, true},
193+
{statistics, Stats}],
194+
[{"default", []}]),
195+
try
196+
%% Create a transaction with multiple operations
197+
{ok, Txn} = rocksdb:pessimistic_transaction(Db, []),
198+
lists:foreach(
199+
fun(I) ->
200+
Key = <<$k, (integer_to_binary(I))/binary>>,
201+
Value = list_to_binary(lists:duplicate(50, $v)),
202+
ok = rocksdb:pessimistic_transaction_put(Txn, Key, Value)
203+
end,
204+
lists:seq(1, 10)),
205+
ok = rocksdb:pessimistic_transaction_commit(Txn),
206+
ok = rocksdb:release_pessimistic_transaction(Txn),
207+
208+
%% Check num_op_per_transaction histogram is readable
209+
{ok, OpHist} = rocksdb:statistics_histogram(Stats, num_op_per_transaction),
210+
?assert(is_map(OpHist)),
211+
?assert(is_float(maps:get(median, OpHist))),
212+
?assert(is_float(maps:get(percentile95, OpHist))),
213+
?assert(is_float(maps:get(percentile99, OpHist))),
214+
?assert(is_float(maps:get(average, OpHist))),
215+
?assert(is_integer(maps:get(count, OpHist))),
216+
?assert(is_integer(maps:get(sum, OpHist)))
217+
after
218+
ok = rocksdb:close(Db),
219+
ok = rocksdb:release_statistics(Stats),
220+
?rm_rf("test_txn_ops_hist")
221+
end,
222+
ok.
223+

0 commit comments

Comments
 (0)