1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.monitoring;
21
22 import java.io.PrintWriter;
23 import java.text.SimpleDateFormat;
24 import java.util.Date;
25 import java.util.LinkedList;
26 import java.util.List;
27
28 import com.google.common.base.Charsets;
29 import com.google.common.base.Preconditions;
30 import com.google.common.collect.Lists;
31
32
33
34
35
36
37
38 public class MemoryBoundedLogMessageBuffer {
39 private final long maxSizeBytes;
40 private long usage = 0;
41 private LinkedList<LogMessage> messages;
42
43 public MemoryBoundedLogMessageBuffer(long maxSizeBytes) {
44 Preconditions.checkArgument(
45 maxSizeBytes > 0);
46 this.maxSizeBytes = maxSizeBytes;
47 this.messages = Lists.newLinkedList();
48 }
49
50
51
52
53
54 public synchronized void add(String messageText) {
55 LogMessage message = new LogMessage(messageText, System.currentTimeMillis());
56
57 usage += message.estimateHeapUsage();
58 messages.add(message);
59 while (usage > maxSizeBytes) {
60 LogMessage removed = messages.remove();
61 usage -= removed.estimateHeapUsage();
62 assert usage >= 0;
63 }
64 }
65
66
67
68
69 public synchronized void dumpTo(PrintWriter out) {
70 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
71
72 for (LogMessage msg : messages) {
73 out.write(df.format(new Date(msg.timestamp)));
74 out.write(" ");
75 out.println(new String(msg.message, Charsets.UTF_8));
76 }
77 }
78
79 synchronized List<LogMessage> getMessages() {
80
81 return Lists.newArrayList(messages);
82 }
83
84
85
86
87
88 synchronized long estimateHeapUsage() {
89 return usage;
90 }
91
92 private static class LogMessage {
93
94 public final byte[] message;
95 public final long timestamp;
96
97
98
99
100
101
102 private static final long BASE_USAGE=100;
103
104 public LogMessage(String message, long timestamp) {
105 this.message = message.getBytes(Charsets.UTF_8);
106 this.timestamp = timestamp;
107 }
108
109 public long estimateHeapUsage() {
110 return message.length + BASE_USAGE;
111 }
112 }
113
114 }