xref: /aosp_15_r20/external/perfetto/src/traced/probes/probes_producer.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_TRACED_PROBES_PROBES_PRODUCER_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_TRACED_PROBES_PROBES_PRODUCER_H_
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include <functional>
21*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
22*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_map>
23*6dbdd20aSAndroid Build Coastguard Worker #include <utility>
24*6dbdd20aSAndroid Build Coastguard Worker 
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/watchdog.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/weak_ptr.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/producer.h"
29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_writer.h"
30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h"
31*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/filesystem/inode_file_data_source.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/ftrace/ftrace_controller.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/ftrace/ftrace_metadata.h"
34*6dbdd20aSAndroid Build Coastguard Worker 
35*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/filesystem/inode_file_map.pbzero.h"
36*6dbdd20aSAndroid Build Coastguard Worker 
37*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
38*6dbdd20aSAndroid Build Coastguard Worker 
39*6dbdd20aSAndroid Build Coastguard Worker class ProbesDataSource;
40*6dbdd20aSAndroid Build Coastguard Worker 
41*6dbdd20aSAndroid Build Coastguard Worker const uint64_t kLRUInodeCacheSize = 1000;
42*6dbdd20aSAndroid Build Coastguard Worker 
43*6dbdd20aSAndroid Build Coastguard Worker class ProbesProducer : public Producer, public FtraceController::Observer {
44*6dbdd20aSAndroid Build Coastguard Worker  public:
45*6dbdd20aSAndroid Build Coastguard Worker   ProbesProducer();
46*6dbdd20aSAndroid Build Coastguard Worker   ~ProbesProducer() override;
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker   static ProbesProducer* GetInstance();
49*6dbdd20aSAndroid Build Coastguard Worker 
50*6dbdd20aSAndroid Build Coastguard Worker   // Producer Impl:
51*6dbdd20aSAndroid Build Coastguard Worker   void OnConnect() override;
52*6dbdd20aSAndroid Build Coastguard Worker   void OnDisconnect() override;
53*6dbdd20aSAndroid Build Coastguard Worker   void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&) override;
54*6dbdd20aSAndroid Build Coastguard Worker   void StartDataSource(DataSourceInstanceID, const DataSourceConfig&) override;
55*6dbdd20aSAndroid Build Coastguard Worker   void StopDataSource(DataSourceInstanceID) override;
56*6dbdd20aSAndroid Build Coastguard Worker   void OnTracingSetup() override;
57*6dbdd20aSAndroid Build Coastguard Worker   void Flush(FlushRequestID,
58*6dbdd20aSAndroid Build Coastguard Worker              const DataSourceInstanceID* data_source_ids,
59*6dbdd20aSAndroid Build Coastguard Worker              size_t num_data_sources,
60*6dbdd20aSAndroid Build Coastguard Worker              FlushFlags) override;
61*6dbdd20aSAndroid Build Coastguard Worker   void ClearIncrementalState(const DataSourceInstanceID* data_source_ids,
62*6dbdd20aSAndroid Build Coastguard Worker                              size_t num_data_sources) override;
63*6dbdd20aSAndroid Build Coastguard Worker 
64*6dbdd20aSAndroid Build Coastguard Worker   // FtraceController::Observer implementation.
65*6dbdd20aSAndroid Build Coastguard Worker   void OnFtraceDataWrittenIntoDataSourceBuffers() override;
66*6dbdd20aSAndroid Build Coastguard Worker 
67*6dbdd20aSAndroid Build Coastguard Worker   // Our Impl
68*6dbdd20aSAndroid Build Coastguard Worker   void ConnectWithRetries(const char* socket_name,
69*6dbdd20aSAndroid Build Coastguard Worker                           base::TaskRunner* task_runner);
70*6dbdd20aSAndroid Build Coastguard Worker 
71*6dbdd20aSAndroid Build Coastguard Worker   // Constructs an instance of a data source of type T.
72*6dbdd20aSAndroid Build Coastguard Worker   template <typename T>
73*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<ProbesDataSource> CreateDSInstance(
74*6dbdd20aSAndroid Build Coastguard Worker       TracingSessionID session_id,
75*6dbdd20aSAndroid Build Coastguard Worker       const DataSourceConfig& config);
76*6dbdd20aSAndroid Build Coastguard Worker 
77*6dbdd20aSAndroid Build Coastguard Worker   void ActivateTrigger(std::string trigger);
78*6dbdd20aSAndroid Build Coastguard Worker 
79*6dbdd20aSAndroid Build Coastguard Worker   // Calls `cb` when all data sources have been registered.
SetAllDataSourcesRegisteredCb(std::function<void ()> cb)80*6dbdd20aSAndroid Build Coastguard Worker   void SetAllDataSourcesRegisteredCb(std::function<void()> cb) {
81*6dbdd20aSAndroid Build Coastguard Worker     all_data_sources_registered_cb_ = cb;
82*6dbdd20aSAndroid Build Coastguard Worker   }
83*6dbdd20aSAndroid Build Coastguard Worker 
84*6dbdd20aSAndroid Build Coastguard Worker  private:
85*6dbdd20aSAndroid Build Coastguard Worker   static ProbesProducer* instance_;
86*6dbdd20aSAndroid Build Coastguard Worker 
87*6dbdd20aSAndroid Build Coastguard Worker   enum State {
88*6dbdd20aSAndroid Build Coastguard Worker     kNotStarted = 0,
89*6dbdd20aSAndroid Build Coastguard Worker     kNotConnected,
90*6dbdd20aSAndroid Build Coastguard Worker     kConnecting,
91*6dbdd20aSAndroid Build Coastguard Worker     kConnected,
92*6dbdd20aSAndroid Build Coastguard Worker   };
93*6dbdd20aSAndroid Build Coastguard Worker 
94*6dbdd20aSAndroid Build Coastguard Worker   ProbesProducer(const ProbesProducer&) = delete;
95*6dbdd20aSAndroid Build Coastguard Worker   ProbesProducer& operator=(const ProbesProducer&) = delete;
96*6dbdd20aSAndroid Build Coastguard Worker 
97*6dbdd20aSAndroid Build Coastguard Worker   void Connect();
98*6dbdd20aSAndroid Build Coastguard Worker   void Restart();
99*6dbdd20aSAndroid Build Coastguard Worker   void ResetConnectionBackoff();
100*6dbdd20aSAndroid Build Coastguard Worker   void IncreaseConnectionBackoff();
101*6dbdd20aSAndroid Build Coastguard Worker   void OnDataSourceFlushComplete(FlushRequestID, DataSourceInstanceID);
102*6dbdd20aSAndroid Build Coastguard Worker   void OnFlushTimeout(FlushRequestID);
103*6dbdd20aSAndroid Build Coastguard Worker 
104*6dbdd20aSAndroid Build Coastguard Worker   State state_ = kNotStarted;
105*6dbdd20aSAndroid Build Coastguard Worker   base::TaskRunner* task_runner_ = nullptr;
106*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<TracingService::ProducerEndpoint> endpoint_;
107*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<FtraceController> ftrace_;
108*6dbdd20aSAndroid Build Coastguard Worker   bool ftrace_creation_failed_ = false;
109*6dbdd20aSAndroid Build Coastguard Worker   uint32_t connection_backoff_ms_ = 0;
110*6dbdd20aSAndroid Build Coastguard Worker   const char* socket_name_ = nullptr;
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker   // Owning map for all active data sources.
113*6dbdd20aSAndroid Build Coastguard Worker   std::unordered_map<DataSourceInstanceID, std::unique_ptr<ProbesDataSource>>
114*6dbdd20aSAndroid Build Coastguard Worker       data_sources_;
115*6dbdd20aSAndroid Build Coastguard Worker 
116*6dbdd20aSAndroid Build Coastguard Worker   // Keeps (pointers to) data sources grouped by session id and data source
117*6dbdd20aSAndroid Build Coastguard Worker   // type. The pointers do not own the data sources (they're owned by
118*6dbdd20aSAndroid Build Coastguard Worker   // data_sources_).
119*6dbdd20aSAndroid Build Coastguard Worker   //
120*6dbdd20aSAndroid Build Coastguard Worker   // const ProbesDataSource::Descriptor* identifies the type.
121*6dbdd20aSAndroid Build Coastguard Worker   //
122*6dbdd20aSAndroid Build Coastguard Worker   // Used by OnFtraceDataWrittenIntoDataSourceBuffers().
123*6dbdd20aSAndroid Build Coastguard Worker   std::unordered_map<
124*6dbdd20aSAndroid Build Coastguard Worker       TracingSessionID,
125*6dbdd20aSAndroid Build Coastguard Worker       std::unordered_multimap<const ProbesDataSource::Descriptor*,
126*6dbdd20aSAndroid Build Coastguard Worker                               ProbesDataSource*>>
127*6dbdd20aSAndroid Build Coastguard Worker       session_data_sources_;
128*6dbdd20aSAndroid Build Coastguard Worker 
129*6dbdd20aSAndroid Build Coastguard Worker   std::unordered_multimap<FlushRequestID, DataSourceInstanceID>
130*6dbdd20aSAndroid Build Coastguard Worker       pending_flushes_;
131*6dbdd20aSAndroid Build Coastguard Worker 
132*6dbdd20aSAndroid Build Coastguard Worker   std::function<void()> all_data_sources_registered_cb_;
133*6dbdd20aSAndroid Build Coastguard Worker 
134*6dbdd20aSAndroid Build Coastguard Worker   std::unordered_map<DataSourceInstanceID, base::Watchdog::Timer> watchdogs_;
135*6dbdd20aSAndroid Build Coastguard Worker   LRUInodeCache cache_{kLRUInodeCacheSize};
136*6dbdd20aSAndroid Build Coastguard Worker   std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>
137*6dbdd20aSAndroid Build Coastguard Worker       system_inodes_;
138*6dbdd20aSAndroid Build Coastguard Worker 
139*6dbdd20aSAndroid Build Coastguard Worker   base::WeakPtrFactory<ProbesProducer> weak_factory_;  // Keep last.
140*6dbdd20aSAndroid Build Coastguard Worker };
141*6dbdd20aSAndroid Build Coastguard Worker 
142*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
143*6dbdd20aSAndroid Build Coastguard Worker 
144*6dbdd20aSAndroid Build Coastguard Worker #endif  // SRC_TRACED_PROBES_PROBES_PRODUCER_H_
145