-
Notifications
You must be signed in to change notification settings - Fork 90
Expand file tree
/
Copy pathoutput_collector_impl.cc
More file actions
65 lines (55 loc) · 2.74 KB
/
output_collector_impl.cc
File metadata and controls
65 lines (55 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "source/client/output_collector_impl.h"
#include <google/protobuf/util/time_util.h>
#include <chrono>
#include <sstream>
#include "external/envoy/source/common/protobuf/utility.h"
#include "source/common/version_info.h"
namespace Nighthawk {
namespace Client {
OutputCollectorImpl::OutputCollectorImpl(Envoy::TimeSource& time_source, const Options& options) {
*(output_.mutable_timestamp()) = Envoy::Protobuf::util::TimeUtil::NanosecondsToTimestamp(
std::chrono::duration_cast<std::chrono::nanoseconds>(
time_source.systemTime().time_since_epoch())
.count());
output_.set_allocated_options(options.toCommandLineOptions().release());
*output_.mutable_version() = VersionInfo::buildVersion();
}
nighthawk::client::Output OutputCollectorImpl::toProto() const { return output_; }
void OutputCollectorImpl::addResult(
absl::string_view name, const std::vector<StatisticPtr>& statistics,
const std::map<std::string, uint64_t>& counters,
const std::chrono::nanoseconds execution_duration,
const absl::optional<Envoy::SystemTime>& first_acquisition_time,
const std::vector<nighthawk::client::UserDefinedOutput>& user_defined_output_results) {
auto result = output_.add_results();
result->set_name(name.data(), name.size());
if (first_acquisition_time.has_value()) {
*(result->mutable_execution_start()) = Envoy::Protobuf::util::TimeUtil::NanosecondsToTimestamp(
std::chrono::duration_cast<std::chrono::nanoseconds>(
first_acquisition_time.value().time_since_epoch())
.count());
}
for (auto& statistic : statistics) {
// TODO(#292): Looking at if the statistic id ends with "_size" to determine how it should be
// serialized is kind of hacky. Maybe we should have a lookup table of sorts, to determine how
// statistics should we serialized. Doing so may give us a canonical place to consolidate their
// ids as well too.
Statistic::SerializationDomain serialization_domain =
absl::EndsWith(statistic->id(), "_size") ? Statistic::SerializationDomain::RAW
: Statistic::SerializationDomain::DURATION;
*(result->add_statistics()) = statistic->toProto(serialization_domain);
}
for (const auto& counter : counters) {
auto new_counters = result->add_counters();
new_counters->set_name(counter.first);
new_counters->set_value(counter.second);
}
*result->mutable_execution_duration() =
Envoy::Protobuf::util::TimeUtil::NanosecondsToDuration(execution_duration.count());
for (const nighthawk::client::UserDefinedOutput& user_defined_result :
user_defined_output_results) {
*result->add_user_defined_outputs() = user_defined_result;
}
}
} // namespace Client
} // namespace Nighthawk