1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_METRICS_NET_NETWORK_METRICS_PROVIDER_H_
#define COMPONENTS_METRICS_NET_NETWORK_METRICS_PROVIDER_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_base.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "components/metrics/metrics_provider.h"
#include "net/base/network_interfaces.h"
#include "net/nqe/effective_connection_type.h"
#include "services/network/public/cpp/network_connection_tracker.h"
#include "third_party/metrics_proto/system_profile.pb.h"
namespace metrics {
SystemProfileProto::Network::EffectiveConnectionType
ConvertEffectiveConnectionType(
net::EffectiveConnectionType effective_connection_type);
// Registers as observer with network::NetworkConnectionTracker and keeps track
// of the network environment.
class NetworkMetricsProvider
: public MetricsProvider,
public network::NetworkConnectionTracker::NetworkConnectionObserver {
public:
// Class that provides |this| with the network quality estimator.
class NetworkQualityEstimatorProvider {
public:
NetworkQualityEstimatorProvider(const NetworkQualityEstimatorProvider&) =
delete;
NetworkQualityEstimatorProvider& operator=(
const NetworkQualityEstimatorProvider&) = delete;
virtual ~NetworkQualityEstimatorProvider() {}
// Provides |this| with |callback| that would be invoked by |this| every
// time there is a change in the network quality estimates.
virtual void PostReplyOnNetworkQualityChanged(
base::RepeatingCallback<void(net::EffectiveConnectionType)>
callback) = 0;
protected:
NetworkQualityEstimatorProvider() {}
};
// Creates a NetworkMetricsProvider, where
// |network_quality_estimator_provider| should be set if it is useful to
// attach the quality of the network to the metrics report.
NetworkMetricsProvider(network::NetworkConnectionTrackerAsyncGetter
network_connection_tracker_async_getter,
std::unique_ptr<NetworkQualityEstimatorProvider>
network_quality_estimator_provider = nullptr);
NetworkMetricsProvider(const NetworkMetricsProvider&) = delete;
NetworkMetricsProvider& operator=(const NetworkMetricsProvider&) = delete;
~NetworkMetricsProvider() override;
private:
FRIEND_TEST_ALL_PREFIXES(NetworkMetricsProviderTest, EffectiveConnectionType);
FRIEND_TEST_ALL_PREFIXES(NetworkMetricsProviderTest,
ECTAmbiguousOnConnectionTypeChange);
FRIEND_TEST_ALL_PREFIXES(NetworkMetricsProviderTest,
ECTNotAmbiguousOnUnknownOrOffline);
FRIEND_TEST_ALL_PREFIXES(NetworkMetricsProviderTest,
ConnectionTypeIsAmbiguous);
// MetricsProvider:
void ProvideSystemProfileMetrics(SystemProfileProto* system_profile) override;
// NetworkConnectionObserver:
void OnConnectionChanged(network::mojom::ConnectionType type) override;
SystemProfileProto::Network::ConnectionType GetConnectionType() const;
SystemProfileProto::Network::WifiPHYLayerProtocol GetWifiPHYLayerProtocol()
const;
// Posts a call to net::GetWifiPHYLayerProtocol on the blocking pool.
void ProbeWifiPHYLayerProtocol();
// Callback from the blocking pool with the result of
// net::GetWifiPHYLayerProtocol.
void OnWifiPHYLayerProtocolResult(net::WifiPHYLayerProtocol mode);
void OnEffectiveConnectionTypeChanged(net::EffectiveConnectionType type);
// Used as a callback to be given to NetworkConnectionTracker async getter to
// set the |network_connection_tracker_|.
void SetNetworkConnectionTracker(
network::NetworkConnectionTracker* network_connection_tracker);
// Watches for network connection changes.
// This |network_connection_tracker_| raw pointer is not owned by this class.
// It is obtained from the global |g_network_connection_tracker| pointer in
// //content/public/browser/network_service_instance.cc and points to the same
// object.
raw_ptr<network::NetworkConnectionTracker> network_connection_tracker_;
// True if |connection_type_| changed during the lifetime of the log.
bool connection_type_is_ambiguous_;
// The connection type according to network::NetworkConnectionTracker.
network::mojom::ConnectionType connection_type_;
// True if the network connection tracker has been initialized.
bool network_connection_tracker_initialized_;
// True if |wifi_phy_layer_protocol_| changed during the lifetime of the log.
bool wifi_phy_layer_protocol_is_ambiguous_;
// The PHY mode of the currently associated access point obtained via
// net::GetWifiPHYLayerProtocol.
net::WifiPHYLayerProtocol wifi_phy_layer_protocol_;
// Provides the network quality estimator. May be null.
std::unique_ptr<NetworkQualityEstimatorProvider>
network_quality_estimator_provider_;
// Last known effective connection type.
net::EffectiveConnectionType effective_connection_type_;
// Minimum and maximum effective connection type since the metrics were last
// provided.
net::EffectiveConnectionType min_effective_connection_type_;
net::EffectiveConnectionType max_effective_connection_type_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<NetworkMetricsProvider> weak_ptr_factory_{this};
};
} // namespace metrics
#endif // COMPONENTS_METRICS_NET_NETWORK_METRICS_PROVIDER_H_
|