blob: c1b13f3eb9e789b24d91d98a0d4faec1806e2651 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Holds helpers for gathering UMA stats about downloads.
#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_STATS_H_
#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_STATS_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "build/build_config.h"
#include "components/download/public/common/download_content.h"
#include "components/download/public/common/download_danger_type.h"
#include "components/download/public/common/download_export.h"
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/download_source.h"
#include "mojo/public/c/system/types.h"
#include "net/base/network_change_notifier.h"
#include "url/gurl.h"
namespace base {
class FilePath;
class Time;
class TimeDelta;
} // namespace base
namespace download {
// We keep a count of how often various events occur in the
// histogram "Download.Counts".
enum DownloadCountTypes {
// Stale enum values left around so that values passed to UMA don't
// change.
DOWNLOAD_COUNT_UNUSED_0 = 0,
DOWNLOAD_COUNT_UNUSED_1,
DOWNLOAD_COUNT_UNUSED_2,
DOWNLOAD_COUNT_UNUSED_3,
DOWNLOAD_COUNT_UNUSED_4,
// Downloads that made it to DownloadResourceHandler
UNTHROTTLED_COUNT,
// Downloads that actually complete.
COMPLETED_COUNT,
// Downloads that are cancelled before completion (user action or error).
CANCELLED_COUNT,
// Downloads that are started.
START_COUNT,
// Downloads that were interrupted by the OS.
INTERRUPTED_COUNT,
// (Deprecated) Write sizes for downloads.
// This is equal to the number of samples in Download.WriteSize histogram.
DOWNLOAD_COUNT_UNUSED_10,
// (Deprecated) Counts iterations of the BaseFile::AppendDataToFile() loop.
// This is equal to the number of samples in Download.WriteLoopCount
// histogram.
DOWNLOAD_COUNT_UNUSED_11,
// Counts interruptions that happened at the end of the download.
INTERRUPTED_AT_END_COUNT,
// Counts errors due to writes to BaseFiles that have been detached already.
// This can happen when saving web pages as complete packages. It happens
// when we get messages to append data to files that have already finished and
// been detached, but haven't yet been removed from the list of files in
// progress.
APPEND_TO_DETACHED_FILE_COUNT,
// (Deprecated) Counts the number of instances where the downloaded file is
// missing after a successful invocation of ScanAndSaveDownloadedFile().
DOWNLOAD_COUNT_UNUSED_14,
// (Deprecated) Count of downloads with a strong ETag and specified
// 'Accept-Ranges: bytes'.
DOWNLOAD_COUNT_UNUSED_15,
// Count of downloads that didn't have a valid WebContents at the time it was
// interrupted.
INTERRUPTED_WITHOUT_WEBCONTENTS,
// Count of downloads that supplies a strong validator (implying byte-wise
// equivalence) and has a 'Accept-Ranges: bytes' header. These downloads are
// candidates for partial resumption.
STRONG_VALIDATOR_AND_ACCEPTS_RANGES,
// (Deprecated) Count of downloads that uses parallel download requests.
USES_PARALLEL_REQUESTS,
// Count of new downloads.
NEW_DOWNLOAD_COUNT,
// Count of new downloads that are started in normal profile.
NEW_DOWNLOAD_COUNT_NORMAL_PROFILE,
// Downloads that are actually completed in normal profile.
COMPLETED_COUNT_NORMAL_PROFILE,
// Downloads that are completed with a content length mismatch error.
COMPLETED_WITH_CONTENT_LENGTH_MISMATCH_COUNT,
// After a download is interrupted with a content length mismatch error, more
// bytes are received when resuming the download.
MORE_BYTES_RECEIVED_AFTER_CONTENT_LENGTH_MISMATCH_COUNT,
// After a download is interrupted with a content length mismatch error, no
// bytes are received when resuming the download.
NO_BYTES_RECEIVED_AFTER_CONTENT_LENGTH_MISMATCH_COUNT,
// Count of downloads that requested target determination.
DETERMINE_DOWNLOAD_TARGET_COUNT,
// Count of downloads that has target determination completed.
DOWNLOAD_TARGET_DETERMINED_COUNT,
// A cross origin download without a content disposition header.
CROSS_ORIGIN_DOWNLOAD_WITHOUT_CONTENT_DISPOSITION,
// Count of attempts that triggered the download flow, before any network
// requests are sent.
DOWNLOAD_TRIGGERED_COUNT,
// Count of attempts for manual download resumption.
MANUAL_RESUMPTION_COUNT,
// Count of attempts for auto download resumption.
AUTO_RESUMPTION_COUNT,
// Count of download attempts that are dropped due to content settings or
// request limiter before DownloadItem is created.
DOWNLOAD_DROPPED_COUNT,
DOWNLOAD_COUNT_TYPES_LAST_ENTRY
};
// Events for user scheduled downloads. Used in histograms, don't reuse or
// remove items. Keep in sync with DownloadLaterEvent in enums.xml.
enum class DownloadLaterEvent {
// Schedule is added during download target determination process.
kScheduleAdded = 0,
// Scheduled is changed from the UI after download is scheduled.
kScheduleChanged = 1,
// Scheduled is removed during resumption.
kScheduleRemoved = 2,
kMaxValue = kScheduleRemoved
};
// Increment one of the above counts.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadCount(DownloadCountTypes type);
// Record download count with download source.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadCountWithSource(
DownloadCountTypes type,
DownloadSource download_source);
// Record metrics when a new download is started.
COMPONENTS_DOWNLOAD_EXPORT void RecordNewDownloadStarted(
net::NetworkChangeNotifier::ConnectionType connection_type,
DownloadSource download_source);
// Record COMPLETED_COUNT and how long the download took.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadCompleted(
int64_t download_len,
bool is_parallelizable,
net::NetworkChangeNotifier::ConnectionType connection_type,
DownloadSource download_source);
// Record INTERRUPTED_COUNT, |reason|, |received| and |total| bytes.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadInterrupted(
DownloadInterruptReason reason,
int64_t received,
int64_t total,
bool is_parallelizable,
bool is_parallel_download_enabled,
DownloadSource download_source);
// Record a dangerous download accept event.
COMPONENTS_DOWNLOAD_EXPORT void RecordDangerousDownloadAccept(
DownloadDangerType danger_type,
const base::FilePath& file_path);
// Returns the type of download.
COMPONENTS_DOWNLOAD_EXPORT DownloadContent
DownloadContentFromMimeType(const std::string& mime_type_string,
bool record_content_subcategory);
// Records the mime type of the download.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadMimeType(
const std::string& mime_type,
bool is_transient);
// Records the mime type of the download for normal profile.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadMimeTypeForNormalProfile(
const std::string& mime_type,
bool is_transient);
// Record overall bandwidth stats at the file end.
// Does not count in any hash computation or file open/close time.
COMPONENTS_DOWNLOAD_EXPORT void RecordFileBandwidth(
size_t length,
base::TimeDelta elapsed_time);
// Increment one of the count for parallelizable download.
COMPONENTS_DOWNLOAD_EXPORT void RecordParallelizableDownloadCount(
DownloadCountTypes type,
bool is_parallel_download_enabled);
// Record the result of a download file rename.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadFileRenameResultAfterRetry(
base::TimeDelta time_since_first_failure,
DownloadInterruptReason interrupt_reason);
// Enumeration for histogramming purposes.
// These values are written to logs. New enum values can be added, but existing
// enums must never be renumbered or deleted and reused.
enum DownloadConnectionSecurity {
DOWNLOAD_SECURE = 0, // Final download url and its redirects all use https
DOWNLOAD_TARGET_INSECURE =
1, // Final download url uses http, redirects are all
// https
DOWNLOAD_REDIRECT_INSECURE =
2, // Final download url uses https, but at least
// one redirect uses http
DOWNLOAD_REDIRECT_TARGET_INSECURE =
3, // Final download url uses http, and at
// least one redirect uses http
DOWNLOAD_TARGET_OTHER = 4, // Final download url uses a scheme not present in
// this enumeration
DOWNLOAD_TARGET_BLOB = 5, // Final download url uses blob scheme
DOWNLOAD_TARGET_DATA = 6, // Final download url uses data scheme
DOWNLOAD_TARGET_FILE = 7, // Final download url uses file scheme
DOWNLOAD_TARGET_FILESYSTEM = 8, // Final download url uses filesystem scheme
DOWNLOAD_TARGET_FTP = 9, // Final download url uses ftp scheme
DOWNLOAD_CONNECTION_SECURITY_MAX
};
enum class DownloadMetricsCallsite {
// Called from within DownloadItem initialization.
kDownloadItem = 0,
// Called from within MixedContentDownloadBlocking (as part of
// ChromeDownloadManagerDelegate).
kMixContentDownloadBlocking,
};
enum class InputStreamReadError {
// Reading the input stream cause a mojo input argument error.
kInvalidArgument = 0,
// Reading the input stream cause a mojo out of range error.
kOutOfRange = 1,
// Reading the input stream cause a mojo busy error.
kBusy = 2,
kUnknown = 3,
kMaxValue = kUnknown,
};
COMPONENTS_DOWNLOAD_EXPORT DownloadConnectionSecurity
CheckDownloadConnectionSecurity(const GURL& download_url,
const std::vector<GURL>& url_chain);
// Records a download's mime-type and security state. This is a short-lived
// metric recorded in multiple callsites to investigate discrepancies in other
// metrics.
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadValidationMetrics(
DownloadMetricsCallsite callsite,
DownloadConnectionSecurity state,
DownloadContent file_type);
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadConnectionSecurity(
const GURL& download_url,
const std::vector<GURL>& url_chain);
COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadHttpResponseCode(
int response_code,
bool is_background_mode);
// Records the interrupt reason that causes download to restart.
COMPONENTS_DOWNLOAD_EXPORT void RecordResumptionStrongValidators(
DownloadInterruptReason reason);
// TODO(crbug.com/40283525): This is only used for the purposes of tests
// and should be refactored.
COMPONENTS_DOWNLOAD_EXPORT void RecordParallelRequestCreationFailure(
DownloadInterruptReason reason);
COMPONENTS_DOWNLOAD_EXPORT int
GetParallelRequestCreationFailureCountForTesting();
// Records the input stream read error type.
COMPONENTS_DOWNLOAD_EXPORT void RecordInputStreamReadError(
MojoResult mojo_result);
#if BUILDFLAG(IS_ANDROID)
enum class BackgroudTargetDeterminationResultTypes {
// Target determination succeeded.
kSuccess = 0,
// Target path doesn't exist.
kTargetPathMissing = 1,
// Path reservation failed.
kPathReservationFailed = 2,
kMaxValue = kPathReservationFailed
};
COMPONENTS_DOWNLOAD_EXPORT void RecordDuplicatePdfDownloadTriggered(
bool open_inline);
#endif // BUILDFLAG(IS_ANDROID)
} // namespace download
#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_STATS_H_