Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ private static void clear() {
@Test
public void server() throws Exception {
int port = Ports.getFreePort( getClass() );
try( var server = new NioHttpServer( new NioHttpServer.DefaultPort( port ) ) ) {
var exporter = new PrometheusExporter( server );
try( NioHttpServer server = new NioHttpServer( new NioHttpServer.DefaultPort( port ) ) ) {
new PrometheusExporter( server );

Counter metric1 = Metrics.counter( "test1" );
Timer metric2 = Metrics.timer( "test2" );
Expand All @@ -69,7 +69,7 @@ public void server() throws Exception {
""" )
.contains( "test2_seconds_count 1" )
.contains( "test2_seconds_max 2.0" )
.contains( "system_metrics 5" );
.contains( "system_metrics 10.0" );
}
}

Expand Down
50 changes: 44 additions & 6 deletions oap-http/oap-http/src/main/java/oap/http/client/OapHttpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
import oap.util.Lists;
import org.eclipse.jetty.client.AbstractConnectionPool;
import org.eclipse.jetty.client.AbstractConnectorHttpClientTransport;
import org.eclipse.jetty.client.ConnectionPool;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.RandomConnectionPool;
import org.eclipse.jetty.client.RoundRobinConnectionPool;
import org.eclipse.jetty.client.WWWAuthenticationProtocolHandler;
import org.eclipse.jetty.http.HttpCookieStore;
import org.eclipse.jetty.io.ClientConnector;
Expand All @@ -24,8 +27,13 @@
import java.util.List;
import java.util.concurrent.atomic.LongAdder;

import static oap.http.client.OapHttpClient.OapHttpClientBuilder.ConnectionPoolFactoryType.RANDOM;

public class OapHttpClient {
public static final HttpClient DEFAULT_HTTP_CLIENT = customHttpClient().build();
public static final HttpClient DEFAULT_HTTP_CLIENT = customHttpClient()
.withConnectionPoolFactoryType( RANDOM )
.metrics( "default" )
.build();

public static OapHttpClientBuilder customHttpClient() {
return new OapHttpClientBuilder();
Expand All @@ -47,6 +55,8 @@ public static class OapHttpClientBuilder {
public boolean dnsjava = false;
private String metrics;
private HttpCookieStore cookieStore;
private ConnectionPool.Factory connectionPoolFactory;
private ConnectionPoolFactoryType connectionPoolFactoryType;

public OapHttpClientBuilder transport( AbstractConnectorHttpClientTransport httpClientTransport ) {
this.httpClientTransport = httpClientTransport;
Expand Down Expand Up @@ -90,6 +100,18 @@ public OapHttpClientBuilder cookieStore( HttpCookieStore cookieStore ) {
return this;
}

public OapHttpClientBuilder withConnectionPoolFactory( ConnectionPool.Factory connectionPoolFactory ) {
this.connectionPoolFactory = connectionPoolFactory;

return this;
}

public OapHttpClientBuilder withConnectionPoolFactoryType( ConnectionPoolFactoryType connectionPoolFactoryType ) {
this.connectionPoolFactoryType = connectionPoolFactoryType;

return this;
}

@SneakyThrows
public HttpClient build() {
HttpClient httpClient = httpClientTransport != null ? new HttpClient( httpClientTransport ) : new HttpClient();
Expand Down Expand Up @@ -124,15 +146,15 @@ public HttpClient build() {
if( metrics != null ) {
( ( AbstractConnectorHttpClientTransport ) httpClient.getHttpClientTransport() ).getClientConnector().addEventListener( new ClientConnectorConnectListener( metrics ) );

Gauge.builder( "dsp_tunneling_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getMaxConnectionCount() ).sum() )
Gauge.builder( "http_client_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getMaxConnectionCount() ).sum() )
.baseUnit( BaseUnits.CONNECTIONS )
.tags( "event", "max", "client", metrics )
.register( Metrics.globalRegistry );
Gauge.builder( "dsp_tunneling_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getConnectionCount() ).sum() )
Gauge.builder( "http_client_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getConnectionCount() ).sum() )
.baseUnit( BaseUnits.CONNECTIONS )
.tags( "event", "total", "client", metrics )
.register( Metrics.globalRegistry );
Gauge.builder( "dsp_tunneling_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getActiveConnectionCount() ).sum() )
Gauge.builder( "http_client_connections", httpClient, cs -> cs.getDestinations().stream().mapToInt( d -> ( ( AbstractConnectionPool ) d.getConnectionPool() ).getActiveConnectionCount() ).sum() )
.baseUnit( BaseUnits.CONNECTIONS )
.tags( "event", "active", "client", metrics )
.register( Metrics.globalRegistry );
Expand All @@ -142,19 +164,35 @@ public HttpClient build() {

httpClient.getProtocolHandlers().remove( WWWAuthenticationProtocolHandler.NAME );

if( connectionPoolFactory != null ) {
httpClient.getHttpClientTransport().setConnectionPoolFactory( connectionPoolFactory );
}

if( connectionPoolFactoryType != null ) {
httpClient.getHttpClientTransport().setConnectionPoolFactory( destination -> switch( this.connectionPoolFactoryType ) {
case RANDOM -> new RandomConnectionPool( destination, httpClient.getMaxConnectionsPerDestination(), 1 );
case ROUND_ROBIN -> new RoundRobinConnectionPool( destination, httpClient.getMaxConnectionsPerDestination(), 1 );
} );
}

return httpClient;
}

public enum ConnectionPoolFactoryType {
RANDOM,
ROUND_ROBIN
}

public static class ClientConnectorConnectListener implements ClientConnector.ConnectListener {
public final LongAdder connectSuccessCounter = new LongAdder();
public final LongAdder connectFailedCounter = new LongAdder();

public ClientConnectorConnectListener( String name ) {
Gauge.builder( "dsp_tunneling_connections", this, cs -> cs.connectSuccessCounter.doubleValue() )
Gauge.builder( "http_client_connections", this, cs -> cs.connectSuccessCounter.doubleValue() )
.baseUnit( BaseUnits.CONNECTIONS )
.tags( "event", "success", "client", name )
.register( Metrics.globalRegistry );
Gauge.builder( "dsp_tunneling_connections", this, cs -> cs.connectFailedCounter.doubleValue() )
Gauge.builder( "http_client_connections", this, cs -> cs.connectFailedCounter.doubleValue() )
.baseUnit( BaseUnits.CONNECTIONS )
.tags( "event", "failed", "client", name )
.register( Metrics.globalRegistry );
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
</distributionManagement>

<properties>
<oap.project.version>25.4.10</oap.project.version>
<oap.project.version>25.4.11</oap.project.version>

<oap.deps.config.version>25.0.1</oap.deps.config.version>
<oap.deps.oap-teamcity.version>25.0.0</oap.deps.oap-teamcity.version>
Expand Down
Loading