Skip to content

Commit 001894d

Browse files
committed
add debug mode for verbose logging.
1 parent 15e4307 commit 001894d

File tree

13 files changed

+112
-12
lines changed

13 files changed

+112
-12
lines changed

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/StorageConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public abstract class StorageConfiguration {
1818
/** The root storage location for buffered telemetry. */
1919
public abstract File getRootDir();
2020

21+
/** Returns true if the storage has been configured with debug verbosity enabled. */
22+
public abstract boolean isDebugEnabled();
23+
2124
/** The max amount of time a file can receive new data. */
2225
public abstract long getMaxFileAgeForWriteMillis();
2326

@@ -62,6 +65,7 @@ public static Builder builder() {
6265
.setMaxFileAgeForWriteMillis(TimeUnit.SECONDS.toMillis(30))
6366
.setMinFileAgeForReadMillis(TimeUnit.SECONDS.toMillis(33))
6467
.setMaxFileAgeForReadMillis(TimeUnit.HOURS.toMillis(18))
68+
.setDebugEnabled(false)
6569
.setTemporaryFileProvider(fileProvider);
6670
}
6771

@@ -81,6 +85,8 @@ public abstract static class Builder {
8185

8286
public abstract Builder setRootDir(File rootDir);
8387

88+
public abstract Builder setDebugEnabled(boolean debugEnabled);
89+
8490
public abstract StorageConfiguration build();
8591
}
8692
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/exporter/FromDiskExporterBuilder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public class FromDiskExporterBuilder<T> {
2525
private Function<Collection<T>, CompletableResultCode> exportFunction =
2626
x -> CompletableResultCode.ofFailure();
2727

28+
private boolean debugEnabled = false;
29+
2830
@NotNull
2931
private static <T> SignalDeserializer<T> noopDeserializer() {
3032
return x -> emptyList();
@@ -63,8 +65,14 @@ public FromDiskExporterBuilder<T> setExportFunction(
6365
return this;
6466
}
6567

68+
@CanIgnoreReturnValue
69+
public FromDiskExporterBuilder<T> setDebugEnabled(boolean debugEnabled) {
70+
this.debugEnabled = debugEnabled;
71+
return this;
72+
}
73+
6674
public FromDiskExporterImpl<T> build() throws IOException {
6775
Storage storage = storageBuilder.build();
68-
return new FromDiskExporterImpl<>(serializer, exportFunction, storage);
76+
return new FromDiskExporterImpl<>(serializer, exportFunction, storage, debugEnabled);
6977
}
7078
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/exporter/FromDiskExporterImpl.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.sdk.common.CompletableResultCode;
1212
import java.io.IOException;
1313
import java.util.Collection;
14+
import java.util.List;
1415
import java.util.concurrent.TimeUnit;
1516
import java.util.function.Function;
1617
import java.util.logging.Level;
@@ -21,18 +22,21 @@
2122
* another delegated exporter.
2223
*/
2324
public final class FromDiskExporterImpl<EXPORT_DATA> implements FromDiskExporter {
25+
private static final Logger logger = Logger.getLogger(FromDiskExporterImpl.class.getName());
2426
private final Storage storage;
2527
private final SignalDeserializer<EXPORT_DATA> deserializer;
2628
private final Function<Collection<EXPORT_DATA>, CompletableResultCode> exportFunction;
27-
private static final Logger logger = Logger.getLogger(FromDiskExporterImpl.class.getName());
29+
private final boolean debugEnabled;
2830

2931
FromDiskExporterImpl(
3032
SignalDeserializer<EXPORT_DATA> deserializer,
3133
Function<Collection<EXPORT_DATA>, CompletableResultCode> exportFunction,
32-
Storage storage) {
34+
Storage storage,
35+
boolean debugEnabled) {
3336
this.deserializer = deserializer;
3437
this.exportFunction = exportFunction;
3538
this.storage = storage;
39+
this.debugEnabled = debugEnabled;
3640
}
3741

3842
public static <T> FromDiskExporterBuilder<T> builder() {
@@ -44,24 +48,36 @@ public static <T> FromDiskExporterBuilder<T> builder() {
4448
*
4549
* @param timeout The amount of time to wait for the wrapped exporter to finish.
4650
* @param unit The unit of the time provided.
47-
* @return true if there was data available and it was successfully exported within the timeout
51+
* @return true if there was data available, and it was successfully exported within the timeout
4852
* provided. false otherwise.
4953
* @throws IOException If an unexpected error happens.
5054
*/
5155
@Override
5256
public boolean exportStoredBatch(long timeout, TimeUnit unit) throws IOException {
53-
logger.log(Level.INFO, "Attempting to export batch from disk.");
57+
log("Attempting to export " + deserializer.signalType() + " batch from disk.");
5458
ReadableResult result =
5559
storage.readAndProcess(
5660
bytes -> {
57-
logger.log(Level.INFO, "About to export stored batch.");
58-
CompletableResultCode join =
59-
exportFunction.apply(deserializer.deserialize(bytes)).join(timeout, unit);
61+
log(
62+
"Read "
63+
+ bytes.length
64+
+ " "
65+
+ deserializer.signalType()
66+
+ " bytes from storage.");
67+
List<EXPORT_DATA> telemetry = deserializer.deserialize(bytes);
68+
log("Now exporting batch of " + telemetry.size() + " " + deserializer.signalType());
69+
CompletableResultCode join = exportFunction.apply(telemetry).join(timeout, unit);
6070
return join.isSuccess();
6171
});
6272
return result == ReadableResult.SUCCEEDED;
6373
}
6474

75+
private void log(String msg) {
76+
if (debugEnabled) {
77+
logger.log(Level.INFO, msg);
78+
}
79+
}
80+
6581
@Override
6682
public void shutdown() throws IOException {
6783
storage.close();

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/LogRecordDataDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public List<LogRecordData> deserialize(byte[] source) {
2828
throw new IllegalArgumentException(e);
2929
}
3030
}
31+
32+
@Override
33+
public String signalType() {
34+
return "logs";
35+
}
3136
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/MetricDataDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public List<MetricData> deserialize(byte[] source) {
2828
throw new IllegalArgumentException(e);
2929
}
3030
}
31+
32+
@Override
33+
public String signalType() {
34+
return "metrics";
35+
}
3136
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/SignalDeserializer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,11 @@ static SignalDeserializer<LogRecordData> ofLogs() {
2424
return LogRecordDataDeserializer.getInstance();
2525
}
2626

27+
/** Deserializes the given byte array into a list of telemetry items. */
2728
List<SDK_ITEM> deserialize(byte[] source);
29+
30+
/** Returns the name of the type of signal -- one of "metrics", "traces", or "logs". */
31+
default String signalType() {
32+
return "unknown";
33+
}
2834
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/SpanDataDeserializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public List<SpanData> deserialize(byte[] source) {
2828
throw new IllegalArgumentException(e);
2929
}
3030
}
31+
32+
@Override
33+
public String signalType() {
34+
return "spans";
35+
}
3136
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/storage/FolderManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.IOException;
1616
import java.util.Objects;
1717
import javax.annotation.Nullable;
18+
import org.jetbrains.annotations.NotNull;
1819

1920
public final class FolderManager {
2021
private final File folder;
@@ -42,6 +43,7 @@ public synchronized ReadableFile getReadableFile() throws IOException {
4243
return null;
4344
}
4445

46+
@NotNull
4547
public synchronized WritableFile createWritableFile() throws IOException {
4648
long systemCurrentTimeMillis = nowMillis(clock);
4749
File[] existingFiles = folder.listFiles();

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/storage/Storage.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
package io.opentelemetry.contrib.disk.buffering.internal.storage;
77

8+
import static java.util.logging.Level.WARNING;
9+
10+
import io.opentelemetry.contrib.disk.buffering.internal.exporter.FromDiskExporterImpl;
811
import io.opentelemetry.contrib.disk.buffering.internal.storage.files.ReadableFile;
912
import io.opentelemetry.contrib.disk.buffering.internal.storage.files.WritableFile;
1013
import io.opentelemetry.contrib.disk.buffering.internal.storage.responses.ReadableResult;
@@ -13,17 +16,23 @@
1316
import java.io.IOException;
1417
import java.util.concurrent.atomic.AtomicBoolean;
1518
import java.util.function.Function;
19+
import java.util.logging.Level;
20+
import java.util.logging.Logger;
1621
import javax.annotation.Nullable;
1722

1823
public final class Storage implements Closeable {
1924
private static final int MAX_ATTEMPTS = 3;
25+
private static final Logger logger = Logger.getLogger(FromDiskExporterImpl.class.getName());
26+
2027
private final FolderManager folderManager;
28+
private final boolean debugEnabled;
2129
private final AtomicBoolean isClosed = new AtomicBoolean(false);
2230
@Nullable private WritableFile writableFile;
2331
@Nullable private ReadableFile readableFile;
2432

25-
public Storage(FolderManager folderManager) {
33+
public Storage(FolderManager folderManager, boolean debugEnabled) {
2634
this.folderManager = folderManager;
35+
this.debugEnabled = debugEnabled;
2736
}
2837

2938
public static StorageBuilder builder() {
@@ -42,13 +51,16 @@ public boolean write(byte[] item) throws IOException {
4251

4352
private boolean write(byte[] item, int attemptNumber) throws IOException {
4453
if (isClosed.get()) {
54+
log("Refusing to write to storage after being closed.");
4555
return false;
4656
}
4757
if (attemptNumber > MAX_ATTEMPTS) {
58+
log("Max number of attempts to write buffered data exceeded.", WARNING);
4859
return false;
4960
}
5061
if (writableFile == null) {
5162
writableFile = folderManager.createWritableFile();
63+
log("Created new writableFile: " + writableFile);
5264
}
5365
WritableResult result = writableFile.append(item);
5466
if (result != WritableResult.SUCCEEDED) {
@@ -72,17 +84,22 @@ public ReadableResult readAndProcess(Function<byte[], Boolean> processing) throw
7284
private ReadableResult readAndProcess(Function<byte[], Boolean> processing, int attemptNumber)
7385
throws IOException {
7486
if (isClosed.get()) {
87+
log("Refusing to read from storage after being closed.");
7588
return ReadableResult.FAILED;
7689
}
7790
if (attemptNumber > MAX_ATTEMPTS) {
91+
log("Maximum number of attempts to read and process buffered data exceeded.", WARNING);
7892
return ReadableResult.FAILED;
7993
}
8094
if (readableFile == null) {
95+
log("Obtaining a new readableFile from the folderManager.");
8196
readableFile = folderManager.getReadableFile();
8297
if (readableFile == null) {
98+
log("Unable to get or create readable file.");
8399
return ReadableResult.FAILED;
84100
}
85101
}
102+
log("Attempting to read data from " + readableFile);
86103
ReadableResult result = readableFile.readAndProcess(processing);
87104
switch (result) {
88105
case SUCCEEDED:
@@ -95,8 +112,19 @@ private ReadableResult readAndProcess(Function<byte[], Boolean> processing, int
95112
}
96113
}
97114

115+
private void log(String msg) {
116+
log(msg, Level.INFO);
117+
}
118+
119+
private void log(String msg, Level level) {
120+
if (debugEnabled) {
121+
logger.log(level, msg);
122+
}
123+
}
124+
98125
@Override
99126
public void close() throws IOException {
127+
log("Closing disk buffering storage.");
100128
if (isClosed.compareAndSet(false, true)) {
101129
if (writableFile != null) {
102130
writableFile.close();

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/storage/StorageBuilder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010
import io.opentelemetry.sdk.common.Clock;
1111
import java.io.File;
1212
import java.io.IOException;
13+
import java.util.logging.Level;
14+
import java.util.logging.Logger;
1315

1416
public class StorageBuilder {
1517

18+
private static final Logger logger = Logger.getLogger(StorageBuilder.class.getName());
19+
1620
private String folderName = "data";
1721
private StorageConfiguration configuration = StorageConfiguration.getDefault(new File("."));
1822
private Clock clock = Clock.getDefault();
@@ -40,7 +44,10 @@ public StorageBuilder setStorageClock(Clock clock) {
4044
public Storage build() throws IOException {
4145
File folder = ensureSubdir(configuration.getRootDir(), folderName);
4246
FolderManager folderManager = new FolderManager(folder, configuration, clock);
43-
return new Storage(folderManager);
47+
if (configuration.isDebugEnabled()) {
48+
logger.log(Level.INFO, "Building storage with configuration => " + configuration);
49+
}
50+
return new Storage(folderManager, configuration.isDebugEnabled());
4451
}
4552

4653
private static File ensureSubdir(File rootDir, String child) throws IOException {

0 commit comments

Comments
 (0)