1 /*
2  * Copyright (c) 2016, Google Inc.
3  * All rights reserved.
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef PERFTOOLS_PERF_DATA_CONVERTER_H_
9 #define PERFTOOLS_PERF_DATA_CONVERTER_H_
10 
11 #include <memory>
12 #include <vector>
13 
14 #include "int_compat.h"
15 #include "string_compat.h"
16 #include "profile.pb.h"
17 
18 namespace quipper {
19 class PerfDataProto;
20 }  // namespace quipper
21 
22 namespace perftools {
23 
24 
25 // Sample label options.
26 enum SampleLabels {
27   kNoLabels = 0,
28   // Adds label with key PidLabelKey and number value set to the process ID.
29   kPidLabel = 1,
30   // Adds label with key TidLabelKey and number value set to the thread ID.
31   kTidLabel = 2,
32   // Equivalent to kPidLabel | kTidLabel
33   kPidAndTidLabels = 3,
34   // Adds label with key TimestampNsLabelKey and number value set to the number
35   // of nanoseconds since the system boot that this sample was taken.
36   kTimestampNsLabel = 4,
37   // Adds label with key ExecutionModeLabelKey and string value set to one of
38   // the ExecutionMode* values.
39   kExecutionModeLabel = 8,
40   // Adds a label with key CommLabelKey and string value set to the sample's
41   // process's command. If no command is known, no label is added.
42   kCommLabel = 16,
43 };
44 
45 // Sample label key names.
46 const char PidLabelKey[] = "pid";
47 const char TidLabelKey[] = "tid";
48 const char TimestampNsLabelKey[] = "timestamp_ns";
49 const char ExecutionModeLabelKey[] = "execution_mode";
50 const char CommLabelKey[] = "comm";
51 
52 // Execution mode label values.
53 const char ExecutionModeHostKernel[] = "Host Kernel";
54 const char ExecutionModeHostUser[] = "Host User";
55 const char ExecutionModeGuestKernel[] = "Guest Kernel";
56 const char ExecutionModeGuestUser[] = "Guest User";
57 const char ExecutionModeHypervisor[] = "Hypervisor";
58 
59 // Perf data conversion options.
60 enum ConversionOptions {
61   // Default options.
62   kNoOptions = 0,
63   // Whether to produce multiple, per-process profiles from the single input
64   // perf data file. If not set, a single profile will be produced ((but you do
65   // still get a list of profiles back; it just has only one entry).
66   kGroupByPids = 1,
67   // Whether the conversion should fail if there is a detected mismatch between
68   // the main mapping in the sample data vs. mapping data.
69   kFailOnMainMappingMismatch = 2,
70 };
71 
72 
73 struct ProcessProfile {
74   // Process PID or 0 if no process grouping was requested.
75   // PIDs can duplicate if there was a PID reuse during the profiling session.
76   uint32 pid = 0;
77   // Profile proto data.
78   perftools::profiles::Profile data;
79   // Min timestamp of a sample, in nanoseconds since boot, or 0 if unknown.
80   int64 min_sample_time_ns = 0;
81   // Max timestamp of a sample, in nanoseconds since boot, or 0 if unknown.
82   int64 max_sample_time_ns = 0;
83 };
84 
85 // Type alias for a random access sequence of owned ProcessProfile objects.
86 using ProcessProfiles = std::vector<std::unique_ptr<ProcessProfile>>;
87 
88 // Converts raw Linux perf data to a vector of process profiles.
89 //
90 // sample_labels is the OR-product of all SampleLabels desired in the output
91 // profiles. options governs other conversion options such as whether per-PID
92 // profiles should be returned or all processes should be merged into the same
93 // profile.
94 //
95 // Returns a vector of process profiles, empty if any error occurs.
96 extern ProcessProfiles RawPerfDataToProfiles(
97     const void* raw, int raw_size, const std::map<string, string>& build_ids,
98     uint32 sample_labels = kNoLabels, uint32 options = kGroupByPids);
99 
100 // Converts a PerfDataProto to a vector of process profiles.
101 extern ProcessProfiles PerfDataProtoToProfiles(
102     const quipper::PerfDataProto* perf_data, uint32 sample_labels = kNoLabels,
103     uint32 options = kGroupByPids);
104 
105 }  // namespace perftools
106 
107 #endif  // PERFTOOLS_PERF_DATA_CONVERTER_H_
108