From f0f6ff4ac03eaf0afabdd8976e6625db1d6e9c93 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 27 Jul 2026 13:46:42 -0700 Subject: [PATCH 1/8] use custom message instead of remote config payload # Conflicts: # opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java # opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java --- .../remotecontrol/CommandDispatcher.java | 2 +- .../remotecontrol/CommandDispatcherImpl.java | 2 +- .../remotecontrol/NoOpCommandDispatcher.java | 2 +- .../CommandDispatcherImplTest.java | 18 ++++++------ dependencyManagement/build.gradle.kts | 2 +- .../opentelemetry/opamp/OpampActivator.java | 4 +++ .../opamp/ServerToAgentMessageHandler.java | 23 +++++++-------- .../opamp/OpampActivatorTest.java | 28 +++++++++++-------- 8 files changed, 43 insertions(+), 38 deletions(-) diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java index 1bdc1085d..982bede5a 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java @@ -17,5 +17,5 @@ package com.splunk.opamp.remotecontrol; public interface CommandDispatcher { - void dispatch(String contentType, String body); + void dispatch(String type, String body); } diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java index ab24a93c8..8d909c9fc 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java @@ -38,7 +38,7 @@ public CommandDispatcherImpl(BigDumper threadDumper) { } @Override - public void dispatch(String contentType, String body) { + public void dispatch(String type, String body) { String[] parts = body.split("\n"); if (parts.length == 0) { logger.warning("Missing useful command body."); diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java b/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java index 7fed93a64..3d5fb258a 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java @@ -18,7 +18,7 @@ public class NoOpCommandDispatcher implements CommandDispatcher { @Override - public void dispatch(String contentType, String body) { + public void dispatch(String type, String body) { // nop } } diff --git a/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java b/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java index ab9b8dc70..463020411 100644 --- a/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java +++ b/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java @@ -33,7 +33,7 @@ void dispatchesThreadDumpWithJobIdCountAndInterval() { when(threadDumper.startPeriodicDumper("job-123", 3, Duration.ofMillis(250))).thenReturn(true); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("text/plain", "thread.dump\njob-123\n3\n250"); + dispatcher.dispatch("command", "thread.dump\njob-123\n3\n250"); verify(threadDumper).startPeriodicDumper("job-123", 3, Duration.ofMillis(250)); } @@ -43,7 +43,7 @@ void acceptsMaximumThreadDumpCountAndInterval() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("text/plain", "thread.dump\njob-123\n100\n300000"); + dispatcher.dispatch("command", "thread.dump\njob-123\n100\n300000"); verify(threadDumper).startPeriodicDumper("job-123", 100, Duration.ofMinutes(5)); } @@ -54,7 +54,7 @@ void usesThreadDumpDefaults() { when(threadDumper.startPeriodicDumper("job-123", 1, Duration.ofMillis(1000))).thenReturn(true); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("text/plain", "thread.dump\r\njob-123\r\n"); + dispatcher.dispatch("command", "thread.dump\r\njob-123\r\n"); verify(threadDumper).startPeriodicDumper("job-123", 1, Duration.ofMillis(1000)); } @@ -64,7 +64,7 @@ void rejectsMissingJobId() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("text/plain", "thread.dump"); + dispatcher.dispatch("command", "thread.dump"); verifyNoInteractions(threadDumper); } @@ -74,11 +74,11 @@ void rejectsInvalidCountAndIntervalWithoutThrowing() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - assertDoesNotThrow(() -> dispatcher.dispatch("text/plain", "thread.dump\njob-123\n0\n1000")); - assertDoesNotThrow(() -> dispatcher.dispatch("text/plain", "thread.dump\njob-123\n101\n1000")); - assertDoesNotThrow(() -> dispatcher.dispatch("text/plain", "thread.dump\njob-123\n1\n300001")); + assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n0\n1000")); + assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n101\n1000")); + assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n1\n300001")); assertDoesNotThrow( - () -> dispatcher.dispatch("text/plain", "thread.dump\njob-123\n1\nnot-a-number")); + () -> dispatcher.dispatch("command", "thread.dump\njob-123\n1\nnot-a-number")); verifyNoInteractions(threadDumper); } @@ -90,6 +90,6 @@ void containsThreadDumpFailures() { .thenThrow(new IllegalStateException("export failed")); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - assertDoesNotThrow(() -> dispatcher.dispatch("text/plain", "thread.dump\njob-123")); + assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123")); } } diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index b0394718e..8d12d324f 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -6,7 +6,7 @@ val otelVersion = "1.64.0" val otelAlphaVersion = otelVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") val otelInstrumentationVersion = "2.30.0" val otelInstrumentationAlphaVersion = otelInstrumentationVersion.replaceFirst("(-SNAPSHOT)?$".toRegex(), "-alpha$1") -val otelContribAlphaVersion = "1.58.0-alpha" +val otelContribAlphaVersion = "1.59.0-alpha" val autoValueVersion = "1.11.1" val dockerJavaVersion = "3.7.1" diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java index 046700f6d..751dc893d 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java @@ -178,6 +178,10 @@ static OpampClient startOpampClient( builder.enableRemoteConfig(); } + if (opampClientConfiguration.isRemoteControlAllowed()) { + builder.addCustomCapability(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + } + String endpoint = opampClientConfiguration.getEndpoint(); long pollingDurationMillis = opampClientConfiguration.getPollingInterval(); if (endpoint != null) { diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java index 5cbe7a2eb..56deb972c 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java @@ -21,11 +21,12 @@ import com.splunk.opamp.remotecontrol.CommandDispatcher; import io.opentelemetry.opamp.client.OpampClient; import io.opentelemetry.opamp.client.internal.response.MessageData; -import opamp.proto.AgentConfigFile; import opamp.proto.AgentRemoteConfig; +import opamp.proto.CustomMessage; public class ServerToAgentMessageHandler { - public static final String MAGIC_CMD_STRING = "COMMAND_HACKS"; + public static final String HACKY_CMD_CAPABILITY = "com.splunk.opamp.experimental_command/v1"; + public static final String HACKY_CMD_TYPE = "command"; private final RemoteConfigProcessor remoteConfigProcessor; private final CommandDispatcher commandDispatcher; @@ -38,18 +39,14 @@ public class ServerToAgentMessageHandler { public void handleMessage(MessageData message, OpampClient opampClient) { AgentRemoteConfig remoteConfig = message.getRemoteConfig(); if (remoteConfig != null) { - - if (remoteConfig.config.config_map.containsKey(MAGIC_CMD_STRING)) { - AgentConfigFile agentConfigFile = remoteConfig.config.config_map.get(MAGIC_CMD_STRING); - String contentType = agentConfigFile.content_type; - String body = agentConfigFile.body.string(UTF_8); - commandDispatcher.dispatch(contentType, body); - if (remoteConfig.config.config_map.size() == 1) { // just this command - return; - } - } - remoteConfigProcessor.applyConfig(remoteConfig, opampClient); } + CustomMessage customMessage = message.getCustomMessage(); + if (customMessage != null + && HACKY_CMD_CAPABILITY.equals(customMessage.capability) + && HACKY_CMD_TYPE.equals(customMessage.type)) { + String body = customMessage.data.string(UTF_8); + commandDispatcher.dispatch(customMessage.type, body); + } } } diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java index f1e62cdcb..f3fdf1d69 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java @@ -44,9 +44,7 @@ import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension; import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.RecordedRequest; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; @@ -58,6 +56,7 @@ import opamp.proto.AgentToServer; import opamp.proto.AnyValue; import opamp.proto.ArrayValue; +import opamp.proto.CustomMessage; import opamp.proto.KeyValue; import opamp.proto.ServerErrorResponse; import opamp.proto.ServerToAgent; @@ -119,15 +118,14 @@ void testOpamp() throws Exception { .put(AttributeKey.booleanArrayKey("boolobjarr"), Arrays.asList(true, true, false, true)) .build(); Resource resource = Resource.create(attributes); - Map configMap = - Collections.singletonMap( - "test-key", - new AgentConfigFile.Builder().body(ByteString.encodeUtf8("test-value")).build()); + String commandBody = "thread.dump\njob-123\n3\n250"; ServerToAgent response = new ServerToAgent.Builder() - .remote_config( - new AgentRemoteConfig.Builder() - .config(new AgentConfigMap.Builder().config_map(configMap).build()) + .custom_message( + new CustomMessage.Builder() + .capability(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY) + .type(ServerToAgentMessageHandler.HACKY_CMD_TYPE) + .data(ByteString.encodeUtf8(commandBody)) .build()) .build(); server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.X_PROTOBUF, response.encode())); @@ -141,6 +139,7 @@ void testOpamp() throws Exception { .withEndpoint(server.httpUri().toString()) .withPollingInterval(500) .withRemoteConfigurationEnabled(true) + .withRemoteControlAllowed(true) .build(); OpampClient client = OpampActivator.startOpampClient( @@ -172,17 +171,22 @@ public void onMessage(OpampClient opampClient, MessageData messageData) { // when MessageData message = result.get(5, TimeUnit.SECONDS); - AgentRemoteConfig remoteConfig = message.getRemoteConfig(); + CustomMessage customMessage = message.getCustomMessage(); // then - assertThat(remoteConfig).isNotNull(); - assertThat(remoteConfig.config.config_map.get("test-key").body.utf8()).isEqualTo("test-value"); + assertThat(customMessage).isNotNull(); + assertThat(customMessage.capability) + .isEqualTo(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + assertThat(customMessage.type).isEqualTo(ServerToAgentMessageHandler.HACKY_CMD_TYPE); + assertThat(customMessage.data.utf8()).isEqualTo(commandBody); RecordedRequest recordedRequest = server.takeRequest(); byte[] body = recordedRequest.request().content().array(); AgentToServer agentToServer = AgentToServer.ADAPTER.decode(body); assertRemoteConfigCapabilities(agentToServer, true); + assertThat(agentToServer.custom_capabilities.capabilities) + .containsExactly(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); assertIdentifyingString(agentToServer, SERVICE_NAME, "test-service"); assertIdentifyingString(agentToServer, SERVICE_INSTANCE_ID, "test-instance"); assertIdentifyingString(agentToServer, SERVICE_NAMESPACE, "test-ns"); From 4c8979b9bd9f2c5e862d919727c657a41d079654 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 27 Jul 2026 13:46:54 -0700 Subject: [PATCH 2/8] backfill test coverage --- .../ServerToAgentMessageHandlerTest.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java new file mode 100644 index 000000000..b8e3a6485 --- /dev/null +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java @@ -0,0 +1,124 @@ +/* + * Copyright Splunk Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.splunk.opentelemetry.opamp; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; + +import com.splunk.opamp.remotecontrol.CommandDispatcher; +import io.opentelemetry.opamp.client.OpampClient; +import io.opentelemetry.opamp.client.internal.response.MessageData; +import okio.ByteString; +import opamp.proto.AgentRemoteConfig; +import opamp.proto.CustomMessage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class ServerToAgentMessageHandlerTest { + + @Mock RemoteConfigProcessor remoteConfigProcessor; + @Mock CommandDispatcher commandDispatcher; + @Mock OpampClient opampClient; + private ServerToAgentMessageHandler handler; + + @BeforeEach + void setUp() { + handler = new ServerToAgentMessageHandler(remoteConfigProcessor, commandDispatcher); + } + + @Test + void dispatchesMatchingCustomCommand() { + String body = "thread.dump\njob-123\n3\n250"; + MessageData message = + MessageData.builder() + .setCustomMessage( + customMessage( + ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, + ServerToAgentMessageHandler.HACKY_CMD_TYPE, + body)) + .build(); + + handler.handleMessage(message, opampClient); + + verify(commandDispatcher).dispatch(ServerToAgentMessageHandler.HACKY_CMD_TYPE, body); + verifyNoInteractions(remoteConfigProcessor, opampClient); + } + + @Test + void ignoresCustomMessageForDifferentCapability() { + MessageData message = + MessageData.builder() + .setCustomMessage( + customMessage( + "com.example.other/v1", + ServerToAgentMessageHandler.HACKY_CMD_TYPE, + "thread.dump\njob-123")) + .build(); + + handler.handleMessage(message, opampClient); + + verifyNoInteractions(commandDispatcher, remoteConfigProcessor, opampClient); + } + + @Test + void ignoresCustomMessageForDifferentType() { + MessageData message = + MessageData.builder() + .setCustomMessage( + customMessage( + ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, + "not-a-command", + "thread.dump\njob-123")) + .build(); + + handler.handleMessage(message, opampClient); + + verifyNoInteractions(commandDispatcher, remoteConfigProcessor, opampClient); + } + + @Test + void handlesRemoteConfigAndCustomCommandFromSameMessage() { + String body = "thread.dump\njob-123"; + AgentRemoteConfig remoteConfig = new AgentRemoteConfig.Builder().build(); + MessageData message = + MessageData.builder() + .setRemoteConfig(remoteConfig) + .setCustomMessage( + customMessage( + ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, + ServerToAgentMessageHandler.HACKY_CMD_TYPE, + body)) + .build(); + + handler.handleMessage(message, opampClient); + + verify(remoteConfigProcessor).applyConfig(remoteConfig, opampClient); + verify(commandDispatcher).dispatch(ServerToAgentMessageHandler.HACKY_CMD_TYPE, body); + } + + private static CustomMessage customMessage(String capability, String type, String body) { + return new CustomMessage.Builder() + .capability(capability) + .type(type) + .data(ByteString.encodeUtf8(body)) + .build(); + } +} From a68c9c133810f548c43b252ec5dc6f367363691f Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 30 Jul 2026 15:03:35 -0700 Subject: [PATCH 3/8] rebase after opt in pr --- .../opentelemetry/opamp/OpampActivator.java | 5 +---- .../opentelemetry/opamp/OpampActivatorTest.java | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java index 751dc893d..fbc0197fc 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java @@ -171,10 +171,7 @@ static OpampClient startOpampClient( OpampClientBuilder builder = OpampClient.builder(); builder.enableEffectiveConfigReporting(); - // Remote control uses OpAMP remote configuration as its transport, so advertise the - // remote configuration capabilities when either feature is enabled. - if (opampClientConfiguration.isRemoteConfigurationEnabled() - || opampClientConfiguration.isRemoteControlAllowed()) { + if (opampClientConfiguration.isRemoteConfigurationEnabled()) { builder.enableRemoteConfig(); } diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java index f3fdf1d69..41e0aa532 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java @@ -50,9 +50,6 @@ import java.util.function.Predicate; import okio.ByteString; import opamp.proto.AgentCapabilities; -import opamp.proto.AgentConfigFile; -import opamp.proto.AgentConfigMap; -import opamp.proto.AgentRemoteConfig; import opamp.proto.AgentToServer; import opamp.proto.AnyValue; import opamp.proto.ArrayValue; @@ -270,10 +267,20 @@ public void onMessage(OpampClient opampClient, MessageData messageData) { } @Test - void shouldAdvertiseRemoteConfigCapabilitiesWhenRemoteControlIsAllowed() throws Exception { + void shouldAdvertiseCustomCapabilityWhenRemoteControlIsAllowed() throws Exception { AgentToServer agentToServer = startClientAndTakeInitialRequest(false, true); + assertRemoteConfigCapabilities(agentToServer, false); + assertThat(agentToServer.custom_capabilities.capabilities) + .containsExactly(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + } + + @Test + void shouldAdvertiseRemoteConfigCapabilitiesOnlyWhenRemoteConfigIsEnabled() throws Exception { + AgentToServer agentToServer = startClientAndTakeInitialRequest(true, false); + assertRemoteConfigCapabilities(agentToServer, true); + assertThat(agentToServer.custom_capabilities).isNull(); } @Test @@ -281,6 +288,7 @@ void shouldNotAdvertiseRemoteConfigCapabilitiesWhenRemoteFeaturesAreDisabled() t AgentToServer agentToServer = startClientAndTakeInitialRequest(false, false); assertRemoteConfigCapabilities(agentToServer, false); + assertThat(agentToServer.custom_capabilities).isNull(); } private AgentToServer startClientAndTakeInitialRequest( From c26b6a85714bf5cf56a275e495be9e06342533c8 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 30 Jul 2026 15:19:03 -0700 Subject: [PATCH 4/8] update licenses --- licenses/licenses.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/licenses/licenses.md b/licenses/licenses.md index 32edec35e..3749f7ed6 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -1,7 +1,7 @@ # splunk-otel-javaagent ## Dependency License Report -_2026-07-23 08:15:00 PDT_ +_2026-07-30 15:18:51 PDT_ ## Apache License, Version 2.0 **1** **Group:** `com.squareup.okhttp3` **Name:** `okhttp` **Version:** `5.4.0` @@ -20,11 +20,11 @@ _2026-07-23 08:15:00 PDT_ > - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**5** **Group:** `com.squareup.wire` **Name:** `wire-runtime` **Version:** `6.4.0` +**5** **Group:** `com.squareup.wire` **Name:** `wire-runtime` **Version:** `6.4.5` > - **POM Project URL**: [https://github.com/square/wire/](https://github.com/square/wire/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**6** **Group:** `com.squareup.wire` **Name:** `wire-runtime-jvm` **Version:** `6.4.0` +**6** **Group:** `com.squareup.wire` **Name:** `wire-runtime-jvm` **Version:** `6.4.5` > - **POM Project URL**: [https://github.com/square/wire/](https://github.com/square/wire/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) @@ -76,15 +76,15 @@ _2026-07-23 08:15:00 PDT_ > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**19** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-opamp-client` **Version:** `1.58.0-alpha` +**19** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-opamp-client` **Version:** `1.59.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**20** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-resource-providers` **Version:** `1.58.0-alpha` +**20** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-resource-providers` **Version:** `1.59.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**21** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-samplers` **Version:** `1.58.0-alpha` +**21** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-samplers` **Version:** `1.59.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) From e1fede16b7dd58cfdb0b21782e43297249892e96 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 4 Aug 2026 15:22:27 -0700 Subject: [PATCH 5/8] remove unnecessary/extra command --- .../remotecontrol/CommandDispatcher.java | 2 +- .../remotecontrol/CommandDispatcherImpl.java | 2 +- .../remotecontrol/NoOpCommandDispatcher.java | 2 +- .../CommandDispatcherImplTest.java | 19 +++++++++---------- .../opamp/ServerToAgentMessageHandler.java | 2 +- .../ServerToAgentMessageHandlerTest.java | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java index 982bede5a..435c9c9ce 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcher.java @@ -17,5 +17,5 @@ package com.splunk.opamp.remotecontrol; public interface CommandDispatcher { - void dispatch(String type, String body); + void dispatch(String body); } diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java index 8d909c9fc..fe4a5ac4a 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/CommandDispatcherImpl.java @@ -38,7 +38,7 @@ public CommandDispatcherImpl(BigDumper threadDumper) { } @Override - public void dispatch(String type, String body) { + public void dispatch(String body) { String[] parts = body.split("\n"); if (parts.length == 0) { logger.warning("Missing useful command body."); diff --git a/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java b/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java index 3d5fb258a..3dddf1706 100644 --- a/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java +++ b/control/src/main/java/com/splunk/opamp/remotecontrol/NoOpCommandDispatcher.java @@ -18,7 +18,7 @@ public class NoOpCommandDispatcher implements CommandDispatcher { @Override - public void dispatch(String type, String body) { + public void dispatch(String body) { // nop } } diff --git a/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java b/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java index 463020411..0e5a8f7d2 100644 --- a/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java +++ b/control/src/test/java/com/splunk/opamp/remotecontrol/CommandDispatcherImplTest.java @@ -33,7 +33,7 @@ void dispatchesThreadDumpWithJobIdCountAndInterval() { when(threadDumper.startPeriodicDumper("job-123", 3, Duration.ofMillis(250))).thenReturn(true); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("command", "thread.dump\njob-123\n3\n250"); + dispatcher.dispatch("thread.dump\njob-123\n3\n250"); verify(threadDumper).startPeriodicDumper("job-123", 3, Duration.ofMillis(250)); } @@ -43,7 +43,7 @@ void acceptsMaximumThreadDumpCountAndInterval() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("command", "thread.dump\njob-123\n100\n300000"); + dispatcher.dispatch("thread.dump\njob-123\n100\n300000"); verify(threadDumper).startPeriodicDumper("job-123", 100, Duration.ofMinutes(5)); } @@ -54,7 +54,7 @@ void usesThreadDumpDefaults() { when(threadDumper.startPeriodicDumper("job-123", 1, Duration.ofMillis(1000))).thenReturn(true); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("command", "thread.dump\r\njob-123\r\n"); + dispatcher.dispatch("thread.dump\r\njob-123\r\n"); verify(threadDumper).startPeriodicDumper("job-123", 1, Duration.ofMillis(1000)); } @@ -64,7 +64,7 @@ void rejectsMissingJobId() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - dispatcher.dispatch("command", "thread.dump"); + dispatcher.dispatch("thread.dump"); verifyNoInteractions(threadDumper); } @@ -74,11 +74,10 @@ void rejectsInvalidCountAndIntervalWithoutThrowing() { BigDumper threadDumper = mock(BigDumper.class); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n0\n1000")); - assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n101\n1000")); - assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123\n1\n300001")); - assertDoesNotThrow( - () -> dispatcher.dispatch("command", "thread.dump\njob-123\n1\nnot-a-number")); + assertDoesNotThrow(() -> dispatcher.dispatch("thread.dump\njob-123\n0\n1000")); + assertDoesNotThrow(() -> dispatcher.dispatch("thread.dump\njob-123\n101\n1000")); + assertDoesNotThrow(() -> dispatcher.dispatch("thread.dump\njob-123\n1\n300001")); + assertDoesNotThrow(() -> dispatcher.dispatch("thread.dump\njob-123\n1\nnot-a-number")); verifyNoInteractions(threadDumper); } @@ -90,6 +89,6 @@ void containsThreadDumpFailures() { .thenThrow(new IllegalStateException("export failed")); CommandDispatcher dispatcher = new CommandDispatcherImpl(threadDumper); - assertDoesNotThrow(() -> dispatcher.dispatch("command", "thread.dump\njob-123")); + assertDoesNotThrow(() -> dispatcher.dispatch("thread.dump\njob-123")); } } diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java index 56deb972c..e8511966c 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java @@ -46,7 +46,7 @@ public void handleMessage(MessageData message, OpampClient opampClient) { && HACKY_CMD_CAPABILITY.equals(customMessage.capability) && HACKY_CMD_TYPE.equals(customMessage.type)) { String body = customMessage.data.string(UTF_8); - commandDispatcher.dispatch(customMessage.type, body); + commandDispatcher.dispatch(body); } } } diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java index b8e3a6485..13e85cb10 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java @@ -58,7 +58,7 @@ void dispatchesMatchingCustomCommand() { handler.handleMessage(message, opampClient); - verify(commandDispatcher).dispatch(ServerToAgentMessageHandler.HACKY_CMD_TYPE, body); + verify(commandDispatcher).dispatch(body); verifyNoInteractions(remoteConfigProcessor, opampClient); } @@ -111,7 +111,7 @@ void handlesRemoteConfigAndCustomCommandFromSameMessage() { handler.handleMessage(message, opampClient); verify(remoteConfigProcessor).applyConfig(remoteConfig, opampClient); - verify(commandDispatcher).dispatch(ServerToAgentMessageHandler.HACKY_CMD_TYPE, body); + verify(commandDispatcher).dispatch(body); } private static CustomMessage customMessage(String capability, String type, String body) { From e2cd11804a3897bd1acbc534458db9c8edfaa34a Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 6 Aug 2026 14:06:18 -0700 Subject: [PATCH 6/8] rename HACKY to hide the shame that lies within. --- .../splunk/opentelemetry/opamp/OpampActivator.java | 2 +- .../opamp/ServerToAgentMessageHandler.java | 8 ++++---- .../opentelemetry/opamp/OpampActivatorTest.java | 12 ++++++------ .../opamp/ServerToAgentMessageHandlerTest.java | 12 ++++++------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java index fbc0197fc..34c6d8fbd 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/OpampActivator.java @@ -176,7 +176,7 @@ static OpampClient startOpampClient( } if (opampClientConfiguration.isRemoteControlAllowed()) { - builder.addCustomCapability(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + builder.addCustomCapability(ServerToAgentMessageHandler.CMD_CAPABILITY); } String endpoint = opampClientConfiguration.getEndpoint(); diff --git a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java index e8511966c..23796b728 100644 --- a/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java +++ b/opamp/src/main/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandler.java @@ -25,8 +25,8 @@ import opamp.proto.CustomMessage; public class ServerToAgentMessageHandler { - public static final String HACKY_CMD_CAPABILITY = "com.splunk.opamp.experimental_command/v1"; - public static final String HACKY_CMD_TYPE = "command"; + public static final String CMD_CAPABILITY = "com.splunk.opamp.experimental_command/v1"; + public static final String CMD_TYPE = "command"; private final RemoteConfigProcessor remoteConfigProcessor; private final CommandDispatcher commandDispatcher; @@ -43,8 +43,8 @@ public void handleMessage(MessageData message, OpampClient opampClient) { } CustomMessage customMessage = message.getCustomMessage(); if (customMessage != null - && HACKY_CMD_CAPABILITY.equals(customMessage.capability) - && HACKY_CMD_TYPE.equals(customMessage.type)) { + && CMD_CAPABILITY.equals(customMessage.capability) + && CMD_TYPE.equals(customMessage.type)) { String body = customMessage.data.string(UTF_8); commandDispatcher.dispatch(body); } diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java index 41e0aa532..bce94b2b0 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java @@ -120,8 +120,8 @@ void testOpamp() throws Exception { new ServerToAgent.Builder() .custom_message( new CustomMessage.Builder() - .capability(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY) - .type(ServerToAgentMessageHandler.HACKY_CMD_TYPE) + .capability(ServerToAgentMessageHandler.CMD_CAPABILITY) + .type(ServerToAgentMessageHandler.CMD_TYPE) .data(ByteString.encodeUtf8(commandBody)) .build()) .build(); @@ -173,8 +173,8 @@ public void onMessage(OpampClient opampClient, MessageData messageData) { // then assertThat(customMessage).isNotNull(); assertThat(customMessage.capability) - .isEqualTo(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); - assertThat(customMessage.type).isEqualTo(ServerToAgentMessageHandler.HACKY_CMD_TYPE); + .isEqualTo(ServerToAgentMessageHandler.CMD_CAPABILITY); + assertThat(customMessage.type).isEqualTo(ServerToAgentMessageHandler.CMD_TYPE); assertThat(customMessage.data.utf8()).isEqualTo(commandBody); RecordedRequest recordedRequest = server.takeRequest(); @@ -183,7 +183,7 @@ public void onMessage(OpampClient opampClient, MessageData messageData) { assertRemoteConfigCapabilities(agentToServer, true); assertThat(agentToServer.custom_capabilities.capabilities) - .containsExactly(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + .containsExactly(ServerToAgentMessageHandler.CMD_CAPABILITY); assertIdentifyingString(agentToServer, SERVICE_NAME, "test-service"); assertIdentifyingString(agentToServer, SERVICE_INSTANCE_ID, "test-instance"); assertIdentifyingString(agentToServer, SERVICE_NAMESPACE, "test-ns"); @@ -272,7 +272,7 @@ void shouldAdvertiseCustomCapabilityWhenRemoteControlIsAllowed() throws Exceptio assertRemoteConfigCapabilities(agentToServer, false); assertThat(agentToServer.custom_capabilities.capabilities) - .containsExactly(ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY); + .containsExactly(ServerToAgentMessageHandler.CMD_CAPABILITY); } @Test diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java index 13e85cb10..4669fe49c 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/ServerToAgentMessageHandlerTest.java @@ -51,8 +51,8 @@ void dispatchesMatchingCustomCommand() { MessageData.builder() .setCustomMessage( customMessage( - ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, - ServerToAgentMessageHandler.HACKY_CMD_TYPE, + ServerToAgentMessageHandler.CMD_CAPABILITY, + ServerToAgentMessageHandler.CMD_TYPE, body)) .build(); @@ -69,7 +69,7 @@ void ignoresCustomMessageForDifferentCapability() { .setCustomMessage( customMessage( "com.example.other/v1", - ServerToAgentMessageHandler.HACKY_CMD_TYPE, + ServerToAgentMessageHandler.CMD_TYPE, "thread.dump\njob-123")) .build(); @@ -84,7 +84,7 @@ void ignoresCustomMessageForDifferentType() { MessageData.builder() .setCustomMessage( customMessage( - ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, + ServerToAgentMessageHandler.CMD_CAPABILITY, "not-a-command", "thread.dump\njob-123")) .build(); @@ -103,8 +103,8 @@ void handlesRemoteConfigAndCustomCommandFromSameMessage() { .setRemoteConfig(remoteConfig) .setCustomMessage( customMessage( - ServerToAgentMessageHandler.HACKY_CMD_CAPABILITY, - ServerToAgentMessageHandler.HACKY_CMD_TYPE, + ServerToAgentMessageHandler.CMD_CAPABILITY, + ServerToAgentMessageHandler.CMD_TYPE, body)) .build(); From 9537ea7696f052155d19c4d8496bb5aa921cd04a Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 10 Aug 2026 10:24:18 -0700 Subject: [PATCH 7/8] bump ci From ad98a2e259bb9148e93671a02b6755fbe84dcaff Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 10 Aug 2026 10:30:08 -0700 Subject: [PATCH 8/8] spotless --- .../com/splunk/opentelemetry/opamp/OpampActivatorTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java index bce94b2b0..ca6497f70 100644 --- a/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java +++ b/opamp/src/test/java/com/splunk/opentelemetry/opamp/OpampActivatorTest.java @@ -172,8 +172,7 @@ public void onMessage(OpampClient opampClient, MessageData messageData) { // then assertThat(customMessage).isNotNull(); - assertThat(customMessage.capability) - .isEqualTo(ServerToAgentMessageHandler.CMD_CAPABILITY); + assertThat(customMessage.capability).isEqualTo(ServerToAgentMessageHandler.CMD_CAPABILITY); assertThat(customMessage.type).isEqualTo(ServerToAgentMessageHandler.CMD_TYPE); assertThat(customMessage.data.utf8()).isEqualTo(commandBody);