| /* |
| * Copyright (C) 2015 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. |
| */ |
| |
| #include "uploader/bn_metricsd_impl.h" |
| |
| #include <base/metrics/histogram.h> |
| #include <base/metrics/sparse_histogram.h> |
| #include <base/metrics/statistics_recorder.h> |
| #include <utils/Errors.h> |
| #include <utils/String16.h> |
| #include <utils/String8.h> |
| |
| using android::binder::Status; |
| using android::String16; |
| |
| static const char16_t kCrashTypeKernel[] = u"kernel"; |
| static const char16_t kCrashTypeUncleanShutdown[] = u"uncleanshutdown"; |
| static const char16_t kCrashTypeUser[] = u"user"; |
| |
| BnMetricsdImpl::BnMetricsdImpl(const std::shared_ptr<CrashCounters>& counters) |
| : counters_(counters) { |
| CHECK(counters_) << "Invalid counters argument to constructor"; |
| } |
| |
| Status BnMetricsdImpl::recordHistogram( |
| const String16& name, int sample, int min, int max, int nbuckets) { |
| base::HistogramBase* histogram = base::Histogram::FactoryGet( |
| android::String8(name).string(), min, max, nbuckets, |
| base::Histogram::kUmaTargetedHistogramFlag); |
| // |histogram| may be null if a client reports two contradicting histograms |
| // with the same name but different limits. |
| // FactoryGet will print a useful message if that is the case. |
| if (histogram) { |
| histogram->Add(sample); |
| } |
| return Status::ok(); |
| } |
| |
| Status BnMetricsdImpl::recordLinearHistogram(const String16& name, |
| int sample, |
| int max) { |
| base::HistogramBase* histogram = base::LinearHistogram::FactoryGet( |
| android::String8(name).string(), 1, max, max + 1, |
| base::Histogram::kUmaTargetedHistogramFlag); |
| // |histogram| may be null if a client reports two contradicting histograms |
| // with the same name but different limits. |
| // FactoryGet will print a useful message if that is the case. |
| if (histogram) { |
| histogram->Add(sample); |
| } |
| return Status::ok(); |
| } |
| |
| Status BnMetricsdImpl::recordSparseHistogram(const String16& name, int sample) { |
| base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( |
| android::String8(name).string(), |
| base::Histogram::kUmaTargetedHistogramFlag); |
| // |histogram| may be null if a client reports two contradicting histograms |
| // with the same name but different limits. |
| // FactoryGet will print a useful message if that is the case. |
| if (histogram) { |
| histogram->Add(sample); |
| } |
| return Status::ok(); |
| } |
| |
| Status BnMetricsdImpl::recordCrash(const String16& type) { |
| if (type == kCrashTypeUser) { |
| counters_->IncrementUserCrashCount(); |
| } else if (type == kCrashTypeKernel) { |
| counters_->IncrementKernelCrashCount(); |
| } else if (type == kCrashTypeUncleanShutdown) { |
| counters_->IncrementUncleanShutdownCount(); |
| } else { |
| LOG(ERROR) << "Unknown crash type received: " << type; |
| } |
| return Status::ok(); |
| } |
| |
| Status BnMetricsdImpl::getHistogramsDump(String16* dump) { |
| std::string str_dump; |
| base::StatisticsRecorder::WriteGraph(std::string(), &str_dump); |
| *dump = String16(str_dump.c_str()); |
| return Status::ok(); |
| } |