code: public Deferred<Object> addHistogramPoint(final String metric,
                                              final long timestamp,
                                              final byte[] raw_data,
                                              final Map<String, String> tags) {
      if (raw_data == null || raw_data.length < MIN_HISTOGRAM_BYTES) {
        return Deferred.fromError(new IllegalArgumentException(
            "The histogram raw data is invalid: " + Bytes.pretty(raw_data)));
      }
      
      checkTimestampAndTags(metric, timestamp, raw_data, tags, (short) 0);
      final byte[] row = IncomingDataPoints.rowKeyTemplate(this, metric, tags);
  
      final byte[] qualifier = Internal.getQualifier(timestamp, 
          HistogramDataPoint.PREFIX);
      
      return storeIntoDB(metric, timestamp, raw_data, tags, (short) 0, row, qualifier);
    }
docs: Adds an encoded Histogram data point in the TSDB.
  @param metric A non-empty string.
  @param timestamp The timestamp associated with the value.
  @param raw_data The encoded data blob of the Histogram point.
  @param tags The tags on this series.  This map must be non-empty.
  @return A deferred object that indicates the completion of the request.
  The {@link Object} has not special meaning and can be {@code null} (think
  of it as {@code Deferred<Void>}). But you probably want to attach at
  least an errback to this {@code Deferred} to handle failures.
  @throws IllegalArgumentException if the timestamp is less than or equal
  to the previous timestamp added or 0 for the first timestamp, or if the
  difference with the previous timestamp is too large.
  @throws IllegalArgumentException if the metric name is empty or contains
  illegal characters.
  @throws IllegalArgumentException if the tags list is empty or one of the
  elements contains illegal characters.
  @throws HBaseException (deferred) if there was a problem while persisting
  data.