TelemetryStorage class
Пакет: com.hypixel.hytale.server.core.telemetry
Файл: com/hypixel/hytale/server/core/telemetry/TelemetryStorage.java
Поля (18)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
|
return |
|
|
return |
|
|
return |
|
Instant |
var1 |
|
Path |
var1 |
|
String |
var2 |
|
String |
var2 |
|
FileTime |
var2 |
|
String |
var3 |
|
String |
var3 |
|
InputStream |
var3 |
|
String |
var4 |
|
boolean |
var4 |
|
OutputStream |
var4 |
|
boolean |
var5 |
|
GZIPOutputStream |
var5 |
|
Instant |
var6 |
Методы (13)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
void |
closeAndCompressvoid closeAndCompress() |
static |
void |
compressFilevoid compressFile(@Nonnull Path var0) |
abstract |
|
compressFile compressFile(var0) |
abstract |
|
compressFile compressFile(this.sessionFilePath) |
|
|
if if(this.sessionWriter != null) |
|
|
if if(!var4 && !var5) |
|
|
if if(this.sessionWriter != null) |
private |
void |
performMaintenancevoid performMaintenance() |
static |
void |
processFilevoid processFile(@Nonnull Path var0, @Nonnull Instant var1, @Nonnull String var2) |
|
|
synchronized synchronized(this.writerLock) |
|
|
synchronized synchronized(this.writerLock) |
abstract |
|
try try(InputStream var3 = Files.newInputStream(var0) |
public |
void |
writeEntryvoid writeEntry(@Nonnull String var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.telemetry;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import java.io.BufferedWriter;
class="kw">import java.io.IOException;
class="kw">import java.io.InputStream;
class="kw">import java.io.OutputStream;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.attribute.FileTime;
class="kw">import java.time.Instant;
class="kw">import java.time.ZoneOffset;
class="kw">import java.time.format.DateTimeFormatter;
class="kw">import java.time.temporal.ChronoUnit;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.logging.Level;
class="kw">import java.util.stream.Stream;
class="kw">import java.util.zip.GZIPOutputStream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class="kw">final class TelemetryStorage {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final String TELEMETRY_DIRECTORY_NAME = "telemetry";
class="kw">private class="kw">static class="kw">final String SESSION_FILE_EXTENSION = ".jsonl";
class="kw">private class="kw">static class="kw">final String COMPRESSED_FILE_EXTENSION = ".jsonl.gz";
class="kw">private class="kw">static class="kw">final int RETENTION_DAYS = 7;
class="kw">private class="kw">static class="kw">final DateTimeFormatter TIMESTAMP_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss").withZone(ZoneOffset.UTC);
@Nonnull
class="kw">private class="kw">final Path telemetryDirectory;
@Nonnull
class="kw">private class="kw">final Path sessionFilePath;
@Nonnull
class="kw">private class="kw">final Object writerLock = new Object();
@Nullable
class="kw">private BufferedWriter sessionWriter;
class="kw">public TelemetryStorage(@Nonnull String var1) {
this.telemetryDirectory = Path.of("telemetry");
try {
if (!Files.exists(this.telemetryDirectory)) {
Files.createDirectories(this.telemetryDirectory);
LOGGER.at(Level.INFO).log("Created telemetry storage directory: %s", this.telemetryDirectory.toAbsolutePath());
}
} catch (IOException var7) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var7)).log("Failed to create telemetry directory");
}
String var2 = TIMESTAMP_FORMAT.format(Instant.now());
String var3 = var1.length() >= 8 ? var1.substring(0, 8) : var1;
String var4 = var2 + "_" + var3 + ".jsonl";
this.sessionFilePath = this.telemetryDirectory.resolve(var4);
CompletableFuture.runAsync(this::performMaintenance);
try {
this.sessionWriter = Files.newBufferedWriter(this.sessionFilePath);
LOGGER.at(Level.INFO).log("Opened telemetry session file: %s", this.sessionFilePath);
} catch (IOException var6) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var6)).log("Failed to create telemetry session file");
}
}
class="kw">public void writeEntry(@Nonnull String var1) {
class="kw">synchronized (this.writerLock) {
if (this.sessionWriter != null) {
try {
this.sessionWriter.write(var1);
this.sessionWriter.newLine();
this.sessionWriter.flush();
} catch (IOException var5) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var5)).log("Failed to write telemetry packet to local storage");
}
}
}
}
class="kw">private void performMaintenance() {
try {
if (!Files.exists(this.telemetryDirectory)) {
class="kw">return;
}
Instant var1 = Instant.now().minus(7L, ChronoUnit.DAYS);
String var2 = this.sessionFilePath.getFileName().toString();
try (Stream var3 = Files.list(this.telemetryDirectory)) {
var3.forEach(var2x -> processFile(var2x, var1, var2));
}
} catch (IOException var8) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var8)).log("Failed to perform telemetry storage maintenance");
}
}
class="kw">private class="kw">static void processFile(@Nonnull Path var0, @Nonnull Instant var1, @Nonnull String var2) {
try {
String var3 = var0.getFileName().toString();
boolean var4 = var3.endsWith(".jsonl");
boolean var5 = var3.endsWith(".jsonl.gz");
if (!var4 && !var5) {
class="kw">return;
}
Instant var6 = Files.getLastModifiedTime(var0).toInstant();
if (var6.isBefore(var1)) {
try {
Files.delete(var0);
LOGGER.at(Level.FINE).log("Deleted expired telemetry file: %s", var3);
} catch (IOException var8) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var8)).log("Failed to delete expired telemetry file: %s", var3);
}
class="kw">return;
}
if (var4 && !var3.equals(var2)) {
compressFile(var0);
}
} catch (IOException var9) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var9)).log("Failed to process telemetry file during maintenance");
}
}
class="kw">private class="kw">static void compressFile(@Nonnull Path var0) {
Path var1 = Path.of(var0 + ".gz");
if (!Files.exists(var1)) {
try {
FileTime var2 = Files.getLastModifiedTime(var0);
try (
InputStream var3 = Files.newInputStream(var0);
OutputStream var4 = Files.newOutputStream(var1);
GZIPOutputStream var5 = new GZIPOutputStream(var4);
) {
var3.transferTo(var5);
}
Files.setLastModifiedTime(var1, var2);
Files.delete(var0);
LOGGER.at(Level.FINE).log("Compressed telemetry file: %s", var0.getFileName());
} catch (IOException var14) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var14)).log("Failed to compress telemetry file: %s", var0.getFileName());
}
}
}
class="kw">public void closeAndCompress() {
class="kw">synchronized (this.writerLock) {
try {
if (this.sessionWriter != null) {
this.sessionWriter.close();
this.sessionWriter = null;
}
if (Files.exists(this.sessionFilePath)) {
compressFile(this.sessionFilePath);
}
} catch (IOException var4) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var4)).log("Failed to close and compress telemetry session file");
}
}
}
}