Line data Source code
1 : // Copyright (C) 2015 The Android Open Source Project
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 :
15 : package com.google.gerrit.server.plugins;
16 :
17 : import com.google.gerrit.extensions.events.LifecycleListener;
18 : import com.google.gerrit.extensions.registration.RegistrationHandle;
19 : import com.google.gerrit.metrics.CallbackMetric;
20 : import com.google.gerrit.metrics.CallbackMetric0;
21 : import com.google.gerrit.metrics.CallbackMetric1;
22 : import com.google.gerrit.metrics.Counter0;
23 : import com.google.gerrit.metrics.Counter1;
24 : import com.google.gerrit.metrics.Counter2;
25 : import com.google.gerrit.metrics.Counter3;
26 : import com.google.gerrit.metrics.Description;
27 : import com.google.gerrit.metrics.Field;
28 : import com.google.gerrit.metrics.Histogram0;
29 : import com.google.gerrit.metrics.Histogram1;
30 : import com.google.gerrit.metrics.Histogram2;
31 : import com.google.gerrit.metrics.Histogram3;
32 : import com.google.gerrit.metrics.MetricMaker;
33 : import com.google.gerrit.metrics.Timer0;
34 : import com.google.gerrit.metrics.Timer1;
35 : import com.google.gerrit.metrics.Timer2;
36 : import com.google.gerrit.metrics.Timer3;
37 : import java.util.Collections;
38 : import java.util.HashSet;
39 : import java.util.Iterator;
40 : import java.util.Set;
41 :
42 : public class PluginMetricMaker extends MetricMaker implements LifecycleListener {
43 : private final MetricMaker root;
44 : private final String prefix;
45 : private final Set<RegistrationHandle> cleanup;
46 :
47 13 : public PluginMetricMaker(MetricMaker root, String prefix) {
48 13 : this.root = root;
49 13 : this.prefix = prefix.endsWith("/") ? prefix : prefix + "/";
50 13 : cleanup = Collections.synchronizedSet(new HashSet<>());
51 13 : }
52 :
53 : @Override
54 : public Counter0 newCounter(String name, Description desc) {
55 0 : Counter0 m = root.newCounter(prefix + name, desc);
56 0 : cleanup.add(m);
57 0 : return m;
58 : }
59 :
60 : @Override
61 : public <F1> Counter1<F1> newCounter(String name, Description desc, Field<F1> field1) {
62 1 : Counter1<F1> m = root.newCounter(prefix + name, desc, field1);
63 1 : cleanup.add(m);
64 1 : return m;
65 : }
66 :
67 : @Override
68 : public <F1, F2> Counter2<F1, F2> newCounter(
69 : String name, Description desc, Field<F1> field1, Field<F2> field2) {
70 0 : Counter2<F1, F2> m = root.newCounter(prefix + name, desc, field1, field2);
71 0 : cleanup.add(m);
72 0 : return m;
73 : }
74 :
75 : @Override
76 : public <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
77 : String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
78 3 : Counter3<F1, F2, F3> m = root.newCounter(prefix + name, desc, field1, field2, field3);
79 3 : cleanup.add(m);
80 3 : return m;
81 : }
82 :
83 : @Override
84 : public Timer0 newTimer(String name, Description desc) {
85 3 : Timer0 m = root.newTimer(prefix + name, desc);
86 3 : cleanup.add(m);
87 3 : return m;
88 : }
89 :
90 : @Override
91 : public <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1) {
92 1 : Timer1<F1> m = root.newTimer(prefix + name, desc, field1);
93 1 : cleanup.add(m);
94 1 : return m;
95 : }
96 :
97 : @Override
98 : public <F1, F2> Timer2<F1, F2> newTimer(
99 : String name, Description desc, Field<F1> field1, Field<F2> field2) {
100 0 : Timer2<F1, F2> m = root.newTimer(prefix + name, desc, field1, field2);
101 0 : cleanup.add(m);
102 0 : return m;
103 : }
104 :
105 : @Override
106 : public <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
107 : String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
108 3 : Timer3<F1, F2, F3> m = root.newTimer(prefix + name, desc, field1, field2, field3);
109 3 : cleanup.add(m);
110 3 : return m;
111 : }
112 :
113 : @Override
114 : public Histogram0 newHistogram(String name, Description desc) {
115 0 : Histogram0 m = root.newHistogram(prefix + name, desc);
116 0 : cleanup.add(m);
117 0 : return m;
118 : }
119 :
120 : @Override
121 : public <F1> Histogram1<F1> newHistogram(String name, Description desc, Field<F1> field1) {
122 1 : Histogram1<F1> m = root.newHistogram(prefix + name, desc, field1);
123 1 : cleanup.add(m);
124 1 : return m;
125 : }
126 :
127 : @Override
128 : public <F1, F2> Histogram2<F1, F2> newHistogram(
129 : String name, Description desc, Field<F1> field1, Field<F2> field2) {
130 0 : Histogram2<F1, F2> m = root.newHistogram(prefix + name, desc, field1, field2);
131 0 : cleanup.add(m);
132 0 : return m;
133 : }
134 :
135 : @Override
136 : public <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
137 : String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
138 0 : Histogram3<F1, F2, F3> m = root.newHistogram(prefix + name, desc, field1, field2, field3);
139 0 : cleanup.add(m);
140 0 : return m;
141 : }
142 :
143 : @Override
144 : public <V> CallbackMetric0<V> newCallbackMetric(
145 : String name, Class<V> valueClass, Description desc) {
146 0 : CallbackMetric0<V> m = root.newCallbackMetric(prefix + name, valueClass, desc);
147 0 : cleanup.add(m);
148 0 : return m;
149 : }
150 :
151 : @Override
152 : public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
153 : String name, Class<V> valueClass, Description desc, Field<F1> field1) {
154 0 : CallbackMetric1<F1, V> m = root.newCallbackMetric(prefix + name, valueClass, desc, field1);
155 0 : cleanup.add(m);
156 0 : return m;
157 : }
158 :
159 : @Override
160 : public RegistrationHandle newTrigger(Set<CallbackMetric<?>> metrics, Runnable trigger) {
161 0 : final RegistrationHandle handle = root.newTrigger(metrics, trigger);
162 0 : cleanup.add(handle);
163 0 : return () -> {
164 0 : handle.remove();
165 0 : cleanup.remove(handle);
166 0 : };
167 : }
168 :
169 : @Override
170 13 : public void start() {}
171 :
172 : @Override
173 : public void stop() {
174 13 : synchronized (cleanup) {
175 13 : Iterator<RegistrationHandle> itr = cleanup.iterator();
176 13 : while (itr.hasNext()) {
177 3 : itr.next().remove();
178 3 : itr.remove();
179 : }
180 13 : }
181 13 : }
182 : }
|