xref: /aosp_15_r20/external/cronet/base/profiler/sample_metadata.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/profiler/sample_metadata.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/metrics/metrics_hashes.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/profiler/stack_sampling_profiler.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_local.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
GetPlatformThreadIdForScope(SampleMetadataScope scope)19*6777b538SAndroid Build Coastguard Worker std::optional<PlatformThreadId> GetPlatformThreadIdForScope(
20*6777b538SAndroid Build Coastguard Worker     SampleMetadataScope scope) {
21*6777b538SAndroid Build Coastguard Worker   if (scope == SampleMetadataScope::kProcess)
22*6777b538SAndroid Build Coastguard Worker     return std::nullopt;
23*6777b538SAndroid Build Coastguard Worker   return PlatformThread::CurrentId();
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker }  // namespace
27*6777b538SAndroid Build Coastguard Worker 
SampleMetadata(std::string_view name,SampleMetadataScope scope)28*6777b538SAndroid Build Coastguard Worker SampleMetadata::SampleMetadata(std::string_view name, SampleMetadataScope scope)
29*6777b538SAndroid Build Coastguard Worker     : name_hash_(HashMetricName(name)), scope_(scope) {}
30*6777b538SAndroid Build Coastguard Worker 
Set(int64_t value)31*6777b538SAndroid Build Coastguard Worker void SampleMetadata::Set(int64_t value) {
32*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Set(name_hash_, std::nullopt,
33*6777b538SAndroid Build Coastguard Worker                                    GetPlatformThreadIdForScope(scope_), value);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker 
Set(int64_t key,int64_t value)36*6777b538SAndroid Build Coastguard Worker void SampleMetadata::Set(int64_t key, int64_t value) {
37*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Set(name_hash_, key,
38*6777b538SAndroid Build Coastguard Worker                                    GetPlatformThreadIdForScope(scope_), value);
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker 
Remove()41*6777b538SAndroid Build Coastguard Worker void SampleMetadata::Remove() {
42*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Remove(name_hash_, std::nullopt,
43*6777b538SAndroid Build Coastguard Worker                                       GetPlatformThreadIdForScope(scope_));
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker 
Remove(int64_t key)46*6777b538SAndroid Build Coastguard Worker void SampleMetadata::Remove(int64_t key) {
47*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Remove(name_hash_, key,
48*6777b538SAndroid Build Coastguard Worker                                       GetPlatformThreadIdForScope(scope_));
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker 
ScopedSampleMetadata(std::string_view name,int64_t value,SampleMetadataScope scope)51*6777b538SAndroid Build Coastguard Worker ScopedSampleMetadata::ScopedSampleMetadata(std::string_view name,
52*6777b538SAndroid Build Coastguard Worker                                            int64_t value,
53*6777b538SAndroid Build Coastguard Worker                                            SampleMetadataScope scope)
54*6777b538SAndroid Build Coastguard Worker     : name_hash_(HashMetricName(name)),
55*6777b538SAndroid Build Coastguard Worker       thread_id_(GetPlatformThreadIdForScope(scope)) {
56*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Set(name_hash_, std::nullopt, thread_id_, value);
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker 
ScopedSampleMetadata(std::string_view name,int64_t key,int64_t value,SampleMetadataScope scope)59*6777b538SAndroid Build Coastguard Worker ScopedSampleMetadata::ScopedSampleMetadata(std::string_view name,
60*6777b538SAndroid Build Coastguard Worker                                            int64_t key,
61*6777b538SAndroid Build Coastguard Worker                                            int64_t value,
62*6777b538SAndroid Build Coastguard Worker                                            SampleMetadataScope scope)
63*6777b538SAndroid Build Coastguard Worker     : name_hash_(HashMetricName(name)),
64*6777b538SAndroid Build Coastguard Worker       key_(key),
65*6777b538SAndroid Build Coastguard Worker       thread_id_(GetPlatformThreadIdForScope(scope)) {
66*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Set(name_hash_, key, thread_id_, value);
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker 
~ScopedSampleMetadata()69*6777b538SAndroid Build Coastguard Worker ScopedSampleMetadata::~ScopedSampleMetadata() {
70*6777b538SAndroid Build Coastguard Worker   GetSampleMetadataRecorder()->Remove(name_hash_, key_, thread_id_);
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker // This function is friended by StackSamplingProfiler so must live directly in
74*6777b538SAndroid Build Coastguard Worker // the base namespace.
ApplyMetadataToPastSamplesImpl(TimeTicks period_start,TimeTicks period_end,uint64_t name_hash,std::optional<int64_t> key,int64_t value,std::optional<PlatformThreadId> thread_id)75*6777b538SAndroid Build Coastguard Worker void ApplyMetadataToPastSamplesImpl(TimeTicks period_start,
76*6777b538SAndroid Build Coastguard Worker                                     TimeTicks period_end,
77*6777b538SAndroid Build Coastguard Worker                                     uint64_t name_hash,
78*6777b538SAndroid Build Coastguard Worker                                     std::optional<int64_t> key,
79*6777b538SAndroid Build Coastguard Worker                                     int64_t value,
80*6777b538SAndroid Build Coastguard Worker                                     std::optional<PlatformThreadId> thread_id) {
81*6777b538SAndroid Build Coastguard Worker   StackSamplingProfiler::ApplyMetadataToPastSamples(
82*6777b538SAndroid Build Coastguard Worker       period_start, period_end, name_hash, key, value, thread_id);
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
ApplyMetadataToPastSamples(TimeTicks period_start,TimeTicks period_end,std::string_view name,int64_t value,SampleMetadataScope scope)85*6777b538SAndroid Build Coastguard Worker void ApplyMetadataToPastSamples(TimeTicks period_start,
86*6777b538SAndroid Build Coastguard Worker                                 TimeTicks period_end,
87*6777b538SAndroid Build Coastguard Worker                                 std::string_view name,
88*6777b538SAndroid Build Coastguard Worker                                 int64_t value,
89*6777b538SAndroid Build Coastguard Worker                                 SampleMetadataScope scope) {
90*6777b538SAndroid Build Coastguard Worker   return ApplyMetadataToPastSamplesImpl(
91*6777b538SAndroid Build Coastguard Worker       period_start, period_end, HashMetricName(name), std::nullopt, value,
92*6777b538SAndroid Build Coastguard Worker       GetPlatformThreadIdForScope(scope));
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker 
ApplyMetadataToPastSamples(TimeTicks period_start,TimeTicks period_end,std::string_view name,int64_t key,int64_t value,SampleMetadataScope scope)95*6777b538SAndroid Build Coastguard Worker void ApplyMetadataToPastSamples(TimeTicks period_start,
96*6777b538SAndroid Build Coastguard Worker                                 TimeTicks period_end,
97*6777b538SAndroid Build Coastguard Worker                                 std::string_view name,
98*6777b538SAndroid Build Coastguard Worker                                 int64_t key,
99*6777b538SAndroid Build Coastguard Worker                                 int64_t value,
100*6777b538SAndroid Build Coastguard Worker                                 SampleMetadataScope scope) {
101*6777b538SAndroid Build Coastguard Worker   return ApplyMetadataToPastSamplesImpl(period_start, period_end,
102*6777b538SAndroid Build Coastguard Worker                                         HashMetricName(name), key, value,
103*6777b538SAndroid Build Coastguard Worker                                         GetPlatformThreadIdForScope(scope));
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
AddProfileMetadataImpl(uint64_t name_hash,int64_t key,int64_t value,std::optional<PlatformThreadId> thread_id)106*6777b538SAndroid Build Coastguard Worker void AddProfileMetadataImpl(uint64_t name_hash,
107*6777b538SAndroid Build Coastguard Worker                             int64_t key,
108*6777b538SAndroid Build Coastguard Worker                             int64_t value,
109*6777b538SAndroid Build Coastguard Worker                             std::optional<PlatformThreadId> thread_id) {
110*6777b538SAndroid Build Coastguard Worker   StackSamplingProfiler::AddProfileMetadata(name_hash, key, value, thread_id);
111*6777b538SAndroid Build Coastguard Worker }
112*6777b538SAndroid Build Coastguard Worker 
AddProfileMetadata(std::string_view name,int64_t key,int64_t value,SampleMetadataScope scope)113*6777b538SAndroid Build Coastguard Worker void AddProfileMetadata(std::string_view name,
114*6777b538SAndroid Build Coastguard Worker                         int64_t key,
115*6777b538SAndroid Build Coastguard Worker                         int64_t value,
116*6777b538SAndroid Build Coastguard Worker                         SampleMetadataScope scope) {
117*6777b538SAndroid Build Coastguard Worker   return AddProfileMetadataImpl(HashMetricName(name), key, value,
118*6777b538SAndroid Build Coastguard Worker                                 GetPlatformThreadIdForScope(scope));
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker 
GetSampleMetadataRecorder()121*6777b538SAndroid Build Coastguard Worker MetadataRecorder* GetSampleMetadataRecorder() {
122*6777b538SAndroid Build Coastguard Worker   static NoDestructor<MetadataRecorder> instance;
123*6777b538SAndroid Build Coastguard Worker   return instance.get();
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker }  // namespace base
127