11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef BASE_METRICS_HISTOGRAM_DELTA_SERIALIZATION_H_
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define BASE_METRICS_HISTOGRAM_DELTA_SERIALIZATION_H_
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <string>
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <vector>
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/base_export.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/basictypes.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/metrics/histogram_flattener.h"
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/metrics/histogram_snapshot_manager.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace base {
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class HistogramBase;
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Serializes and restores histograms deltas.
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class BASE_EXPORT HistogramDeltaSerialization : public HistogramFlattener {
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |caller_name| is string used in histograms for counting inconsistencies.
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit HistogramDeltaSerialization(const std::string& caller_name);
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~HistogramDeltaSerialization();
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Computes deltas in histogram bucket counts relative to the previous call to
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // this method. Stores the deltas in serialized form into |serialized_deltas|.
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // If |serialized_deltas| is NULL, no data is serialized, though the next call
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // will compute the deltas relative to this one.
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void PrepareAndSerializeDeltas(std::vector<std::string>* serialized_deltas);
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Deserialize deltas and add samples to corresponding histograms, creating
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // them if necessary. Silently ignores errors in |serialized_deltas|.
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static void DeserializeAndAddSamples(
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const std::vector<std::string>& serialized_deltas);
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // HistogramFlattener implementation.
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void RecordDelta(const HistogramBase& histogram,
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           const HistogramSamples& snapshot) OVERRIDE;
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void InconsistencyDetected(
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      HistogramBase::Inconsistency problem) OVERRIDE;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void UniqueInconsistencyDetected(
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      HistogramBase::Inconsistency problem) OVERRIDE;
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void InconsistencyDetectedInLoggedCount(int amount) OVERRIDE;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Calculates deltas in histogram counters.
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  HistogramSnapshotManager histogram_snapshot_manager_;
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Output buffer for serialized deltas.
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<std::string>* serialized_deltas_;
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Histograms to count inconsistencies in snapshots.
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  HistogramBase* inconsistencies_histogram_;
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  HistogramBase* inconsistencies_unique_histogram_;
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  HistogramBase* inconsistent_snapshot_histogram_;
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HistogramDeltaSerialization);
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace base
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // BASE_METRICS_HISTOGRAM_DELTA_SERIALIZATION_H_
66