blob: f808bdcb22ff11f42fcc8195d9683f30700cc663 [file] [log] [blame]
// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "power_manager/common/metrics_sender.h"
#include <base/logging.h>
#include <metrics/metrics_library.h>
namespace power_manager {
namespace {
// Singleton instance; weak pointer.
MetricsSenderInterface* instance_ = NULL;
} // namespace
// static
MetricsSenderInterface* MetricsSenderInterface::GetInstance() {
return instance_;
}
// static
void MetricsSenderInterface::SetInstance(MetricsSenderInterface* instance) {
CHECK((!!instance_) ^ (!!instance))
<< "Replacing live instance " << instance_ << " with " << instance;
instance_ = instance;
}
MetricsSender::MetricsSender(scoped_ptr<MetricsLibraryInterface> metrics_lib)
: metrics_lib_(metrics_lib.Pass()) {
MetricsSenderInterface::SetInstance(this);
}
MetricsSender::~MetricsSender() {
MetricsSenderInterface::SetInstance(NULL);
}
bool MetricsSender::SendMetric(const std::string& name,
int sample,
int min,
int max,
int num_buckets) {
VLOG(1) << "Sending metric " << name << " (sample=" << sample << " min="
<< min << " max=" << max << " num_buckets=" << num_buckets << ")";
// If the sample falls outside of the histogram's range, just let it end up in
// the underflow or overflow bucket.
if (!metrics_lib_->SendToUMA(name, sample, min, max, num_buckets)) {
LOG(ERROR) << "Failed to send metric " << name;
return false;
}
return true;
}
bool MetricsSender::SendEnumMetric(const std::string& name,
int sample,
int max) {
VLOG(1) << "Sending enum metric " << name << " (sample=" << sample
<< " max=" << max << ")";
if (sample > max) {
LOG(WARNING) << name << " sample " << sample << " is greater than " << max;
sample = max;
}
if (!metrics_lib_->SendEnumToUMA(name, sample, max)) {
LOG(ERROR) << "Failed to send enum metric " << name;
return false;
}
return true;
}
bool SendMetric(const std::string& name,
int sample,
int min,
int max,
int num_buckets) {
MetricsSenderInterface* sender = MetricsSenderInterface::GetInstance();
return sender ? sender->SendMetric(name, sample, min, max, num_buckets) :
true;
}
bool SendEnumMetric(const std::string& name, int sample, int max) {
MetricsSenderInterface* sender = MetricsSenderInterface::GetInstance();
return sender ? sender->SendEnumMetric(name, sample, max) : true;
}
} // namespace power_manager