View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.hadoop.hbase.replication.regionserver;
20  
21  import org.apache.hadoop.classification.InterfaceAudience;
22  import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
23  import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSource;
24  
25  /**
26   * This class is for maintaining the various replication statistics for a sink and publishing them
27   * through the metrics interfaces.
28   */
29  @InterfaceAudience.Private
30  public class MetricsSink {
31  
32    public static final String SINK_AGE_OF_LAST_APPLIED_OP = "sink.ageOfLastAppliedOp";
33    public static final String SINK_APPLIED_BATCHES = "sink.appliedBatches";
34    public static final String SINK_APPLIED_OPS = "sink.appliedOps";
35  
36    private MetricsReplicationSource rms;
37    private long lastTimestampForAge = System.currentTimeMillis();
38  
39    public MetricsSink() {
40      rms = CompatibilitySingletonFactory.getInstance(MetricsReplicationSource.class);
41    }
42  
43    /**
44     * Set the age of the last applied operation
45     *
46     * @param timestamp The timestamp of the last operation applied.
47     * @return the age that was set
48     */
49    public long setAgeOfLastAppliedOp(long timestamp) {
50      long age = 0;
51      if (lastTimestampForAge != timestamp) {
52        lastTimestampForAge = timestamp;
53        age = System.currentTimeMillis() - lastTimestampForAge;
54      } 
55      rms.setGauge(SINK_AGE_OF_LAST_APPLIED_OP, age);
56      return age;
57    }
58  
59    /**
60     * Refreshing the age makes sure the value returned is the actual one and
61     * not the one set a replication time
62     * @return refreshed age
63     */
64    public long refreshAgeOfLastAppliedOp() {
65      return setAgeOfLastAppliedOp(lastTimestampForAge);
66    }
67  
68    /**
69     * Convience method to change metrics when a batch of operations are applied.
70     *
71     * @param batchSize
72     */
73    public void applyBatch(long batchSize) {
74      rms.incCounters(SINK_APPLIED_BATCHES, 1);
75      rms.incCounters(SINK_APPLIED_OPS, batchSize);
76    }
77  
78  }