| /* |
| * Copyright (c) 2016, Google Inc. |
| * All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef PERFTOOLS_PERF_DATA_CONVERTER_H_ |
| #define PERFTOOLS_PERF_DATA_CONVERTER_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "int_compat.h" |
| #include "string_compat.h" |
| #include "profile.pb.h" |
| |
| namespace quipper { |
| class PerfDataProto; |
| } // namespace quipper |
| |
| namespace perftools { |
| |
| |
| // Sample label options. |
| enum SampleLabels { |
| kNoLabels = 0, |
| // Adds label with key PidLabelKey and number value set to the process ID. |
| kPidLabel = 1, |
| // Adds label with key TidLabelKey and number value set to the thread ID. |
| kTidLabel = 2, |
| // Equivalent to kPidLabel | kTidLabel |
| kPidAndTidLabels = 3, |
| // Adds label with key TimestampNsLabelKey and number value set to the number |
| // of nanoseconds since the system boot that this sample was taken. |
| kTimestampNsLabel = 4, |
| // Adds label with key ExecutionModeLabelKey and string value set to one of |
| // the ExecutionMode* values. |
| kExecutionModeLabel = 8, |
| // Adds a label with key CommLabelKey and string value set to the sample's |
| // process's command. If no command is known, no label is added. |
| kCommLabel = 16, |
| }; |
| |
| // Sample label key names. |
| const char PidLabelKey[] = "pid"; |
| const char TidLabelKey[] = "tid"; |
| const char TimestampNsLabelKey[] = "timestamp_ns"; |
| const char ExecutionModeLabelKey[] = "execution_mode"; |
| const char CommLabelKey[] = "comm"; |
| |
| // Execution mode label values. |
| const char ExecutionModeHostKernel[] = "Host Kernel"; |
| const char ExecutionModeHostUser[] = "Host User"; |
| const char ExecutionModeGuestKernel[] = "Guest Kernel"; |
| const char ExecutionModeGuestUser[] = "Guest User"; |
| const char ExecutionModeHypervisor[] = "Hypervisor"; |
| |
| // Perf data conversion options. |
| enum ConversionOptions { |
| // Default options. |
| kNoOptions = 0, |
| // Whether to produce multiple, per-process profiles from the single input |
| // perf data file. If not set, a single profile will be produced ((but you do |
| // still get a list of profiles back; it just has only one entry). |
| kGroupByPids = 1, |
| // Whether the conversion should fail if there is a detected mismatch between |
| // the main mapping in the sample data vs. mapping data. |
| kFailOnMainMappingMismatch = 2, |
| }; |
| |
| |
| struct ProcessProfile { |
| // Process PID or 0 if no process grouping was requested. |
| // PIDs can duplicate if there was a PID reuse during the profiling session. |
| uint32 pid = 0; |
| // Profile proto data. |
| perftools::profiles::Profile data; |
| // Min timestamp of a sample, in nanoseconds since boot, or 0 if unknown. |
| int64 min_sample_time_ns = 0; |
| // Max timestamp of a sample, in nanoseconds since boot, or 0 if unknown. |
| int64 max_sample_time_ns = 0; |
| }; |
| |
| // Type alias for a random access sequence of owned ProcessProfile objects. |
| using ProcessProfiles = std::vector<std::unique_ptr<ProcessProfile>>; |
| |
| // Converts raw Linux perf data to a vector of process profiles. |
| // |
| // sample_labels is the OR-product of all SampleLabels desired in the output |
| // profiles. options governs other conversion options such as whether per-PID |
| // profiles should be returned or all processes should be merged into the same |
| // profile. |
| // |
| // Returns a vector of process profiles, empty if any error occurs. |
| extern ProcessProfiles RawPerfDataToProfiles( |
| const void* raw, int raw_size, const std::map<string, string>& build_ids, |
| uint32 sample_labels = kNoLabels, uint32 options = kGroupByPids); |
| |
| // Converts a PerfDataProto to a vector of process profiles. |
| extern ProcessProfiles PerfDataProtoToProfiles( |
| const quipper::PerfDataProto* perf_data, uint32 sample_labels = kNoLabels, |
| uint32 options = kGroupByPids); |
| |
| } // namespace perftools |
| |
| #endif // PERFTOOLS_PERF_DATA_CONVERTER_H_ |