blob: 9ed7ad4be1d02fa96a3ae3bae3862858b123e1ee [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef INCLUDE_PERFETTO_TRACE_PROCESSOR_TRACE_PROCESSOR_H_
#define INCLUDE_PERFETTO_TRACE_PROCESSOR_TRACE_PROCESSOR_H_
#include <memory>
#include <vector>
#include "perfetto/base/build_config.h"
#include "perfetto/base/export.h"
#include "perfetto/trace_processor/basic_types.h"
#include "perfetto/trace_processor/iterator.h"
#include "perfetto/trace_processor/metatrace_config.h"
#include "perfetto/trace_processor/status.h"
#include "perfetto/trace_processor/trace_processor_storage.h"
namespace perfetto {
namespace trace_processor {
// Extends TraceProcessorStorage to support execution of SQL queries on loaded
// traces. See TraceProcessorStorage for parsing of trace files.
class PERFETTO_EXPORT_COMPONENT TraceProcessor : public TraceProcessorStorage {
public:
// For legacy API clients. Iterator used to be a nested class here. Many API
// clients depends on it at this point.
using Iterator = ::perfetto::trace_processor::Iterator;
// Creates a new instance of TraceProcessor.
static std::unique_ptr<TraceProcessor> CreateInstance(const Config&);
~TraceProcessor() override;
// Executes the SQL on the loaded portion of the trace.
//
// More than one SQL statement can be passed to this function; all but the
// last will be fully executed by this function before retuning. The last
// statement will be executed and will yield rows as the caller calls Next()
// over the returned Iterator.
//
// See documentation of the Iterator class for an example on how to use
// the returned iterator.
virtual Iterator ExecuteQuery(const std::string& sql) = 0;
// Registers SQL files with the associated path under the module named
// |sql_module.name|. These modules can be run by using the |IMPORT| SQL
// function.
//
// For example, if you registered a module called "camera" with a file path
// "camera/cpu/metrics.sql" you can import it (run the file) using "SELECT
// IMPORT('camera.cpu.metrics');". The first word of the string has to be a
// module name and there can be only one module registered with a given name.
virtual base::Status RegisterSqlModule(SqlModule sql_module) = 0;
// Registers a metric at the given path which will run the specified SQL.
virtual base::Status RegisterMetric(const std::string& path,
const std::string& sql) = 0;
// Reads the FileDescriptorSet proto message given by |data| and |size| and
// adds any extensions to the metrics proto to allow them to be available as
// proto builder functions when computing metrics.
virtual base::Status ExtendMetricsProto(const uint8_t* data, size_t size) = 0;
// Behaves exactly as ExtendMetricsProto, except any FileDescriptor with
// filename matching a prefix in |skip_prefixes| is skipped.
virtual base::Status ExtendMetricsProto(
const uint8_t* data,
size_t size,
const std::vector<std::string>& skip_prefixes) = 0;
// Computes the given metrics on the loded portion of the trace. If
// successful, the output argument |metrics_proto| will be filled with the
// proto-encoded bytes for the message TraceMetrics in
// perfetto/metrics/metrics.proto.
virtual base::Status ComputeMetric(
const std::vector<std::string>& metric_names,
std::vector<uint8_t>* metrics_proto) = 0;
enum MetricResultFormat {
kProtoText = 0,
kJson = 1,
};
// Computes metrics as the ComputeMetric function above, but instead of
// producing proto encoded bytes, the output argument |metrics_string| is
// filled with the metric formatted in the requested |format|.
virtual base::Status ComputeMetricText(
const std::vector<std::string>& metric_names,
MetricResultFormat format,
std::string* metrics_string) = 0;
// Interrupts the current query. Typically used by Ctrl-C handler.
virtual void InterruptQuery() = 0;
// Deletes all tables and views that have been created (by the UI or user)
// after the trace was loaded. It preserves the built-in tables/view created
// by the ingestion process. Returns the number of table/views deleted.
virtual size_t RestoreInitialTables() = 0;
// Sets/returns the name of the currently loaded trace or an empty string if
// no trace is fully loaded yet. This has no effect on the Trace Processor
// functionality and is used for UI purposes only.
// The returned name is NOT a path and will contain extra text w.r.t. the
// argument originally passed to SetCurrentTraceName(), e.g., "file (42 MB)".
virtual std::string GetCurrentTraceName() = 0;
virtual void SetCurrentTraceName(const std::string&) = 0;
// Enables "meta-tracing" of trace processor.
// Metatracing involves tracing trace processor itself to root-cause
// performace issues in trace processor. See |DisableAndReadMetatrace| for
// more information on the format of the metatrace.
using MetatraceConfig = metatrace::MetatraceConfig;
using MetatraceCategories = metatrace::MetatraceCategories;
virtual void EnableMetatrace(MetatraceConfig config = {}) = 0;
// Disables "meta-tracing" of trace processor and writes the trace as a
// sequence of |TracePackets| into |trace_proto| returning the status of this
// read.
virtual base::Status DisableAndReadMetatrace(
std::vector<uint8_t>* trace_proto) = 0;
// Gets all the currently loaded proto descriptors used in metric computation.
// This includes all compiled-in binary descriptors, and all proto descriptors
// loaded by trace processor shell at runtime. The message is encoded as
// DescriptorSet, defined in perfetto/trace_processor/trace_processor.proto.
virtual std::vector<uint8_t> GetMetricDescriptors() = 0;
};
// When set, logs SQLite actions on the console.
void PERFETTO_EXPORT_COMPONENT EnableSQLiteVtableDebugging();
} // namespace trace_processor
} // namespace perfetto
#endif // INCLUDE_PERFETTO_TRACE_PROCESSOR_TRACE_PROCESSOR_H_