Home | History | Annotate | Download | only in metrics
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/metrics/histogram_delta_serialization.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/metrics/histogram_base.h"
      9 #include "base/metrics/histogram_snapshot_manager.h"
     10 #include "base/pickle.h"
     11 #include "base/safe_numerics.h"
     12 #include "base/values.h"
     13 
     14 namespace base {
     15 
     16 namespace {
     17 
     18 // Create or find existing histogram and add the samples from pickle.
     19 // Silently returns when seeing any data problem in the pickle.
     20 void DeserializeHistogramAndAddSamples(PickleIterator* iter) {
     21   HistogramBase* histogram = DeserializeHistogramInfo(iter);
     22   if (!histogram)
     23     return;
     24 
     25   if (histogram->flags() & HistogramBase::kIPCSerializationSourceFlag) {
     26     DVLOG(1) << "Single process mode, histogram observed and not copied: "
     27              << histogram->histogram_name();
     28     return;
     29   }
     30   histogram->AddSamplesFromPickle(iter);
     31 }
     32 
     33 }  // namespace
     34 
     35 HistogramDeltaSerialization::HistogramDeltaSerialization(
     36     const std::string& caller_name)
     37     : histogram_snapshot_manager_(this),
     38       serialized_deltas_(NULL) {
     39   inconsistencies_histogram_ =
     40       LinearHistogram::FactoryGet(
     41           "Histogram.Inconsistencies" + caller_name, 1,
     42           HistogramBase::NEVER_EXCEEDED_VALUE,
     43           HistogramBase::NEVER_EXCEEDED_VALUE + 1,
     44           HistogramBase::kUmaTargetedHistogramFlag);
     45 
     46   inconsistencies_unique_histogram_ =
     47       LinearHistogram::FactoryGet(
     48           "Histogram.Inconsistencies" + caller_name + "Unique", 1,
     49           HistogramBase::NEVER_EXCEEDED_VALUE,
     50           HistogramBase::NEVER_EXCEEDED_VALUE + 1,
     51           HistogramBase::kUmaTargetedHistogramFlag);
     52 
     53   inconsistent_snapshot_histogram_ =
     54       Histogram::FactoryGet(
     55           "Histogram.InconsistentSnapshot" + caller_name, 1, 1000000, 50,
     56           HistogramBase::kUmaTargetedHistogramFlag);
     57 }
     58 
     59 HistogramDeltaSerialization::~HistogramDeltaSerialization() {
     60 }
     61 
     62 void HistogramDeltaSerialization::PrepareAndSerializeDeltas(
     63     std::vector<std::string>* serialized_deltas) {
     64   serialized_deltas_ = serialized_deltas;
     65   // Note: Before serializing, we set the kIPCSerializationSourceFlag for all
     66   // the histograms, so that the receiving process can distinguish them from the
     67   // local histograms.
     68   histogram_snapshot_manager_.PrepareDeltas(
     69       Histogram::kIPCSerializationSourceFlag, false);
     70   serialized_deltas_ = NULL;
     71 }
     72 
     73 // static
     74 void HistogramDeltaSerialization::DeserializeAndAddSamples(
     75     const std::vector<std::string>& serialized_deltas) {
     76   for (std::vector<std::string>::const_iterator it = serialized_deltas.begin();
     77        it != serialized_deltas.end(); ++it) {
     78     Pickle pickle(it->data(), checked_numeric_cast<int>(it->size()));
     79     PickleIterator iter(pickle);
     80     DeserializeHistogramAndAddSamples(&iter);
     81   }
     82 }
     83 
     84 void HistogramDeltaSerialization::RecordDelta(
     85     const HistogramBase& histogram,
     86     const HistogramSamples& snapshot) {
     87   DCHECK_NE(0, snapshot.TotalCount());
     88 
     89   Pickle pickle;
     90   histogram.SerializeInfo(&pickle);
     91   snapshot.Serialize(&pickle);
     92   serialized_deltas_->push_back(
     93       std::string(static_cast<const char*>(pickle.data()), pickle.size()));
     94 }
     95 
     96 void HistogramDeltaSerialization::InconsistencyDetected(
     97     HistogramBase::Inconsistency problem) {
     98   inconsistencies_histogram_->Add(problem);
     99 }
    100 
    101 void HistogramDeltaSerialization::UniqueInconsistencyDetected(
    102     HistogramBase::Inconsistency problem) {
    103   inconsistencies_unique_histogram_->Add(problem);
    104 }
    105 
    106 void HistogramDeltaSerialization::InconsistencyDetectedInLoggedCount(
    107     int amount) {
    108   inconsistent_snapshot_histogram_->Add(std::abs(amount));
    109 }
    110 
    111 }  // namespace base
    112