diff options
author | Juanli Shen <juanlishen@google.com> | 2018-07-13 19:52:59 -0700 |
---|---|---|
committer | Juanli Shen <juanlishen@google.com> | 2018-07-13 19:52:59 -0700 |
commit | be40b0d3a8cf2e37c80b2c248111051fa8bdf7bc (patch) | |
tree | 79384a0045d5bbc550666f047d088f9582755086 /src/cpp/server/load_reporter/load_reporter.cc | |
parent | f9f5c67aff91e4ad26371b0a2482a5011ab45226 (diff) |
Add server load reporting service
Diffstat (limited to 'src/cpp/server/load_reporter/load_reporter.cc')
-rw-r--r-- | src/cpp/server/load_reporter/load_reporter.cc | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/src/cpp/server/load_reporter/load_reporter.cc b/src/cpp/server/load_reporter/load_reporter.cc index 3f0063d883..464063a13f 100644 --- a/src/cpp/server/load_reporter/load_reporter.cc +++ b/src/cpp/server/load_reporter/load_reporter.cc @@ -22,6 +22,7 @@ #include <stdio.h> #include <chrono> #include <ctime> +#include <iterator> #include "src/cpp/server/load_reporter/constants.h" #include "src/cpp/server/load_reporter/get_cpu_stats.h" @@ -65,8 +66,8 @@ CensusViewProvider::CensusViewProvider() // measurements instead of setting the data values directly. auto vd_end_count = ::opencensus::stats::ViewDescriptor() - .set_name((kViewEndCount)) - .set_measure((kMeasureEndCount)) + .set_name(kViewEndCount) + .set_measure(kMeasureEndCount) .set_aggregation(::opencensus::stats::Aggregation::Sum()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -80,8 +81,8 @@ CensusViewProvider::CensusViewProvider() view_descriptor_map_.emplace(kViewEndCount, vd_end_count); auto vd_end_bytes_sent = ::opencensus::stats::ViewDescriptor() - .set_name((kViewEndBytesSent)) - .set_measure((kMeasureEndBytesSent)) + .set_name(kViewEndBytesSent) + .set_measure(kMeasureEndBytesSent) .set_aggregation(::opencensus::stats::Aggregation::Sum()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -95,8 +96,8 @@ CensusViewProvider::CensusViewProvider() view_descriptor_map_.emplace(kViewEndBytesSent, vd_end_bytes_sent); auto vd_end_bytes_received = ::opencensus::stats::ViewDescriptor() - .set_name((kViewEndBytesReceived)) - .set_measure((kMeasureEndBytesReceived)) + .set_name(kViewEndBytesReceived) + .set_measure(kMeasureEndBytesReceived) .set_aggregation(::opencensus::stats::Aggregation::Sum()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -110,8 +111,8 @@ CensusViewProvider::CensusViewProvider() view_descriptor_map_.emplace(kViewEndBytesReceived, vd_end_bytes_received); auto vd_end_latency_ms = ::opencensus::stats::ViewDescriptor() - .set_name((kViewEndLatencyMs)) - .set_measure((kMeasureEndLatencyMs)) + .set_name(kViewEndLatencyMs) + .set_measure(kMeasureEndLatencyMs) .set_aggregation(::opencensus::stats::Aggregation::Sum()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -126,8 +127,8 @@ CensusViewProvider::CensusViewProvider() // Two views related to other call metrics. auto vd_metric_call_count = ::opencensus::stats::ViewDescriptor() - .set_name((kViewOtherCallMetricCount)) - .set_measure((kMeasureOtherCallMetric)) + .set_name(kViewOtherCallMetricCount) + .set_measure(kMeasureOtherCallMetric) .set_aggregation(::opencensus::stats::Aggregation::Count()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -141,8 +142,8 @@ CensusViewProvider::CensusViewProvider() view_descriptor_map_.emplace(kViewOtherCallMetricCount, vd_metric_call_count); auto vd_metric_value = ::opencensus::stats::ViewDescriptor() - .set_name((kViewOtherCallMetricValue)) - .set_measure((kMeasureOtherCallMetric)) + .set_name(kViewOtherCallMetricValue) + .set_measure(kMeasureOtherCallMetric) .set_aggregation(::opencensus::stats::Aggregation::Sum()) .add_column(tag_key_token_) .add_column(tag_key_host_) @@ -161,11 +162,26 @@ double CensusViewProvider::GetRelatedViewDataRowDouble( size_t view_name_len, const std::vector<grpc::string>& tag_values) { auto it_vd = view_data_map.find(grpc::string(view_name, view_name_len)); GPR_ASSERT(it_vd != view_data_map.end()); + GPR_ASSERT(it_vd->second.type() == + ::opencensus::stats::ViewData::Type::kDouble); auto it_row = it_vd->second.double_data().find(tag_values); GPR_ASSERT(it_row != it_vd->second.double_data().end()); return it_row->second; } +uint64_t CensusViewProvider::GetRelatedViewDataRowInt( + const ViewDataMap& view_data_map, const char* view_name, + size_t view_name_len, const std::vector<grpc::string>& tag_values) { + auto it_vd = view_data_map.find(grpc::string(view_name, view_name_len)); + GPR_ASSERT(it_vd != view_data_map.end()); + GPR_ASSERT(it_vd->second.type() == + ::opencensus::stats::ViewData::Type::kInt64); + auto it_row = it_vd->second.int_data().find(tag_values); + GPR_ASSERT(it_row != it_vd->second.int_data().end()); + GPR_ASSERT(it_row->second >= 0); + return it_row->second; +} + CensusViewProviderDefaultImpl::CensusViewProviderDefaultImpl() { for (const auto& p : view_descriptor_map()) { const grpc::string& view_name = p.first; @@ -235,23 +251,23 @@ LoadReporter::GenerateLoadBalancingFeedback() { return ::grpc::lb::v1::LoadBalancingFeedback::default_instance(); } // Find the longest range with valid ends. - LoadBalancingFeedbackRecord* oldest = &feedback_records_[0]; - LoadBalancingFeedbackRecord* newest = - &feedback_records_[feedback_records_.size() - 1]; - while (newest > oldest && + auto oldest = feedback_records_.begin(); + auto newest = feedback_records_.end() - 1; + while (std::distance(oldest, newest) > 0 && (newest->cpu_limit == 0 || oldest->cpu_limit == 0)) { // A zero limit means that the system info reading was failed, so these // records can't be used to calculate CPU utilization. if (newest->cpu_limit == 0) --newest; if (oldest->cpu_limit == 0) ++oldest; } - if (newest - oldest < 1 || oldest->end_time == newest->end_time || + if (std::distance(oldest, newest) < 1 || + oldest->end_time == newest->end_time || newest->cpu_limit == oldest->cpu_limit) { return ::grpc::lb::v1::LoadBalancingFeedback::default_instance(); } uint64_t rpcs = 0; uint64_t errors = 0; - for (LoadBalancingFeedbackRecord* p = newest; p != oldest; --p) { + for (auto p = newest; p != oldest; --p) { // Because these two numbers are counters, the oldest record shouldn't be // included. rpcs += p->rpcs; @@ -338,7 +354,8 @@ void LoadReporter::AttachOrphanLoadId( if (per_balancer_store.lb_id() == kInvalidLbId) { load->set_load_key_unknown(true); } else { - load->set_load_key_unknown(false); + // We shouldn't set load_key_unknown to any value in this case because + // load_key_unknown and orphaned_load_identifier are under an oneof struct. load->mutable_orphaned_load_identifier()->set_load_key( per_balancer_store.load_key()); load->mutable_orphaned_load_identifier()->set_load_balancer_id( @@ -381,9 +398,7 @@ void LoadReporter::ProcessViewDataCallStart( const CensusViewProvider::ViewDataMap& view_data_map) { auto it = view_data_map.find(kViewStartCount); if (it != view_data_map.end()) { - // Note that the data type for any Sum view is double, whatever the data - // type of the original measure. - for (const auto& p : it->second.double_data()) { + for (const auto& p : it->second.int_data()) { const std::vector<grpc::string>& tag_values = p.first; const uint64_t start_count = static_cast<uint64_t>(p.second); const grpc::string& client_ip_and_token = tag_values[0]; @@ -405,9 +420,7 @@ void LoadReporter::ProcessViewDataCallEnd( uint64_t total_error_count = 0; auto it = view_data_map.find(kViewEndCount); if (it != view_data_map.end()) { - // Note that the data type for any Sum view is double, whatever the data - // type of the original measure. - for (const auto& p : it->second.double_data()) { + for (const auto& p : it->second.int_data()) { const std::vector<grpc::string>& tag_values = p.first; const uint64_t end_count = static_cast<uint64_t>(p.second); const grpc::string& client_ip_and_token = tag_values[0]; @@ -424,18 +437,16 @@ void LoadReporter::ProcessViewDataCallEnd( continue; } LoadRecordKey key(client_ip_and_token, user_id); - const uint64_t bytes_sent = - CensusViewProvider::GetRelatedViewDataRowDouble( - view_data_map, kViewEndBytesSent, sizeof(kViewEndBytesSent) - 1, - tag_values); + const uint64_t bytes_sent = CensusViewProvider::GetRelatedViewDataRowInt( + view_data_map, kViewEndBytesSent, sizeof(kViewEndBytesSent) - 1, + tag_values); const uint64_t bytes_received = - CensusViewProvider::GetRelatedViewDataRowDouble( + CensusViewProvider::GetRelatedViewDataRowInt( view_data_map, kViewEndBytesReceived, sizeof(kViewEndBytesReceived) - 1, tag_values); - const uint64_t latency_ms = - CensusViewProvider::GetRelatedViewDataRowDouble( - view_data_map, kViewEndLatencyMs, sizeof(kViewEndLatencyMs) - 1, - tag_values); + const uint64_t latency_ms = CensusViewProvider::GetRelatedViewDataRowInt( + view_data_map, kViewEndLatencyMs, sizeof(kViewEndLatencyMs) - 1, + tag_values); uint64_t ok_count = 0; uint64_t error_count = 0; total_end_count += end_count; |