blob: ce96c5b5e42b54ff3fb59b512928dd0a8d321054 [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/optimization_guide/proto/models.pb.h"
#include "components/segmentation_platform/internal/database/metadata_utils.h"
#include "components/segmentation_platform/internal/execution/model_execution_status.h"
#include "components/segmentation_platform/internal/proto/types.pb.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
using optimization_guide::proto::OptimizationTarget;
namespace segmentation_platform {
namespace stats {
// 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,
};
// Records the score computed for a given segment.
void RecordModelScore(OptimizationTarget segment_id, float score);
// Records the result of segment selection whenever segment selection is
// computed.
void RecordSegmentSelectionComputed(
const std::string& segmentation_key,
OptimizationTarget new_selection,
absl::optional<OptimizationTarget> 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(OptimizationTarget segment_id,
bool has_metadata);
// Records the number of tensor features an updated ML model has.
void RecordModelDeliveryMetadataFeatureCount(OptimizationTarget 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(
OptimizationTarget segment_id,
bool processed,
metadata_utils::ValidationResult validation_result);
// Record what type of model metadata we received.
void RecordModelDeliveryReceived(OptimizationTarget segment_id);
// Records the result of attempting to save an updated version of the model
// metadata.
void RecordModelDeliverySaveResult(OptimizationTarget segment_id, bool success);
// Records whether the currently stored segment_id matches the incoming
// segment_id, as these are expected to match.
void RecordModelDeliverySegmentIdMatches(OptimizationTarget 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(
OptimizationTarget 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(OptimizationTarget segment_id,
bool success,
base::TimeDelta duration);
// Records the duration of fetching data for, processing, and executing an ML
// model.
void RecordModelExecutionDurationTotal(OptimizationTarget segment_id,
ModelExecutionStatus status,
base::TimeDelta duration);
// Records the result value after successfully executing an ML model.
void RecordModelExecutionResult(OptimizationTarget segment_id, float result);
// Records whether the result value of of executing an ML model was successfully
// saved.
void RecordModelExecutionSaveResult(OptimizationTarget segment_id,
bool success);
// Records the final execution status for any ML model execution.
void RecordModelExecutionStatus(OptimizationTarget segment_id,
ModelExecutionStatus status);
// Records the percent of features in a tensor that are equal to 0 when the
// segmentation model is executed.
void RecordModelExecutionZeroValuePercent(OptimizationTarget 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);
} // namespace stats
} // namespace segmentation_platform
#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_STATS_H_