Skip to content

Commit a84dc47

Browse files
authored
Merge pull request #204 from atoulme/add_opentelemetry
Make test less flaky by removing grpc exporter
2 parents 904c85b + 3b8cc32 commit a84dc47

File tree

10 files changed

+82
-64
lines changed

10 files changed

+82
-64
lines changed

fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeSupportClient.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ public void shutdown(final InvocationTaskManager itm) {
5353
this.channel.shutdown();
5454
if (!channel.awaitTermination(DEFAULT_TIMEOUT, TimeUnit.SECONDS)) {
5555
channel.shutdownNow();
56-
if (!channel.awaitTermination(DEFAULT_TIMEOUT, TimeUnit.SECONDS)) {
57-
System.err.println("Channel did not terminate");
58-
}
5956
}
6057

6158
} catch (final InterruptedException e) {

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/ChaincodeBaseTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.hyperledger.fabric.metrics.Metrics;
3030
import org.hyperledger.fabric.protos.peer.ChaincodeShim;
3131
import org.hyperledger.fabric.shim.chaincode.EmptyChaincode;
32+
import org.hyperledger.fabric.traces.Traces;
3233
import org.junit.Ignore;
3334
import org.junit.Rule;
3435
import org.junit.Test;
@@ -299,6 +300,7 @@ public void connectChaincodeBase() throws IOException {
299300

300301
final Properties props = cb.getChaincodeConfig();
301302
Metrics.initialize(props);
303+
Traces.initialize(props);
302304

303305
cb.connectToPeer(new StreamObserver<ChaincodeShim.ChaincodeMessage>() {
304306
@Override

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/ChatChaincodeWithPeerTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hyperledger.fabric.protos.peer.ChaincodeShim;
1313
import org.hyperledger.fabric.shim.chaincode.EmptyChaincode;
1414
import org.hyperledger.fabric.shim.utils.MessageUtil;
15+
import org.hyperledger.fabric.traces.Traces;
1516
import org.junit.Rule;
1617
import org.junit.contrib.java.lang.system.EnvironmentVariables;
1718
import org.junit.jupiter.api.AfterEach;
@@ -103,6 +104,7 @@ void initEmptyId() throws IOException {
103104

104105
Properties props = chaincodeBase.getChaincodeConfig();
105106
Metrics.initialize(props);
107+
Traces.initialize(props);
106108
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
107109
},
108110
"chaincode id not set, set env 'CORE_CHAINCODE_ID_NAME', for example 'CORE_CHAINCODE_ID_NAME=mycc'"
@@ -130,7 +132,7 @@ void connectNull() throws IOException {
130132

131133
Properties props = chaincodeBase.getChaincodeConfig();
132134
Metrics.initialize(props);
133-
135+
Traces.initialize(props);
134136
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
135137
assertNull(chatChaincodeWithPeer.connect(null));
136138
}
@@ -143,6 +145,7 @@ void connectAndReceiveRegister() throws IOException {
143145
chaincodeBase.validateOptions();
144146

145147
Properties props = chaincodeBase.getChaincodeConfig();
148+
Traces.initialize(props);
146149
Metrics.initialize(props);
147150

148151
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
@@ -213,6 +216,7 @@ void connectAndReceiveRegisterComplete() throws IOException {
213216
chaincodeBase.validateOptions();
214217

215218
Properties props = chaincodeBase.getChaincodeConfig();
219+
Traces.initialize(props);
216220
Metrics.initialize(props);
217221

218222
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
@@ -243,6 +247,7 @@ void connectAndReceiveRegisterException() throws IOException {
243247
chaincodeBase.validateOptions();
244248

245249
Properties props = chaincodeBase.getChaincodeConfig();
250+
Traces.initialize(props);
246251
Metrics.initialize(props);
247252

248253
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
@@ -271,6 +276,7 @@ void connectOnCompletedException() throws IOException {
271276

272277
Properties props = chaincodeBase.getChaincodeConfig();
273278
Metrics.initialize(props);
279+
Traces.initialize(props);
274280

275281
ChatChaincodeWithPeer chatChaincodeWithPeer = new ChatChaincodeWithPeer(chaincodeBase);
276282

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/NettyGrpcServerTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.hyperledger.fabric.metrics.Metrics;
99
import org.hyperledger.fabric.shim.chaincode.EmptyChaincode;
10+
import org.hyperledger.fabric.traces.Traces;
1011
import org.junit.Rule;
1112
import org.junit.contrib.java.lang.system.EnvironmentVariables;
1213
import org.junit.jupiter.api.AfterEach;
@@ -221,6 +222,7 @@ void initEnvSetPortChaincodeServerAndCoreChaincodeIdName() throws IOException {
221222

222223
Properties props = chaincodeBase.getChaincodeConfig();
223224
Metrics.initialize(props);
225+
Traces.initialize(props);
224226

225227
ChaincodeServer chaincodeServer = new NettyChaincodeServer(chaincodeBase, new ChaincodeServerProperties());
226228

@@ -235,6 +237,7 @@ void startAndStopSetCoreChaincodeIdName() {
235237
chaincodeBase.processEnvironmentOptions();
236238
Properties props = chaincodeBase.getChaincodeConfig();
237239
Metrics.initialize(props);
240+
Traces.initialize(props);
238241

239242
ChaincodeServer chaincodeServer = new NettyChaincodeServer(chaincodeBase, new ChaincodeServerProperties());
240243
new Thread(() -> {

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/impl/ChaincodeSupportClientTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hyperledger.fabric.protos.peer.ChaincodeShim;
1313
import org.hyperledger.fabric.shim.ChaincodeBase;
1414
import org.hyperledger.fabric.shim.chaincode.EmptyChaincode;
15+
import org.hyperledger.fabric.traces.Traces;
1516
import org.junit.Rule;
1617
import org.junit.contrib.java.lang.system.EnvironmentVariables;
1718
import org.junit.jupiter.api.Assertions;
@@ -33,6 +34,7 @@ void testStartInvocationTaskManagerAndRequestObserverNull() throws IOException {
3334

3435
Properties props = chaincodeBase.getChaincodeConfig();
3536
Metrics.initialize(props);
37+
Traces.initialize(props);
3638

3739
final ManagedChannelBuilder<?> managedChannelBuilder = chaincodeBase.newChannelBuilder();
3840
ChaincodeSupportClient chaincodeSupportClient = new ChaincodeSupportClient(managedChannelBuilder);
@@ -60,6 +62,7 @@ void testStartInvocationTaskManagerNullAndRequestObserver() throws IOException {
6062

6163
Properties props = chaincodeBase.getChaincodeConfig();
6264
Metrics.initialize(props);
65+
Traces.initialize(props);
6366

6467
final ManagedChannelBuilder<?> managedChannelBuilder = chaincodeBase.newChannelBuilder();
6568
ChaincodeSupportClient chaincodeSupportClient = new ChaincodeSupportClient(managedChannelBuilder);

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/impl/InnvocationTaskManagerTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hyperledger.fabric.protos.peer.ChaincodeShim;
1313
import org.hyperledger.fabric.shim.ChaincodeBase;
1414
import org.hyperledger.fabric.shim.chaincode.EmptyChaincode;
15+
import org.hyperledger.fabric.traces.Traces;
1516
import org.junit.Rule;
1617
import org.junit.contrib.java.lang.system.EnvironmentVariables;
1718
import org.junit.jupiter.api.AfterEach;
@@ -57,6 +58,7 @@ void getManager() throws IOException {
5758
chaincodeBase.validateOptions();
5859

5960
Properties props = chaincodeBase.getChaincodeConfig();
61+
Traces.initialize(props);
6062
Metrics.initialize(props);
6163

6264
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName("chaincodeIdNumber12345").build();
@@ -72,6 +74,7 @@ void getManagerChaincodeIDNull() throws IOException {
7274

7375
Properties props = chaincodeBase.getChaincodeConfig();
7476
Metrics.initialize(props);
77+
Traces.initialize(props);
7578

7679
Assertions.assertThrows(
7780
IllegalArgumentException.class, () -> {
@@ -103,6 +106,7 @@ void onChaincodeMessage() throws IOException {
103106

104107
Properties props = chaincodeBase.getChaincodeConfig();
105108
Metrics.initialize(props);
109+
Traces.initialize(props);
106110

107111
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName("chaincodeIdNumber12345").build();
108112
final InvocationTaskManager itm = InvocationTaskManager.getManager(chaincodeBase, chaincodeId);
@@ -122,6 +126,7 @@ void setResponseConsumer() throws IOException {
122126

123127
Properties props = chaincodeBase.getChaincodeConfig();
124128
Metrics.initialize(props);
129+
Traces.initialize(props);
125130

126131
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName("chaincodeIdNumber12345").build();
127132
final InvocationTaskManager itm = InvocationTaskManager.getManager(chaincodeBase, chaincodeId);
@@ -137,6 +142,7 @@ void registerException() {
137142

138143
Properties props = chaincodeBase.getChaincodeConfig();
139144
Metrics.initialize(props);
145+
Traces.initialize(props);
140146

141147
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName("chaincodeIdNumber12345").build();
142148
final InvocationTaskManager itm = InvocationTaskManager.getManager(chaincodeBase, chaincodeId);
@@ -157,6 +163,7 @@ void onChaincodeMessageREGISTER() {
157163

158164
Properties props = chaincodeBase.getChaincodeConfig();
159165
Metrics.initialize(props);
166+
Traces.initialize(props);
160167

161168
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName("chaincodeIdNumber12345").build();
162169
final InvocationTaskManager itm = InvocationTaskManager.getManager(chaincodeBase, chaincodeId);
@@ -178,6 +185,7 @@ void onChaincodeMessageInvokeChaincode() {
178185

179186
Properties props = chaincodeBase.getChaincodeConfig();
180187
Metrics.initialize(props);
188+
Traces.initialize(props);
181189

182190
final String chaincodeIdNumber = "chaincodeIdNumber12345";
183191
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName(chaincodeIdNumber).build();
@@ -201,6 +209,7 @@ void onChaincodeMessagePutState() {
201209

202210
Properties props = chaincodeBase.getChaincodeConfig();
203211
Metrics.initialize(props);
212+
Traces.initialize(props);
204213

205214
final String chaincodeIdNumber = "chaincodeIdNumber12345";
206215
final Chaincode.ChaincodeID chaincodeId = Chaincode.ChaincodeID.newBuilder().setName(chaincodeIdNumber).build();
@@ -223,6 +232,7 @@ void shutdown() throws IOException {
223232
chaincodeBase.validateOptions();
224233

225234
Properties props = chaincodeBase.getChaincodeConfig();
235+
Traces.initialize(props);
226236
Metrics.initialize(props);
227237

228238
final ManagedChannelBuilder<?> managedChannelBuilder = chaincodeBase.newChannelBuilder();

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/shim/impl/InvocationTaskManagerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hyperledger.fabric.protos.peer.Chaincode.ChaincodeID;
1818
import org.hyperledger.fabric.protos.peer.ChaincodeShim.ChaincodeMessage;
1919
import org.hyperledger.fabric.shim.ChaincodeBase;
20+
import org.hyperledger.fabric.traces.Traces;
2021
import org.junit.jupiter.api.AfterEach;
2122
import org.junit.jupiter.api.BeforeEach;
2223
import org.junit.jupiter.api.Test;
@@ -33,6 +34,7 @@ public final class InvocationTaskManagerTest {
3334
@BeforeEach
3435
public void setup() {
3536
Metrics.initialize(new Properties());
37+
Traces.initialize(new Properties());
3638

3739
chaincode = Mockito.mock(ChaincodeBase.class);
3840
final ChaincodeID id = ChaincodeID.newBuilder().setName("randomname").build();

fabric-chaincode-shim/src/test/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProviderTest.java

Lines changed: 5 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.hyperledger.fabric.traces.impl;
77

8-
import com.google.common.io.Closer;
98
import io.grpc.ManagedChannelBuilder;
109
import io.grpc.Server;
1110
import io.grpc.ServerCall;
@@ -15,13 +14,9 @@
1514
import io.grpc.Status;
1615
import io.grpc.inprocess.InProcessChannelBuilder;
1716
import io.grpc.inprocess.InProcessServerBuilder;
18-
import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
1917
import io.grpc.stub.StreamObserver;
2018
import io.opentelemetry.api.trace.Span;
21-
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse;
22-
import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc;
23-
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest;
24-
import io.opentelemetry.proto.trace.v1.ResourceSpans;
19+
import io.opentelemetry.sdk.trace.data.SpanData;
2520
import org.hyperledger.fabric.contract.ChaincodeStubNaiveImpl;
2621
import org.hyperledger.fabric.metrics.Metrics;
2722
import org.hyperledger.fabric.protos.peer.Chaincode;
@@ -34,11 +29,8 @@
3429
import org.hyperledger.fabric.shim.impl.ChaincodeSupportClient;
3530
import org.hyperledger.fabric.shim.impl.InvocationTaskManager;
3631
import org.hyperledger.fabric.traces.Traces;
37-
import org.junit.jupiter.api.AfterEach;
38-
import org.junit.jupiter.api.BeforeEach;
3932
import org.junit.jupiter.api.Test;
4033

41-
import java.util.ArrayList;
4234
import java.util.List;
4335
import java.util.Properties;
4436
import java.util.concurrent.CompletableFuture;
@@ -48,36 +40,6 @@
4840

4941
public final class OpenTelemetryTracesProviderTest {
5042

51-
private static final class FakeCollector extends TraceServiceGrpc.TraceServiceImplBase {
52-
private final List<ResourceSpans> receivedSpans = new ArrayList<ResourceSpans>();
53-
private Status returnedStatus = Status.OK;
54-
55-
@Override
56-
public void export(
57-
final ExportTraceServiceRequest request,
58-
final StreamObserver<ExportTraceServiceResponse> responseObserver) {
59-
receivedSpans.addAll(request.getResourceSpansList());
60-
responseObserver.onNext(ExportTraceServiceResponse.newBuilder().build());
61-
if (!returnedStatus.isOk()) {
62-
if (returnedStatus.getCode() == Status.Code.DEADLINE_EXCEEDED) {
63-
// Do not call onCompleted to simulate a deadline exceeded.
64-
return;
65-
}
66-
responseObserver.onError(returnedStatus.asRuntimeException());
67-
return;
68-
}
69-
responseObserver.onCompleted();
70-
}
71-
72-
List<io.opentelemetry.proto.trace.v1.ResourceSpans> getReceivedSpans() {
73-
return receivedSpans;
74-
}
75-
76-
void setReturnedStatus(final Status returnedStatus) {
77-
this.returnedStatus = returnedStatus;
78-
}
79-
}
80-
8143
private class ContextGetterChaincode extends ChaincodeBase {
8244

8345
@Override
@@ -96,23 +58,6 @@ public Properties getChaincodeConfig() {
9658
}
9759
}
9860

99-
private final FakeCollector fakeTracesCollector = new FakeCollector();
100-
private final Closer closer = Closer.create();
101-
102-
@BeforeEach
103-
public void setUp() throws Exception {
104-
Server server =
105-
NettyServerBuilder.forPort(4317)
106-
.addService(fakeTracesCollector)
107-
.build()
108-
.start();
109-
closer.register(server::shutdownNow);
110-
}
111-
112-
@AfterEach
113-
public void tearDown() throws Exception {
114-
closer.close();
115-
}
11661

11762
@Test
11863
public void testProvider() {
@@ -126,13 +71,13 @@ public void testProvider() {
12671

12772
@Test
12873
public void testTracing() throws Exception {
74+
12975
Properties props = new Properties();
13076
props.put("CHAINCODE_TRACES_ENABLED", "true");
13177
props.put("CHAINCODE_TRACES_PROVIDER", OpenTelemetryTracesProvider.class.getName());
13278
props.put("OTEL_TRACES_SAMPLER", "always_on");
13379
props.put("OTEL_BSP_SCHEDULE_DELAY", "100");
134-
props.put("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317");
135-
props.put("OTEL_EXPORTER_OTLP_INSECURE", "true");
80+
props.put("otel.traces.exporter", "TestSpanExporterProvider");
13681
Traces.initialize(props);
13782
Metrics.initialize(props);
13883

@@ -189,8 +134,8 @@ public void onCompleted() {
189134

190135
chaincodeSupportClient.start(itm, requestObserver);
191136
wait.get(5, TimeUnit.SECONDS);
192-
Thread.sleep(5000); // wait for async send of the trace
193-
List<io.opentelemetry.proto.trace.v1.ResourceSpans> spans = fakeTracesCollector.getReceivedSpans();
137+
Thread.sleep(5000);
138+
List<SpanData> spans = TestSpanExporterProvider.SPANS;
194139
assertThat(spans.isEmpty()).isFalse();
195140

196141
chaincodeSupportClient.shutdown(itm);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2019 IBM All Rights Reserved.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package org.hyperledger.fabric.traces.impl;
7+
8+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
9+
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider;
10+
import io.opentelemetry.sdk.common.CompletableResultCode;
11+
import io.opentelemetry.sdk.trace.data.SpanData;
12+
import io.opentelemetry.sdk.trace.export.SpanExporter;
13+
14+
import java.util.ArrayList;
15+
import java.util.Collection;
16+
import java.util.List;
17+
18+
public final class TestSpanExporterProvider implements ConfigurableSpanExporterProvider {
19+
20+
public static final List<SpanData> SPANS = new ArrayList<>();
21+
public static final SpanExporter EXPORTER = new SpanExporter() {
22+
23+
@Override
24+
public CompletableResultCode export(final Collection<SpanData> spans) {
25+
TestSpanExporterProvider.SPANS.addAll(spans);
26+
return CompletableResultCode.ofSuccess();
27+
}
28+
29+
@Override
30+
public CompletableResultCode flush() {
31+
return CompletableResultCode.ofSuccess();
32+
}
33+
34+
@Override
35+
public CompletableResultCode shutdown() {
36+
return CompletableResultCode.ofSuccess();
37+
}
38+
};
39+
40+
@Override
41+
public SpanExporter createExporter(final ConfigProperties config) {
42+
return EXPORTER;
43+
}
44+
45+
@Override
46+
public String getName() {
47+
return "TestSpanExporterProvider";
48+
}
49+
}

0 commit comments

Comments
 (0)