Skip to content

Commit c952ee9

Browse files
cmgracefacebook-github-bot
authored andcommitted
Schematized Monitor part1 - Create MetricInfo in MetricFrameBase
Summary: create metricInfo class that contains the following information of metrics: ``` MetricInfo { metricName: cpu_time handler: TwTaskMetricHanlder.getCPUTime() validation: cpu_time >=0, cpu_time <= cpu_time_limit granularity: second, minute aggregation: p99, p90 inclusion: LST/LSST / cpu_architacture(e.g. COOPER LAKE) / cpu_model(e.g. AMD) / kernel_version exclusion: (same as inclusion) criticality: high/low } *criticality: if high criticality, means when data is missing to a certain level, it should trigger a sev ``` the goal is to optimize data consumability workflow as: {F1983199684} Differential Revision: D85995164
1 parent bcf54da commit c952ee9

2 files changed

Lines changed: 248 additions & 4 deletions

File tree

dynolog/src/metric_frame/MetricFrameBase.cpp

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,131 @@ MetricFrameSlice::MetricFrameSlice(
119119
MetricFrameRange range)
120120
: frame_{frame}, range_{range} {}
121121

122+
// validation rule constructor and methods
123+
ValidationRule::ValidationRule(Type type, double targetValue)
124+
: type_(type), targetValue_(targetValue) {}
125+
126+
ValidationRule ValidationRule::min(double minValue) {
127+
return ValidationRule(Type::MIN, minValue);
128+
}
129+
130+
ValidationRule ValidationRule::max(double maxValue) {
131+
return ValidationRule(Type::MAX, maxValue);
132+
}
133+
134+
ValidationRule ValidationRule::lessThan(double targetValue) {
135+
return ValidationRule(Type::LESS_THAN, targetValue);
136+
}
137+
138+
ValidationRule ValidationRule::greaterThan(double targetValue) {
139+
return ValidationRule(Type::GREATER_THAN, targetValue);
140+
}
141+
142+
bool ValidationRule::validate(double value, ValidationRule validationRule)
143+
const {
144+
auto& type = validationRule.type_;
145+
auto& targetValue = validationRule.targetValue_;
146+
switch (type) {
147+
case Type::MIN:
148+
return value >= targetValue;
149+
150+
case Type::MAX:
151+
return value <= targetValue;
152+
153+
case Type::LESS_THAN:
154+
return value < targetValue;
155+
156+
case Type::GREATER_THAN:
157+
return value > targetValue;
158+
159+
default:
160+
return false;
161+
}
162+
}
163+
164+
// MetricInfo constructor and methods
165+
MetricInfo::MetricInfo(
166+
MetricName metricName,
167+
std::vector<MGranularity> granularities,
168+
std::vector<Aggregation> aggregations,
169+
Aggregation defaultAggregation,
170+
HandlerFunc handler,
171+
std::vector<ValidationRule> validationRules,
172+
std::map<Category, std::vector<std::string>> inclusion,
173+
std::map<Category, std::vector<std::string>> exclusion,
174+
Criticality criticality)
175+
: metricName_(metricName),
176+
granularities_(std::move(granularities)),
177+
aggregations_(std::move(aggregations)),
178+
defaultAggregation_(defaultAggregation),
179+
handler_(std::move(handler)),
180+
validationRules_(std::move(validationRules)),
181+
inclusion_(std::move(inclusion)),
182+
exclusion_(std::move(exclusion)),
183+
criticality_(criticality) {}
184+
185+
const MetricName& MetricInfo::metricName() const {
186+
return metricName_;
187+
}
188+
189+
const std::vector<MGranularity>& MetricInfo::granularities() const {
190+
return granularities_;
191+
}
192+
193+
const std::vector<Aggregation>& MetricInfo::aggregations() const {
194+
return aggregations_;
195+
}
196+
197+
const Aggregation& MetricInfo::defaultAggregation() const {
198+
return defaultAggregation_;
199+
}
200+
201+
HandlerFunc MetricInfo::handler() const {
202+
return handler_;
203+
}
204+
205+
const std::vector<ValidationRule>& MetricInfo::validationRules() const {
206+
return validationRules_;
207+
}
208+
209+
const std::map<Category, std::vector<std::string>>& MetricInfo::inclusion()
210+
const {
211+
return inclusion_;
212+
}
213+
214+
const std::map<Category, std::vector<std::string>>& MetricInfo::exclusion()
215+
const {
216+
return exclusion_;
217+
}
218+
219+
Criticality MetricInfo::criticality() const {
220+
return criticality_;
221+
}
222+
223+
// MetricInfoMap constructor and methods
224+
MetricInfoMap::MetricInfoMap(std::map<MetricName, MetricInfo> metricInfoMap)
225+
: metricInfoMap_(std::move(metricInfoMap)) {}
226+
227+
std::optional<MetricInfo> MetricInfoMap::getMetricInfo(
228+
MetricName metricName) const {
229+
auto it = metricInfoMap_.find(metricName);
230+
if (it != metricInfoMap_.end()) {
231+
return it->second;
232+
}
233+
return std::nullopt;
234+
}
235+
236+
bool MetricInfoMap::contains(MetricName metricName) const {
237+
return metricInfoMap_.find(metricName) != metricInfoMap_.end();
238+
}
239+
240+
const std::map<MetricName, MetricInfo>& MetricInfoMap::getMetricInfoMap()
241+
const {
242+
return metricInfoMap_;
243+
}
244+
245+
void MetricInfoMap::add(MetricName metricName, MetricInfo metricInfo) {
246+
metricInfoMap_.insert_or_assign(metricName, std::move(metricInfo));
247+
}
248+
122249
} // namespace facebook::dynolog

dynolog/src/metric_frame/MetricFrameBase.h

Lines changed: 121 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,30 @@
77

88
#pragma once
99

10-
#include "dynolog/src/metric_frame/MetricFrameTsUnitInterface.h"
11-
#include "dynolog/src/metric_frame/MetricSeries.h"
12-
#include "dynolog/src/metric_frame/TextTable.h"
13-
1410
#include <chrono>
11+
#include <functional>
1512
#include <memory>
13+
#include <optional>
14+
#include <ostream>
1615
#include <string>
1716
#include <variant>
17+
#include <vector>
18+
19+
#include "dyno/if/gen-cpp2/dynolog_schematized_types.h"
20+
#include "dynolog/src/metric_frame/ExtraTypes.h"
21+
#include "dynolog/src/metric_frame/MetricFrameTsUnitInterface.h"
22+
#include "dynolog/src/metric_frame/MetricSeries.h"
23+
#include "dynolog/src/metric_frame/TextTable.h"
1824

1925
namespace facebook::dynolog {
2026

27+
using ::facebook::dynolog_schematized::Aggregation;
28+
using ::facebook::dynolog_schematized::DynoLogSchematizedResponse;
29+
using MGranularity = facebook::dynolog_schematized::Granularity;
30+
using ::facebook::dynolog_schematized::Identifier;
31+
using ::facebook::dynolog_schematized::MetricName;
32+
using ::facebook::dynolog_schematized::Scope;
33+
2134
using SampleVarT = std::variant<int64_t, uint64_t, double, PerfReadValues>;
2235
using MetricSeriesInt64Ptr = std::shared_ptr<MetricSeries<int64_t>>;
2336
using MetricSeriesUint64Ptr = std::shared_ptr<MetricSeries<uint64_t>>;
@@ -216,4 +229,108 @@ class MetricFrameSlice {
216229

217230
std::ostream& operator<<(std::ostream& s, const MetricFrameBase& frame);
218231

232+
// validation rule types
233+
enum class Type {
234+
MIN, // value >= min
235+
MAX, // value <= max
236+
LESS_THAN, // value < target_value
237+
GREATER_THAN, // value > target_value
238+
};
239+
240+
class ValidationRule {
241+
public:
242+
// Validation rule types
243+
explicit ValidationRule(Type type, double targetValue);
244+
245+
// generate a validation rule with min/max range
246+
static ValidationRule min(double minValue);
247+
static ValidationRule max(double maxValue);
248+
static ValidationRule lessThan(double targetValue);
249+
static ValidationRule greaterThan(double targetValue);
250+
251+
// Validate a value against its validation rule
252+
bool validate(double value, ValidationRule validationRule) const;
253+
254+
private:
255+
Type type_;
256+
double targetValue_;
257+
};
258+
259+
using HandlerFunc = std::function<void(
260+
DynoLogSchematizedResponse&,
261+
Identifier&,
262+
Scope,
263+
MGranularity,
264+
Aggregation,
265+
uint64_t)>;
266+
267+
// Criticality levels for metrics
268+
enum class Criticality {
269+
LOW,
270+
HIGH,
271+
};
272+
273+
// Include/exclude category for metrics
274+
enum class Category {
275+
LST,
276+
LSST,
277+
CPU_ARCH,
278+
CPU_MODEL,
279+
KERNEL_VERSION,
280+
};
281+
class MetricInfo {
282+
public:
283+
MetricInfo(
284+
MetricName metricName,
285+
std::vector<MGranularity> granularities,
286+
std::vector<Aggregation> aggregations,
287+
Aggregation defaultAggregation,
288+
HandlerFunc handler,
289+
std::vector<ValidationRule> validationRules,
290+
std::map<Category, std::vector<std::string>> inclusion,
291+
std::map<Category, std::vector<std::string>> exclusion,
292+
Criticality criticality);
293+
virtual ~MetricInfo() = default;
294+
const MetricName& metricName() const;
295+
const std::vector<MGranularity>& granularities() const;
296+
const std::vector<Aggregation>& aggregations() const;
297+
const Aggregation& defaultAggregation() const;
298+
HandlerFunc handler() const;
299+
const std::vector<ValidationRule>& validationRules() const;
300+
const std::map<Category, std::vector<std::string>>& inclusion() const;
301+
const std::map<Category, std::vector<std::string>>& exclusion() const;
302+
Criticality criticality() const;
303+
304+
private:
305+
MetricName metricName_;
306+
std::vector<MGranularity> granularities_;
307+
std::vector<Aggregation> aggregations_;
308+
Aggregation defaultAggregation_;
309+
HandlerFunc handler_;
310+
std::vector<ValidationRule> validationRules_;
311+
std::map<Category, std::vector<std::string>> inclusion_;
312+
std::map<Category, std::vector<std::string>> exclusion_;
313+
Criticality criticality_;
314+
};
315+
316+
class MetricInfoMap {
317+
public:
318+
explicit MetricInfoMap(std::map<MetricName, MetricInfo> metricInfoMap);
319+
320+
// Get the entire map
321+
const std::map<MetricName, MetricInfo>& getMetricInfoMap() const;
322+
323+
// Get MetricInfo for a specific metric name
324+
std::optional<MetricInfo> getMetricInfo(MetricName metricName) const;
325+
326+
// Check if a metric is registered
327+
bool contains(MetricName metricName) const;
328+
329+
// Add or update a MetricInfo
330+
void add(MetricName metricName, MetricInfo metricInfo);
331+
332+
private:
333+
std::map<MetricName, MetricInfo> metricInfoMap_;
334+
};
335+
219336
} // namespace facebook::dynolog

0 commit comments

Comments
 (0)