YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/src/yb/util/metrics_writer.h
Line
Count
Source (jump to first uncovered line)
1
//
2
// Copyright (c) YugaByte, Inc.
3
//
4
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
// in compliance with the License.  You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software distributed under the License
10
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
// or implied.  See the License for the specific language governing permissions and limitations
12
// under the License.
13
//
14
//
15
16
#ifndef YB_UTIL_METRICS_WRITER_H
17
#define YB_UTIL_METRICS_WRITER_H
18
19
#include <map>
20
21
#include "yb/util/metric_entity.h"
22
23
namespace yb {
24
25
class PrometheusWriter {
26
 public:
27
  explicit PrometheusWriter(std::stringstream* output);
28
29
  virtual ~PrometheusWriter();
30
31
  // Write to the a single metric entry for non-table level metrics.
32
  template <typename T>
33
  CHECKED_STATUS WriteSingleEntryNonTable(
34
0
      const MetricEntity::AttributeMap& attr, const std::string& name, const T& value) {
35
0
    auto it = attr.find("table_id");
36
0
    if (it != attr.end()) {
37
0
      return STATUS(
38
0
          InvalidArgument, "Expect no table_id in attr argument when calling this function.");
39
0
    }
40
41
0
    RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
42
0
    return Status::OK();
43
0
  }
Unexecuted instantiation: yb::Status yb::PrometheusWriter::WriteSingleEntryNonTable<int>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int const&)
Unexecuted instantiation: yb::Status yb::PrometheusWriter::WriteSingleEntryNonTable<unsigned long long>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long long const&)
44
45
  template<typename T>
46
  CHECKED_STATUS WriteSingleEntry(
47
      const MetricEntity::AttributeMap& attr, const std::string& name, const T& value,
48
84.0k
      AggregationFunction aggregation_function) {
49
84.0k
    auto it = attr.find("table_id");
50
84.0k
    if (it != attr.end()) {
51
      // For tablet level metrics, we roll up on the table level.
52
25.6k
      if (per_table_attributes_.find(it->second) == per_table_attributes_.end()) {
53
        // If it's the first time we see this table, create the aggregate structures.
54
37
        per_table_attributes_[it->second] = attr;
55
37
        per_table_values_[it->second][name] = value;
56
25.6k
      } else {
57
25.6k
        switch (aggregation_function) {
58
25.4k
          case kSum:
59
25.4k
            per_table_values_[it->second][name] += value;
60
25.4k
            break;
61
181
          case kMax:
62
            // If we have a new max, also update the metadata so that it matches correctly.
63
181
            if (static_cast<double>(value) > per_table_values_[it->second][name]) {
64
25
              per_table_attributes_[it->second] = attr;
65
25
              per_table_values_[it->second][name] = value;
66
25
            }
67
181
            break;
68
0
          default:
69
0
            InvalidAggregationFunction(aggregation_function);
70
0
            break;
71
25.6k
        }
72
25.6k
      }
73
58.4k
    } else {
74
      // For non-tablet level metrics, export them directly.
75
58.4k
      RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
76
58.4k
    }
77
84.0k
    return Status::OK();
78
84.0k
  }
yb::Status yb::PrometheusWriter::WriteSingleEntry<unsigned long long>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long long const&, yb::AggregationFunction)
Line
Count
Source
48
53.4k
      AggregationFunction aggregation_function) {
49
53.4k
    auto it = attr.find("table_id");
50
53.4k
    if (it != attr.end()) {
51
      // For tablet level metrics, we roll up on the table level.
52
19.9k
      if (per_table_attributes_.find(it->second) == per_table_attributes_.end()) {
53
        // If it's the first time we see this table, create the aggregate structures.
54
27
        per_table_attributes_[it->second] = attr;
55
27
        per_table_values_[it->second][name] = value;
56
19.9k
      } else {
57
19.9k
        switch (aggregation_function) {
58
19.9k
          case kSum:
59
19.9k
            per_table_values_[it->second][name] += value;
60
19.9k
            break;
61
0
          case kMax:
62
            // If we have a new max, also update the metadata so that it matches correctly.
63
0
            if (static_cast<double>(value) > per_table_values_[it->second][name]) {
64
0
              per_table_attributes_[it->second] = attr;
65
0
              per_table_values_[it->second][name] = value;
66
0
            }
67
0
            break;
68
0
          default:
69
0
            InvalidAggregationFunction(aggregation_function);
70
0
            break;
71
19.9k
        }
72
19.9k
      }
73
33.4k
    } else {
74
      // For non-tablet level metrics, export them directly.
75
33.4k
      RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
76
33.4k
    }
77
53.4k
    return Status::OK();
78
53.4k
  }
yb::Status yb::PrometheusWriter::WriteSingleEntry<long long>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, long long const&, yb::AggregationFunction)
Line
Count
Source
48
25.5k
      AggregationFunction aggregation_function) {
49
25.5k
    auto it = attr.find("table_id");
50
25.5k
    if (it != attr.end()) {
51
      // For tablet level metrics, we roll up on the table level.
52
5.67k
      if (per_table_attributes_.find(it->second) == per_table_attributes_.end()) {
53
        // If it's the first time we see this table, create the aggregate structures.
54
10
        per_table_attributes_[it->second] = attr;
55
10
        per_table_values_[it->second][name] = value;
56
5.66k
      } else {
57
5.66k
        switch (aggregation_function) {
58
5.48k
          case kSum:
59
5.48k
            per_table_values_[it->second][name] += value;
60
5.48k
            break;
61
181
          case kMax:
62
            // If we have a new max, also update the metadata so that it matches correctly.
63
181
            if (static_cast<double>(value) > per_table_values_[it->second][name]) {
64
25
              per_table_attributes_[it->second] = attr;
65
25
              per_table_values_[it->second][name] = value;
66
25
            }
67
181
            break;
68
0
          default:
69
0
            InvalidAggregationFunction(aggregation_function);
70
0
            break;
71
5.66k
        }
72
5.66k
      }
73
19.9k
    } else {
74
      // For non-tablet level metrics, export them directly.
75
19.9k
      RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
76
19.9k
    }
77
25.5k
    return Status::OK();
78
25.5k
  }
yb::Status yb::PrometheusWriter::WriteSingleEntry<unsigned int>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int const&, yb::AggregationFunction)
Line
Count
Source
48
91
      AggregationFunction aggregation_function) {
49
91
    auto it = attr.find("table_id");
50
91
    if (it != attr.end()) {
51
      // For tablet level metrics, we roll up on the table level.
52
37
      if (per_table_attributes_.find(it->second) == per_table_attributes_.end()) {
53
        // If it's the first time we see this table, create the aggregate structures.
54
0
        per_table_attributes_[it->second] = attr;
55
0
        per_table_values_[it->second][name] = value;
56
37
      } else {
57
37
        switch (aggregation_function) {
58
37
          case kSum:
59
37
            per_table_values_[it->second][name] += value;
60
37
            break;
61
0
          case kMax:
62
            // If we have a new max, also update the metadata so that it matches correctly.
63
0
            if (static_cast<double>(value) > per_table_values_[it->second][name]) {
64
0
              per_table_attributes_[it->second] = attr;
65
0
              per_table_values_[it->second][name] = value;
66
0
            }
67
0
            break;
68
0
          default:
69
0
            InvalidAggregationFunction(aggregation_function);
70
0
            break;
71
37
        }
72
37
      }
73
54
    } else {
74
      // For non-tablet level metrics, export them directly.
75
54
      RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
76
54
    }
77
91
    return Status::OK();
78
91
  }
Unexecuted instantiation: yb::Status yb::PrometheusWriter::WriteSingleEntry<std::__1::atomic<unsigned long long> >(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::atomic<unsigned long long> const&, yb::AggregationFunction)
yb::Status yb::PrometheusWriter::WriteSingleEntry<double>(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, double const&, yb::AggregationFunction)
Line
Count
Source
48
4.98k
      AggregationFunction aggregation_function) {
49
4.98k
    auto it = attr.find("table_id");
50
4.98k
    if (it != attr.end()) {
51
      // For tablet level metrics, we roll up on the table level.
52
0
      if (per_table_attributes_.find(it->second) == per_table_attributes_.end()) {
53
        // If it's the first time we see this table, create the aggregate structures.
54
0
        per_table_attributes_[it->second] = attr;
55
0
        per_table_values_[it->second][name] = value;
56
0
      } else {
57
0
        switch (aggregation_function) {
58
0
          case kSum:
59
0
            per_table_values_[it->second][name] += value;
60
0
            break;
61
0
          case kMax:
62
            // If we have a new max, also update the metadata so that it matches correctly.
63
0
            if (static_cast<double>(value) > per_table_values_[it->second][name]) {
64
0
              per_table_attributes_[it->second] = attr;
65
0
              per_table_values_[it->second][name] = value;
66
0
            }
67
0
            break;
68
0
          default:
69
0
            InvalidAggregationFunction(aggregation_function);
70
0
            break;
71
0
        }
72
0
      }
73
4.98k
    } else {
74
      // For non-tablet level metrics, export them directly.
75
4.98k
      RETURN_NOT_OK(FlushSingleEntry(attr, name, value));
76
4.98k
    }
77
4.98k
    return Status::OK();
78
4.98k
  }
79
80
  CHECKED_STATUS FlushAggregatedValues(const uint32_t& max_tables_metrics_breakdowns,
81
                                       std::string priority_regex);
82
83
 private:
84
  friend class MetricsTest;
85
  // FlushSingleEntry() was a function template with type of "value" as template
86
  // var T. To allow NMSWriter to override FlushSingleEntry(), the type of "value"
87
  // has been instantiated to int64_t.
88
  virtual CHECKED_STATUS FlushSingleEntry(const MetricEntity::AttributeMap& attr,
89
                                          const std::string& name, const int64_t& value);
90
91
  void InvalidAggregationFunction(AggregationFunction aggregation_function);
92
93
  // Map from table_id to attributes
94
  std::map<std::string, MetricEntity::AttributeMap> per_table_attributes_;
95
  // Map from table_id to map of metric_name to value
96
  std::map<std::string, std::map<std::string, double>> per_table_values_;
97
  // Output stream
98
  std::stringstream* output_;
99
  // Timestamp for all metrics belonging to this writer instance.
100
  int64_t timestamp_;
101
};
102
103
// Native Metrics Storage Writer - writes prometheus metrics into system table.
104
class NMSWriter : public PrometheusWriter {
105
 public:
106
  typedef std::unordered_map<std::string, int64_t> MetricsMap;
107
  typedef std::unordered_map<std::string, MetricsMap> EntityMetricsMap;
108
109
  explicit NMSWriter(EntityMetricsMap* table_metrics, MetricsMap* server_metrics);
110
111
 private:
112
  CHECKED_STATUS FlushSingleEntry(
113
      const MetricEntity::AttributeMap& attr, const std::string& name,
114
      const int64_t& value) override;
115
116
  // Output
117
  // Map from table_id to map of metric_name to value
118
  EntityMetricsMap* table_metrics_;
119
  // Map from metric_name to value
120
  MetricsMap* server_metrics_;
121
};
122
123
} // namespace yb
124
125
#endif // YB_UTIL_METRICS_WRITER_H