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");
         }
      }
   }
}