PeriodView class

Пакет: com.hypixel.hytale.metrics

Файл: com/hypixel/hytale/metrics/BucketedOpStats.java

Поля (6)

МодификаторыТипИмя
public long bytes
public long count
public long latencySumNanos
public long maxLatencyNanos
public long minLatencyNanos
public long periodSec

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.metrics;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicLong;
class="kw">import java.util.concurrent.atomic.AtomicLongArray;
class="kw">import java.util.concurrent.atomic.LongAdder;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.bson.BsonDocument;

class="kw">public class BucketedOpStats class="kw">implements MetricProvider {
   class="kw">private class="kw">static class="kw">final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1L);
   class="kw">public class="kw">static class="kw">final int DEFAULT_BUCKETS = 900;
   class="kw">public class="kw">static class="kw">final long[] DEFAULT_PERIODS_SEC = new long[]{60L, 300L, 900L};
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<BucketedOpStats.PeriodView> PERIOD_VIEW_CODEC = BuilderCodec.builder(
         BucketedOpStats.PeriodView.class, BucketedOpStats.PeriodView::new
      )
      .append(new KeyedCodec<>("PeriodSec", Codec.LONG), (var0, var1) -> var0.periodSec = var1, var0 -> var0.periodSec)
      .add()
      .append(new KeyedCodec<>("Count", Codec.LONG), (var0, var1) -> var0.count = var1, var0 -> var0.count)
      .add()
      .append(new KeyedCodec<>("Bytes", Codec.LONG), (var0, var1) -> var0.bytes = var1, var0 -> var0.bytes)
      .add()
      .append(new KeyedCodec<>("LatencySumNanos", Codec.LONG), (var0, var1) -> var0.latencySumNanos = var1, var0 -> var0.latencySumNanos)
      .add()
      .append(new KeyedCodec<>("MinLatencyNanos", Codec.LONG), (var0, var1) -> var0.minLatencyNanos = var1, var0 -> var0.minLatencyNanos)
      .add()
      .append(new KeyedCodec<>("MaxLatencyNanos", Codec.LONG), (var0, var1) -> var0.maxLatencyNanos = var1, var0 -> var0.maxLatencyNanos)
      .add()
      .build();
   @Nonnull
   class="kw">public class="kw">static class="kw">final Codec<BucketedOpStats.PeriodView[]> PERIOD_VIEW_ARRAY_CODEC = new ArrayCodec<>(PERIOD_VIEW_CODEC, BucketedOpStats.PeriodView[]::new);
   class="kw">private class="kw">final int bucketCount;
   class="kw">private class="kw">final long[] periodsSec;
   class="kw">private class="kw">final AtomicLongArray bucketSecond;
   class="kw">private class="kw">final LongAdder[] bucketCounts;
   class="kw">private class="kw">final LongAdder[] bucketBytes;
   class="kw">private class="kw">final LongAdder[] bucketLatencySumNanos;
   class="kw">private class="kw">final AtomicLong[] bucketMinLatencyNanos;
   class="kw">private class="kw">final AtomicLong[] bucketMaxLatencyNanos;

   class="kw">public BucketedOpStats() {
      this(900, DEFAULT_PERIODS_SEC);
   }

   class="kw">public BucketedOpStats(int var1, @Nonnull long[] var2) {
      this.bucketCount = var1;
      this.periodsSec = (long[])var2.clone();
      this.bucketSecond = new AtomicLongArray(var1);
      this.bucketCounts = new LongAdder[var1];
      this.bucketBytes = new LongAdder[var1];
      this.bucketLatencySumNanos = new LongAdder[var1];
      this.bucketMinLatencyNanos = new AtomicLong[var1];
      this.bucketMaxLatencyNanos = new AtomicLong[var1];

      for (int var3 = 0; var3 < var1; var3++) {
         this.bucketSecond.set(var3, Long.MIN_VALUE);
         this.bucketCounts[var3] = new LongAdder();
         this.bucketBytes[var3] = new LongAdder();
         this.bucketLatencySumNanos[var3] = new LongAdder();
         this.bucketMinLatencyNanos[var3] = new AtomicLong(Long.MAX_VALUE);
         this.bucketMaxLatencyNanos[var3] = new AtomicLong(Long.MIN_VALUE);
      }
   }

   class="kw">public void record(long var1, long var3) {
      this.record(var1, var3, System.nanoTime() / NANOS_PER_SECOND);
   }

   void record(long var1, long var3, long var5) {
      int var7 = Math.floorMod(var5, this.bucketCount);

      for (long var8 = this.bucketSecond.get(var7); var8 != var5; var8 = this.bucketSecond.get(var7)) {
         if (var5 < var8) {
            class="kw">return;
         }

         if (this.bucketSecond.compareAndSet(var7, var8, var5)) {
            this.bucketCounts[var7].reset();
            this.bucketBytes[var7].reset();
            this.bucketLatencySumNanos[var7].reset();
            this.bucketMinLatencyNanos[var7].set(Long.MAX_VALUE);
            this.bucketMaxLatencyNanos[var7].set(Long.MIN_VALUE);
            break;
         }
      }

      this.bucketCounts[var7].increment();
      this.bucketBytes[var7].add(var3);
      this.bucketLatencySumNanos[var7].add(var1);
      updateMin(this.bucketMinLatencyNanos[var7], var1);
      updateMax(this.bucketMaxLatencyNanos[var7], var1);
   }

   class="kw">private class="kw">static void updateMin(@Nonnull AtomicLong var0, long var1) {
      for (long var3 = var0.get(); var1 < var3; var3 = var0.get()) {
         if (var0.compareAndSet(var3, var1)) {
            class="kw">return;
         }
      }
   }

   class="kw">private class="kw">static void updateMax(@Nonnull AtomicLong var0, long var1) {
      for (long var3 = var0.get(); var1 > var3; var3 = var0.get()) {
         if (var0.compareAndSet(var3, var1)) {
            class="kw">return;
         }
      }
   }

   @Nonnull
   class="kw">public BucketedOpStats.PeriodView summary(long var1) {
      class="kw">return this.summary(var1, System.nanoTime() / NANOS_PER_SECOND);
   }

   @Nonnull
   class="kw">private BucketedOpStats.PeriodView summary(long var1, long var3) {
      long var5 = var3 - var1;
      long var7 = 0L;
      long var9 = 0L;
      long var11 = 0L;
      long var13 = Long.MAX_VALUE;
      long var15 = Long.MIN_VALUE;

      for (int var17 = 0; var17 < this.bucketCount; var17++) {
         long var18 = this.bucketSecond.get(var17);
         if (var18 > var5 && var18 <= var3) {
            var7 += this.bucketCounts[var17].sum();
            var9 += this.bucketBytes[var17].sum();
            var11 += this.bucketLatencySumNanos[var17].sum();
            long var20 = this.bucketMinLatencyNanos[var17].get();
            long var22 = this.bucketMaxLatencyNanos[var17].get();
            if (var20 < var13) {
               var13 = var20;
            }

            if (var22 > var15) {
               var15 = var22;
            }
         }
      }

      if (var7 == 0L) {
         var13 = 0L;
         var15 = 0L;
      }

      class="kw">return new BucketedOpStats.PeriodView(var1, var7, var9, var11, var13, var15);
   }

   @Nonnull
   class="kw">public BucketedOpStats.PeriodView[] allSummaries() {
      long var1 = System.nanoTime() / NANOS_PER_SECOND;
      BucketedOpStats.PeriodView[] var3 = new BucketedOpStats.PeriodView[this.periodsSec.length];

      for (int var4 = 0; var4 < this.periodsSec.length; var4++) {
         var3[var4] = this.summary(this.periodsSec[var4], var1);
      }

      class="kw">return var3;
   }

   @Nonnull
   @Override
   class="kw">public MetricResults toMetricResults() {
      BsonDocument var1 = new BsonDocument();
      ExtraInfo var2 = ExtraInfo.THREAD_LOCAL.get();
      var1.put("Periods", PERIOD_VIEW_ARRAY_CODEC.encode(this.allSummaries(), var2));
      class="kw">return new MetricResults(var1);
   }

   class="kw">public class="kw">static class PeriodView {
      class="kw">public long periodSec;
      class="kw">public long count;
      class="kw">public long bytes;
      class="kw">public long latencySumNanos;
      class="kw">public long minLatencyNanos;
      class="kw">public long maxLatencyNanos;

      class="kw">public PeriodView() {
      }

      class="kw">public PeriodView(long var1, long var3, long var5, long var7, long var9, long var11) {
         this.periodSec = var1;
         this.count = var3;
         this.bytes = var5;
         this.latencySumNanos = var7;
         this.minLatencyNanos = var9;
         this.maxLatencyNanos = var11;
      }
   }
}