From b4405849e6daf3957592dd78abc1eabe3fb4feda Mon Sep 17 00:00:00 2001 From: Bill O'Neil Date: Wed, 2 Jan 2019 23:52:28 -0500 Subject: [PATCH 1/2] [#90] Add okhttp metrics --- gradle/dependencies.gradle | 4 +++- stubbornjava-common/build.gradle | 1 + .../com/stubbornjava/common/HttpClient.java | 21 ++++++++++++++++--- .../stubbornjava/common/MetricsReporters.java | 6 +++--- .../stubbornjava/webapp/github/GitHubApi.java | 6 +++--- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index c2901ad7..c33daf24 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -24,12 +24,14 @@ ext { lombok : '1.18.2', // Code gen sitemapgen4j : '1.0.6', // Sitemap generator for SEO jbcrypt : '0.4', // BCrypt salted hashing library - + okhttpMetrics : '0.4.0', // Metrics for OkHttp + junit : '4.12', // Unit Testing ] libs = [ okhttp : "com.squareup.okhttp3:okhttp:$versions.okhttp", okhttpUrlConnection : "com.squareup.okhttp3:okhttp-urlconnection:$versions.okhttp", + okhttpMetrics : "com.raskasa.metrics:metrics-okhttp:$versions.okhttpMetrics", loggingInterceptor : "com.squareup.okhttp3:logging-interceptor:$versions.okhttp", jacksonCore : "com.fasterxml.jackson.core:jackson-core:$versions.jackson", jacksonDatabind : "com.fasterxml.jackson.core:jackson-databind:$versions.jackson", diff --git a/stubbornjava-common/build.gradle b/stubbornjava-common/build.gradle index d3fff9f1..56382373 100644 --- a/stubbornjava-common/build.gradle +++ b/stubbornjava-common/build.gradle @@ -39,6 +39,7 @@ dependencies { compile libs.jooqCodegen compile libs.flyway compile libs.connectorj + compile libs.okhttpMetrics testCompile libs.junit testCompile libs.hsqldb diff --git a/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java b/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java index 9cbbbcab..9b83afae 100644 --- a/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java +++ b/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java @@ -18,6 +18,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.raskasa.metrics.okhttp.InstrumentedOkHttpClients; + import okhttp3.Dispatcher; import okhttp3.Interceptor; import okhttp3.Interceptor.Chain; @@ -56,8 +58,13 @@ public static Interceptor getHeaderInterceptor(String name, String value) { }; } + public static OkHttpClient wrapWithMetircs(String name, OkHttpClient client) { + return InstrumentedOkHttpClients.create(Metrics.registry(), client, name); + } + // {{start:client}} private static final OkHttpClient client; + private static final OkHttpClient globalClient; static { Dispatcher dispatcher = new Dispatcher(); dispatcher.setMaxRequestsPerHost(15); @@ -69,15 +76,23 @@ public static Interceptor getHeaderInterceptor(String name, String value) { .dispatcher(dispatcher) .addNetworkInterceptor(loggingInterceptor) .build(); - } - ; + globalClient = wrapWithMetircs("GlobalClient", baseClientBuilder().build()); + } /* * Global client that can be shared for common HTTP tasks. */ public static OkHttpClient globalClient() { - return client; + return globalClient; + } + + /* + * Global client base for extending defaults. + * This is the same as the global client but without metrics enabled yet. + */ + public static OkHttpClient.Builder baseClientBuilder() { + return client.newBuilder(); } // {{end:client}} diff --git a/stubbornjava-common/src/main/java/com/stubbornjava/common/MetricsReporters.java b/stubbornjava-common/src/main/java/com/stubbornjava/common/MetricsReporters.java index 487d0ed7..e5d679f5 100644 --- a/stubbornjava-common/src/main/java/com/stubbornjava/common/MetricsReporters.java +++ b/stubbornjava-common/src/main/java/com/stubbornjava/common/MetricsReporters.java @@ -13,9 +13,9 @@ class MetricsReporters { public static void startReporters(MetricRegistry registry) { // Graphite reporter to Grafana Cloud - OkHttpClient client = new OkHttpClient.Builder() - //.addNetworkInterceptor(HttpClient.getLoggingInterceptor()) - .build(); + OkHttpClient client = HttpClient.wrapWithMetircs("GraphiteReporter", + new OkHttpClient.Builder() + .build()); String graphiteHost = Configs.properties().getString("metrics.graphite.host"); String grafanaApiKey = Configs.properties().getString("metrics.grafana.api_key"); diff --git a/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java b/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java index 0975a45e..28a38a04 100644 --- a/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java +++ b/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java @@ -88,12 +88,12 @@ public Builder clientSecret(String clientSecret) { } public GitHubApi build() { - OkHttpClient client = HttpClient.globalClient() - .newBuilder() + OkHttpClient client = HttpClient.baseClientBuilder() .addInterceptor(HttpClient.getHeaderInterceptor("Accept", VERSION_HEADER)) .addInterceptor(GitHubApi.gitHubAuth(clientId, clientSecret)) .build(); - return new GitHubApi(client); + OkHttpClient metricsClient = HttpClient.wrapWithMetircs("GithubApiClient", client); + return new GitHubApi(metricsClient); } } From d879e4ed0e3017e58acea71b9efa37ec89b14693 Mon Sep 17 00:00:00 2001 From: Bill O'Neil Date: Thu, 3 Jan 2019 00:06:26 -0500 Subject: [PATCH 2/2] Cloning does infact share the connection pools --- .../com/stubbornjava/common/HttpClient.java | 28 ++++++++----------- .../stubbornjava/webapp/github/GitHubApi.java | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java b/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java index 9b83afae..9c420c1d 100644 --- a/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java +++ b/stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java @@ -63,21 +63,9 @@ public static OkHttpClient wrapWithMetircs(String name, OkHttpClient client) { } // {{start:client}} - private static final OkHttpClient client; private static final OkHttpClient globalClient; static { - Dispatcher dispatcher = new Dispatcher(); - dispatcher.setMaxRequestsPerHost(15); - - client = new OkHttpClient.Builder() - .connectTimeout(2, TimeUnit.SECONDS) - .writeTimeout(1, TimeUnit.MINUTES) - .readTimeout(1, TimeUnit.MINUTES) - .dispatcher(dispatcher) - .addNetworkInterceptor(loggingInterceptor) - .build(); - - globalClient = wrapWithMetircs("GlobalClient", baseClientBuilder().build()); + globalClient = wrapWithMetircs("GlobalClient", defaultClientBuilder().build()); } /* @@ -91,8 +79,16 @@ public static OkHttpClient globalClient() { * Global client base for extending defaults. * This is the same as the global client but without metrics enabled yet. */ - public static OkHttpClient.Builder baseClientBuilder() { - return client.newBuilder(); + public static OkHttpClient.Builder defaultClientBuilder() { + Dispatcher dispatcher = new Dispatcher(); + dispatcher.setMaxRequestsPerHost(15); + + return new OkHttpClient.Builder() + .connectTimeout(2, TimeUnit.SECONDS) + .writeTimeout(1, TimeUnit.MINUTES) + .readTimeout(1, TimeUnit.MINUTES) + .dispatcher(dispatcher) + .addNetworkInterceptor(loggingInterceptor); } // {{end:client}} @@ -102,7 +98,7 @@ public static OkHttpClient.Builder baseClientBuilder() { * a stateful cookie jar. This is useful when you need * to access password protected sites. */ - public static OkHttpClient newClientWithCookieJar() { + public static OkHttpClient newClientWithCookieJar(OkHttpClient client) { CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); diff --git a/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java b/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java index 28a38a04..deb30903 100644 --- a/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java +++ b/stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java @@ -88,7 +88,7 @@ public Builder clientSecret(String clientSecret) { } public GitHubApi build() { - OkHttpClient client = HttpClient.baseClientBuilder() + OkHttpClient client = HttpClient.defaultClientBuilder() .addInterceptor(HttpClient.getHeaderInterceptor("Accept", VERSION_HEADER)) .addInterceptor(GitHubApi.gitHubAuth(clientId, clientSecret)) .build();