diff --git a/docs/cn/rpcz.md b/docs/cn/rpcz.md index b2808da268..637997d15f 100644 --- a/docs/cn/rpcz.md +++ b/docs/cn/rpcz.md @@ -13,6 +13,7 @@ | rpcz_database_dir | ./rpc_data/rpcz | For storing requests/contexts collected by rpcz. | src/baidu/rpc/span.cpp | | rpcz_keep_span_db | false | Don't remove DB of rpcz at program's exit | src/baidu/rpc/span.cpp | | rpcz_keep_span_seconds (R) | 3600 | Keep spans for at most so many seconds | src/baidu/rpc/span.cpp | +| rpcz_save_span_min_latency_us (R) | 0 (default:0) | The minimum latency microseconds of span saved | src/baidu/rpc/span.cpp | 若启动时未加-enable_rpcz,则可在启动后访问SERVER_URL/rpcz/enable动态开启rpcz,访问SERVER_URL/rpcz/disable则关闭,这两个链接等价于访问SERVER_URL/flags/enable_rpcz?setvalue=true和SERVER_URL/flags/enable_rpcz?setvalue=false。在r31010之后,rpc在html版本中增加了一个按钮可视化地开启和关闭。 diff --git a/src/brpc/span.cpp b/src/brpc/span.cpp index 356a7cd039..7a0218ddc1 100644 --- a/src/brpc/span.cpp +++ b/src/brpc/span.cpp @@ -29,6 +29,7 @@ #include "butil/object_pool.h" #include "butil/fast_rand.h" #include "butil/file_util.h" +#include "butil/files/file_enumerator.h" #include "brpc/shared_object.h" #include "brpc/reloadable_flags.h" #include "brpc/span.h" @@ -59,6 +60,9 @@ BRPC_VALIDATE_GFLAG(rpcz_keep_span_seconds, PositiveInteger); DEFINE_bool(rpcz_keep_span_db, false, "Don't remove DB of rpcz at program's exit"); +DEFINE_int64(rpcz_save_span_min_latency_us, 0, "The minimum latency microseconds of span saved"); +BRPC_VALIDATE_GFLAG(rpcz_save_span_min_latency_us, NonNegativeInteger); + struct IdGen { bool init; uint16_t seq; @@ -378,10 +382,8 @@ class SpanDB : public SharedObject { delete id_db; delete time_db; if (!FLAGS_rpcz_keep_span_db) { - std::string cmd = butil::string_printf("rm -rf %s %s", - id_db_name.c_str(), - time_db_name.c_str()); - butil::ignore_result(system(cmd.c_str())); + butil::DeleteFile(butil::FilePath(id_db_name), true); + butil::DeleteFile(butil::FilePath(time_db_name), true); } } }; @@ -506,6 +508,15 @@ inline uint64_t ToLittleEndian(const uint32_t* buf) { } SpanDB* SpanDB::Open() { + // Remove old rpcz directory even if crash occurs. + if (!FLAGS_rpcz_keep_span_db) { + butil::FileEnumerator dirs(butil::FilePath(FLAGS_rpcz_database_dir), false, + butil::FileEnumerator::DIRECTORIES, "[0-9]*.[0-9]*.[0-9]*"); + for (auto name = dirs.Next(); !name.empty(); name = dirs.Next()) { + butil::DeleteFile(name, true); + } + } + SpanDB local; leveldb::Status st; char prefix[64]; @@ -568,6 +579,11 @@ leveldb::Status SpanDB::Index(const Span* span, std::string* value_buf) { // of time window. const int64_t start_time = span->GetStartRealTimeUs(); + const int64_t latency_us = span->GetEndRealTimeUs() - start_time; + // if latency_us < FLAGS_rpcz_save_span_min_latency_us, don't save this span + if (latency_us < FLAGS_rpcz_save_span_min_latency_us) { + return leveldb::Status::OK(); + } BriefSpan brief; brief.set_trace_id(span->trace_id()); brief.set_span_id(span->span_id()); @@ -577,7 +593,7 @@ leveldb::Status SpanDB::Index(const Span* span, std::string* value_buf) { brief.set_request_size(span->request_size()); brief.set_response_size(span->response_size()); brief.set_start_real_us(start_time); - brief.set_latency_us(span->GetEndRealTimeUs() - start_time); + brief.set_latency_us(latency_us); brief.set_full_method_name(span->full_method_name()); if (!brief.SerializeToString(value_buf)) { return leveldb::Status::InvalidArgument(