optimization_guide_logger.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. #include "components/optimization_guide/core/optimization_guide_logger.h"
  5. #include "base/logging.h"
  6. #include "base/observer_list.h"
  7. #include "base/strings/strcat.h"
  8. #include "components/optimization_guide/core/hints_processing_util.h"
  9. #include "components/optimization_guide/core/optimization_guide_switches.h"
  10. namespace {
  11. // TODO(rajendrant): Verify if all debug messages before browser startup are
  12. // getting saved without being dropped, when some hints fetching and model
  13. // downloading happens.
  14. constexpr size_t kMaxRecentLogMessages = 100;
  15. } // namespace
  16. OptimizationGuideLogger::LogMessageBuilder::LogMessageBuilder(
  17. optimization_guide_common::mojom::LogSource log_source,
  18. const std::string& source_file,
  19. int source_line,
  20. OptimizationGuideLogger* optimization_guide_logger)
  21. : log_source_(log_source),
  22. source_file_(source_file),
  23. source_line_(source_line),
  24. optimization_guide_logger_(optimization_guide_logger) {}
  25. OptimizationGuideLogger::LogMessageBuilder::~LogMessageBuilder() {
  26. if (!optimization_guide_logger_) {
  27. // It is possible for this to not be available in tests, so just return
  28. // here.
  29. return;
  30. }
  31. std::string message = base::StrCat(messages_);
  32. optimization_guide_logger_->OnLogMessageAdded(
  33. base::Time::Now(), log_source_, source_file_, source_line_, message);
  34. DVLOG(0) << source_file_ << "(" << source_line_ << ") " << message;
  35. }
  36. OptimizationGuideLogger::LogMessageBuilder&
  37. OptimizationGuideLogger::LogMessageBuilder::operator<<(const char* message) {
  38. messages_.push_back(message);
  39. return *this;
  40. }
  41. OptimizationGuideLogger::LogMessageBuilder&
  42. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  43. const std::string& message) {
  44. messages_.push_back(message);
  45. return *this;
  46. }
  47. OptimizationGuideLogger::LogMessageBuilder&
  48. OptimizationGuideLogger::LogMessageBuilder::operator<<(const GURL& url) {
  49. messages_.push_back(url.possibly_invalid_spec());
  50. return *this;
  51. }
  52. OptimizationGuideLogger::LogMessageBuilder&
  53. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  54. optimization_guide::proto::RequestContext request_context) {
  55. messages_.push_back(
  56. optimization_guide::proto::RequestContext_Name(request_context));
  57. return *this;
  58. }
  59. OptimizationGuideLogger::LogMessageBuilder&
  60. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  61. optimization_guide::proto::OptimizationType optimization_type) {
  62. messages_.push_back(
  63. optimization_guide::GetStringNameForOptimizationType(optimization_type));
  64. return *this;
  65. }
  66. OptimizationGuideLogger::LogMessageBuilder&
  67. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  68. optimization_guide::OptimizationTypeDecision optimization_type_decision) {
  69. messages_.push_back(
  70. base::NumberToString(static_cast<int>(optimization_type_decision)));
  71. return *this;
  72. }
  73. OptimizationGuideLogger::LogMessageBuilder&
  74. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  75. optimization_guide::OptimizationGuideDecision optimization_guide_decision) {
  76. messages_.push_back(
  77. GetStringForOptimizationGuideDecision(optimization_guide_decision));
  78. return *this;
  79. }
  80. OptimizationGuideLogger::LogMessageBuilder&
  81. OptimizationGuideLogger::LogMessageBuilder::operator<<(
  82. optimization_guide::proto::OptimizationTarget optimization_target) {
  83. messages_.push_back(
  84. optimization_guide::proto::OptimizationTarget_Name(optimization_target));
  85. return *this;
  86. }
  87. OptimizationGuideLogger::LogMessage::LogMessage(
  88. base::Time event_time,
  89. optimization_guide_common::mojom::LogSource log_source,
  90. const std::string& source_file,
  91. int source_line,
  92. const std::string& message)
  93. : event_time(event_time),
  94. log_source(log_source),
  95. source_file(source_file),
  96. source_line(source_line),
  97. message(message) {}
  98. OptimizationGuideLogger::OptimizationGuideLogger() {
  99. if (optimization_guide::switches::IsDebugLogsEnabled())
  100. recent_log_messages_.reserve(kMaxRecentLogMessages);
  101. }
  102. OptimizationGuideLogger::~OptimizationGuideLogger() = default;
  103. void OptimizationGuideLogger::AddObserver(
  104. OptimizationGuideLogger::Observer* observer) {
  105. observers_.AddObserver(observer);
  106. if (optimization_guide::switches::IsDebugLogsEnabled()) {
  107. for (const auto& message : recent_log_messages_) {
  108. for (Observer& obs : observers_) {
  109. obs.OnLogMessageAdded(message.event_time, message.log_source,
  110. message.source_file, message.source_line,
  111. message.message);
  112. }
  113. }
  114. }
  115. }
  116. void OptimizationGuideLogger::RemoveObserver(
  117. OptimizationGuideLogger::Observer* observer) {
  118. observers_.RemoveObserver(observer);
  119. }
  120. void OptimizationGuideLogger::OnLogMessageAdded(
  121. base::Time event_time,
  122. optimization_guide_common::mojom::LogSource log_source,
  123. const std::string& source_file,
  124. int source_line,
  125. const std::string& message) {
  126. if (optimization_guide::switches::IsDebugLogsEnabled()) {
  127. recent_log_messages_.emplace_back(event_time, log_source, source_file,
  128. source_line, message);
  129. if (recent_log_messages_.size() > kMaxRecentLogMessages)
  130. recent_log_messages_.pop_front();
  131. }
  132. for (Observer& obs : observers_)
  133. obs.OnLogMessageAdded(event_time, log_source, source_file, source_line,
  134. message);
  135. }
  136. bool OptimizationGuideLogger::ShouldEnableDebugLogs() const {
  137. return !observers_.empty() ||
  138. optimization_guide::switches::IsDebugLogsEnabled();
  139. }