| /* |
| * 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_ |