BucketedOpStats class

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

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

implements: MetricProvider

Поля (29)

МодификаторыТипИмя
final long NANOS_PER_SECOND
break
public long bytes
public long count
public long latencySumNanos
public long maxLatencyNanos
public long minLatencyNanos
public long periodSec
return
return
return
long var1
BsonDocument var1
long var11
long var13
var13
var13
long var15
var15
var15
long var18
ExtraInfo var2
long var20
long var22
BucketedOpStats.PeriodView[] var3
long var5
int var7
long var7
long var9

Методы (20)

МодификаторыВозвратСигнатура
abstract return new MetricResultsreturn new MetricResults(var1)
public PeriodViewpublic PeriodView()
public PeriodViewpublic PeriodView(long var1, long var3, long var5, long var7, long var9, long var11)
for for(int var3 = 0; var3 < var1; var3++)
for for(int var17 = 0; var17 < this.bucketCount; var17++)
for for(int var4 = 0; var4 < this.periodsSec.length; var4++)
abstract for for(long var8 = this.bucketSecond.get(var7)
abstract for for(long var3 = var0.get()
if if(var5 < var8)
if if(var18 > var5 && var18 <= var3)
if if(var20 < var13)
if if(var22 > var15)
if if(var7 == 0L)
public void recordvoid record(long var1, long var3)
void recordvoid record(long var1, long var3, long var5)
abstract this this(900, DEFAULT_PERIODS_SEC)
static void updateMaxvoid updateMax(@Nonnull AtomicLong var0, long var1)
abstract updateMax updateMax(this.bucketMaxLatencyNanos[var7], var1)
static void updateMinvoid updateMin(@Nonnull AtomicLong var0, long var1)
abstract updateMin updateMin(this.bucketMinLatencyNanos[var7], var1)

Исходный код

Показать/скрыть
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;
      }
   }
}