blob: 336434aaa272b1a6c477f549bb71e35d849e704b [file] [log] [blame]
// Copyright 2021 The Chromium 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 COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_STATS_H_
#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_STATS_H_
#include "components/segmentation_platform/internal/execution/model_execution_status.h"
#include "components/segmentation_platform/internal/metadata/metadata_utils.h"
#include "components/segmentation_platform/internal/proto/types.pb.h"
#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
#include "components/segmentation_platform/public/segment_selection_result.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace segmentation_platform::stats {
using proto::SegmentId;
// Keep in sync with AdaptiveToolbarSegmentSwitch in enums.xml.
// Visible for testing.
enum class AdaptiveToolbarSegmentSwitch {
kUnknown = 0,
kNoneToNewTab = 1,
kNoneToShare = 2,
kNoneToVoice = 3,
kNewTabToNone = 4,
kShareToNone = 5,
kVoiceToNone = 6,
kNewTabToShare = 7,
kNewTabToVoice = 8,
kShareToNewTab = 9,
kShareToVoice = 10,
kVoiceToNewTab = 11,
kVoiceToShare = 12,
kMaxValue = kVoiceToShare,
};
// Keep in sync with SegmentationBooleanSegmentSwitch in enums.xml.
// Visible for testing.
enum class BooleanSegmentSwitch {
kUnknown = 0,
kNoneToEnabled = 1,
kEnabledToNone = 2,
kMaxValue = kEnabledToNone,
};
// Returns an UMA display string for the given segment_id.
std::string OptimizationTargetToHistogramVariant(SegmentId segment_id);
// Returns an UMA display string for the given `segmentation_key`.
const char* SegmentationKeyToUmaName(const std::string& segmentation_key);
// Records the score computed for a given segment.
void RecordModelScore(SegmentId segment_id, float score);
// Records the time difference between when a new version of model from
// optimization guide is available and when the model is initialized in the
// client.
void RecordModelUpdateTimeDifference(SegmentId segment_id,
int64_t model_update_time);
// Records the result of segment selection whenever segment selection is
// computed.
void RecordSegmentSelectionComputed(
const std::string& segmentation_key,
SegmentId new_selection,
absl::optional<SegmentId> previous_selection);
// Database Maintenance metrics.
// Records the number of unique signal identifiers that were successfully
// cleaned up.
void RecordMaintenanceCleanupSignalSuccessCount(size_t count);
// Records the result for each compaction attempt for a particular signal type.
void RecordMaintenanceCompactionResult(proto::SignalType signal_type,
bool success);
// Records the number of signal identifiers that were found that we should aim
// to clean up.
void RecordMaintenanceSignalIdentifierCount(size_t count);
// Model Delivery metrics.
// Records whether any incoming ML model had metadata attached that we were able
// to parse.
void RecordModelDeliveryHasMetadata(SegmentId segment_id, bool has_metadata);
// Records the number of tensor features an updated ML model has.
void RecordModelDeliveryMetadataFeatureCount(SegmentId segment_id,
size_t count);
// Records the result of validating the metadata of an incoming ML model.
// Recorded before and after it has been merged with the already stored
// metadata.
void RecordModelDeliveryMetadataValidation(
SegmentId segment_id,
bool processed,
metadata_utils::ValidationResult validation_result);
// Record what type of model metadata we received.
void RecordModelDeliveryReceived(SegmentId segment_id);
// Records the result of attempting to save an updated version of the model
// metadata.
void RecordModelDeliverySaveResult(SegmentId segment_id, bool success);
// Records whether the currently stored segment_id matches the incoming
// segment_id, as these are expected to match.
void RecordModelDeliverySegmentIdMatches(SegmentId segment_id, bool matches);
// Model Execution metrics.
// Records the duration of processing a single ML feature. This only takes into
// account the time it takes to process (aggregate) a feature result, not
// fetching it from the database. It also takes into account filtering any
// enum histograms.
void RecordModelExecutionDurationFeatureProcessing(SegmentId segment_id,
base::TimeDelta duration);
// Records the duration of executing an ML model. This only takes into account
// the time it takes to invoke and wait for a result from the underlying ML
// infrastructure from //components/optimization_guide, and not fetching the
// relevant data from the database.
void RecordModelExecutionDurationModel(SegmentId segment_id,
bool success,
base::TimeDelta duration);
// Records the duration of fetching data for, processing, and executing an ML
// model.
void RecordModelExecutionDurationTotal(SegmentId segment_id,
ModelExecutionStatus status,
base::TimeDelta duration);
// Records the total duration of on-demand segment selection which includes
// running all the models associated with the client and computing result.
void RecordOnDemandSegmentSelectionDuration(
const std::string& segmentation_key,
const SegmentSelectionResult& result,
base::TimeDelta duration);
// Records the result value after successfully executing an ML model.
void RecordModelExecutionResult(SegmentId segment_id, float result);
// Records whether the result value of of executing an ML model was successfully
// saved.
void RecordModelExecutionSaveResult(SegmentId segment_id, bool success);
// Records the final execution status for any ML model execution.
void RecordModelExecutionStatus(SegmentId segment_id,
bool default_provider,
ModelExecutionStatus status);
// Records the percent of features in a tensor that are equal to 0 when the
// segmentation model is executed.
void RecordModelExecutionZeroValuePercent(SegmentId segment_id,
const std::vector<float>& tensor);
// Signal Database metrics.
// Records the number of database entries that were fetched from the database
// during a call to GetSamples. This is not the same as the sample count since
// each database entry can contain multiple samples.
void RecordSignalDatabaseGetSamplesDatabaseEntryCount(size_t count);
// Records the result of fetching data from the database during a call to
// GetSamples.
void RecordSignalDatabaseGetSamplesResult(bool success);
// Records the number of samples that were returned after reading entries from
// the database, during a call to GetSamples. This is not the same as the
// database entry count, since each entry can contain multiple samples.
void RecordSignalDatabaseGetSamplesSampleCount(size_t count);
// Records the number of unique user action and histogram signals that we are
// currently tracking.
void RecordSignalsListeningCount(
const std::set<uint64_t>& user_actions,
const std::set<std::pair<std::string, proto::SignalType>>& histograms);
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Please keep in sync with
// "SegmentationSelectionFailureReason" in
// //tools/metrics/histograms/enums.xml.
enum class SegmentationSelectionFailureReason {
kPlatformDisabled = 0,
kSelectionAvailableInPrefs = 1,
kAtLeastOneSegmentNotReady = 2,
kAtLeastOneSegmentSignalsNotCollected = 3,
kSelectionTtlNotExpired = 4,
kAtLeastOneModelFailedExecution = 5,
kAtLeastOneModelNeedsMoreSignals = 6,
kAtLeastOneModelWithInvalidMetadata = 7,
kFailedToSaveModelResult = 8,
kInvalidSelectionResultInPrefs = 9,
kDBInitFailure = 10,
kAtLeastOneSegmentNotAvailable = 11,
kAtLeastOneSegmentDefaultSignalNotCollected = 12,
kAtLeastOneSegmentDefaultExecFailed = 13,
kAtLeastOneSegmentDefaultMissingMetadata = 14,
kAtLeastOneSegmentTfliteExecFailed = 15,
kMaxValue = kAtLeastOneSegmentTfliteExecFailed
};
// Records the reason for failure or success to compute a segment selection.
void RecordSegmentSelectionFailure(const std::string& segmentation_key,
SegmentationSelectionFailureReason reason);
// Keep in sync with SegmentationPlatformFeatureProcessingError in
// //tools/metrics/histograms/enums.xml.
enum class FeatureProcessingError {
kUkmEngineDisabled = 0,
kUmaValidationError = 1,
kSqlValidationError = 2,
kCustomInputError = 3,
kSqlBindValuesError = 4,
kSqlQueryRunError = 5,
kResultTensorError = 6,
kMaxValue = kResultTensorError,
};
// Return a string display for the given FeatureProcessingError.
std::string FeatureProcessingErrorToString(FeatureProcessingError error);
// Records the type of error encountered during feature processing.
void RecordFeatureProcessingError(SegmentId segment_id,
FeatureProcessingError error);
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Please keep in sync with
// "SegmentationModelAvailability" in //tools/metrics/histograms/enums.xml.
enum class SegmentationModelAvailability {
kModelHandlerCreated = 0,
kModelAvailable = 1,
kMetadataInvalid = 2,
kMaxValue = kMetadataInvalid
};
// Records the availability of segmentation models for each target needed.
void RecordModelAvailability(SegmentId segment_id,
SegmentationModelAvailability availability);
// Records the number of input tensor that's causing a failure to upload
// structured metrics.
void RecordTooManyInputTensors(int tensor_size);
// Analytics events for training data collection. Sync with
// SegmentationPlatformTrainingDataCollectionEvent in enums.xml.
enum class TrainingDataCollectionEvent {
kImmediateCollectionStart = 0,
kImmediateCollectionSuccess = 1,
kModelInfoMissing = 2,
kMetadataValidationFailed = 3,
kGetInputTensorsFailed = 4,
kNotEnoughCollectionTime = 5,
kUkmReportingFailed = 6,
kPartialDataNotAllowed = 7,
kContinousCollectionStart = 8,
kContinousCollectionSuccess = 9,
kMaxValue = kContinousCollectionSuccess,
};
// Records analytics for training data collection.
void RecordTrainingDataCollectionEvent(SegmentId segment_id,
TrainingDataCollectionEvent event);
} // namespace segmentation_platform::stats
#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_STATS_H_