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