/Users/deen/code/yugabyte-db/src/yb/tserver/tserver_metrics_heartbeat_data_provider.cc
Line | Count | Source |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | // |
13 | | |
14 | | #include "yb/tserver/tserver_metrics_heartbeat_data_provider.h" |
15 | | |
16 | | #include "yb/consensus/log.h" |
17 | | |
18 | | #include "yb/docdb/docdb_rocksdb_util.h" |
19 | | |
20 | | #include "yb/master/master_heartbeat.pb.h" |
21 | | |
22 | | #include "yb/tablet/tablet.h" |
23 | | #include "yb/tablet/tablet_metadata.h" |
24 | | #include "yb/tablet/tablet_peer.h" |
25 | | |
26 | | #include "yb/tserver/tablet_server.h" |
27 | | #include "yb/tserver/ts_tablet_manager.h" |
28 | | #include "yb/tserver/tserver_service.service.h" |
29 | | |
30 | | #include "yb/util/logging.h" |
31 | | #include "yb/util/mem_tracker.h" |
32 | | #include "yb/util/metrics.h" |
33 | | |
34 | | DEFINE_int32(tserver_heartbeat_metrics_interval_ms, 5000, |
35 | | "Interval (in milliseconds) at which tserver sends its metrics in a heartbeat to " |
36 | | "master."); |
37 | | |
38 | | DEFINE_bool(tserver_heartbeat_metrics_add_drive_data, true, |
39 | | "Add drive data to metrics which tserver sends to master"); |
40 | | |
41 | | DECLARE_uint64(rocksdb_max_file_size_for_compaction); |
42 | | |
43 | | using namespace std::literals; |
44 | | |
45 | | namespace yb { |
46 | | namespace tserver { |
47 | | |
48 | | TServerMetricsHeartbeatDataProvider::TServerMetricsHeartbeatDataProvider(TabletServer* server) : |
49 | | PeriodicalHeartbeatDataProvider(server, |
50 | | MonoDelta::FromMilliseconds(FLAGS_tserver_heartbeat_metrics_interval_ms)), |
51 | 8.74k | start_time_(MonoTime::Now()) {} |
52 | | |
53 | | void TServerMetricsHeartbeatDataProvider::DoAddData( |
54 | 1.07M | const master::TSHeartbeatResponsePB& last_resp, master::TSHeartbeatRequestPB* req) { |
55 | | // Get the total memory used. |
56 | 1.07M | size_t mem_usage = MemTracker::GetRootTracker()->GetUpdatedConsumption(true /* force */); |
57 | 1.07M | auto* metrics = req->mutable_metrics(); |
58 | 1.07M | metrics->set_total_ram_usage(static_cast<int64_t>(mem_usage)); |
59 | 1.07M | VLOG_WITH_PREFIX1 (4) << "Total Memory Usage: " << mem_usage1 ; |
60 | | |
61 | 1.07M | uint64_t total_file_sizes = 0; |
62 | 1.07M | uint64_t uncompressed_file_sizes = 0; |
63 | 1.07M | uint64_t num_files = 0; |
64 | | |
65 | 1.07M | bool no_full_tablet_report = !req->has_tablet_report() || req->tablet_report().is_incremental()1.07M ; |
66 | 1.07M | bool should_add_tablet_data = |
67 | 1.07M | FLAGS_tserver_heartbeat_metrics_add_drive_data && no_full_tablet_report1.07M ; |
68 | | |
69 | | |
70 | 2.46M | for (const auto& tablet_peer : server().tablet_manager()->GetTabletPeers()) { |
71 | 2.46M | if (tablet_peer) { |
72 | 2.46M | auto tablet = tablet_peer->shared_tablet(); |
73 | 2.46M | if (tablet) { |
74 | 2.35M | auto sizes = tablet->GetCurrentVersionSstFilesAllSizes(); |
75 | 2.35M | total_file_sizes += sizes.first; |
76 | 2.35M | uncompressed_file_sizes += sizes.second; |
77 | 2.35M | num_files += tablet->GetCurrentVersionNumSSTFiles(); |
78 | 2.35M | if (should_add_tablet_data && tablet_peer->log_available()2.35M && |
79 | 2.35M | tablet_peer->tablet_metadata()->tablet_data_state() == |
80 | 2.35M | tablet::TabletDataState::TABLET_DATA_READY) { |
81 | 2.35M | auto tablet_metadata = req->add_storage_metadata(); |
82 | 2.35M | tablet_metadata->set_tablet_id(tablet_peer->tablet_id()); |
83 | 2.35M | tablet_metadata->set_sst_file_size(sizes.first); |
84 | 2.35M | tablet_metadata->set_wal_file_size(tablet_peer->log()->OnDiskSize()); |
85 | 2.35M | tablet_metadata->set_uncompressed_sst_file_size(sizes.second); |
86 | 2.35M | tablet_metadata->set_may_have_orphaned_post_split_data( |
87 | 2.35M | tablet->MayHaveOrphanedPostSplitData()); |
88 | 2.35M | } |
89 | 2.35M | } |
90 | 2.46M | } |
91 | 2.46M | } |
92 | 1.07M | metrics->set_total_sst_file_size(total_file_sizes); |
93 | 1.07M | metrics->set_uncompressed_sst_file_size(uncompressed_file_sizes); |
94 | 1.07M | metrics->set_num_sst_files(num_files); |
95 | | |
96 | | // Get the total number of read and write operations. |
97 | 1.07M | auto reads_hist = server().GetMetricsHistogram( |
98 | 1.07M | TabletServerServiceRpcMethodIndexes::kRead); |
99 | 1.07M | uint64_t num_reads = (reads_hist != nullptr) ? reads_hist->TotalCount()1.07M : 06 ; |
100 | | |
101 | 1.07M | auto writes_hist = server().GetMetricsHistogram( |
102 | 1.07M | TabletServerServiceRpcMethodIndexes::kWrite); |
103 | 1.07M | uint64_t num_writes = (writes_hist != nullptr) ? writes_hist->TotalCount()1.07M : 06 ; |
104 | | |
105 | | // Calculate the read and write ops per second. |
106 | 1.07M | MonoDelta diff = CoarseMonoClock::Now() - prev_run_time(); |
107 | 1.07M | double_t div = diff.ToSeconds(); |
108 | | |
109 | 1.07M | double rops_per_sec = (div > 0 && num_reads > 01.07M ) ? |
110 | 1.05M | (static_cast<double>(num_reads - prev_reads_) / div)14.9k : 0; |
111 | | |
112 | 1.07M | double wops_per_sec = (div > 0 && num_writes > 01.07M ) ? |
113 | 945k | (static_cast<double>(num_writes - prev_writes_) / div)124k : 0; |
114 | | |
115 | 1.07M | prev_reads_ = num_reads; |
116 | 1.07M | prev_writes_ = num_writes; |
117 | 1.07M | metrics->set_read_ops_per_sec(rops_per_sec); |
118 | 1.07M | metrics->set_write_ops_per_sec(wops_per_sec); |
119 | 1.07M | uint64_t uptime_seconds = CalculateUptime(); |
120 | | |
121 | 1.07M | metrics->set_uptime_seconds(uptime_seconds); |
122 | | // If the "max file size for compaction" flag is greater than 0, then tablet splitting should |
123 | | // be disabled for tablets with a default TTL. |
124 | 1.07M | metrics->set_disable_tablet_split_if_default_ttl(FLAGS_rocksdb_max_file_size_for_compaction > 0); |
125 | | |
126 | 1.07M | VLOG_WITH_PREFIX6 (4) << "Read Ops per second: " << rops_per_sec6 ; |
127 | 1.07M | VLOG_WITH_PREFIX6 (4) << "Write Ops per second: " << wops_per_sec6 ; |
128 | 1.07M | VLOG_WITH_PREFIX6 (4) << "Total SST File Sizes: "<< total_file_sizes6 ; |
129 | 1.07M | VLOG_WITH_PREFIX6 (4) << "Uptime seconds: "<< uptime_seconds6 ; |
130 | | |
131 | 1.07M | if (FLAGS_tserver_heartbeat_metrics_add_drive_data) { |
132 | 1.08M | for (const std::string& path : server().fs_manager()->GetFsRootDirs()) { |
133 | 1.08M | auto stat = server().GetEnv()->GetFilesystemStatsBytes(path.c_str()); |
134 | 1.08M | if (!stat.ok()) { |
135 | 873k | continue; |
136 | 873k | } |
137 | 214k | auto* path_metric = metrics->add_path_metrics(); |
138 | 214k | path_metric->set_path_id(path); |
139 | 214k | path_metric->set_used_space(stat->used_space); |
140 | 214k | path_metric->set_total_space(stat->total_space); |
141 | 214k | } |
142 | 1.07M | } |
143 | 1.07M | } |
144 | | |
145 | 1.07M | uint64_t TServerMetricsHeartbeatDataProvider::CalculateUptime() { |
146 | 1.07M | MonoDelta delta = MonoTime::Now().GetDeltaSince(start_time_); |
147 | 1.07M | uint64_t uptime_seconds = static_cast<uint64_t>(delta.ToSeconds()); |
148 | 1.07M | return uptime_seconds; |
149 | 1.07M | } |
150 | | |
151 | | |
152 | | } // namespace tserver |
153 | | } // namespace yb |