Skip to content

Commit 466f087

Browse files
committed
HADOOP-11181. GraphiteSink emits wrong timestamps (Sascha Coenen via raviprak)
1 parent 0af1a2b commit 466f087

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

hadoop-common-project/hadoop-common/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ Release 2.6.0 - UNRELEASED
661661

662662
BUG FIXES
663663

664+
HADOOP-11181. GraphiteSink emits wrong timestamps (Sascha Coenen via raviprak)
665+
664666
HADOOP-10781. Unportable getgrouplist() usage breaks FreeBSD (Dmitry
665667
Sivachenko via Colin Patrick McCabe)
666668

hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/sink/GraphiteSink.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ public void putMetrics(MetricsRecord record) {
8989
}
9090
}
9191

92-
// Round the timestamp to second as Graphite accepts it in such format.
93-
int timestamp = Math.round(record.timestamp() / 1000.0f);
92+
// The record timestamp is in milliseconds while Graphite expects an epoc time in seconds.
93+
long timestamp = record.timestamp() / 1000L;
9494

9595
// Collect datapoints.
9696
for (AbstractMetric metric : record.metrics()) {

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/impl/TestGraphiteMetrics.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@
1919
package org.apache.hadoop.metrics2.impl;
2020

2121
import static org.junit.Assert.assertEquals;
22+
import static org.mockito.Mockito.mock;
23+
import static org.mockito.Mockito.verify;
24+
import static org.mockito.Mockito.when;
2225

26+
import java.io.ByteArrayOutputStream;
2327
import java.io.IOException;
2428
import java.io.OutputStreamWriter;
2529
import java.io.Writer;
2630
import java.util.ArrayList;
31+
import java.util.Collections;
2732
import java.util.HashSet;
2833
import java.util.List;
2934
import java.util.Set;
@@ -34,8 +39,6 @@
3439
import org.apache.hadoop.metrics2.MetricsTag;
3540
import org.apache.hadoop.metrics2.sink.GraphiteSink;
3641
import org.junit.Test;
37-
38-
import static org.mockito.Mockito.*;
3942
import org.mockito.ArgumentCaptor;
4043
import org.mockito.internal.util.reflection.Whitebox;
4144

@@ -108,6 +111,43 @@ public void testPutMetrics2() {
108111
result.equals("null.all.Context.Context=all.foo2 2 10\n" +
109112
"null.all.Context.Context=all.foo1 1 10\n"));
110113
}
114+
115+
/**
116+
* Assert that timestamps are converted correctly, ticket HADOOP-11182
117+
*/
118+
@Test
119+
public void testPutMetrics3() {
120+
121+
// setup GraphiteSink
122+
GraphiteSink sink = new GraphiteSink();
123+
ByteArrayOutputStream out = new ByteArrayOutputStream();
124+
Whitebox.setInternalState(sink, "writer", new OutputStreamWriter(out));
125+
126+
// given two metrics records with timestamps 1000 milliseconds apart.
127+
List<MetricsTag> tags = Collections.emptyList();
128+
Set<AbstractMetric> metrics = new HashSet<AbstractMetric>();
129+
metrics.add(makeMetric("foo1", 1));
130+
MetricsRecord record1 = new MetricsRecordImpl(MsInfo.Context, 1000000000000L, tags, metrics);
131+
MetricsRecord record2 = new MetricsRecordImpl(MsInfo.Context, 1000000001000L, tags, metrics);
132+
133+
sink.putMetrics(record1);
134+
sink.putMetrics(record2);
135+
136+
sink.flush();
137+
try {
138+
sink.close();
139+
} catch(IOException e) {
140+
e.printStackTrace();
141+
}
142+
143+
// then the timestamps in the graphite stream should differ by one second.
144+
String expectedOutput
145+
= "null.default.Context.foo1 1 1000000000\n"
146+
+ "null.default.Context.foo1 1 1000000001\n";
147+
assertEquals(expectedOutput, out.toString());
148+
}
149+
150+
111151
@Test(expected=MetricsException.class)
112152
public void testCloseAndWrite() throws IOException {
113153
GraphiteSink sink = new GraphiteSink();

0 commit comments

Comments
 (0)