Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
GiraphMetrics |
|
| 1.0833333333333333;1.083 |
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 | package org.apache.giraph.metrics; | |
19 | ||
20 | import org.apache.giraph.conf.GiraphConfiguration; | |
21 | import org.apache.giraph.utils.GcTracker; | |
22 | ||
23 | import com.google.common.collect.Lists; | |
24 | ||
25 | import java.io.PrintStream; | |
26 | import java.util.List; | |
27 | ||
28 | import static org.apache.giraph.bsp.BspService.INPUT_SUPERSTEP; | |
29 | ||
30 | /** | |
31 | * Top level metrics class for using Yammer's metrics in Giraph. | |
32 | */ | |
33 | public class GiraphMetrics { | |
34 | /** Singleton instance for everyone to use */ | |
35 | 0 | private static GiraphMetrics INSTANCE = new GiraphMetrics(); |
36 | ||
37 | /** registry for per-superstep metrics */ | |
38 | private final SuperstepMetricsRegistry perSuperstep; | |
39 | ||
40 | /** registry for optional per-job metrics */ | |
41 | private final GiraphMetricsRegistry perJobOptional; | |
42 | ||
43 | /** registry for required per-job metrics */ | |
44 | private final GiraphMetricsRegistry perJobRequired; | |
45 | ||
46 | /** Garbage collection tracker */ | |
47 | private final GcTracker gcTracker; | |
48 | ||
49 | /** observer for per-superstep metrics re-initialization */ | |
50 | 0 | private final List<ResetSuperstepMetricsObserver> observers = |
51 | 0 | Lists.newArrayList(); |
52 | ||
53 | /** | |
54 | * Initialize no-op registry that creates no-op metrics. | |
55 | */ | |
56 | 0 | private GiraphMetrics() { |
57 | 0 | perJobOptional = GiraphMetricsRegistry.createFake(); |
58 | 0 | perSuperstep = SuperstepMetricsRegistry.createFake(); |
59 | 0 | perJobRequired = GiraphMetricsRegistry.createWithOptional("giraph", "job"); |
60 | 0 | gcTracker = new GcTracker(); |
61 | 0 | } |
62 | ||
63 | /** | |
64 | * Initialize GiraphMetrics with Hadoop Context | |
65 | * | |
66 | * @param conf GiraphConfiguration to use. | |
67 | */ | |
68 | 0 | private GiraphMetrics(GiraphConfiguration conf) { |
69 | 0 | perJobOptional = GiraphMetricsRegistry.create(conf, "giraph", "job"); |
70 | 0 | perSuperstep = SuperstepMetricsRegistry.create(conf, INPUT_SUPERSTEP); |
71 | 0 | perJobRequired = GiraphMetricsRegistry.createWithOptional("giraph", "job"); |
72 | 0 | gcTracker = new GcTracker(conf); |
73 | 0 | } |
74 | ||
75 | /** | |
76 | * Get singleton instance of GiraphMetrics. | |
77 | * | |
78 | * @return GiraphMetrics singleton instance | |
79 | */ | |
80 | public static GiraphMetrics get() { | |
81 | 0 | return INSTANCE; |
82 | } | |
83 | ||
84 | /** | |
85 | * Initialize singleton instance of GiraphMetrics. | |
86 | * | |
87 | * @param conf GiraphConfiguration to use. | |
88 | */ | |
89 | public static void init(GiraphConfiguration conf) { | |
90 | 0 | INSTANCE = new GiraphMetrics(conf); |
91 | 0 | } |
92 | ||
93 | /** | |
94 | * Get per-job optional metrics. | |
95 | * | |
96 | * @return per-job optional {@link GiraphMetricsRegistry} | |
97 | */ | |
98 | public GiraphMetricsRegistry perJobOptional() { | |
99 | 0 | return perJobOptional; |
100 | } | |
101 | ||
102 | /** | |
103 | * Get per-job required metrics. | |
104 | * | |
105 | * @return per-job require {@link GiraphMetricsRegistry} | |
106 | */ | |
107 | public GiraphMetricsRegistry perJobRequired() { | |
108 | 0 | return perJobRequired; |
109 | } | |
110 | ||
111 | /** | |
112 | * Get per-superstep metrics. | |
113 | * | |
114 | * @return per-superstep GiraphMetricsRegistry | |
115 | */ | |
116 | public SuperstepMetricsRegistry perSuperstep() { | |
117 | 0 | return perSuperstep; |
118 | } | |
119 | ||
120 | /** | |
121 | * Get GC tracker | |
122 | * | |
123 | * @return Gc tracker | |
124 | */ | |
125 | public GcTracker getGcTracker() { | |
126 | 0 | return gcTracker; |
127 | } | |
128 | ||
129 | /** | |
130 | * Anyone using per-superstep counters needs to re-initialize their Metrics | |
131 | * object on each new superstep. Otherwise they will always be updating just | |
132 | * one counter. This method allows people to easily register a callback for | |
133 | * when they should do the re-initializing. | |
134 | * | |
135 | * @param observer SuperstepObserver to watch | |
136 | */ | |
137 | public synchronized void addSuperstepResetObserver( | |
138 | ResetSuperstepMetricsObserver observer) { | |
139 | 0 | observers.add(observer); |
140 | 0 | } |
141 | ||
142 | /** | |
143 | * Reset the per-superstep MetricsRegistry | |
144 | * | |
145 | * @param superstep long number of superstep | |
146 | */ | |
147 | public synchronized void resetSuperstepMetrics(long superstep) { | |
148 | 0 | perSuperstep.setSuperstep(superstep); |
149 | 0 | for (ResetSuperstepMetricsObserver observer : observers) { |
150 | 0 | observer.newSuperstep(perSuperstep); |
151 | 0 | } |
152 | 0 | } |
153 | ||
154 | /** | |
155 | * Dump all metrics to output stream provided. | |
156 | * | |
157 | * @param out PrintStream to dump to. | |
158 | */ | |
159 | public void dumpToStream(PrintStream out) { | |
160 | 0 | perJobOptional.printToStream(out); |
161 | 0 | perJobRequired.printToStream(out); |
162 | 0 | } |
163 | ||
164 | /** | |
165 | * Stop using metrics (for cleanup) | |
166 | */ | |
167 | public void shutdown() { | |
168 | 0 | perJobOptional.shutdown(); |
169 | 0 | perJobRequired.shutdown(); |
170 | 0 | perSuperstep.shutdown(); |
171 | 0 | } |
172 | } |