Skip to content

Commit 715bab1

Browse files
author
robbins
committed
new buckets
1 parent 1d6c458 commit 715bab1

File tree

5 files changed

+95
-10
lines changed

5 files changed

+95
-10
lines changed

java/src/com/ibm/javametrics/agent/Bucket.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
public interface Bucket {
1919
public void pushData(String data);
2020

21-
public String empty();
21+
public String getNext();
22+
23+
public void empty();
2224

2325
public int getSize();
2426

java/src/com/ibm/javametrics/agent/JavaAgent.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,41 @@ public JavaAgent() {
4444

4545
private void init() {
4646
exec = Executors.newSingleThreadScheduledExecutor();
47-
exec.scheduleAtFixedRate(this::empty, collectionInterval, collectionInterval, TimeUnit.SECONDS);
47+
exec.scheduleAtFixedRate(this::drain, collectionInterval, collectionInterval, TimeUnit.SECONDS);
4848
}
4949

5050
public void pushData(String type, String data) {
5151
synchronized (buckets) {
5252
Bucket bucket = buckets.get(type);
5353
if (bucket == null) {
54-
bucket = new StringDataBucket();
54+
bucket = new JsonDataBucket();
5555
buckets.put(type, bucket);
5656
}
5757

5858
if ((bucket.getSize() + data.length()) > MAX_BUCKET_SIZE) {
59-
emit(type, bucket.empty());
59+
drain(type, bucket);
6060
}
6161

6262
bucket.pushData(data);
6363
}
6464
}
6565

66-
private void empty() {
66+
private void drain() {
6767
synchronized (buckets) {
6868
buckets.forEach((name, bucket) -> {
69-
emit(name, bucket.empty());
69+
drain(name, bucket);
7070
});
7171
}
7272
}
7373

74+
private void drain(String type, Bucket bucket) {
75+
String data = bucket.getNext();
76+
while (data != null) {
77+
emit(type, data);
78+
data = bucket.getNext();
79+
}
80+
}
81+
7482
private void emit(String type, String data) {
7583
if (data != null) {
7684
receivers.forEach((receiver) -> {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*******************************************************************************
2+
* Copyright 2017 IBM Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
5+
* use this file except in compliance with the License. You may obtain a copy of
6+
* the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations under
14+
* the License.
15+
******************************************************************************/
16+
package com.ibm.javametrics.agent;
17+
18+
import java.util.ArrayList;
19+
20+
public class JsonDataBucket implements Bucket {
21+
22+
private static final int MAX_SIZE = 4 * 1024;
23+
private ArrayList<String> bucket = new ArrayList<String>(100);
24+
int size = 0;
25+
int cursor = 0;
26+
27+
@Override
28+
public int getSize() {
29+
return size;
30+
}
31+
32+
@Override
33+
public void empty() {
34+
synchronized (bucket) {
35+
bucket.clear();
36+
cursor = 0;
37+
size = 0;
38+
}
39+
}
40+
41+
@Override
42+
public void pushData(String data) {
43+
synchronized (bucket) {
44+
bucket.add(data);
45+
size += data.length();
46+
47+
System.err.println("pushed " + cursor + " " + bucket.size() + " " + size);
48+
while (size > MAX_SIZE && cursor > 0) {
49+
String removed = bucket.remove(0);
50+
cursor--;
51+
size -= removed.length();
52+
System.err.println("trimmed " + cursor + " " + bucket.size() + " " + size);
53+
}
54+
}
55+
}
56+
57+
@Override
58+
public String getNext() {
59+
String data = null;
60+
synchronized (bucket) {
61+
if (cursor < bucket.size()) {
62+
data = bucket.get(cursor);
63+
cursor++;
64+
System.err.println("returned " + cursor + " " + bucket.size() + " " + size);
65+
}
66+
}
67+
return data;
68+
}
69+
}

java/src/com/ibm/javametrics/agent/StringDataBucket.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,19 @@ public int getSize() {
2626
}
2727

2828
@Override
29-
public String empty() {
30-
String data = bucket.toString();
29+
public void empty() {
3130
bucket = new StringBuffer(INITIAL_BUCKET_SIZE);
32-
return data;
3331
}
3432

3533
@Override
3634
public void pushData(String data) {
3735
bucket.append(data);
3836
}
37+
38+
@Override
39+
public String getNext() {
40+
String data = bucket.toString();
41+
bucket = new StringBuffer(INITIAL_BUCKET_SIZE);
42+
return data;
43+
}
3944
}

java/src/com/ibm/javametrics/impl/JavametricsImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public JavametricsImpl() {
5151

5252
private void initializeProviders() {
5353
/*
54-
* Start the mbean data providers
54+
* Start the data providers
5555
*/
5656
providerManager = new DataProviderManager(COLLECTION_INTERVAL);
5757
}
@@ -63,6 +63,7 @@ private void initializeProviders() {
6363
* java.lang.String)
6464
*/
6565
public void receiveData(String type, String data) {
66+
System.err.println("received: " + type + " " + data);
6667
for (Iterator<JavametricsListener> iterator = javametricsListeners.iterator(); iterator.hasNext();) {
6768
JavametricsListener javametricsListener = iterator.next();
6869
javametricsListener.receive(type, data);

0 commit comments

Comments
 (0)