1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_LOG_TRACE_NET_LOG_OBSERVER_H_
#define NET_LOG_TRACE_NET_LOG_OBSERVER_H_
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/rand_util.h"
#include "net/base/net_export.h"
#include "net/base/tracing.h"
#include "net/log/net_log.h"
#include "net/log/net_log_capture_mode.h"
namespace net {
// TraceNetLogObserver watches for TraceLog enable, and sends NetLog
// events to TraceLog if it is enabled.
class NET_EXPORT TraceNetLogObserver
: public NetLog::ThreadSafeObserver,
public base::trace_event::TraceLog::AsyncEnabledStateObserver {
public:
struct Options final {
// Work around https://bugs.llvm.org/show_bug.cgi?id=36684
static Options Default() { return {}; }
NetLogCaptureMode capture_mode = NetLogCaptureMode::kDefault;
// If false, trace events will be logged under the "netlog" category.
// If true, trace events will be logged under the
// "disabled-by-default-netlog.sensitive" category.
//
// TODO(https://crbug.com/410018349): ideally this should be derived from
// `capture_mode`, i.e. we should treat this as true if `capture_mode` is
// not `kHeavilyRedacted`. We'd need to assess the consequences on current
// trace users, though.
bool use_sensitive_category = false;
// The name of the root track netlog tracks will be nested under.
perfetto::StaticString root_track_name = "Chromium NetLog";
// When true, record trace events verbosely:
// - Use separate tracks for each NetLogSource.
// - Add flows to relate NetLog events to threads.
bool verbose = false;
};
explicit TraceNetLogObserver(Options options = Options::Default());
TraceNetLogObserver(const TraceNetLogObserver&) = delete;
TraceNetLogObserver& operator=(const TraceNetLogObserver&) = delete;
~TraceNetLogObserver() override;
// net::NetLog::ThreadSafeObserver implementation:
void OnAddEntry(const NetLogEntry& entry) override;
// Start to watch for TraceLog enable and disable events.
// This can't be called if already watching for events.
// Watches NetLog only when tracing is enabled.
void WatchForTraceStart(NetLog* net_log);
// Stop watching for TraceLog enable and disable events.
// If WatchForTraceStart is called, this must be called before
// TraceNetLogObserver is destroyed.
void StopWatchForTraceStart();
// base::trace_event::TraceLog::EnabledStateChangedObserver implementation:
void OnTraceLogEnabled() override;
void OnTraceLogDisabled() override;
private:
void AddEntry(const NetLogEntry& entry,
perfetto::StaticString entry_type_string,
perfetto::StaticString source_type_string,
base::Value::Dict params);
void AddEntryVerbose(const NetLogEntry& entry,
perfetto::StaticString entry_type_string,
perfetto::StaticString source_type_string,
base::Value::Dict params);
// The "root track" is used as the parent track of all NetLog event tracks.
// Folding all NetLog tracks under a root track serves a number of purposes:
// - It looks tidier in the Perfetto UI, as it provides a nice visual
// separation from the rest of the process child tracks (threads);
// - It can be used to distinguish between multiple TraceNetLogObserver
// instances (which can happen e.g. if WebView and Cronet are used in the
// same process);
// - It allows us to customize the ordering of the child tracks. If we hang
// NetLog tracks directly under the process track, we are forced into
// lexicographic track name ordering which is not the best ordering for
// NetLog sources.
perfetto::Track MaybeSetUpAndGetRootTrack();
// Used to derive track ids. We use a random number in an attempt to keep
// track ids globally unique, which is a requirement of the track event API.
const uint64_t track_id_base_ = base::RandUint64();
const NetLogCaptureMode capture_mode_;
const bool use_sensitive_category_;
const bool verbose_;
const perfetto::StaticString root_track_name_;
std::once_flag root_track_set_up_;
raw_ptr<NetLog> net_log_to_watch_ = nullptr;
base::WeakPtrFactory<TraceNetLogObserver> weak_factory_{this};
};
} // namespace net
#endif // NET_LOG_TRACE_NET_LOG_OBSERVER_H_
|