Skip to content

Commit

Permalink
Expose AWS HTTP Client stats via JMX
Browse files Browse the repository at this point in the history
  • Loading branch information
losipiuk committed Jan 5, 2021
1 parent 2161800 commit 39a9945
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 0 deletions.
Expand Up @@ -24,6 +24,9 @@
import java.util.function.Consumer;

import static com.amazonaws.util.AWSRequestMetrics.Field.ClientExecuteTime;
import static com.amazonaws.util.AWSRequestMetrics.Field.HttpClientPoolAvailableCount;
import static com.amazonaws.util.AWSRequestMetrics.Field.HttpClientPoolLeasedCount;
import static com.amazonaws.util.AWSRequestMetrics.Field.HttpClientPoolPendingCount;
import static com.amazonaws.util.AWSRequestMetrics.Field.HttpClientRetryCount;
import static com.amazonaws.util.AWSRequestMetrics.Field.HttpRequestTime;
import static com.amazonaws.util.AWSRequestMetrics.Field.RequestCount;
Expand Down Expand Up @@ -54,6 +57,21 @@ public final void collectMetrics(Request<?> request, Response<?> response)
recordThrottleExceptionCount(throttleExceptions.longValue());
}

Number httpClientPoolAvailableCount = timingInfo.getCounter(HttpClientPoolAvailableCount.name());
if (httpClientPoolAvailableCount != null) {
recordHttpClientPoolAvailableCount(httpClientPoolAvailableCount.longValue());
}

Number httpClientPoolLeasedCount = timingInfo.getCounter(HttpClientPoolLeasedCount.name());
if (httpClientPoolLeasedCount != null) {
recordHttpClientPoolLeasedCount(httpClientPoolLeasedCount.longValue());
}

Number httpClientPoolPendingCount = timingInfo.getCounter(HttpClientPoolPendingCount.name());
if (httpClientPoolPendingCount != null) {
recordHttpClientPoolPendingCount(httpClientPoolPendingCount.longValue());
}

recordSubTimingDurations(timingInfo, HttpRequestTime, this::recordHttpRequestTime);
recordSubTimingDurations(timingInfo, ClientExecuteTime, this::recordClientExecutionTime);
recordSubTimingDurations(timingInfo, RetryPauseTime, this::recordRetryPauseTime);
Expand All @@ -71,6 +89,12 @@ public final void collectMetrics(Request<?> request, Response<?> response)

protected abstract void recordRetryPauseTime(Duration duration);

protected abstract void recordHttpClientPoolAvailableCount(long count);

protected abstract void recordHttpClientPoolLeasedCount(long count);

protected abstract void recordHttpClientPoolPendingCount(long count);

private static void recordSubTimingDurations(TimingInfo timingInfo, AWSRequestMetrics.Field field, Consumer<Duration> consumer)
{
List<TimingInfo> subTimings = timingInfo.getAllSubMeasurements(field.name());
Expand Down
Expand Up @@ -20,6 +20,8 @@
import org.weakref.jmx.Managed;
import org.weakref.jmx.Nested;

import java.util.concurrent.atomic.AtomicLong;

import static java.util.Objects.requireNonNull;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

Expand Down Expand Up @@ -51,6 +53,9 @@ public class GlueMetastoreStats
private final TimeStat awsRequestTime = new TimeStat(MILLISECONDS);
private final TimeStat awsClientExecuteTime = new TimeStat(MILLISECONDS);
private final TimeStat awsClientRetryPauseTime = new TimeStat(MILLISECONDS);
private final AtomicLong awsHttpClientPoolAvailableCount = new AtomicLong();
private final AtomicLong awsHttpClientPoolLeasedCount = new AtomicLong();
private final AtomicLong awsHttpClientPoolPendingCount = new AtomicLong();

@Managed
@Nested
Expand Down Expand Up @@ -220,6 +225,24 @@ public TimeStat getAwsClientRetryPauseTime()
return awsClientRetryPauseTime;
}

@Managed
public long getAwsHttpClientPoolAvailableCount()
{
return awsHttpClientPoolAvailableCount.get();
}

@Managed
public long getAwsHttpClientPoolLeasedCount()
{
return awsHttpClientPoolLeasedCount.get();
}

@Managed
public long getAwsHttpClientPoolPendingCount()
{
return awsHttpClientPoolPendingCount.get();
}

public GlueSdkClientMetricsCollector newRequestMetricsCollector()
{
return new GlueSdkClientMetricsCollector(this);
Expand Down Expand Up @@ -270,5 +293,23 @@ protected void recordRetryPauseTime(Duration duration)
{
stats.awsClientRetryPauseTime.add(duration);
}

@Override
protected void recordHttpClientPoolAvailableCount(long count)
{
stats.awsHttpClientPoolAvailableCount.set(count);
}

@Override
protected void recordHttpClientPoolLeasedCount(long count)
{
stats.awsHttpClientPoolLeasedCount.set(count);
}

@Override
protected void recordHttpClientPoolPendingCount(long count)
{
stats.awsHttpClientPoolPendingCount.set(count);
}
}
}
Expand Up @@ -63,4 +63,22 @@ protected void recordRetryPauseTime(Duration duration)
{
stats.addAwsClientRetryPauseTime(duration);
}

@Override
protected void recordHttpClientPoolAvailableCount(long count)
{
stats.setAwsHttpClientPoolAvailableCount(count);
}

@Override
protected void recordHttpClientPoolLeasedCount(long count)
{
stats.setAwsHttpClientPoolLeasedCount(count);
}

@Override
protected void recordHttpClientPoolPendingCount(long count)
{
stats.setAwsHttpClientPoolPendingCount(count);
}
}
Expand Up @@ -22,6 +22,7 @@

import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.concurrent.atomic.AtomicLong;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

Expand Down Expand Up @@ -52,6 +53,9 @@ public class TrinoS3FileSystemStats
private final TimeStat awsRequestTime = new TimeStat(MILLISECONDS);
private final TimeStat awsClientExecuteTime = new TimeStat(MILLISECONDS);
private final TimeStat awsClientRetryPauseTime = new TimeStat(MILLISECONDS);
private final AtomicLong awsHttpClientPoolAvailableCount = new AtomicLong();
private final AtomicLong awsHttpClientPoolLeasedCount = new AtomicLong();
private final AtomicLong awsHttpClientPoolPendingCount = new AtomicLong();

@Managed
@Nested
Expand Down Expand Up @@ -193,6 +197,24 @@ public TimeStat getAwsClientRetryPauseTime()
return awsClientRetryPauseTime;
}

@Managed
public long getAwsHttpClientPoolAvailableCount()
{
return awsHttpClientPoolAvailableCount.get();
}

@Managed
public long getAwsHttpClientPoolLeasedCount()
{
return awsHttpClientPoolLeasedCount.get();
}

@Managed
public long getAwsHttpClientPoolPendingCount()
{
return awsHttpClientPoolPendingCount.get();
}

@Managed
@Nested
public CounterStat getGetObjectRetries()
Expand Down Expand Up @@ -315,6 +337,21 @@ public void addAwsClientRetryPauseTime(Duration duration)
awsClientRetryPauseTime.add(duration);
}

public void setAwsHttpClientPoolAvailableCount(long count)
{
this.awsHttpClientPoolAvailableCount.set(count);
}

public void setAwsHttpClientPoolLeasedCount(long count)
{
this.awsHttpClientPoolLeasedCount.set(count);
}

public void setAwsHttpClientPoolPendingCount(long count)
{
this.awsHttpClientPoolPendingCount.set(count);
}

public void newGetObjectRetry()
{
getObjectRetries.update(1);
Expand Down

0 comments on commit 39a9945

Please sign in to comment.