trace_net_log_observer.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2014 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 "net/log/trace_net_log_observer.h"
  5. #include <stdio.h>
  6. #include <memory>
  7. #include <string>
  8. #include <utility>
  9. #include "base/check.h"
  10. #include "base/json/json_writer.h"
  11. #include "base/trace_event/trace_event.h"
  12. #include "base/values.h"
  13. #include "net/log/net_log_entry.h"
  14. #include "net/log/net_log_event_type.h"
  15. namespace net {
  16. namespace {
  17. // TraceLog category for NetLog events.
  18. constexpr const char kNetLogTracingCategory[] = "netlog";
  19. class TracedValue : public base::trace_event::ConvertableToTraceFormat {
  20. public:
  21. explicit TracedValue(base::Value value) : value_(std::move(value)) {}
  22. ~TracedValue() override = default;
  23. private:
  24. void AppendAsTraceFormat(std::string* out) const override {
  25. if (!value_.is_none()) {
  26. std::string tmp;
  27. base::JSONWriter::Write(value_, &tmp);
  28. *out += tmp;
  29. } else {
  30. *out += "{}";
  31. }
  32. }
  33. private:
  34. base::Value value_;
  35. };
  36. } // namespace
  37. TraceNetLogObserver::TraceNetLogObserver() = default;
  38. TraceNetLogObserver::~TraceNetLogObserver() {
  39. DCHECK(!net_log_to_watch_);
  40. DCHECK(!net_log());
  41. }
  42. void TraceNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
  43. base::Value params = entry.params.Clone();
  44. switch (entry.phase) {
  45. case NetLogEventPhase::BEGIN:
  46. TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(
  47. kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
  48. entry.source.id, "source_type",
  49. NetLog::SourceTypeToString(entry.source.type), "params",
  50. std::make_unique<TracedValue>(std::move(params)));
  51. break;
  52. case NetLogEventPhase::END:
  53. TRACE_EVENT_NESTABLE_ASYNC_END2(
  54. kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
  55. entry.source.id, "source_type",
  56. NetLog::SourceTypeToString(entry.source.type), "params",
  57. std::make_unique<TracedValue>(std::move(params)));
  58. break;
  59. case NetLogEventPhase::NONE:
  60. TRACE_EVENT_NESTABLE_ASYNC_INSTANT2(
  61. kNetLogTracingCategory, NetLogEventTypeToString(entry.type),
  62. entry.source.id, "source_type",
  63. NetLog::SourceTypeToString(entry.source.type), "params",
  64. std::make_unique<TracedValue>(std::move(params)));
  65. break;
  66. }
  67. }
  68. void TraceNetLogObserver::WatchForTraceStart(NetLog* netlog) {
  69. DCHECK(!net_log_to_watch_);
  70. DCHECK(!net_log());
  71. net_log_to_watch_ = netlog;
  72. // Tracing can start before the observer is even created, for instance for
  73. // startup tracing.
  74. if (base::trace_event::TraceLog::GetInstance()->IsEnabled())
  75. OnTraceLogEnabled();
  76. base::trace_event::TraceLog::GetInstance()->AddAsyncEnabledStateObserver(
  77. weak_factory_.GetWeakPtr());
  78. }
  79. void TraceNetLogObserver::StopWatchForTraceStart() {
  80. // Should only stop if is currently watching.
  81. DCHECK(net_log_to_watch_);
  82. base::trace_event::TraceLog::GetInstance()->RemoveAsyncEnabledStateObserver(
  83. this);
  84. // net_log() != nullptr iff NetLog::AddObserver() has been called.
  85. // This implies that if the netlog category wasn't enabled, then
  86. // NetLog::RemoveObserver() will not get called, and there won't be
  87. // a crash in NetLog::RemoveObserver().
  88. if (net_log())
  89. net_log()->RemoveObserver(this);
  90. net_log_to_watch_ = nullptr;
  91. }
  92. void TraceNetLogObserver::OnTraceLogEnabled() {
  93. bool enabled;
  94. TRACE_EVENT_CATEGORY_GROUP_ENABLED(kNetLogTracingCategory, &enabled);
  95. if (!enabled)
  96. return;
  97. net_log_to_watch_->AddObserver(this, NetLogCaptureMode::kDefault);
  98. }
  99. void TraceNetLogObserver::OnTraceLogDisabled() {
  100. if (net_log())
  101. net_log()->RemoveObserver(this);
  102. }
  103. } // namespace net