Skip to content

Commit bccad4a

Browse files
committed
Simplify OpAmp client api
1 parent c0dc313 commit bccad4a

File tree

10 files changed

+90
-21
lines changed

10 files changed

+90
-21
lines changed

opamp-client/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ client [spec](https://github.com/open-telemetry/opamp-spec/blob/main/specificati
1212
```java
1313
// Initializing it
1414

15-
RequestService requestService = HttpRequestService.create(OkHttpSender.create("[OPAMP_SERVICE_URL]"));
16-
// RequestService requestService = WebSocketRequestService.create(OkHttpWebSocket.create("[OPAMP_SERVICE_URL]")); // Use this instead to connect to the server via WebSocket.
1715
OpampClient client =
1816
OpampClient.builder()
17+
.setEndpoint("[OPAMP_SERVICE_URL]")
1918
.putIdentifyingAttribute("service.name", "My service name")
2019
.enableRemoteConfig()
2120
.setRequestService(requestService)

opamp-client/src/main/java/io/opentelemetry/opamp/client/OpampClientBuilder.java

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,23 @@
77

88
import com.github.f4b6a3.uuid.UuidCreator;
99
import com.google.errorprone.annotations.CanIgnoreReturnValue;
10+
import io.opentelemetry.opamp.client.internal.Experimental;
1011
import io.opentelemetry.opamp.client.internal.connectivity.http.OkHttpSender;
12+
import io.opentelemetry.opamp.client.internal.connectivity.websocket.OkHttpWebSocket;
1113
import io.opentelemetry.opamp.client.internal.impl.OpampClientImpl;
1214
import io.opentelemetry.opamp.client.internal.impl.OpampClientState;
1315
import io.opentelemetry.opamp.client.internal.request.service.HttpRequestService;
16+
import io.opentelemetry.opamp.client.internal.request.service.RequestService;
1417
import io.opentelemetry.opamp.client.internal.request.service.WebSocketRequestService;
1518
import io.opentelemetry.opamp.client.internal.state.State;
16-
import io.opentelemetry.opamp.client.request.service.RequestService;
19+
import java.net.URI;
1720
import java.nio.ByteBuffer;
1821
import java.util.ArrayList;
1922
import java.util.HashMap;
2023
import java.util.List;
2124
import java.util.Map;
2225
import java.util.UUID;
26+
import java.util.function.Function;
2327
import javax.annotation.Nullable;
2428
import opamp.proto.AgentCapabilities;
2529
import opamp.proto.AgentDescription;
@@ -30,27 +34,57 @@
3034

3135
/** Builds an {@link OpampClient} instance. */
3236
public final class OpampClientBuilder {
37+
private static final String DEFAULT_ENDPOINT_URL = "http://localhost:4320/v1/opamp";
38+
private static final URI DEFAULT_ENDPOINT = URI.create(DEFAULT_ENDPOINT_URL);
39+
3340
private final Map<String, AnyValue> identifyingAttributes = new HashMap<>();
3441
private final Map<String, AnyValue> nonIdentifyingAttributes = new HashMap<>();
3542
private long capabilities = 0;
36-
private RequestService service =
37-
HttpRequestService.create(OkHttpSender.create("http://localhost:4320/v1/opamp"));
43+
private Function<URI, RequestService> serviceFactory =
44+
endpoint -> {
45+
String scheme = endpoint.getScheme();
46+
if ("ws".equalsIgnoreCase(scheme) || "wss".equalsIgnoreCase(scheme)) {
47+
return WebSocketRequestService.create(OkHttpWebSocket.create(endpoint.toString()));
48+
} else {
49+
return HttpRequestService.create(OkHttpSender.create(endpoint.toString()));
50+
}
51+
};
52+
3853
@Nullable private byte[] instanceUid;
3954
@Nullable private State.EffectiveConfig effectiveConfigState;
55+
@Nullable private URI endpoint = DEFAULT_ENDPOINT;
56+
57+
static {
58+
Experimental.internalSetServiceFactory(
59+
(builder, serviceFactory) -> builder.serviceFactory = serviceFactory);
60+
}
4061

4162
OpampClientBuilder() {}
4263

4364
/**
44-
* Sets an implementation of a {@link RequestService} to handle the request's sending process.
45-
* There are 2 possible options, either {@link HttpRequestService} to use HTTP, or {@link
46-
* WebSocketRequestService} to use WebSocket.
65+
* Sets the OpAMP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The
66+
* endpoint must start with either http://, https://, ws:// or wss://. Sets the address of the
67+
* OpAMP Server.
68+
*
69+
* @param endpoint The OpAMP endpoint.
70+
* @return this
71+
*/
72+
@CanIgnoreReturnValue
73+
public OpampClientBuilder setEndpoint(String endpoint) {
74+
return setEndpoint(URI.create(endpoint));
75+
}
76+
77+
/**
78+
* Sets the OpAMP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The
79+
* endpoint must start with either http://, https://, ws:// or wss://. Sets the address of the
80+
* OpAMP Server.
4781
*
48-
* @param service The request service implementation.
82+
* @param endpoint The OpAMP endpoint.
4983
* @return this
5084
*/
5185
@CanIgnoreReturnValue
52-
public OpampClientBuilder setRequestService(RequestService service) {
53-
this.service = service;
86+
public OpampClientBuilder setEndpoint(URI endpoint) {
87+
this.endpoint = endpoint;
5488
return this;
5589
}
5690

@@ -402,7 +436,7 @@ public OpampClient build(OpampClient.Callbacks callbacks) {
402436
new State.InstanceUid(instanceUid),
403437
new State.Flags(0L),
404438
effectiveConfigState);
405-
return OpampClientImpl.create(service, state, callbacks);
439+
return OpampClientImpl.create(serviceFactory.apply(endpoint), state, callbacks);
406440
}
407441

408442
private static State.EffectiveConfig createEffectiveConfigNoop() {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.opamp.client.internal;
7+
8+
import io.opentelemetry.opamp.client.OpampClientBuilder;
9+
import io.opentelemetry.opamp.client.internal.request.service.RequestService;
10+
import java.net.URI;
11+
import java.util.function.BiConsumer;
12+
import java.util.function.Function;
13+
import javax.annotation.Nullable;
14+
15+
/**
16+
* This class is internal and experimental. Its APIs are unstable and can change at any time. Its
17+
* APIs (or a version of them) may be promoted to the public stable API in the future, but no
18+
* guarantees are made.
19+
*/
20+
public final class Experimental {
21+
22+
@Nullable
23+
private static volatile BiConsumer<OpampClientBuilder, Function<URI, RequestService>>
24+
setServiceFactory;
25+
26+
/**
27+
* Sets factory function for creating {@link RequestService} instances form a given server URI.
28+
*/
29+
public static void setServiceFactory(
30+
OpampClientBuilder builder, Function<URI, RequestService> serviceFactory) {
31+
if (setServiceFactory != null) {
32+
setServiceFactory.accept(builder, serviceFactory);
33+
}
34+
}
35+
36+
public static void internalSetServiceFactory(
37+
BiConsumer<OpampClientBuilder, Function<URI, RequestService>> setServiceFactory) {
38+
Experimental.setServiceFactory = setServiceFactory;
39+
}
40+
41+
private Experimental() {}
42+
}

opamp-client/src/main/java/io/opentelemetry/opamp/client/internal/impl/OpampClientImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
import io.opentelemetry.opamp.client.internal.impl.recipe.appenders.SequenceNumberAppender;
2020
import io.opentelemetry.opamp.client.internal.request.Field;
2121
import io.opentelemetry.opamp.client.internal.request.Request;
22+
import io.opentelemetry.opamp.client.internal.request.service.RequestService;
2223
import io.opentelemetry.opamp.client.internal.response.MessageData;
2324
import io.opentelemetry.opamp.client.internal.response.OpampServerResponseException;
2425
import io.opentelemetry.opamp.client.internal.response.Response;
2526
import io.opentelemetry.opamp.client.internal.state.ObservableState;
2627
import io.opentelemetry.opamp.client.internal.state.State;
27-
import io.opentelemetry.opamp.client.request.service.RequestService;
2828
import java.util.ArrayList;
2929
import java.util.Collections;
3030
import java.util.List;

opamp-client/src/main/java/io/opentelemetry/opamp/client/internal/request/service/HttpRequestService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.opentelemetry.opamp.client.internal.request.delay.RetryPeriodicDelay;
1515
import io.opentelemetry.opamp.client.internal.response.OpampServerResponseException;
1616
import io.opentelemetry.opamp.client.internal.response.Response;
17-
import io.opentelemetry.opamp.client.request.service.RequestService;
1817
import java.io.IOException;
1918
import java.time.Duration;
2019
import java.util.Objects;

opamp-client/src/main/java/io/opentelemetry/opamp/client/request/service/RequestService.java renamed to opamp-client/src/main/java/io/opentelemetry/opamp/client/internal/request/service/RequestService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.opamp.client.request.service;
6+
package io.opentelemetry.opamp.client.internal.request.service;
77

88
import io.opentelemetry.opamp.client.OpampClient;
99
import io.opentelemetry.opamp.client.internal.request.Request;
10-
import io.opentelemetry.opamp.client.internal.request.service.HttpRequestService;
11-
import io.opentelemetry.opamp.client.internal.request.service.WebSocketRequestService;
1210
import io.opentelemetry.opamp.client.internal.response.Response;
1311
import java.util.function.Supplier;
1412

opamp-client/src/main/java/io/opentelemetry/opamp/client/internal/request/service/WebSocketRequestService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import io.opentelemetry.opamp.client.internal.request.delay.RetryPeriodicDelay;
1414
import io.opentelemetry.opamp.client.internal.response.OpampServerResponseException;
1515
import io.opentelemetry.opamp.client.internal.response.Response;
16-
import io.opentelemetry.opamp.client.request.service.RequestService;
1716
import java.io.ByteArrayOutputStream;
1817
import java.io.IOException;
1918
import java.time.Duration;

opamp-client/src/test/java/io/opentelemetry/opamp/client/internal/impl/OpampClientImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import io.opentelemetry.opamp.client.internal.connectivity.http.OkHttpSender;
1818
import io.opentelemetry.opamp.client.internal.request.Request;
1919
import io.opentelemetry.opamp.client.internal.request.service.HttpRequestService;
20+
import io.opentelemetry.opamp.client.internal.request.service.RequestService;
2021
import io.opentelemetry.opamp.client.internal.response.MessageData;
2122
import io.opentelemetry.opamp.client.internal.state.State;
22-
import io.opentelemetry.opamp.client.request.service.RequestService;
2323
import java.io.IOException;
2424
import java.time.Duration;
2525
import java.util.ArrayList;

opamp-client/src/test/java/io/opentelemetry/opamp/client/internal/request/service/HttpRequestServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.opentelemetry.opamp.client.internal.request.Request;
2222
import io.opentelemetry.opamp.client.internal.request.delay.PeriodicDelay;
2323
import io.opentelemetry.opamp.client.internal.response.Response;
24-
import io.opentelemetry.opamp.client.request.service.RequestService;
2524
import java.io.ByteArrayInputStream;
2625
import java.time.Duration;
2726
import java.util.ArrayList;

opamp-client/src/test/java/io/opentelemetry/opamp/client/internal/request/service/WebSocketRequestServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import io.opentelemetry.opamp.client.internal.request.Request;
2424
import io.opentelemetry.opamp.client.internal.response.OpampServerResponseException;
2525
import io.opentelemetry.opamp.client.internal.response.Response;
26-
import io.opentelemetry.opamp.client.request.service.RequestService;
2726
import java.io.ByteArrayOutputStream;
2827
import java.io.IOException;
2928
import java.time.Duration;

0 commit comments

Comments
 (0)