optimization_guide_logger.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_OPTIMIZATION_GUIDE_LOGGER_H_
  5. #define COMPONENTS_OPTIMIZATION_GUIDE_CORE_OPTIMIZATION_GUIDE_LOGGER_H_
  6. #include <string>
  7. #include "base/containers/circular_deque.h"
  8. #include "base/memory/raw_ptr.h"
  9. #include "base/observer_list.h"
  10. #include "base/observer_list_types.h"
  11. #include "base/time/time.h"
  12. #include "components/optimization_guide/core/optimization_guide_common.mojom.h"
  13. #include "components/optimization_guide/core/optimization_guide_decision.h"
  14. #include "components/optimization_guide/proto/common_types.pb.h"
  15. #include "url/gurl.h"
  16. #define OPTIMIZATION_GUIDE_LOGGER(log_source, optimization_guide_logger) \
  17. OptimizationGuideLogger::LogMessageBuilder(log_source, __FILE__, __LINE__, \
  18. optimization_guide_logger)
  19. // Interface to record the debug logs and send it to be shown in the
  20. // optimization guide internals page.
  21. class OptimizationGuideLogger {
  22. public:
  23. class Observer : public base::CheckedObserver {
  24. public:
  25. virtual void OnLogMessageAdded(
  26. base::Time event_time,
  27. optimization_guide_common::mojom::LogSource log_source,
  28. const std::string& source_file,
  29. int source_line,
  30. const std::string& message) = 0;
  31. };
  32. OptimizationGuideLogger();
  33. ~OptimizationGuideLogger();
  34. OptimizationGuideLogger(const OptimizationGuideLogger&) = delete;
  35. OptimizationGuideLogger& operator=(const OptimizationGuideLogger&) = delete;
  36. void AddObserver(OptimizationGuideLogger::Observer* observer);
  37. void RemoveObserver(OptimizationGuideLogger::Observer* observer);
  38. void OnLogMessageAdded(base::Time event_time,
  39. optimization_guide_common::mojom::LogSource log_source,
  40. const std::string& source_file,
  41. int source_line,
  42. const std::string& message);
  43. // Whether debug logs should allowed to be recorded.
  44. bool ShouldEnableDebugLogs() const;
  45. // Class that builds the log message and used when debugging is enabled via
  46. // command-line switch or the internals page.
  47. class LogMessageBuilder {
  48. public:
  49. LogMessageBuilder(optimization_guide_common::mojom::LogSource log_source,
  50. const std::string& source_file,
  51. int source_line,
  52. OptimizationGuideLogger* optimization_guide_logger);
  53. ~LogMessageBuilder();
  54. LogMessageBuilder& operator<<(const char* message);
  55. LogMessageBuilder& operator<<(const std::string& message);
  56. LogMessageBuilder& operator<<(const GURL& url);
  57. LogMessageBuilder& operator<<(
  58. optimization_guide::proto::RequestContext request_context);
  59. LogMessageBuilder& operator<<(
  60. optimization_guide::proto::OptimizationType optimization_type);
  61. LogMessageBuilder& operator<<(optimization_guide::OptimizationTypeDecision
  62. optimization_type_decision);
  63. LogMessageBuilder& operator<<(optimization_guide::OptimizationGuideDecision
  64. optimization_guide_decision);
  65. LogMessageBuilder& operator<<(
  66. optimization_guide::proto::OptimizationTarget optimization_target);
  67. private:
  68. const optimization_guide_common::mojom::LogSource log_source_;
  69. const std::string source_file_;
  70. const int source_line_;
  71. std::vector<std::string> messages_;
  72. raw_ptr<OptimizationGuideLogger> optimization_guide_logger_;
  73. };
  74. private:
  75. struct LogMessage {
  76. LogMessage(base::Time event_time,
  77. optimization_guide_common::mojom::LogSource log_source,
  78. const std::string& source_file,
  79. int source_line,
  80. const std::string& message);
  81. const base::Time event_time;
  82. const optimization_guide_common::mojom::LogSource log_source;
  83. const std::string source_file;
  84. const int source_line;
  85. const std::string message;
  86. };
  87. // Contains the most recent log messages. Messages are queued up only when
  88. // |kDebugLoggingEnabled| command-line switch is specified. This allows the
  89. // messages at startup to be saved and shown in the internals page later.
  90. base::circular_deque<LogMessage> recent_log_messages_;
  91. base::ObserverList<OptimizationGuideLogger::Observer> observers_;
  92. };
  93. #endif // COMPONENTS_OPTIMIZATION_GUIDE_CORE_OPTIMIZATION_GUIDE_LOGGER_H_