blob: 860487ee3be80d61e155345be51840d34fc36298 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_METRICS_PERF_PERF_EVENTS_COLLECTOR_H_
#define CHROME_BROWSER_METRICS_PERF_PERF_EVENTS_COLLECTOR_H_
#include <map>
#include "chrome/browser/metrics/perf/metric_collector.h"
#include "chrome/browser/metrics/perf/random_selector.h"
namespace metrics {
struct CPUIdentity;
class PerfOutputCall;
class WindowedIncognitoObserver;
// Enables collection of perf events profile data. perf aka "perf events" is a
// performance profiling infrastructure built into the linux kernel. For more
// information, see: https://perf.wiki.kernel.org/index.php/Main_Page.
class PerfCollector : public MetricCollector {
public:
PerfCollector();
~PerfCollector() override;
void Init() override;
protected:
// Returns the perf proto type associated with the given vector of perf
// arguments, starting with "perf" itself in |args[0]|.
static PerfProtoType GetPerfProtoType(const std::vector<std::string>& args);
// Parses a PerfDataProto or PerfStatProto from serialized data |perf_stdout|,
// if non-empty. Which proto to use depends on |subcommand|. If |perf_stdout|
// is empty, it is counted as an error. |incognito_observer| indicates
// whether an incognito window had been opened during the profile collection
// period. If there was an incognito window, discard the incoming data.
void ParseOutputProtoIfValid(
std::unique_ptr<WindowedIncognitoObserver> incognito_observer,
std::unique_ptr<SampledProfile> sampled_profile,
PerfProtoType type,
const std::string& perf_stdout);
// MetricCollector:
bool ShouldCollect() const override;
void CollectProfile(std::unique_ptr<SampledProfile> sampled_profile) override;
const RandomSelector& command_selector() const { return command_selector_; }
private:
// Change the values in |collection_params_| and the commands in
// |command_selector_| for any keys that are present in |params|.
void SetCollectionParamsFromVariationParams(
const std::map<std::string, std::string>& params);
// Set of commands to choose from.
RandomSelector command_selector_;
// An active call to perf/quipper, if set.
std::unique_ptr<PerfOutputCall> perf_output_call_;
DISALLOW_COPY_AND_ASSIGN(PerfCollector);
};
// Exposed for unit testing.
namespace internal {
// Return the default set of perf commands and their odds of selection given
// the identity of the CPU in |cpuid|.
std::vector<RandomSelector::WeightAndValue> GetDefaultCommandsForCpu(
const CPUIdentity& cpuid);
// For the "PerfCommand::"-prefixed keys in |params|, return the cpu specifier
// that is the narrowest match for the CPU identified by |cpuid|.
// Valid CPU specifiers, in increasing order of specificity, are:
// "default", a system architecture (e.g. "x86_64"), a CPU microarchitecture
// (currently only some Intel and AMD uarchs supported), or a CPU model name
// substring.
std::string FindBestCpuSpecifierFromParams(
const std::map<std::string, std::string>& params,
const CPUIdentity& cpuid);
} // namespace internal
} // namespace metrics
#endif // CHROME_BROWSER_METRICS_PERF_PERF_EVENTS_COLLECTOR_H_