This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new a4df042deb [S3 Metrics] Allow to customize S3 metrics prefix
a4df042deb is described below

commit a4df042deb8ece3fe8ca2fa8330f70b7083854a2
Author: Quan Tran <hqt...@linagora.com>
AuthorDate: Tue Oct 15 10:45:13 2024 +0700

    [S3 Metrics] Allow to customize S3 metrics prefix
---
 .../blob/objectstorage/aws/JamesS3MetricPublisher.java    | 15 +++++++++------
 .../james/blob/objectstorage/aws/S3ClientFactory.java     |  9 ++++++++-
 .../james/blob/objectstorage/aws/S3BlobStoreDAOTest.java  |  4 +++-
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git 
a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/JamesS3MetricPublisher.java
 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/JamesS3MetricPublisher.java
index 095acc2c7c..3e43845635 100644
--- 
a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/JamesS3MetricPublisher.java
+++ 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/JamesS3MetricPublisher.java
@@ -35,18 +35,21 @@ import software.amazon.awssdk.metrics.MetricCollection;
 import software.amazon.awssdk.metrics.MetricPublisher;
 
 public class JamesS3MetricPublisher implements MetricPublisher {
+    public static final String DEFAULT_S3_METRICS_PREFIX = "s3";
+
     private final GaugeRegistry.SettableGauge<Integer> availableConcurrency; 
// The number of remaining concurrent requests that can be supported by the 
HTTP client without needing to establish another connection.
     private final GaugeRegistry.SettableGauge<Integer> leasedConcurrency; // 
The number of request currently being executed by the HTTP client.
     private final GaugeRegistry.SettableGauge<Integer> 
pendingConcurrencyAcquires; // The number of requests that are blocked, waiting 
for another TCP connection or a new stream to be available from the connection 
pool.
     private final TimeMetric concurrencyAcquireDuration; // The time taken to 
acquire a channel from the connection pool.
     private final TimeMetric apiCallDuration; // The total time taken to 
finish a request (inclusive of all retries).
 
-    public JamesS3MetricPublisher(MetricFactory metricFactory, GaugeRegistry 
gaugeRegistry) {
-        this.availableConcurrency = 
gaugeRegistry.settableGauge("s3_httpClient_availableConcurrency");
-        this.leasedConcurrency = 
gaugeRegistry.settableGauge("s3_httpClient_leasedConcurrency");
-        this.pendingConcurrencyAcquires = 
gaugeRegistry.settableGauge("s3_httpClient_pendingConcurrencyAcquires");
-        this.concurrencyAcquireDuration = 
metricFactory.timer("s3_httpClient_concurrencyAcquireDuration");
-        this.apiCallDuration = 
metricFactory.timer("s3_apiCall_apiCallDuration");
+    public JamesS3MetricPublisher(MetricFactory metricFactory, GaugeRegistry 
gaugeRegistry,
+                                  String metricPrefix) {
+        this.availableConcurrency = gaugeRegistry.settableGauge(metricPrefix + 
"_httpClient_availableConcurrency");
+        this.leasedConcurrency = gaugeRegistry.settableGauge(metricPrefix + 
"_httpClient_leasedConcurrency");
+        this.pendingConcurrencyAcquires = 
gaugeRegistry.settableGauge(metricPrefix + 
"_httpClient_pendingConcurrencyAcquires");
+        this.concurrencyAcquireDuration = metricFactory.timer(metricPrefix + 
"_httpClient_concurrencyAcquireDuration");
+        this.apiCallDuration = metricFactory.timer(metricPrefix + 
"_apiCall_apiCallDuration");
     }
 
     @Override
diff --git 
a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3ClientFactory.java
 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3ClientFactory.java
index f635fcd608..ef3f32f2fd 100644
--- 
a/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3ClientFactory.java
+++ 
b/server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3ClientFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.blob.objectstorage.aws;
 
+import static 
org.apache.james.blob.objectstorage.aws.JamesS3MetricPublisher.DEFAULT_S3_METRICS_PREFIX;
+
 import java.io.Closeable;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -32,6 +34,7 @@ import javax.net.ssl.X509TrustManager;
 
 import jakarta.annotation.PreDestroy;
 import jakarta.inject.Inject;
+import jakarta.inject.Provider;
 import jakarta.inject.Singleton;
 
 import org.apache.james.lifecycle.api.Startable;
@@ -67,13 +70,17 @@ public class S3ClientFactory implements Startable, 
Closeable {
 
     public static final String S3_METRICS_ENABLED_PROPERTY_KEY = 
"james.s3.metrics.enabled";
     public static final String S3_METRICS_ENABLED_DEFAULT_VALUE = "true";
+    public static final String S3_METRICS_PREFIX = 
System.getProperty("james.s3.metrics.prefix", DEFAULT_S3_METRICS_PREFIX);
 
     private final S3AsyncClient s3Client;
 
     @Inject
     @Singleton
     public S3ClientFactory(S3BlobStoreConfiguration configuration, 
MetricFactory metricFactory, GaugeRegistry gaugeRegistry) {
+        this(configuration, () -> new JamesS3MetricPublisher(metricFactory, 
gaugeRegistry, S3_METRICS_PREFIX));
+    }
 
+    public S3ClientFactory(S3BlobStoreConfiguration configuration, 
Provider<JamesS3MetricPublisher> jamesS3MetricPublisherProvider) {
         AwsS3AuthConfiguration authConfiguration = 
configuration.getSpecificAuthConfiguration();
         S3Configuration pathStyleAccess = S3Configuration.builder()
             .pathStyleAccessEnabled(true)
@@ -89,7 +96,7 @@ public class S3ClientFactory implements Startable, Closeable {
             .overrideConfiguration(builder -> {
                 boolean s3MetricsEnabled = 
Boolean.parseBoolean(System.getProperty(S3_METRICS_ENABLED_PROPERTY_KEY, 
S3_METRICS_ENABLED_DEFAULT_VALUE));
                 if (s3MetricsEnabled) {
-                    builder.addMetricPublisher(new 
JamesS3MetricPublisher(metricFactory, gaugeRegistry));
+                    
builder.addMetricPublisher(jamesS3MetricPublisherProvider.get());
                 }
             })
             .build();
diff --git 
a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAOTest.java
 
b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAOTest.java
index b852ca25ac..bca00dd75e 100644
--- 
a/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAOTest.java
+++ 
b/server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAOTest.java
@@ -20,6 +20,7 @@ package org.apache.james.blob.objectstorage.aws;
 
 import static org.apache.james.blob.api.BlobStoreDAOFixture.ELEVEN_KILOBYTES;
 import static org.apache.james.blob.api.BlobStoreDAOFixture.TEST_BUCKET_NAME;
+import static 
org.apache.james.blob.objectstorage.aws.JamesS3MetricPublisher.DEFAULT_S3_METRICS_PREFIX;
 import static 
org.apache.james.blob.objectstorage.aws.S3BlobStoreConfiguration.UPLOAD_RETRY_EXCEPTION_PREDICATE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
@@ -66,7 +67,8 @@ public class S3BlobStoreDAOTest implements 
BlobStoreDAOContract {
                 .filter(UPLOAD_RETRY_EXCEPTION_PREDICATE)))
             .build();
 
-        s3ClientFactory = new S3ClientFactory(s3Configuration, new 
RecordingMetricFactory(), new NoopGaugeRegistry());
+        s3ClientFactory = new S3ClientFactory(s3Configuration, () -> new 
JamesS3MetricPublisher(new RecordingMetricFactory(), new NoopGaugeRegistry(),
+            DEFAULT_S3_METRICS_PREFIX));
 
         testee = new S3BlobStoreDAO(s3ClientFactory, s3Configuration, new 
TestBlobId.Factory());
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to