Skip to content

Commit 49a4ba4

Browse files
committed
Adding the client side integration of otel
Signed-off-by: Emmanuel Hugonnet <[email protected]>
1 parent b787fd5 commit 49a4ba4

File tree

5 files changed

+376
-4
lines changed

5 files changed

+376
-4
lines changed

client/base/src/main/java/io/a2a/client/ClientBuilder.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.a2a.spec.AgentCard;
1010
import io.a2a.spec.AgentInterface;
1111
import io.a2a.spec.TransportProtocol;
12+
import java.lang.reflect.InvocationTargetException;
1213

1314
import java.util.ArrayList;
1415
import java.util.HashMap;
@@ -37,7 +38,8 @@ public class ClientBuilder {
3738
private final AgentCard agentCard;
3839

3940
private final List<BiConsumer<ClientEvent, AgentCard>> consumers = new ArrayList<>();
40-
private @Nullable Consumer<Throwable> streamErrorHandler;
41+
private @Nullable
42+
Consumer<Throwable> streamErrorHandler;
4143
private ClientConfig clientConfig = new ClientConfig.Builder().build();
4244

4345
private final Map<Class<? extends ClientTransport>, ClientTransportConfig<? extends ClientTransport>> clientTransports = new LinkedHashMap<>();
@@ -105,7 +107,7 @@ private ClientTransport buildClientTransport() throws A2AClientException {
105107
throw new A2AClientException("Missing required TransportConfig for " + agentInterface.transport());
106108
}
107109

108-
return clientTransportProvider.create(clientTransportConfig, agentCard, agentInterface.url());
110+
return wrap(clientTransportProvider.create(clientTransportConfig, agentCard, agentInterface.url()), clientTransportConfig);
109111
}
110112

111113
private Map<String, String> getServerPreferredTransports() {
@@ -160,10 +162,21 @@ private AgentInterface findBestClientTransport() throws A2AClientException {
160162
if (transportProtocol == null || transportUrl == null) {
161163
throw new A2AClientException("No compatible transport found");
162164
}
163-
if (! transportProviderRegistry.containsKey(transportProtocol)) {
165+
if (!transportProviderRegistry.containsKey(transportProtocol)) {
164166
throw new A2AClientException("No client available for " + transportProtocol);
165167
}
166168

167169
return new AgentInterface(transportProtocol, transportUrl);
168170
}
171+
172+
private ClientTransport wrap(ClientTransport transport, ClientTransportConfig<? extends ClientTransport> clientTransportConfig) {
173+
try {
174+
Class<?> factoryClass = this.getClass().getClassLoader().loadClass("io.a2a.extras.opentelemetry.OpenTelemetryClientTransportFactory");
175+
Object openTelemetryClientTransportFactory = factoryClass.getConstructor(new Class<?>[0]).newInstance(new Object[0]);
176+
factoryClass.getDeclaredMethod("config", ClientTransportConfig.class).invoke(openTelemetryClientTransportFactory, clientTransportConfig);
177+
return (ClientTransport) factoryClass.getDeclaredMethod("wrap", ClientTransport.class).invoke(openTelemetryClientTransportFactory, transport);
178+
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
179+
return transport;
180+
}
181+
}
169182
}

client/transport/rest/src/main/java/io/a2a/client/transport/rest/RestTransportConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import io.a2a.client.transport.spi.ClientTransportConfig;
55
import org.jspecify.annotations.Nullable;
66

7-
public class RestTransportConfig extends ClientTransportConfig<RestTransport> {
7+
public class RestTransportConfig extends ClientTransportConfig<RestTransport> {
88

99
private final @Nullable A2AHttpClient httpClient;
1010

client/transport/spi/src/main/java/io/a2a/client/transport/spi/ClientTransportConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
import io.a2a.client.transport.spi.interceptors.ClientCallInterceptor;
44
import java.util.ArrayList;
5+
import java.util.HashMap;
56

67
import java.util.List;
8+
import java.util.Map;
79

810
/**
911
* Configuration for an A2A client transport.
1012
*/
1113
public abstract class ClientTransportConfig<T extends ClientTransport> {
1214

1315
protected List<ClientCallInterceptor> interceptors = new ArrayList<>();
16+
protected Map<String, ? extends Object > parameters = new HashMap<>();
1417

1518
public void setInterceptors(List<ClientCallInterceptor> interceptors) {
1619
this.interceptors = new ArrayList<>(interceptors);
@@ -19,4 +22,12 @@ public void setInterceptors(List<ClientCallInterceptor> interceptors) {
1922
public List<ClientCallInterceptor> getInterceptors() {
2023
return interceptors;
2124
}
25+
26+
public void setParameters(Map<String, ? extends Object > parameters) {
27+
this.parameters = new HashMap<>(parameters);
28+
}
29+
30+
public Map<String, ? extends Object > getParameters() {
31+
return parameters;
32+
}
2233
}

0 commit comments

Comments
 (0)