Skip to content

Commit 4d0de9a

Browse files
spjeganSunjeetJegan
authored
Support for copying metric listeners from existing Producers (#784)
* roughin- withProducerMetricsListenerFromExisting * tests and some refactorings * Renamed method to withMetricsListenersFromExisting * Renamed method to withMetricsListenerFromExisting --------- Co-authored-by: Sunjeet Singh <sunjeets@netflix.com> Co-authored-by: Jegan <jponrama@netflix.com>
1 parent a8929b3 commit 4d0de9a

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

hollow/src/main/java/com/netflix/hollow/api/producer/AbstractHollowProducer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.netflix.hollow.api.producer.fs.HollowFilesystemBlobStager;
3131
import com.netflix.hollow.api.producer.listener.CycleListener;
3232
import com.netflix.hollow.api.producer.listener.HollowProducerEventListener;
33+
import com.netflix.hollow.api.producer.metrics.AbstractProducerMetricsListener;
3334
import com.netflix.hollow.api.producer.validation.ValidationResult;
3435
import com.netflix.hollow.api.producer.validation.ValidationStatus;
3536
import com.netflix.hollow.api.producer.validation.ValidationStatusException;
@@ -125,6 +126,11 @@ public AbstractHollowProducer(
125126
b.hashCodeFinder, b.doIntegrityCheck, b.updatePlanBlobVerifier);
126127
}
127128

129+
private final HollowProducerListener producerMetricsListener;
130+
HollowProducerListener getProducerMetricsListener() {
131+
return producerMetricsListener;
132+
}
133+
128134
private AbstractHollowProducer(
129135
HollowProducer.BlobStager blobStager,
130136
HollowProducer.Publisher publisher,
@@ -172,6 +178,14 @@ private AbstractHollowProducer(
172178
this.blobStorageCleaner = blobStorageCleaner;
173179

174180
this.listeners = new ProducerListenerSupport(eventListeners.stream().distinct().collect(toList()));
181+
HollowProducerEventListener temp = null;
182+
for (HollowProducerEventListener l : eventListeners) {
183+
if (l instanceof AbstractProducerMetricsListener) {
184+
temp = l;
185+
}
186+
}
187+
this.producerMetricsListener = (HollowProducerListener) temp;
188+
175189

176190
this.metrics = new HollowProducerMetrics();
177191
this.metricsCollector = metricsCollector;

hollow/src/main/java/com/netflix/hollow/api/producer/HollowProducer.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.netflix.hollow.api.producer.enforcer.SingleProducerEnforcer;
2626
import com.netflix.hollow.api.producer.fs.HollowFilesystemBlobStager;
2727
import com.netflix.hollow.api.producer.listener.HollowProducerEventListener;
28+
import com.netflix.hollow.api.producer.metrics.AbstractProducerMetricsListener;
2829
import com.netflix.hollow.api.producer.validation.ValidatorListener;
2930
import com.netflix.hollow.core.read.engine.HollowReadStateEngine;
3031
import com.netflix.hollow.core.schema.HollowSchema;
@@ -111,6 +112,12 @@
111112
*/
112113
public class HollowProducer extends AbstractHollowProducer {
113114

115+
116+
static HollowProducerAccessor ACCESSOR;
117+
static void setAccessor(HollowProducerAccessor accessor) {
118+
ACCESSOR = accessor;
119+
}
120+
114121
/*
115122
* HollowProducer and HollowProducer.Incremental extend from a package protected AbstractHollowProducer
116123
* for sharing common functionality.
@@ -746,6 +753,31 @@ public static class Builder<B extends HollowProducer.Builder<B>> {
746753
ProducerOptionalBlobPartConfig optionalPartConfig = null;
747754
HollowConsumer.UpdatePlanBlobVerifier updatePlanBlobVerifier = HollowConsumer.UpdatePlanBlobVerifier.DEFAULT_INSTANCE;
748755

756+
protected HollowProducerEventListener customProducerMetricsListener = null;
757+
758+
public B withMetricsListenerFromExisting(HollowProducer producer) {
759+
HollowProducerAccessHelper.ensureInit();
760+
this.customProducerMetricsListener = HollowProducer.ACCESSOR.getProducerMetricsListener(producer);
761+
return (B) this;
762+
}
763+
764+
protected HollowProducerEventListener getCustomProducerMetricsListener() {
765+
return customProducerMetricsListener;
766+
}
767+
768+
private void overrideProducerMetricsListenerIfNeeded() {
769+
if (customProducerMetricsListener == null) {
770+
return;
771+
}
772+
773+
// If the builder already has configured a producer metrics listener, do not override it.
774+
boolean hasProducerMetricsListener = eventListeners.stream()
775+
.anyMatch(l -> l instanceof AbstractProducerMetricsListener);
776+
if (!hasProducerMetricsListener) {
777+
eventListeners.add(customProducerMetricsListener);
778+
}
779+
}
780+
749781
public B withBlobStager(HollowProducer.BlobStager stager) {
750782
this.stager = stager;
751783
return (B) this;
@@ -977,6 +1009,7 @@ protected void checkArguments() {
9771009
*/
9781010
public HollowProducer build() {
9791011
checkArguments();
1012+
overrideProducerMetricsListenerIfNeeded();
9801013
return new HollowProducer(this);
9811014
}
9821015

@@ -988,6 +1021,7 @@ public HollowProducer build() {
9881021
*/
9891022
public HollowProducer.Incremental buildIncremental() {
9901023
checkArguments();
1024+
overrideProducerMetricsListenerIfNeeded();
9911025
return new HollowProducer.Incremental(this);
9921026
}
9931027
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.netflix.hollow.api.producer;
2+
3+
final class HollowProducerAccessHelper {
4+
static {
5+
HollowProducer.setAccessor(new HollowProducerAccessor() {
6+
@Override
7+
public HollowProducerListener getProducerMetricsListener(HollowProducer producer) {
8+
return producer.getProducerMetricsListener();
9+
}
10+
});
11+
}
12+
13+
// force class to load (builder will call this)
14+
static void ensureInit() {}
15+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.netflix.hollow.api.producer;
2+
3+
public interface HollowProducerAccessor {
4+
HollowProducerListener getProducerMetricsListener(HollowProducer producer);
5+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.netflix.hollow.api.producer;
2+
3+
import static org.junit.Assert.assertSame;
4+
5+
import com.netflix.hollow.api.producer.HollowProducer.PublishArtifact;
6+
import com.netflix.hollow.api.producer.metrics.AbstractProducerMetricsListener;
7+
import java.io.IOException;
8+
import org.junit.Test;
9+
10+
public class HollowProducerBuilderWithListenersTest {
11+
12+
private static final class NoopPublisher implements HollowProducer.Publisher {
13+
@Override
14+
public void publish(PublishArtifact publishArtifact) {}
15+
}
16+
17+
private static final class TestMetricsListener extends AbstractProducerMetricsListener {
18+
}
19+
20+
@Test
21+
public void withMetricsListenersFromExisting_reusesMetricsListenerWhenNotExplicitlySet() throws IOException {
22+
TestMetricsListener metricsListener = new TestMetricsListener();
23+
24+
HollowProducer producer1 = HollowProducer.withPublisher(new NoopPublisher())
25+
.withListener(metricsListener)
26+
.build();
27+
28+
assertSame(metricsListener, producer1.getProducerMetricsListener());
29+
30+
HollowProducer producer2 = HollowProducer.withPublisher(new NoopPublisher())
31+
.withMetricsListenerFromExisting(producer1)
32+
.build();
33+
34+
assertSame(producer1.getProducerMetricsListener(), producer2.getProducerMetricsListener());
35+
}
36+
37+
@Test
38+
public void withMetricsListenersFromExisting_doesNotOverrideProvidedMetricsListener() throws IOException {
39+
TestMetricsListener metricsListener = new TestMetricsListener();
40+
HollowProducer producer1 = HollowProducer.withPublisher(new NoopPublisher())
41+
.withListener(metricsListener)
42+
.build();
43+
44+
TestMetricsListener metricsListener2 = new TestMetricsListener();
45+
HollowProducer producer2 = HollowProducer.withPublisher(new NoopPublisher())
46+
.withListener(metricsListener2)
47+
.withMetricsListenerFromExisting(producer1)
48+
.build();
49+
50+
assertSame(metricsListener2, producer2.getProducerMetricsListener());
51+
}
52+
}

0 commit comments

Comments
 (0)