blob: bc6500de7678e48dbd87130f36f629078f5130c2 [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.
#ifndef SRC_DEVELOPER_FORENSICS_UTILS_COBALT_METRICS_H_
#define SRC_DEVELOPER_FORENSICS_UTILS_COBALT_METRICS_H_
#include "src/developer/forensics/utils/cobalt/metrics_registry.cb.h"
namespace forensics {
namespace cobalt {
constexpr auto kProjectId = cobalt_registry::kProjectId;
constexpr auto kInspectBudgetMetricId = cobalt_registry::kMaxInputInspectBudgetMigratedMetricId;
enum class CrashState {
kUnknown = cobalt_registry::CrashMigratedMetricDimensionState::Unknown,
kFiled = cobalt_registry::CrashMigratedMetricDimensionState::Filed,
kUploaded = cobalt_registry::CrashMigratedMetricDimensionState::Uploaded,
kArchived = cobalt_registry::CrashMigratedMetricDimensionState::Archived,
kGarbageCollected = cobalt_registry::CrashMigratedMetricDimensionState::GarbageCollected,
kDropped = cobalt_registry::CrashMigratedMetricDimensionState::Dropped,
kUploadThrottled = cobalt_registry::CrashMigratedMetricDimensionState::UploadThrottled,
kOnDeviceQuotaReached = cobalt_registry::CrashMigratedMetricDimensionState::OnDeviceQuotaReached,
kDeleted = cobalt_registry::CrashMigratedMetricDimensionState::Deleted,
kUploadTimedOut = cobalt_registry::CrashMigratedMetricDimensionState::UploadTimedOut,
};
enum class UploadAttemptState {
kUnknown = cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::Unknown,
kUploadAttempt = cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::UploadAttempt,
kUploaded = cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::Uploaded,
kDeleted = cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::Deleted,
kGarbageCollected =
cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::GarbageCollected,
kUploadThrottled =
cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::UploadThrottled,
kUploadTimedOut =
cobalt_registry::CrashUploadAttemptsMigratedMetricDimensionState::UploadTimedOut,
};
enum class TimedOutData {
kUnknown = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::Unknown,
kSystemLog = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::SystemLog,
kKernelLog = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::KernelLog,
kScreenshot =
cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::Screenshot,
kInspect = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::Inspect,
kChannel = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::Channel,
kProductInfo =
cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::ProductInfo,
kBoardInfo = cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::BoardInfo,
kLastRebootInfo =
cobalt_registry::FeedbackDataCollectionTimeoutMigratedMetricDimensionData::LastRebootInfo,
};
enum class SnapshotGenerationFlow {
kUnknown = cobalt_registry::SnapshotGenerationDurationUsecsMigratedMetricDimensionFlow::Unknown,
kSuccess = cobalt_registry::SnapshotGenerationDurationUsecsMigratedMetricDimensionFlow::Success,
kFailure = cobalt_registry::SnapshotGenerationDurationUsecsMigratedMetricDimensionFlow::Failure,
};
enum class LastRebootReason {
kUnknown = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::Unknown,
kGenericGraceful =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::GenericGraceful,
kGenericUngraceful =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::GenericUngraceful,
kCold = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::Cold,
kBriefPowerLoss = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::BriefPowerLoss,
kBrownout = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::Brownout,
kKernelPanic = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::KernelPanic,
kSystemOutOfMemory =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::SystemOutOfMemory,
kHardwareWatchdogTimeout =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::HardwareWatchdogTimeout,
kSoftwareWatchdogTimeout =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::SoftwareWatchdogTimeout,
kUserRequest = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::UserRequest,
kSystemUpdate = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::SystemUpdate,
kRetrySystemUpdate =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::RetrySystemUpdate,
kZbiSwap = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::ZbiSwap,
kHighTemperature =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::HighTemperature,
kSessionFailure = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::SessionFailure,
kSysmgrFailure = cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::SysmgrFailure,
kFactoryDataReset =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::FactoryDataReset,
kCriticalComponentFailure =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::CriticalComponentFailure,
kRootJobTermination =
cobalt_registry::LastRebootUptimeMigratedMetricDimensionReason::RootJobTermination,
};
enum class RebootReasonWriteResult {
kSuccess =
cobalt_registry::RebootReasonPersistDurationUsecsMigratedMetricDimensionWriteResult::Success,
kFailure =
cobalt_registry::RebootReasonPersistDurationUsecsMigratedMetricDimensionWriteResult::Failure,
};
enum class PreviousBootEncodingVersion {
kUnknown = cobalt_registry::
PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::Unknown,
kV_01 =
cobalt_registry::PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::V01,
kV_02 =
cobalt_registry::PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::V02,
kV_03 =
cobalt_registry::PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::V03,
kV_04 =
cobalt_registry::PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::V04,
kV_05 =
cobalt_registry::PreviousBootLogCompressionRatioMigratedMetricDimensionEncodingVersion::V05,
};
enum class SnapshotVersion {
kUnknown = cobalt_registry::SnapshotSizeMigratedMetricDimensionVersion::Unknown,
kV_01 = cobalt_registry::SnapshotSizeMigratedMetricDimensionVersion::V01,
kV_02 = cobalt_registry::SnapshotSizeMigratedMetricDimensionVersion::V02,
kV_03 = cobalt_registry::SnapshotSizeMigratedMetricDimensionVersion::V03,
};
inline constexpr uint32_t MetricIDForEventCode(const SnapshotVersion version) {
return cobalt_registry::kSnapshotSizeMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const PreviousBootEncodingVersion version) {
return cobalt_registry::kPreviousBootLogCompressionRatioMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const RebootReasonWriteResult write_result) {
return cobalt_registry::kRebootReasonPersistDurationUsecsMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const LastRebootReason reason) {
return cobalt_registry::kLastRebootUptimeMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const SnapshotGenerationFlow snapshot) {
return cobalt_registry::kSnapshotGenerationDurationUsecsMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const TimedOutData data) {
return cobalt_registry::kFeedbackDataCollectionTimeoutMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const CrashState state) {
return cobalt_registry::kCrashMigratedMetricId;
}
inline constexpr uint32_t MetricIDForEventCode(const UploadAttemptState state) {
return cobalt_registry::kCrashUploadAttemptsMigratedMetricId;
}
namespace internal {
// Determines if all passed event code types correspond to the same metric ids.
//
// The base case needs to be provided with a default value to return.
template <typename EventCodeTypeDefault, typename... EventCodeTypes>
struct MetricIDChecker {
static constexpr uint32_t metric_id = MetricIDForEventCode(static_cast<EventCodeTypeDefault>(0));
static constexpr bool all_same = true;
};
// Uses the first event code type as the default for the base case and check if all of the metric
// ids for the event codes in the parameter pack are the same.
template <typename EventCodeTypeDefault, typename EventCodeTypesH, typename... EventCodeTypesT>
struct MetricIDChecker<EventCodeTypeDefault, EventCodeTypesH, EventCodeTypesT...> {
static constexpr uint32_t metric_id = MetricIDForEventCode(static_cast<EventCodeTypesH>(0));
static constexpr bool all_same =
metric_id == MetricIDChecker<EventCodeTypeDefault, EventCodeTypesT...>::metric_id;
};
} // namespace internal
template <typename EventCodeTypesH, typename... EventCodeTypesT>
inline constexpr uint32_t MetricIDForEventCode(const EventCodeTypesH event_code,
const EventCodeTypesT... event_codes_t) {
constexpr internal::MetricIDChecker<EventCodeTypesH, EventCodeTypesH, EventCodeTypesT...> checker;
static_assert(checker.all_same, "All event codes need to have the same metric id");
return checker.metric_id;
}
// Corresponds to |fuchsia::metrics::MetricEventLogger| public methods.
enum class EventType {
kInteger,
kOccurrence,
};
inline constexpr EventType EventTypeForEventCode(const SnapshotVersion version) {
return EventType::kInteger;
}
inline constexpr EventType EventTypeForEventCode(const PreviousBootEncodingVersion version) {
return EventType::kInteger;
}
inline constexpr EventType EventTypeForEventCode(const RebootReasonWriteResult write_result) {
return EventType::kInteger;
}
inline constexpr EventType EventTypeForEventCode(const LastRebootReason reason) {
return EventType::kInteger;
}
inline constexpr EventType EventTypeForEventCode(const SnapshotGenerationFlow snapshot) {
return EventType::kInteger;
}
inline constexpr EventType EventTypeForEventCode(const TimedOutData data) {
return EventType::kOccurrence;
}
inline constexpr EventType EventTypeForEventCode(const CrashState state) {
return EventType::kOccurrence;
}
inline constexpr EventType EventTypeForEventCode(const UploadAttemptState state) {
return EventType::kOccurrence;
}
} // namespace cobalt
} // namespace forensics
#endif // SRC_DEVELOPER_FORENSICS_UTILS_COBALT_METRICS_H_