| // 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::kMaxInputInspectBudgetMetricId; |
| |
| enum class CrashState { |
| kUnknown = cobalt_registry::CrashMetricDimensionState::Unknown, |
| kFiled = cobalt_registry::CrashMetricDimensionState::Filed, |
| kUploaded = cobalt_registry::CrashMetricDimensionState::Uploaded, |
| kArchived = cobalt_registry::CrashMetricDimensionState::Archived, |
| kGarbageCollected = cobalt_registry::CrashMetricDimensionState::GarbageCollected, |
| kDropped = cobalt_registry::CrashMetricDimensionState::Dropped, |
| kUploadThrottled = cobalt_registry::CrashMetricDimensionState::UploadThrottled, |
| kOnDeviceQuotaReached = cobalt_registry::CrashMetricDimensionState::OnDeviceQuotaReached, |
| kDeleted = cobalt_registry::CrashMetricDimensionState::Deleted, |
| }; |
| |
| enum class UploadAttemptState { |
| kUnknown = cobalt_registry::CrashUploadAttemptsMetricDimensionState::Unknown, |
| kUploadAttempt = cobalt_registry::CrashUploadAttemptsMetricDimensionState::UploadAttempt, |
| kUploaded = cobalt_registry::CrashUploadAttemptsMetricDimensionState::Uploaded, |
| kDeleted = cobalt_registry::CrashUploadAttemptsMetricDimensionState::Deleted, |
| kGarbageCollected = cobalt_registry::CrashUploadAttemptsMetricDimensionState::GarbageCollected, |
| kUploadThrottled = cobalt_registry::CrashUploadAttemptsMetricDimensionState::UploadThrottled, |
| }; |
| |
| enum class TimedOutData { |
| kUnknown = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::Unknown, |
| kSystemLog = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::SystemLog, |
| kKernelLog = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::KernelLog, |
| kScreenshot = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::Screenshot, |
| kInspect = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::Inspect, |
| kChannel = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::Channel, |
| kProductInfo = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::ProductInfo, |
| kBoardInfo = cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::BoardInfo, |
| kLastRebootInfo = |
| cobalt_registry::FeedbackDataCollectionTimeoutMetricDimensionData::LastRebootInfo, |
| }; |
| |
| enum class SnapshotGenerationFlow { |
| kUnknown = cobalt_registry::SnapshotGenerationDurationUsecsMetricDimensionFlow::Unknown, |
| kSuccess = cobalt_registry::SnapshotGenerationDurationUsecsMetricDimensionFlow::Success, |
| kFailure = cobalt_registry::SnapshotGenerationDurationUsecsMetricDimensionFlow::Failure, |
| }; |
| |
| enum class LastRebootReason { |
| kUnknown = cobalt_registry::LastRebootUptimeMetricDimensionReason::Unknown, |
| kGenericGraceful = cobalt_registry::LastRebootUptimeMetricDimensionReason::GenericGraceful, |
| kGenericUngraceful = cobalt_registry::LastRebootUptimeMetricDimensionReason::GenericUngraceful, |
| kCold = cobalt_registry::LastRebootUptimeMetricDimensionReason::Cold, |
| kBriefPowerLoss = cobalt_registry::LastRebootUptimeMetricDimensionReason::BriefPowerLoss, |
| kBrownout = cobalt_registry::LastRebootUptimeMetricDimensionReason::Brownout, |
| kKernelPanic = cobalt_registry::LastRebootUptimeMetricDimensionReason::KernelPanic, |
| kSystemOutOfMemory = cobalt_registry::LastRebootUptimeMetricDimensionReason::SystemOutOfMemory, |
| kHardwareWatchdogTimeout = |
| cobalt_registry::LastRebootUptimeMetricDimensionReason::HardwareWatchdogTimeout, |
| kSoftwareWatchdogTimeout = |
| cobalt_registry::LastRebootUptimeMetricDimensionReason::SoftwareWatchdogTimeout, |
| kUserRequest = cobalt_registry::LastRebootUptimeMetricDimensionReason::UserRequest, |
| kSystemUpdate = cobalt_registry::LastRebootUptimeMetricDimensionReason::SystemUpdate, |
| kRetrySystemUpdate = cobalt_registry::LastRebootUptimeMetricDimensionReason::RetrySystemUpdate, |
| kZbiSwap = cobalt_registry::LastRebootUptimeMetricDimensionReason::ZbiSwap, |
| kHighTemperature = cobalt_registry::LastRebootUptimeMetricDimensionReason::HighTemperature, |
| kSessionFailure = cobalt_registry::LastRebootUptimeMetricDimensionReason::SessionFailure, |
| kSysmgrFailure = cobalt_registry::LastRebootUptimeMetricDimensionReason::SysmgrFailure, |
| kFactoryDataReset = cobalt_registry::LastRebootUptimeMetricDimensionReason::FactoryDataReset, |
| kCriticalComponentFailure = |
| cobalt_registry::LastRebootUptimeMetricDimensionReason::CriticalComponentFailure, |
| }; |
| |
| enum class RebootReasonWriteResult { |
| kSuccess = cobalt_registry::RebootReasonPersistDurationUsecsMetricDimensionWriteResult::Success, |
| kFailure = cobalt_registry::RebootReasonPersistDurationUsecsMetricDimensionWriteResult::Failure, |
| }; |
| |
| enum class PreviousBootEncodingVersion { |
| kUnknown = |
| cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::Unknown, |
| kV_01 = cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::V01, |
| kV_02 = cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::V02, |
| kV_03 = cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::V03, |
| kV_04 = cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::V04, |
| kV_05 = cobalt_registry::PreviousBootLogCompressionRatioMetricDimensionEncodingVersion::V05, |
| }; |
| |
| enum class SnapshotVersion { |
| kUnknown = cobalt_registry::SnapshotSizeMetricDimensionVersion::Unknown, |
| kV_01 = cobalt_registry::SnapshotSizeMetricDimensionVersion::V01, |
| kV_02 = cobalt_registry::SnapshotSizeMetricDimensionVersion::V02, |
| kV_03 = cobalt_registry::SnapshotSizeMetricDimensionVersion::V03, |
| }; |
| |
| inline constexpr uint32_t MetricIDForEventCode(const SnapshotVersion version) { |
| return cobalt_registry::kSnapshotSizeMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const PreviousBootEncodingVersion version) { |
| return cobalt_registry::kPreviousBootLogCompressionRatioMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const RebootReasonWriteResult write_result) { |
| return cobalt_registry::kRebootReasonPersistDurationUsecsMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const LastRebootReason reason) { |
| return cobalt_registry::kLastRebootUptimeMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const SnapshotGenerationFlow snapshot) { |
| return cobalt_registry::kSnapshotGenerationDurationUsecsMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const TimedOutData data) { |
| return cobalt_registry::kFeedbackDataCollectionTimeoutMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const CrashState state) { |
| return cobalt_registry::kCrashMetricId; |
| } |
| |
| inline constexpr uint32_t MetricIDForEventCode(const UploadAttemptState state) { |
| return cobalt_registry::kCrashUploadAttemptsMetricId; |
| } |
| |
| 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; |
| } |
| |
| enum class EventType { |
| kOccurrence, |
| kCount, |
| kTimeElapsed, |
| kMultidimensionalEvent, |
| }; |
| |
| inline constexpr EventType EventTypeForEventCode(const SnapshotVersion version) { |
| return EventType::kCount; |
| } |
| |
| inline constexpr EventType EventTypeForEventCode(const PreviousBootEncodingVersion version) { |
| return EventType::kCount; |
| } |
| |
| inline constexpr EventType EventTypeForEventCode(const RebootReasonWriteResult write_result) { |
| return EventType::kTimeElapsed; |
| } |
| |
| inline constexpr EventType EventTypeForEventCode(const LastRebootReason reason) { |
| return EventType::kTimeElapsed; |
| } |
| |
| inline constexpr EventType EventTypeForEventCode(const SnapshotGenerationFlow snapshot) { |
| return EventType::kTimeElapsed; |
| } |
| |
| 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::kCount; |
| } |
| |
| } // namespace cobalt |
| } // namespace forensics |
| |
| #endif // SRC_DEVELOPER_FORENSICS_UTILS_COBALT_METRICS_H_ |