File: connection_info_metrics_logger.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (133 lines) | stat: -rw-r--r-- 4,658 bytes parent folder | download | duplicates (6)
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
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_ASH_COMPONENTS_NETWORK_METRICS_CONNECTION_INFO_METRICS_LOGGER_H_
#define CHROMEOS_ASH_COMPONENTS_NETWORK_METRICS_CONNECTION_INFO_METRICS_LOGGER_H_

#include <optional>

#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "chromeos/ash/components/network/network_connection_observer.h"
#include "chromeos/ash/components/network/network_state_handler_observer.h"

namespace ash {

class NetworkConnectionHandler;
class NetworkState;
class NetworkStateHandler;

// Class for tracking general connection information about networks.
//
// This class adds observers on network state and makes the following
// measurements on all networks:
// 1. Success rate of all connection attempts.
// 2. Success rate of user initiated connection attempts.
// 3. Connected states and non-user initiated disconnections.
//
// Note: This class does not start logging metrics until Init() is
// invoked.
class COMPONENT_EXPORT(CHROMEOS_NETWORK) ConnectionInfoMetricsLogger
    : public NetworkStateHandlerObserver,
      public NetworkConnectionObserver {
 public:
  class Observer : public base::CheckedObserver {
   public:
    ~Observer() override = default;

    // Invoked when a connection result finishes, i.e. a network becomes
    // connected from a non-connected state or a network goes from a connecting
    // state to a disconnected state. In the latter situation, |shill_error|
    // will be non-empty.
    virtual void OnConnectionResult(
        const std::string& guid,
        const std::optional<std::string>& shill_error) = 0;
  };

  ConnectionInfoMetricsLogger();
  ConnectionInfoMetricsLogger(const ConnectionInfoMetricsLogger&) = delete;
  ConnectionInfoMetricsLogger& operator=(const ConnectionInfoMetricsLogger&) =
      delete;
  ~ConnectionInfoMetricsLogger() override;

  void Init(NetworkStateHandler* network_state_handler,
            NetworkConnectionHandler* network_connection_handler);

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

 private:
  friend class ConnectionInfoMetricsLoggerTest;

  // Stores connection related information for a network.
  struct ConnectionInfo {
   public:
    enum class Status {
      // The network is not connected, connecting, or disconnecting.
      kDisconnected = 0,

      // The network is being connected to.
      kConnecting = 1,

      // The network is connected.
      kConnected = 2,

      // The network is disconnecting.
      kDisconnecting = 3,

      // The network is in failure state which mapped to the corresponding
      // shill error.
      kFailure = 4,
    };

    explicit ConnectionInfo(const NetworkState* network,
                            bool is_user_initiated);
    ~ConnectionInfo();

    bool operator==(const ConnectionInfo& other) const;

    Status status;
    std::string guid;
    std::string shill_error;
    bool is_user_initiated;
  };

  // NetworkStateHandlerObserver::
  void ConnectToNetworkRequested(const std::string& service_path) override;
  void NetworkListChanged() override;
  void NetworkConnectionStateChanged(const NetworkState* network) override;
  void OnShuttingDown() override;

  // NetworkConnectionObserver::
  void ConnectSucceeded(const std::string& service_path) override;
  void ConnectFailed(const std::string& service_path,
                     const std::string& error_name) override;

  void UpdateConnectionInfo(const NetworkState* network);
  void ConnectionAttemptFinished(const std::optional<ConnectionInfo>& prev_info,
                                 const ConnectionInfo& curr_info) const;
  void AttemptLogConnectionStateResult(
      const std::optional<ConnectionInfo>& prev_info,
      const ConnectionInfo& curr_info) const;
  std::optional<ConnectionInfo> GetCachedInfo(const std::string& guid) const;
  void NotifyConnectionResult(
      const std::string& guid,
      const std::optional<std::string>& shill_error) const;

  raw_ptr<NetworkStateHandler> network_state_handler_ = nullptr;
  raw_ptr<NetworkConnectionHandler> network_connection_handler_ = nullptr;

  NetworkStateHandlerScopedObservation network_state_handler_observer_{this};

  // Stores connection information for all networks.
  base::flat_map<std::string, ConnectionInfo> guid_to_connection_info_;

  base::ObserverList<Observer> observers_;
};

}  // namespace ash

#endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_METRICS_CONNECTION_INFO_METRICS_LOGGER_H_