Skip to content

Commit b5f8478

Browse files
authored
Merge pull request #84 from intergral/plugin_api
feat(plugin): add new api for plugin registration in api
2 parents 4dc0272 + 573d322 commit b5f8478

File tree

7 files changed

+94
-6
lines changed

7 files changed

+94
-6
lines changed

.github/workflows/update_docs.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
uses: robinraju/[email protected]
5151
with:
5252
latest: true
53-
fileName: Maven Site
53+
fileName: Maven.Site
5454

5555
- name: Unpack
5656
run: |

CHANGELOG.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# main - Unreleased
2-
2+
- **[CHANGE]**: plugin: Add new API for registering plugins [#84](https://github.com/intergral/deep/pull/84) [@Umaaz](https://github.com/Umaaz)
33

44
# 1.1.3 (15/12/2023)
5-
- **[CHANGE]**: update: Update deep proto to 1.0.3 [#74](https://github.com/intergral/deep/pull/74) [@Umaaz](https://github.com/Umaaz)
5+
- **[CHANGE]**: update: Update deep proto to 1.0.3 [#74](https://github.com/intergral/deep/pull/74) [@Umaaz](https://github.com/Umaaz)
66
- **[CHANGE]**: plugin: Change the plugins to use SPI to load [#77](https://github.com/intergral/deep/pull/77) [@Umaaz](https://github.com/Umaaz)
77
- **[FEATURE]**: metrics: Add support for metrics from tracepoints [#74](https://github.com/intergral/deep/pull/74) [@Umaaz](https://github.com/Umaaz)
88

agent-api/src/main/java/com/intergral/deep/agent/api/IDeep.java

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.intergral.deep.agent.api;
1919

2020
import com.intergral.deep.agent.api.plugin.MetricDefinition;
21+
import com.intergral.deep.agent.api.spi.IDeepPlugin;
2122
import com.intergral.deep.agent.api.tracepoint.ITracepoint.ITracepointRegistration;
2223
import java.util.Collection;
2324
import java.util.Map;
@@ -55,6 +56,14 @@ public interface IDeep {
5556
*/
5657
String getVersion();
5758

59+
/**
60+
* This allows the registration of custom plugins.
61+
*
62+
* @param plugin the plugin that can be used to decorate snapshots
63+
* @return a {@link IRegistration} that can be used to unregister the plugin
64+
*/
65+
IRegistration<IDeepPlugin> registerPlugin(final IDeepPlugin plugin);
66+
5867
/**
5968
* Create a tracepoint that will only exist on this instance.
6069
*

agent/src/main/java/com/intergral/deep/agent/DeepAgent.java

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.intergral.deep.agent.api.DeepVersion;
2121
import com.intergral.deep.agent.api.IDeep;
22+
import com.intergral.deep.agent.api.IRegistration;
2223
import com.intergral.deep.agent.api.plugin.MetricDefinition;
2324
import com.intergral.deep.agent.api.resource.Resource;
2425
import com.intergral.deep.agent.api.spi.IDeepPlugin;
@@ -84,6 +85,12 @@ public String getVersion() {
8485
return DeepVersion.VERSION;
8586
}
8687

88+
@Override
89+
public IRegistration<IDeepPlugin> registerPlugin(final IDeepPlugin plugin) {
90+
plugin.configure(this.settings, Reflection.getInstance());
91+
return this.settings.addPlugin(plugin);
92+
}
93+
8794
@Override
8895
public ITracepointRegistration registerTracepoint(final String path, final int line) {
8996
return registerTracepoint(path, line, Collections.emptyMap(), Collections.emptyList(), Collections.emptyList());

agent/src/main/java/com/intergral/deep/agent/settings/Settings.java

+29-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.intergral.deep.agent.settings;
1919

20+
import com.intergral.deep.agent.api.IRegistration;
2021
import com.intergral.deep.agent.api.logger.ITracepointLogger;
2122
import com.intergral.deep.agent.api.logger.TracepointLogger;
2223
import com.intergral.deep.agent.api.resource.Resource;
@@ -51,7 +52,7 @@ public class Settings implements ISettings {
5152
private static final AtomicBoolean IS_ACTIVE = new AtomicBoolean(true);
5253
private final Properties properties;
5354
private Resource resource;
54-
private Collection<IDeepPlugin> plugins = Collections.emptyList();
55+
private final Collection<IDeepPlugin> plugins = new ArrayList<>();
5556
private ITracepointLogger tracepointLogger = new TracepointLogger();
5657

5758
private Settings(Properties properties) {
@@ -321,7 +322,7 @@ public List<String> getAsList(final String key) {
321322
* @return the discovered plugin with the given name, or {@code null} if a plugin with the provided name and type cannot be found.
322323
*/
323324
public <T> T getPluginByName(final Class<T> clazz, final String name) {
324-
final Collection<T> plugins = getPlugins(clazz, t -> t.getClass().getName().endsWith(name));
325+
final Collection<T> plugins = getPlugins(clazz, t -> t.getClass().getName().equals(name));
325326
if (plugins.isEmpty()) {
326327
return null;
327328
}
@@ -364,7 +365,8 @@ private <T> Collection<T> getPlugins(final Class<T> target, final Predicate<T> p
364365
* @param plugins the plugins to use
365366
*/
366367
public void setPlugins(Collection<IDeepPlugin> plugins) {
367-
this.plugins = plugins;
368+
this.plugins.clear();
369+
this.plugins.addAll(plugins);
368370
}
369371

370372
/**
@@ -419,6 +421,30 @@ public void setTracepointLogger(final ITracepointLogger tracepointLogger) {
419421
this.tracepointLogger = tracepointLogger;
420422
}
421423

424+
/**
425+
* Add a plugin to the current config.
426+
*
427+
* @param plugin the new plugin
428+
* @return the plugin registration
429+
*/
430+
public IRegistration<IDeepPlugin> addPlugin(final IDeepPlugin plugin) {
431+
this.plugins.add(plugin);
432+
return new IRegistration<IDeepPlugin>() {
433+
@Override
434+
public void unregister() {
435+
final boolean removeIf = Settings.this.plugins.removeIf(existing -> existing == plugin);
436+
if (!removeIf) {
437+
throw new IllegalStateException(String.format("cannot remove plugin: %s", plugin));
438+
}
439+
}
440+
441+
@Override
442+
public IDeepPlugin get() {
443+
return plugin;
444+
}
445+
};
446+
}
447+
422448
/**
423449
* Used to indicate an invalid config value.
424450
*/

agent/src/test/java/com/intergral/deep/agent/DeepAgentTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import static org.mockito.Mockito.times;
2525

2626
import com.intergral.deep.agent.api.DeepVersion;
27+
import com.intergral.deep.agent.api.IRegistration;
28+
import com.intergral.deep.agent.api.spi.IDeepPlugin;
2729
import com.intergral.deep.agent.api.tracepoint.ITracepoint;
2830
import com.intergral.deep.agent.api.tracepoint.ITracepoint.ITracepointRegistration;
2931
import com.intergral.deep.agent.settings.Settings;
@@ -79,7 +81,19 @@ void start_shouldSetPluginsAndResource() throws IOException {
7981

8082
Mockito.verify(settings).setPlugins(Mockito.anyCollection());
8183
Mockito.verify(settings).setResource(Mockito.any());
84+
}
85+
86+
@Test
87+
void registerPlugin() {
88+
//noinspection unchecked
89+
final IRegistration<IDeepPlugin> iRegistration = Mockito.mock(IRegistration.class);
90+
Mockito.when(settings.addPlugin(Mockito.any())).thenReturn(iRegistration);
91+
92+
final IDeepPlugin deepPlugin = Mockito.mock(IDeepPlugin.class);
93+
deepAgent.registerPlugin(deepPlugin);
8294

95+
Mockito.verify(settings, times(1)).addPlugin(Mockito.any());
96+
Mockito.verify(deepPlugin, times(1)).configure(settings, Reflection.getInstance());
8397
}
8498

8599
@Test

agent/src/test/java/com/intergral/deep/agent/settings/SettingsTest.java

+32
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static org.junit.jupiter.api.Assertions.assertThrows;
2626
import static org.junit.jupiter.api.Assertions.assertTrue;
2727

28+
import com.intergral.deep.agent.api.IRegistration;
2829
import com.intergral.deep.agent.api.logger.ITracepointLogger;
2930
import com.intergral.deep.agent.api.plugin.IMetricProcessor;
3031
import com.intergral.deep.agent.api.spi.IDeepPlugin;
@@ -177,6 +178,32 @@ void plugins() {
177178
assertNull(notFound);
178179
}
179180

181+
@Test
182+
void addPlugin() {
183+
final Settings settings = Settings.build(new HashMap<>());
184+
185+
final TestPlugin plugin = new TestPlugin();
186+
final IRegistration<IDeepPlugin> iDeepPluginIRegistration = settings.addPlugin(plugin);
187+
188+
assertNotNull(iDeepPluginIRegistration.get());
189+
190+
assertSame(plugin, iDeepPluginIRegistration.get());
191+
192+
assertEquals(1, settings.getPlugins().size());
193+
194+
assertNotNull(settings.getPluginByName(TestPlugin.class, TestPlugin.class.getName()));
195+
196+
iDeepPluginIRegistration.unregister();
197+
198+
assertEquals(0, settings.getPlugins().size());
199+
200+
assertNull(settings.getPluginByName(TestPlugin.class, TestPlugin.class.getName()));
201+
202+
final IllegalStateException illegalStateException = assertThrows(IllegalStateException.class, iDeepPluginIRegistration::unregister);
203+
assertEquals("cannot remove plugin: TestPlugin{}", illegalStateException.getMessage());
204+
205+
}
206+
180207
private static class TestPlugin implements IDeepPlugin, IMetricProcessor, ITracepointLogger {
181208

182209
@Override
@@ -207,5 +234,10 @@ public void summary(final String name, final Map<String, Object> labels, final S
207234
public void logTracepoint(final String logMsg, final String tracepointId, final String snapshotId) {
208235

209236
}
237+
238+
@Override
239+
public String toString() {
240+
return "TestPlugin{}";
241+
}
210242
}
211243
}

0 commit comments

Comments
 (0)