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.giraph.metrics;
20
21 import com.google.common.collect.ImmutableMap;
22
23 import java.util.concurrent.TimeUnit;
24
25 /**
26 * A timer to record duration of an event in a given TimeUnit.
27 * GiraphTimer is actually just a single-value Yammer Gauge that has some
28 * methods to make timing things easier.
29 */
30 public class GiraphTimer extends ValueGauge<Long> {
31 /** Mapping from TimeUnit to abbreviation used for printing */
32 private static final ImmutableMap<TimeUnit, String> TIME_UNIT_TO_ABBREV =
33 ImmutableMap.<TimeUnit, String>builder().
34 put(TimeUnit.DAYS, "days").
35 put(TimeUnit.HOURS, "hours").
36 put(TimeUnit.MICROSECONDS, "us").
37 put(TimeUnit.MILLISECONDS, "ms").
38 put(TimeUnit.MINUTES, "mins").
39 put(TimeUnit.NANOSECONDS, "ns").
40 put(TimeUnit.SECONDS, "secs").build();
41
42 /** dimension to measure things by */
43 private TimeUnit timeUnit;
44
45 /**
46 * Create new timer, add it to the registry.
47 *
48 * @param registry GiraphMetricsRegistry to add timer to
49 * @param name String name of timer
50 * @param timeUnit TimeUnit to measure in
51 */
52 public GiraphTimer(GiraphMetricsRegistry registry, String name,
53 TimeUnit timeUnit) {
54 super(registry, name);
55 this.timeUnit = timeUnit;
56 set(0L);
57 }
58
59 /**
60 * Get TimeUnit used.
61 *
62 * @return TimeUnit being used.
63 */
64 public TimeUnit getTimeUnit() {
65 return timeUnit;
66 }
67
68 /**
69 * Begin timing an event.
70 *
71 * @return GiraphTimerContext. Use stop() to end timing the event.
72 */
73 public GiraphTimerContext time() {
74 return new GiraphTimerContext(this);
75 }
76
77 /**
78 * Set value from a given TimeUnit, converting to our TimeUnit.
79 *
80 * @param value long measurement taken.
81 * @param valueTimeUnit TimeUnit measurement is in.
82 * @return this
83 */
84 public GiraphTimer set(long value, TimeUnit valueTimeUnit) {
85 set(timeUnit.convert(value, valueTimeUnit));
86 return this;
87 }
88
89 /**
90 * Get abbreviated string of TimeUnit.
91 *
92 * @return TimeUnit abbreviation.
93 */
94 public String getTimeUnitAbbrev() {
95 return TIME_UNIT_TO_ABBREV.get(timeUnit);
96 }
97
98 /**
99 * Get string representation of value
100 *
101 * @return String value and abbreviated time unit
102 */
103 public String valueAndUnit() {
104 return "" + value() + " " + getTimeUnitAbbrev();
105 }
106 }