blob: 5051c2262736e7dc67d9a97607b0022384ed84ff [file] [log] [blame]
// Copyright 2012 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LOGIN_MANAGER_LOGIN_METRICS_H_
#define LOGIN_MANAGER_LOGIN_METRICS_H_
#include <memory>
#include <string>
#include <base/files/file_path.h>
#include <base/time/time.h>
#include <metrics/metrics_library.h>
namespace login_manager {
class CumulativeUseTimeMetric;
class LoginMetrics {
public:
// Do we believe the session exited due to a login crash loop?
// These values are persisted to metrics server. Entries (other than
// NUM_VALUES) should not be renumbered and numeric values should never be
// reused. If you update this enum, also update Chrome's enums.xml.
enum class SessionExitType {
NORMAL_EXIT = 0,
LOGIN_CRASH_LOOP = 1,
NUM_VALUES // Keep last
};
enum AllowedUsersState { ANY_USER_ALLOWED = 0, ONLY_ALLOWLISTED = 1 };
// The result of loading and parsing a policy file. The data is used to
// be sent to metrics server. The metrics doesn't support adding new values
// so this enum must not be extended.
enum PolicyFileState { kGood = 0, kMalformed = 1, kNotPresent = 2 };
// The state of the device ownership according to install attributes. The
// data is used to be sent to metrics server. The metrics doesn't support
// adding new values so this enum must not be extended.
enum OwnershipState {
kConsumer = 0,
kEnterprise = 1,
kLegacyRetail = 2,
kConsumerKiosk = 3,
kOther = 4,
};
enum UserType {
GUEST = 0,
OWNER = 1,
OTHER = 2,
DEV_GUEST = 3,
DEV_OWNER = 4,
DEV_OTHER = 5,
NUM_TYPES = 6
};
enum StateKeyGenerationStatus {
STATE_KEY_STATUS_GENERATION_METHOD_IDENTIFIER_HASH = 0,
STATE_KEY_STATUS_GENERATION_METHOD_HMAC_DEVICE_SECRET = 1,
DEPRECATED_STATE_KEY_STATUS_MISSING_IDENTIFIERS = 2,
STATE_KEY_STATUS_BAD_DEVICE_SECRET = 3,
STATE_KEY_STATUS_HMAC_INIT_FAILURE = 4,
STATE_KEY_STATUS_HMAC_SIGN_FAILURE = 5,
STATE_KEY_STATUS_MISSING_MACHINE_SERIAL_NUMBER = 6,
STATE_KEY_STATUS_MISSING_DISK_SERIAL_NUMBER = 7,
STATE_KEY_STATUS_MISSING_ALL_IDENTIFIERS = 8,
STATE_KEY_STATUS_COUNT // must be last.
};
enum InvalidDevicePolicyFilesStatus {
ALL_VALID = 0,
SOME_INVALID = 1,
ALL_INVALID = 2,
NUM_VALUES = 3
};
enum SwitchToFeatureFlagMappingStatus {
SWITCHES_ABSENT = 0,
SWITCHES_VALID = 1,
SWITCHES_INVALID = 2,
NUM_SWITCHES_STATUSES = 3,
};
// Current state of the browser process at the moment we decide to abort it.
// Includes the standard Linux process states. Also includes an error bucket
// so we can see if LivenessCheckerImpl::GetBrowserState() is failing. Used by
// the "ChromeOS.Liveness.BrowserStateAtTimeout" UMA.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Update Chrome's enums.xml if new
// values are added.
enum class BrowserState {
kRunning = 0, // State: R
kSleeping = 1, // State: S
kUninterruptibleWait = 2, // State: D
kZombie = 3, // State: Z
kTracedOrStopped = 4, // State: T
kUnknown = 5, // Got a State character from status file
// but it wasn't R, S, D, Z, or T
kErrorGettingState = 6, // Failed to read status file from /proc.
kMaxValue = kErrorGettingState // Must be equal to the largest value
};
enum class ArcContinueBootImpulseStatus {
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
kArcContinueBootImpulseStatusSuccess = 0,
kArcContinueBootImpulseStatusFailed = 1,
kArcContinueBootImpulseStatusTimedOut = 2,
kMaxValue = kArcContinueBootImpulseStatusTimedOut
};
// Holds the state of several policy files on disk.
struct DevicePolicyFilesStatus {
public:
// Refers to the state of the file containing the owner key, used to check
// the policy data signature.
PolicyFileState owner_key_file_state;
// Refers to the state of the files containing the device policy. If at
// least one device policy file managed to be read and validated, it's
// good.
PolicyFileState policy_file_state;
// Refers to the device ownership as stated by install attributes.
OwnershipState ownership_state;
};
explicit LoginMetrics(const base::FilePath& per_boot_flag_dir);
LoginMetrics(const LoginMetrics&) = delete;
LoginMetrics& operator=(const LoginMetrics&) = delete;
virtual ~LoginMetrics();
// Sends metric reporting whether the mount namespace creation succeeded or
// failed.
virtual void SendNamespaceCreationResult(bool status);
// Writes a histogram indicating the state key generation method used.
virtual void SendStateKeyGenerationStatus(StateKeyGenerationStatus status);
// Record a stat called |tag| via the bootstat library.
virtual void RecordStats(const char* tag);
// Return true if we have already recorded that Chrome has exec'd.
virtual bool HasRecordedChromeExec();
// Starts tracking cumulative ARC usage time. Should be called when ARC
// container is started.
virtual void StartTrackingArcUseTime();
// Stops tracking cumulative ARC usage time. Should be called when ARC
// container is stopped.
virtual void StopTrackingArcUseTime();
// Submits to UMA the result of invalid policy checks.
virtual void SendInvalidPolicyFilesStatus(
InvalidDevicePolicyFilesStatus result);
// Submits to UMA whether or not the session exited due to a login crash loop.
virtual void SendSessionExitType(SessionExitType session_exit_type);
// Submits to UMA the browser shutdown time of normal exit.
virtual void SendBrowserShutdownTime(base::TimeDelta browser_shutdown_time);
// Submits to UMA the status of the Arc Continue Boot time.
virtual void SendArcContinueBootImpulseStatus(
ArcContinueBootImpulseStatus status);
// Submits to UMA the time to execute continue-arc-boot impulse.
virtual void SendArcContinueBootImpulseTime(
base::TimeDelta arc_continue_boot_impulse_time);
// Submits a UMA sample indicating compatibility feature flag mapping status.
virtual void SendSwitchToFeatureFlagMappingStatus(
SwitchToFeatureFlagMappingStatus status);
// Submits to UMA the time it took for a response to be received after a
// liveness ping was sent.
virtual void SendLivenessPingResponseTime(base::TimeDelta response_time);
// Submits to UMA the liveness ping result.
virtual void SendLivenessPingResult(bool success);
// CrOS events are translated to an enum and reported to the generic
// "Platform.CrOSEvent" enum histogram. The |event| string must be registered
// in metrics/metrics_library.cc:kCrosEventNames.
virtual void ReportCrosEvent(const std::string& event);
// Submits to UMA the state of the device policy, key and device ownership.
virtual void SendDevicePolicyFilesMetrics(DevicePolicyFilesStatus status);
private:
friend class LoginMetricsTest;
friend class UserTypeTest;
// Returns code to send to the metrics library based on the state of
// several policy-related files on disk and device ownership.
static int DevicePolicyStatusCode(const DevicePolicyFilesStatus& status);
// Returns code to send to the metrics library based on the type of user
// (owner, guest or other) and the mode (normal or developer).
static int LoginUserTypeCode(bool dev_mode, bool guest, bool owner);
const base::FilePath per_boot_flag_file_;
MetricsLibrary metrics_lib_;
std::unique_ptr<CumulativeUseTimeMetric> arc_cumulative_use_time_;
};
} // namespace login_manager
#endif // LOGIN_MANAGER_LOGIN_METRICS_H_