blob: d7df2e1cbed50ec2071865bd567036ae3654d823 [file] [log] [blame] [edit]
/*
* Copyright (C) 2026 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 SRC_TRACE_PROCESSOR_SHELL_METRICS_H_
#define SRC_TRACE_PROCESSOR_SHELL_METRICS_H_
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/descriptor.pb.h>
#include "perfetto/base/status.h"
#include "perfetto/trace_processor/trace_processor.h"
namespace perfetto::trace_processor {
enum MetricV1OutputFormat {
kBinaryProto,
kTextProto,
kJson,
kNone,
};
struct MetricNameAndPath {
std::string name;
std::optional<std::string> no_ext_path;
};
class MetricExtension {
public:
void SetDiskPath(std::string path);
void SetVirtualPath(std::string path);
const std::string& disk_path() const { return disk_path_; }
const std::string& virtual_path() const { return virtual_path_; }
private:
std::string disk_path_;
std::string virtual_path_;
static void AddTrailingSlashIfNeeded(std::string& path);
};
std::string BaseName(std::string metric_path);
base::Status RegisterMetric(TraceProcessor* trace_processor,
const std::string& register_metric);
base::Status ParseToFileDescriptorProto(
const std::string& filename,
google::protobuf::FileDescriptorProto* file_desc);
base::Status ExtendMetricsProto(TraceProcessor* trace_processor,
const std::string& extend_metrics_proto,
google::protobuf::DescriptorPool* pool);
base::Status RunMetrics(TraceProcessor* trace_processor,
const std::vector<MetricNameAndPath>& metrics,
MetricV1OutputFormat format);
base::Status ParseSingleMetricExtensionPath(bool dev,
const std::string& raw_extension,
MetricExtension& parsed_extension);
base::Status CheckForDuplicateMetricExtension(
const std::vector<MetricExtension>& metric_extensions);
base::Status ParseMetricExtensionPaths(
bool dev,
const std::vector<std::string>& raw_metric_extensions,
std::vector<MetricExtension>& metric_extensions);
void ExtendPoolWithBinaryDescriptor(
google::protobuf::DescriptorPool& pool,
const void* data,
int size,
const std::vector<std::string>& skip_prefixes);
base::Status LoadMetricExtensionProtos(TraceProcessor* trace_processor,
const std::string& proto_root,
const std::string& mount_path,
google::protobuf::DescriptorPool& pool);
base::Status LoadMetricExtensionSql(TraceProcessor* trace_processor,
const std::string& sql_root,
const std::string& mount_path);
base::Status LoadMetricExtension(TraceProcessor* trace_processor,
const MetricExtension& extension,
google::protobuf::DescriptorPool& pool);
base::Status PopulateDescriptorPool(
google::protobuf::DescriptorPool& pool,
const std::vector<MetricExtension>& metric_extensions);
base::Status LoadMetrics(TraceProcessor* trace_processor,
const std::string& raw_metric_names,
google::protobuf::DescriptorPool& pool,
std::vector<MetricNameAndPath>& name_and_path);
base::Status LoadMetricsAndExtensionsSql(
TraceProcessor* trace_processor,
const std::vector<MetricNameAndPath>& metrics,
const std::vector<MetricExtension>& extensions);
} // namespace perfetto::trace_processor
#endif // SRC_TRACE_PROCESSOR_SHELL_METRICS_H_