diff --git a/src/kudu/client/batcher.cc b/src/kudu/client/batcher.cc index 91c60be..9bee8d5 100644 --- a/src/kudu/client/batcher.cc +++ b/src/kudu/client/batcher.cc @@ -791,6 +791,8 @@ void Batcher::ProcessWriteResponse(const WriteRpc& rpc, MarkHadErrors(); } + client_->data_->write_histo_->Increment(rpc.num_attempts()); + CheckForFinishedFlush(); } diff --git a/src/kudu/client/client-internal.cc b/src/kudu/client/client-internal.cc index bfc421f..cf7f047 100644 --- a/src/kudu/client/client-internal.cc +++ b/src/kudu/client/client-internal.cc @@ -22,6 +22,7 @@ #include "kudu/master/master.proxy.h" #include "kudu/rpc/rpc.h" #include "kudu/rpc/rpc_controller.h" +#include "kudu/util/metrics.h" #include "kudu/util/net/dns_resolver.h" #include "kudu/util/net/net_util.h" #include "kudu/util/thread_restrictions.h" @@ -30,6 +31,12 @@ using std::set; using std::string; using std::vector; +METRIC_DEFINE_entity(client); +METRIC_DEFINE_histogram(client, write_attempt_count, "Write Attempt Count", + kudu::MetricUnit::kRequests, + "Number of attempts per write RPC", + 1000, 2); + namespace kudu { using consensus::RaftPeerPB; @@ -210,7 +217,9 @@ Status KuduClient::Data::SyncLeaderMasterRpc( RpcController*)>& func); KuduClient::Data::Data() - : latest_observed_timestamp_(KuduClient::kNoTimestamp) { + : latest_observed_timestamp_(KuduClient::kNoTimestamp), + entity_(METRIC_ENTITY_client.Instantiate(®istry_, "foo")), + write_histo_(METRIC_write_attempt_count.Instantiate(entity_.get())) { } KuduClient::Data::~Data() { diff --git a/src/kudu/client/client-internal.h b/src/kudu/client/client-internal.h index 886ad1b..4ec41a2 100644 --- a/src/kudu/client/client-internal.h +++ b/src/kudu/client/client-internal.h @@ -11,6 +11,7 @@ #include "kudu/client/client.h" #include "kudu/util/atomic.h" #include "kudu/util/locks.h" +#include "kudu/util/metrics.h" #include "kudu/util/net/net_util.h" namespace kudu { @@ -202,6 +203,9 @@ class KuduClient::Data { AtomicInt latest_observed_timestamp_; + MetricRegistry registry_; + scoped_refptr entity_; + scoped_refptr write_histo_; DISALLOW_COPY_AND_ASSIGN(Data); }; diff --git a/src/kudu/client/client-test-util.cc b/src/kudu/client/client-test-util.cc index 00978a7..d0c2732 100644 --- a/src/kudu/client/client-test-util.cc +++ b/src/kudu/client/client-test-util.cc @@ -7,7 +7,9 @@ #include #include +#include "kudu/client/client-internal.h" #include "kudu/gutil/stl_util.h" +#include "kudu/util/metrics.h" #include "kudu/util/test_util.h" namespace kudu { @@ -33,6 +35,8 @@ void LogSessionErrorsAndDie(const std::tr1::shared_ptr& session, << " had status " << e->status().ToString(); i++; } + + LOG(INFO) << DumpWritesHistogram(session->client()); CHECK_OK(s); // will fail } @@ -60,5 +64,16 @@ KuduSchema KuduSchemaFromSchema(const Schema& schema) { return KuduSchema(schema); } +string DumpWritesHistogram(KuduClient* client) { + std::stringstream ss; + JsonWriter w(&ss, JsonWriter::PRETTY); + MetricJsonOptions opts; + opts.include_raw_histograms = true; + opts.include_schema_info = true; + CHECK_OK(client->data_->write_histo_->WriteAsJson(&w, opts)); + return ss.str(); +} + + } // namespace client } // namespace kudu diff --git a/src/kudu/client/client-test-util.h b/src/kudu/client/client-test-util.h index 8b3af23..0d307ec 100644 --- a/src/kudu/client/client-test-util.h +++ b/src/kudu/client/client-test-util.h @@ -38,6 +38,8 @@ void ScanToStrings(KuduScanner* scanner, std::vector* row_strings); // Convert a kudu::Schema to a kudu::client::KuduSchema. KuduSchema KuduSchemaFromSchema(const Schema& schema); +std::string DumpWritesHistogram(KuduClient* client); + } // namespace client } // namespace kudu diff --git a/src/kudu/client/client.h b/src/kudu/client/client.h index 3b91025..b722424 100644 --- a/src/kudu/client/client.h +++ b/src/kudu/client/client.h @@ -243,6 +243,7 @@ class KUDU_EXPORT KuduClient : public std::tr1::enable_shared_from_this