Skip to content

Commit

Permalink
[CrOS Cellular] Add Usage.Count metric for ESIM and modify existing.
Browse files Browse the repository at this point in the history
* Deprecates existing Network.Cellular.Usage.Count metric.
* Adds Network.Cellular.PSim.Usage.Count metric.
* Adds Network.Cellular.ESim.Usage.Count metric.
* See go/cros-cellular-key-metrics for more info.

(cherry picked from commit 6cec687)

Bug: 1183573,1184847
Change-Id: Ie000961f640a7dec3dae9802419c6dc75a5c82be
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2725171
Commit-Queue: Regan Hsu <hsuregan@chromium.org>
Reviewed-by: Azeem Arshad <azeemarshad@chromium.org>
Reviewed-by: Steven Holte <holte@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#859973}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2736760
Reviewed-by: Kyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/branch-heads/4430@{#145}
Cr-Branched-From: e5ce7dc-refs/heads/master@{#857950}
  • Loading branch information
Regan Hsu authored and Chromium LUCI CQ committed Mar 5, 2021
1 parent a22f941 commit 0e598c4
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 27 deletions.
31 changes: 22 additions & 9 deletions chromeos/network/cellular_metrics_logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -293,36 +293,49 @@ void CellularMetricsLogger::CheckForCellularUsageCountMetric() {
network_state_handler_->GetVisibleNetworkListByType(
NetworkTypePattern::NonVirtual(), &network_list);

bool is_cellular_connected = false;
base::Optional<const NetworkState*> connected_cellular_network;
bool is_non_cellular_connected = false;
for (const auto* network : network_list) {
for (auto* network : network_list) {
if (!network->IsConnectedState())
continue;

// Note: Only one cellular network may be ever connected.
if (network->Matches(NetworkTypePattern::Cellular()))
is_cellular_connected = true;
connected_cellular_network = network;
else
is_non_cellular_connected = true;
}

// Discard not-connected states received before the timer runs out.
if (!is_cellular_connected && initialization_timer_.IsRunning())
if (!connected_cellular_network.has_value() &&
initialization_timer_.IsRunning()) {
return;
}

CellularUsage usage;
if (is_cellular_connected) {
base::Optional<SimType> sim_type;
if (connected_cellular_network.has_value()) {
usage = is_non_cellular_connected
? CellularUsage::kConnectedWithOtherNetwork
: CellularUsage::kConnectedAndOnlyNetwork;
sim_type = connected_cellular_network.value()->eid().empty()
? SimType::kPSim
: SimType::kESim;
} else {
usage = CellularUsage::kNotConnected;
}

if (usage == last_cellular_usage_)
return;
last_cellular_usage_ = usage;
if (!sim_type.has_value() || *sim_type == SimType::kPSim) {
if (usage != last_psim_cellular_usage_)
UMA_HISTOGRAM_ENUMERATION("Network.Cellular.PSim.Usage.Count", usage);
last_psim_cellular_usage_ = usage;
}

UMA_HISTOGRAM_ENUMERATION("Network.Cellular.Usage.Count", usage);
if (!sim_type.has_value() || *sim_type == SimType::kESim) {
if (usage != last_esim_cellular_usage_)
UMA_HISTOGRAM_ENUMERATION("Network.Cellular.ESim.Usage.Count", usage);
last_esim_cellular_usage_ = usage;
}
}

CellularMetricsLogger::ConnectionInfo*
Expand Down
12 changes: 12 additions & 0 deletions chromeos/network/cellular_metrics_logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularMetricsLogger
base::Optional<base::TimeTicks> last_connect_start_time;
};

// Cellular network SIM types.
enum class SimType {
kPSim,
kESim,
};

// Usage type for cellular network. These values are persisted to logs.
// Entries should not be renumbered and numberic values should never
// be reused.
Expand Down Expand Up @@ -153,6 +159,12 @@ class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularMetricsLogger
// Tracks the last cellular network usage state.
base::Optional<CellularUsage> last_cellular_usage_;

// Tracks the last PSim cellular network usage state.
base::Optional<CellularUsage> last_psim_cellular_usage_;

// Tracks the last ESim cellular network usage state.
base::Optional<CellularUsage> last_esim_cellular_usage_;

// Tracks whether cellular device is available or not.
bool is_cellular_available_ = false;

Expand Down
93 changes: 75 additions & 18 deletions chromeos/network/cellular_metrics_logger_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ const char kTestCellularServicePath[] = "/service/cellular0";
const char kTestCellularServicePath2[] = "/service/cellular1";
const char kTestEthServicePath[] = "/service/eth0";

const char kUsageCountHistogram[] = "Network.Cellular.Usage.Count";
const char kPSimUsageCountHistogram[] = "Network.Cellular.PSim.Usage.Count";
const char kESimUsageCountHistogram[] = "Network.Cellular.ESim.Usage.Count";

const char kActivationStatusAtLoginHistogram[] =
"Network.Cellular.Activation.StatusAtLogin";
const char kTimeToConnectedHistogram[] =
Expand Down Expand Up @@ -87,6 +89,10 @@ class CellularMetricsLoggerTest : public testing::Test {
service_test->SetServiceProperty(
kTestCellularServicePath2, shill::kActivationStateProperty,
base::Value(shill::kActivationStateNotActivated));

service_test->SetServiceProperty(kTestCellularServicePath2,
shill::kEidProperty,
base::Value("test_eid"));
base::RunLoop().RunUntilIdle();
}

Expand Down Expand Up @@ -130,37 +136,88 @@ TEST_F(CellularMetricsLoggerTest, CellularUsageCountTest) {
service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestOnlineStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectTotalCount(kUsageCountHistogram, 0);
histogram_tester.ExpectTotalCount(kPSimUsageCountHistogram, 0);

task_environment_.FastForwardBy(
CellularMetricsLogger::kInitializationTimeout);
histogram_tester.ExpectBucketCount(
kUsageCountHistogram, CellularMetricsLogger::CellularUsage::kNotConnected,
1);
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 1);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 1);

// Cellular connected with other network.
// PSim Cellular connected with other network.
service_client_test()->SetServiceProperty(
kTestCellularServicePath, shill::kStateProperty, kTestOnlineStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kUsageCountHistogram,
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedWithOtherNetwork, 1);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedWithOtherNetwork, 0);

// Cellular connected as only network.
// PSim Cellular connected as only network.
service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kUsageCountHistogram,
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedAndOnlyNetwork, 1);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedAndOnlyNetwork, 0);

// Cellular not connected.
// PSim Cellular not connected; both ESim and PSim hisograms are emitted to.
service_client_test()->SetServiceProperty(
kTestCellularServicePath, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kUsageCountHistogram, CellularMetricsLogger::CellularUsage::kNotConnected,
2);
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 2);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 1);

// Connect ethernet network.
service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestOnlineStateValue);

// ESim Cellular connected.
service_client_test()->SetServiceProperty(
kTestCellularServicePath2, shill::kStateProperty, kTestOnlineStateValue);

// ESim Cellular connected with other network.
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedWithOtherNetwork, 1);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedWithOtherNetwork, 1);

// ESim Cellular connected as only network.
service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedAndOnlyNetwork, 1);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedAndOnlyNetwork, 1);

// ESim Cellular not connected; both ESim and PSim hisograms are emitted to.
service_client_test()->SetServiceProperty(
kTestCellularServicePath2, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 2);
histogram_tester.ExpectBucketCount(
kESimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 2);
}

TEST_F(CellularMetricsLoggerTest, CellularUsageCountDongleTest) {
Expand All @@ -172,27 +229,27 @@ TEST_F(CellularMetricsLoggerTest, CellularUsageCountDongleTest) {
// Should not log state if no cellular devices are available.
task_environment_.FastForwardBy(
CellularMetricsLogger::kInitializationTimeout);
histogram_tester.ExpectTotalCount(kUsageCountHistogram, 0);
histogram_tester.ExpectTotalCount(kPSimUsageCountHistogram, 0);

service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestOnlineStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectTotalCount(kUsageCountHistogram, 0);
histogram_tester.ExpectTotalCount(kPSimUsageCountHistogram, 0);

// Should log state if a new cellular device is plugged in.
InitCellular();
task_environment_.FastForwardBy(
CellularMetricsLogger::kInitializationTimeout);
histogram_tester.ExpectBucketCount(
kUsageCountHistogram, CellularMetricsLogger::CellularUsage::kNotConnected,
1);
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kNotConnected, 1);

// Should log connected state for cellular device that was plugged in.
service_client_test()->SetServiceProperty(
kTestCellularServicePath, shill::kStateProperty, kTestOnlineStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kUsageCountHistogram,
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedWithOtherNetwork, 1);

// Should log connected as only network state for cellular device
Expand All @@ -201,15 +258,15 @@ TEST_F(CellularMetricsLoggerTest, CellularUsageCountDongleTest) {
kTestEthServicePath, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectBucketCount(
kUsageCountHistogram,
kPSimUsageCountHistogram,
CellularMetricsLogger::CellularUsage::kConnectedAndOnlyNetwork, 1);

// Should not log state if cellular device is unplugged.
RemoveCellular();
service_client_test()->SetServiceProperty(
kTestEthServicePath, shill::kStateProperty, kTestIdleStateValue);
base::RunLoop().RunUntilIdle();
histogram_tester.ExpectTotalCount(kUsageCountHistogram, 3);
histogram_tester.ExpectTotalCount(kPSimUsageCountHistogram, 3);
}

TEST_F(CellularMetricsLoggerTest, CellularActivationStateAtLoginTest) {
Expand Down
24 changes: 24 additions & 0 deletions tools/metrics/histograms/histograms_xml/network/histograms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,32 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</summary>
</histogram>

<histogram name="Network.Cellular.ESim.Usage.Count" enum="NetworkCellularUsage"
expires_after="2022-03-01">
<owner>azeemarshad@chromium.org</owner>
<owner>cros-connectivity@google.com</owner>
<summary>
Tracks the number of times a ESim cellular network is connected as the only
network, or with other network or not connected at all.
</summary>
</histogram>

<histogram name="Network.Cellular.PSim.Usage.Count" enum="NetworkCellularUsage"
expires_after="2022-03-01">
<owner>azeemarshad@chromium.org</owner>
<owner>cros-connectivity@google.com</owner>
<summary>
Tracks the number of times an PSim cellular network is connected as the only
network, or with other network or not connected at all.
</summary>
</histogram>

<histogram name="Network.Cellular.Usage.Count" enum="NetworkCellularUsage"
expires_after="2021-06-30">
<obsolete>
Split into Network.Cellular.PSim.Usage.Count and
Network.Cellular.ESim.Usage.Count on 2/2021 in M91.
</obsolete>
<owner>azeemarshad@chromium.org</owner>
<owner>cros-system-services-networking@google.com</owner>
<summary>
Expand Down

0 comments on commit 0e598c4

Please sign in to comment.