blob: 444d9252b1db9912b505e54d4769d9b5c08576da [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/utils/cobalt/event.h"
#include "src/lib/fxl/strings/string_printf.h"
namespace forensics {
namespace cobalt {
using fxl::StringPrintf;
bool operator==(const Event& lhs, const Event& rhs) {
if (lhs.type != rhs.type) {
return false;
}
if (lhs.metric_id != rhs.metric_id) {
return false;
}
if (lhs.type != EventType::kMultidimensionalEvent && lhs.dimensions[0] != rhs.dimensions[0]) {
return false;
}
switch (lhs.type) {
// If the event is an occurrence event then the count/usecs_elapsed field isn't relevant.
case EventType::kOccurrence:
return true;
case EventType::kCount:
return lhs.count == rhs.count;
case EventType::kTimeElapsed:
return lhs.usecs_elapsed == rhs.usecs_elapsed;
case EventType::kMultidimensionalEvent:
std::vector lhs_events = lhs.dimensions;
std::vector rhs_events = rhs.dimensions;
std::sort(lhs_events.begin(), lhs_events.end());
std::sort(rhs_events.begin(), rhs_events.end());
return lhs_events == rhs_events;
}
}
std::ostream& operator<<(std::ostream& os, const Event& event) { return os << event.ToString(); }
std::string Event::ToString() const {
switch (type) {
case EventType::kOccurrence:
return fxl::StringPrintf("{type: occurrence, metric_id: %u, dimension: %u}", metric_id,
dimensions[0]);
case EventType::kCount:
return fxl::StringPrintf("{type: count, metric_id: %u, dimension: %u, count: %lu}", metric_id,
dimensions[0], count);
case EventType::kTimeElapsed:
return fxl::StringPrintf(
"{type: time elapsed, metric_id: %u, dimension: %u, usecs elapsed: %lu}", metric_id,
dimensions[0], usecs_elapsed);
case EventType::kMultidimensionalEvent:
std::string dimensions_str;
for (const auto& dimension : dimensions) {
dimensions_str += fxl::StringPrintf("%u, ", dimension);
}
dimensions_str = dimensions_str.substr(0, dimensions_str.size() - 2);
return fxl::StringPrintf(
"{type: multi-dimensional occurrence, metric_id: %u, dimensions: [%s]}", metric_id,
dimensions_str.c_str());
}
}
} // namespace cobalt
} // namespace forensics