Skip to content

Commit 8195001

Browse files
mushketykzentol
authored andcommitted
[FLINK-3950] Add Meter interface
This closes apache#2374
1 parent 6226108 commit 8195001

File tree

19 files changed

+638
-10
lines changed

19 files changed

+638
-10
lines changed

docs/monitoring/metrics.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ This method returns a `MetricGroup` object on which you can create and register
3434

3535
### Metric types
3636

37-
Flink supports `Counters`, `Gauges` and `Histograms`.
37+
Flink supports `Counters`, `Gauges`, `Histograms` and `Meters`.
3838

3939
#### Counter
4040

@@ -155,6 +155,55 @@ public class MyMapper extends RichMapFunction<Long, Integer> {
155155
}
156156
{% endhighlight %}
157157

158+
#### Meter
159+
160+
A `Meter` measures an average throughput. An occurrence of an event can be registered with the `markEvent()` method. Occurrence of multiple events at the same time can be registered with `markEvent(long n)` method.
161+
You can register a meter by calling `meter(String name, Meter meter)` on a `MetricGroup`.
162+
163+
{% highlight java %}
164+
public class MyMapper extends RichMapFunction<Long, Integer> {
165+
private Meter meter;
166+
167+
@Override
168+
public void open(Configuration config) {
169+
this.meter = getRuntimeContext()
170+
.getMetricGroup()
171+
.meter("myMeter", new MyMeter());
172+
}
173+
174+
@public Integer map(Long value) throws Exception {
175+
this.meter.markEvent();
176+
}
177+
}
178+
{% endhighlight %}
179+
180+
Flink offers a {% gh_link flink-metrics/flink-metrics-dropwizard/src/main/java/org/apache/flink/dropwizard/metrics/DropwizardMeterWrapper.java "Wrapper" %} that allows usage of Codahale/DropWizard meters.
181+
To use this wrapper add the following dependency in your `pom.xml`:
182+
{% highlight xml %}
183+
<dependency>
184+
<groupId>org.apache.flink</groupId>
185+
<artifactId>flink-metrics-dropwizard</artifactId>
186+
<version>{{site.version}}</version>
187+
</dependency>
188+
{% endhighlight %}
189+
190+
You can then register a Codahale/DropWizard meter like this:
191+
192+
{% highlight java %}
193+
public class MyMapper extends RichMapFunction<Long, Integer> {
194+
private Meter meter;
195+
196+
@Override
197+
public void open(Configuration config) {
198+
com.codahale.metrics.Meter meter = new com.codahale.metrics.Meter();
199+
200+
this.meter = getRuntimeContext()
201+
.getMetricGroup()
202+
.meter("myMeter", new DropWizardMeterWrapper(meter));
203+
}
204+
}
205+
{% endhighlight %}
206+
158207
## Scope
159208

160209
Every metric is assigned an identifier under which it will be reported that is based on 3 components: the user-provided name when registering the metric, an optional user-defined scope and a system-provided scope.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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.flink.metrics;
20+
21+
/**
22+
* Metric for measuring throughput.
23+
*/
24+
public interface Meter extends Metric {
25+
26+
/**
27+
* Mark occurrence of an event.
28+
*/
29+
void markEvent();
30+
31+
/**
32+
* Mark occurrence of multiple events.
33+
*
34+
* @param n number of events occurred
35+
*/
36+
void markEvent(long n);
37+
38+
/**
39+
* Returns the current rate of events per second.
40+
*
41+
* @return current rate of events per second
42+
*/
43+
double getRate();
44+
45+
/**
46+
* Get number of events marked on the meter.
47+
*
48+
* @return number of events marked on the meter
49+
*/
50+
long getCount();
51+
}

flink-metrics/flink-metrics-core/src/main/java/org/apache/flink/metrics/MetricGroup.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,26 @@ public interface MetricGroup {
110110
*/
111111
<H extends Histogram> H histogram(int name, H histogram);
112112

113+
/**
114+
* Registers a new {@link Meter} with Flink.
115+
*
116+
* @param name name of the meter
117+
* @param meter meter to register
118+
* @param <M> meter type
119+
* @return the registered meter
120+
*/
121+
<M extends Meter> M meter(String name, M meter);
122+
123+
/**
124+
* Registers a new {@link Meter} with Flink.
125+
*
126+
* @param name name of the meter
127+
* @param meter meter to register
128+
* @param <M> meter type
129+
* @return the registered meter
130+
*/
131+
<M extends Meter> M meter(int name, M meter);
132+
113133
// ------------------------------------------------------------------------
114134
// Groups
115135
// ------------------------------------------------------------------------

flink-metrics/flink-metrics-core/src/main/java/org/apache/flink/metrics/groups/UnregisteredMetricsGroup.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.flink.metrics.Counter;
2323
import org.apache.flink.metrics.Gauge;
2424
import org.apache.flink.metrics.Histogram;
25+
import org.apache.flink.metrics.Meter;
2526
import org.apache.flink.metrics.MetricGroup;
2627
import org.apache.flink.metrics.SimpleCounter;
2728

@@ -69,6 +70,16 @@ public <H extends Histogram> H histogram(int name, H histogram) {
6970
return histogram;
7071
}
7172

73+
@Override
74+
public <M extends Meter> M meter(String name, M meter) {
75+
return meter;
76+
}
77+
78+
@Override
79+
public <M extends Meter> M meter(int name, M meter) {
80+
return meter;
81+
}
82+
7283
@Override
7384
public <H extends Histogram> H histogram(String name, H histogram) {
7485
return histogram;

flink-metrics/flink-metrics-core/src/main/java/org/apache/flink/metrics/reporter/AbstractReporter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.flink.metrics.Counter;
2323
import org.apache.flink.metrics.Gauge;
2424
import org.apache.flink.metrics.Histogram;
25+
import org.apache.flink.metrics.Meter;
2526
import org.apache.flink.metrics.Metric;
2627
import org.apache.flink.metrics.MetricGroup;
2728
import org.slf4j.Logger;
@@ -39,6 +40,7 @@ public abstract class AbstractReporter implements MetricReporter, CharacterFilte
3940
protected final Map<Gauge<?>, String> gauges = new HashMap<>();
4041
protected final Map<Counter, String> counters = new HashMap<>();
4142
protected final Map<Histogram, String> histograms = new HashMap<>();
43+
protected final Map<Meter, String> meters = new HashMap<>();
4244

4345
@Override
4446
public void notifyOfAddedMetric(Metric metric, String metricName, MetricGroup group) {
@@ -51,6 +53,8 @@ public void notifyOfAddedMetric(Metric metric, String metricName, MetricGroup gr
5153
gauges.put((Gauge<?>) metric, name);
5254
} else if (metric instanceof Histogram) {
5355
histograms.put((Histogram) metric, name);
56+
} else if (metric instanceof Meter) {
57+
meters.put((Meter) metric, name);
5458
} else {
5559
log.warn("Cannot add unknown metric type {}. This indicates that the reporter " +
5660
"does not support this metric type.", metric.getClass().getName());
@@ -67,6 +71,8 @@ public void notifyOfRemovedMetric(Metric metric, String metricName, MetricGroup
6771
gauges.remove(metric);
6872
} else if (metric instanceof Histogram) {
6973
histograms.remove(metric);
74+
} else if (metric instanceof Meter) {
75+
meters.remove(metric);
7076
} else {
7177
log.warn("Cannot remove unknown metric type {}. This indicates that the reporter " +
7278
"does not support this metric type.", metric.getClass().getName());
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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.flink.metrics.util;
20+
21+
import org.apache.flink.metrics.Meter;
22+
23+
public class TestMeter implements Meter {
24+
25+
@Override
26+
public void markEvent() {
27+
}
28+
29+
@Override
30+
public void markEvent(long n) {
31+
}
32+
33+
@Override
34+
public double getRate() {
35+
return 5;
36+
}
37+
38+
@Override
39+
public long getCount() {
40+
return 100L;
41+
}
42+
}

flink-metrics/flink-metrics-dropwizard/src/main/java/org/apache/flink/dropwizard/ScheduledDropwizardReporter.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
import com.codahale.metrics.ScheduledReporter;
2424

2525
import org.apache.flink.annotation.PublicEvolving;
26+
import org.apache.flink.dropwizard.metrics.DropwizardMeterWrapper;
2627
import org.apache.flink.dropwizard.metrics.FlinkCounterWrapper;
2728
import org.apache.flink.dropwizard.metrics.DropwizardHistogramWrapper;
2829
import org.apache.flink.dropwizard.metrics.FlinkGaugeWrapper;
2930
import org.apache.flink.dropwizard.metrics.FlinkHistogramWrapper;
31+
import org.apache.flink.dropwizard.metrics.FlinkMeterWrapper;
3032
import org.apache.flink.metrics.CharacterFilter;
3133
import org.apache.flink.metrics.Counter;
3234
import org.apache.flink.metrics.Gauge;
3335
import org.apache.flink.metrics.Histogram;
36+
import org.apache.flink.metrics.Meter;
3437
import org.apache.flink.metrics.Metric;
3538
import org.apache.flink.metrics.MetricConfig;
3639
import org.apache.flink.metrics.MetricGroup;
@@ -67,6 +70,7 @@ public abstract class ScheduledDropwizardReporter implements MetricReporter, Sch
6770
private final Map<Gauge<?>, String> gauges = new HashMap<>();
6871
private final Map<Counter, String> counters = new HashMap<>();
6972
private final Map<Histogram, String> histograms = new HashMap<>();
73+
private final Map<Meter, String> meters = new HashMap<>();
7074

7175
// ------------------------------------------------------------------------
7276

@@ -83,6 +87,10 @@ Map<Counter, String> getCounters() {
8387
return counters;
8488
}
8589

90+
Map<Meter, String> getMeters() {
91+
return meters;
92+
}
93+
8694
// ------------------------------------------------------------------------
8795
// life cycle
8896
// ------------------------------------------------------------------------
@@ -118,10 +126,19 @@ else if (metric instanceof Gauge) {
118126
histograms.put(histogram, fullName);
119127

120128
if (histogram instanceof DropwizardHistogramWrapper) {
121-
registry.register(fullName, ((DropwizardHistogramWrapper) histogram).getDropwizarHistogram());
129+
registry.register(fullName, ((DropwizardHistogramWrapper) histogram).getDropwizardHistogram());
122130
} else {
123131
registry.register(fullName, new FlinkHistogramWrapper(histogram));
124132
}
133+
} else if (metric instanceof Meter) {
134+
Meter meter = (Meter) metric;
135+
meters.put(meter, fullName);
136+
137+
if (meter instanceof DropwizardMeterWrapper) {
138+
registry.register(fullName, ((DropwizardMeterWrapper) meter).getDropwizardMeter());
139+
} else {
140+
registry.register(fullName, new FlinkMeterWrapper(meter));
141+
}
125142
} else {
126143
log.warn("Cannot add metric of type {}. This indicates that the reporter " +
127144
"does not support this metric type.", metric.getClass().getName());

flink-metrics/flink-metrics-dropwizard/src/main/java/org/apache/flink/dropwizard/metrics/DropwizardHistogramWrapper.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,28 @@
2626
*/
2727
public class DropwizardHistogramWrapper implements Histogram {
2828

29-
private final com.codahale.metrics.Histogram dropwizarHistogram;
29+
private final com.codahale.metrics.Histogram dropwizardHistogram;
3030

3131
public DropwizardHistogramWrapper(com.codahale.metrics.Histogram dropwizardHistogram) {
32-
this.dropwizarHistogram = dropwizardHistogram;
32+
this.dropwizardHistogram = dropwizardHistogram;
3333
}
3434

35-
public com.codahale.metrics.Histogram getDropwizarHistogram() {
36-
return dropwizarHistogram;
35+
public com.codahale.metrics.Histogram getDropwizardHistogram() {
36+
return dropwizardHistogram;
3737
}
3838

3939
@Override
4040
public void update(long value) {
41-
dropwizarHistogram.update(value);
41+
dropwizardHistogram.update(value);
4242
}
4343

4444
@Override
4545
public long getCount() {
46-
return dropwizarHistogram.getCount();
46+
return dropwizardHistogram.getCount();
4747
}
4848

4949
@Override
5050
public HistogramStatistics getStatistics() {
51-
return new DropwizardHistogramStatistics(dropwizarHistogram.getSnapshot());
51+
return new DropwizardHistogramStatistics(dropwizardHistogram.getSnapshot());
5252
}
5353
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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.flink.dropwizard.metrics;
20+
21+
import org.apache.flink.metrics.Meter;
22+
23+
/**
24+
* Wrapper to use a Dropwizard {@link com.codahale.metrics.Meter} as a Flink {@link Meter}.
25+
*/
26+
public class DropwizardMeterWrapper implements Meter {
27+
28+
private final com.codahale.metrics.Meter meter;
29+
30+
public DropwizardMeterWrapper(com.codahale.metrics.Meter meter) {
31+
this.meter = meter;
32+
}
33+
34+
public com.codahale.metrics.Meter getDropwizardMeter() {
35+
return meter;
36+
}
37+
38+
@Override
39+
public void markEvent() {
40+
meter.mark();
41+
}
42+
43+
@Override
44+
public void markEvent(long n) {
45+
meter.mark(n);
46+
}
47+
48+
@Override
49+
public double getRate() {
50+
return meter.getOneMinuteRate();
51+
}
52+
53+
@Override
54+
public long getCount() {
55+
return meter.getCount();
56+
}
57+
}

0 commit comments

Comments
 (0)