xref: /aosp_15_r20/external/cronet/components/metrics/log_store.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_METRICS_LOG_STORE_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_METRICS_LOG_STORE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <optional>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_log.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker namespace metrics {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker // Interface for local storage of serialized logs to be reported.
17*6777b538SAndroid Build Coastguard Worker // It allows consumers to check if there are logs to consume, consume them one
18*6777b538SAndroid Build Coastguard Worker // at a time by staging and discarding logs, and persist/load the whole set.
19*6777b538SAndroid Build Coastguard Worker class LogStore {
20*6777b538SAndroid Build Coastguard Worker  public:
21*6777b538SAndroid Build Coastguard Worker   virtual ~LogStore() = default;
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker   // Returns true if there are any logs waiting to be uploaded.
24*6777b538SAndroid Build Coastguard Worker   virtual bool has_unsent_logs() const = 0;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker   // Returns true if there is a log that needs to be, or is being, uploaded.
27*6777b538SAndroid Build Coastguard Worker   virtual bool has_staged_log() const = 0;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker   // The text of the staged log, as a serialized protobuf.
30*6777b538SAndroid Build Coastguard Worker   // Will trigger a DCHECK if there is no staged log.
31*6777b538SAndroid Build Coastguard Worker   virtual const std::string& staged_log() const = 0;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   // The SHA1 hash of the staged log. This is used to detect log corruption.
34*6777b538SAndroid Build Coastguard Worker   // Will trigger a DCHECK if there is no staged log.
35*6777b538SAndroid Build Coastguard Worker   virtual const std::string& staged_log_hash() const = 0;
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   // The HMAC-SHA256 signature of the staged log. This is used to validate that
38*6777b538SAndroid Build Coastguard Worker   // a log originated from Chrome, and to detect corruption.
39*6777b538SAndroid Build Coastguard Worker   // Will trigger a DCHECK if there is no staged log.
40*6777b538SAndroid Build Coastguard Worker   virtual const std::string& staged_log_signature() const = 0;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   // User id associated with the staged log. Empty if the log was
43*6777b538SAndroid Build Coastguard Worker   // recorded during no particular user session or during guest session.
44*6777b538SAndroid Build Coastguard Worker   //
45*6777b538SAndroid Build Coastguard Worker   // Will trigger a DCHECK if there is no staged log.
46*6777b538SAndroid Build Coastguard Worker   virtual std::optional<uint64_t> staged_log_user_id() const = 0;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // LogMetadata associated with the staged log.
49*6777b538SAndroid Build Coastguard Worker   virtual const LogMetadata staged_log_metadata() const = 0;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   // Populates staged_log() with the next stored log to send.
52*6777b538SAndroid Build Coastguard Worker   // The order in which logs are staged is up to the implementor.
53*6777b538SAndroid Build Coastguard Worker   // The staged_log must remain the same even if additional logs are added.
54*6777b538SAndroid Build Coastguard Worker   // Should only be called if has_unsent_logs() is true.
55*6777b538SAndroid Build Coastguard Worker   virtual void StageNextLog() = 0;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Discards the staged log. |reason| is the reason why the log was discarded
58*6777b538SAndroid Build Coastguard Worker   // (used for debugging through chrome://metrics-internals).
59*6777b538SAndroid Build Coastguard Worker   virtual void DiscardStagedLog(base::StringPiece reason = "") = 0;
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   // Marks the staged log as sent, DiscardStagedLog() shall still be called if
62*6777b538SAndroid Build Coastguard Worker   // the staged log needs discarded.
63*6777b538SAndroid Build Coastguard Worker   virtual void MarkStagedLogAsSent() = 0;
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker   // Trims saved logs and writes them to persistent storage. When
66*6777b538SAndroid Build Coastguard Worker   // |overwrite_in_memory_store| is false, we will still not persist logs that
67*6777b538SAndroid Build Coastguard Worker   // should be trimmed away, but they will still be available in memory
68*6777b538SAndroid Build Coastguard Worker   // (allowing them to still be eligible for upload this session).
69*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/40745324): Revisit call sites and determine what value of
70*6777b538SAndroid Build Coastguard Worker   // |overwrite_in_memory_store| they should use.
71*6777b538SAndroid Build Coastguard Worker   virtual void TrimAndPersistUnsentLogs(bool overwrite_in_memory_store) = 0;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   // Loads unsent logs from persistent storage.
74*6777b538SAndroid Build Coastguard Worker   virtual void LoadPersistedUnsentLogs() = 0;
75*6777b538SAndroid Build Coastguard Worker };
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_METRICS_LOG_STORE_H_
80