Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2015 The Chromium Authors |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_RULE_H_ |
| 6 | #define CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_RULE_H_ |
| 7 | |
Siddhartha | 24ef3c47 | 2017-08-22 00:19:20 | [diff] [blame] | 8 | #include <memory> |
Etienne Pierre-doray | 88cce9f | 2024-03-21 01:22:17 | [diff] [blame] | 9 | #include <optional> |
Siddhartha | 24ef3c47 | 2017-08-22 00:19:20 | [diff] [blame] | 10 | |
Etienne Pierre-doray | 840a117 | 2024-03-18 22:57:00 | [diff] [blame] | 11 | #include "base/observer_list_types.h" |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 12 | #include "base/timer/timer.h" |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 13 | #include "content/common/content_export.h" |
| 14 | #include "third_party/perfetto/protos/perfetto/config/chrome/scenario_config.gen.h" |
Siddhartha S | 7d37b8d4 | 2019-06-07 23:53:12 | [diff] [blame] | 15 | #include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h" |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 16 | |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 17 | namespace content { |
| 18 | |
Etienne Pierre-doray | 840a117 | 2024-03-18 22:57:00 | [diff] [blame] | 19 | class CONTENT_EXPORT BackgroundTracingRule : public base::CheckedObserver { |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 20 | public: |
Siddhartha S | 7d37b8d4 | 2019-06-07 23:53:12 | [diff] [blame] | 21 | using MetadataProto = |
| 22 | perfetto::protos::pbzero::BackgroundTracingMetadata::TriggerRule; |
Etienne Pierre-doray | b57b7394 | 2023-03-20 21:34:43 | [diff] [blame] | 23 | // Returns true if the trigger caused a scenario to either begin recording or |
| 24 | // finalize the trace depending on the config. |
| 25 | using RuleTriggeredCallback = |
| 26 | base::RepeatingCallback<bool(const BackgroundTracingRule*)>; |
Siddhartha S | 7d37b8d4 | 2019-06-07 23:53:12 | [diff] [blame] | 27 | |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 28 | BackgroundTracingRule(); |
oysteine | fa00aa0 | 2016-05-18 00:34:14 | [diff] [blame] | 29 | |
Peter Boström | 828b902 | 2021-09-21 02:28:43 | [diff] [blame] | 30 | BackgroundTracingRule(const BackgroundTracingRule&) = delete; |
| 31 | BackgroundTracingRule& operator=(const BackgroundTracingRule&) = delete; |
| 32 | |
Etienne Pierre-doray | 840a117 | 2024-03-18 22:57:00 | [diff] [blame] | 33 | ~BackgroundTracingRule() override; |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 34 | |
Etienne Pierre-doray | b57b7394 | 2023-03-20 21:34:43 | [diff] [blame] | 35 | virtual void Install(RuleTriggeredCallback); |
| 36 | virtual void Uninstall(); |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 37 | virtual perfetto::protos::gen::TriggerRule ToProtoForTesting() const; |
Siddhartha S | 7d37b8d4 | 2019-06-07 23:53:12 | [diff] [blame] | 38 | virtual void GenerateMetadataProto(MetadataProto* out) const; |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 39 | |
oysteine | b6461a2c | 2015-10-30 22:35:49 | [diff] [blame] | 40 | // Probability that we should allow a tigger to happen. |
| 41 | double trigger_chance() const { return trigger_chance_; } |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 42 | std::optional<base::TimeDelta> delay() const { return delay_; } |
oysteine | b6461a2c | 2015-10-30 22:35:49 | [diff] [blame] | 43 | |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 44 | static std::unique_ptr<BackgroundTracingRule> Create( |
| 45 | const perfetto::protos::gen::TriggerRule& config); |
Etienne Pierre-doray | a83afef | 2024-04-17 16:49:38 | [diff] [blame] | 46 | static bool Append( |
| 47 | const std::vector<perfetto::protos::gen::TriggerRule>& configs, |
| 48 | std::vector<std::unique_ptr<BackgroundTracingRule>>& rules); |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 49 | |
Etienne Pierre-doray | cf6f244 | 2024-12-03 18:23:47 | [diff] [blame] | 50 | const std::string& rule_name() const { return rule_name_; } |
Etienne Pierre-doray | 88cce9f | 2024-03-21 01:22:17 | [diff] [blame] | 51 | std::optional<int32_t> triggered_value() const { return triggered_value_; } |
Etienne Pierre-doray | 226632b | 2025-02-11 20:51:21 | [diff] [blame] | 52 | uint64_t flow_id() const { return flow_id_; } |
Stephen Nusko | a30b22e | 2019-08-27 21:10:06 | [diff] [blame] | 53 | |
ssid | 3ae598b | 2020-12-24 22:48:39 | [diff] [blame] | 54 | bool is_crash() const { return is_crash_; } |
| 55 | |
Etienne Pierre-doray | 226632b | 2025-02-11 20:51:21 | [diff] [blame] | 56 | bool OnRuleTriggered(std::optional<int32_t> value, uint64_t flow_id); |
Etienne Pierre-doray | 840a117 | 2024-03-18 22:57:00 | [diff] [blame] | 57 | |
Stephen Nusko | a30b22e | 2019-08-27 21:10:06 | [diff] [blame] | 58 | protected: |
Etienne Pierre-doray | cf6f244 | 2024-12-03 18:23:47 | [diff] [blame] | 59 | virtual std::string GetDefaultRuleName() const; |
Stephen Nusko | a30b22e | 2019-08-27 21:10:06 | [diff] [blame] | 60 | |
Etienne Pierre-doray | b57b7394 | 2023-03-20 21:34:43 | [diff] [blame] | 61 | virtual void DoInstall() = 0; |
| 62 | virtual void DoUninstall() = 0; |
Etienne Pierre-doray | b57b7394 | 2023-03-20 21:34:43 | [diff] [blame] | 63 | |
| 64 | bool installed() const { return installed_; } |
| 65 | |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 66 | private: |
Etienne Pierre-doray | 9f7ba73b | 2023-06-12 18:28:50 | [diff] [blame] | 67 | void Setup(const perfetto::protos::gen::TriggerRule& config); |
Etienne Pierre-doray | 0aff0eb | 2022-12-13 22:36:50 | [diff] [blame] | 68 | |
Etienne Pierre-doray | b57b7394 | 2023-03-20 21:34:43 | [diff] [blame] | 69 | RuleTriggeredCallback trigger_callback_; |
| 70 | bool installed_ = false; |
ssid | 3ae598b | 2020-12-24 22:48:39 | [diff] [blame] | 71 | double trigger_chance_ = 1.0; |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 72 | std::optional<base::TimeDelta> delay_; |
| 73 | std::optional<base::TimeDelta> activation_delay_; |
Etienne Pierre-doray | 6cf25ff | 2023-10-31 16:18:32 | [diff] [blame] | 74 | base::OneShotTimer trigger_timer_; |
| 75 | base::OneShotTimer activation_timer_; |
Etienne Pierre-doray | cf6f244 | 2024-12-03 18:23:47 | [diff] [blame] | 76 | std::string rule_name_; |
Etienne Pierre-doray | 88cce9f | 2024-03-21 01:22:17 | [diff] [blame] | 77 | std::optional<int32_t> triggered_value_; |
Etienne Pierre-doray | 226632b | 2025-02-11 20:51:21 | [diff] [blame] | 78 | uint64_t flow_id_; |
ssid | 3ae598b | 2020-12-24 22:48:39 | [diff] [blame] | 79 | bool is_crash_ = false; |
oysteine | f4ce0b06 | 2015-08-26 01:33:06 | [diff] [blame] | 80 | }; |
| 81 | |
| 82 | } // namespace content |
| 83 | |
| 84 | #endif // CONTENT_BROWSER_TRACING_BACKGROUND_TRACING_RULE_H_ |