YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/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