20
20
import com .google .common .util .concurrent .Service ;
21
21
import com .google .common .util .concurrent .ServiceManager ;
22
22
import org .elasticsearch .client .RestClient ;
23
- import org .elasticsearch .common .settings .Settings ;
24
- import org .elasticsearch .core .IOUtils ;
25
- import org .elasticsearch .core .TimeValue ;
26
- import org .elasticsearch .env .Environment ;
27
- import org .elasticsearch .ingest .IngestService ;
28
- import org .elasticsearch .ingest .LogstashInternalBridge ;
29
- import org .elasticsearch .ingest .Processor ;
30
- import org .elasticsearch .ingest .common .IngestCommonPlugin ;
31
- import org .elasticsearch .ingest .common .ProcessorsWhitelistExtension ;
32
- import org .elasticsearch .ingest .useragent .IngestUserAgentPlugin ;
33
- import org .elasticsearch .painless .PainlessPlugin ;
34
- import org .elasticsearch .painless .PainlessScriptEngine ;
35
- import org .elasticsearch .painless .spi .PainlessExtension ;
36
- import org .elasticsearch .painless .spi .Whitelist ;
37
- import org .elasticsearch .plugins .ExtensiblePlugin ;
38
- import org .elasticsearch .plugins .IngestPlugin ;
39
- import org .elasticsearch .script .IngestConditionalScript ;
40
- import org .elasticsearch .script .IngestScript ;
41
- import org .elasticsearch .script .ScriptEngine ;
42
- import org .elasticsearch .script .ScriptModule ;
43
- import org .elasticsearch .script .ScriptService ;
44
- import org .elasticsearch .script .mustache .MustacheScriptEngine ;
45
- import org .elasticsearch .threadpool .ThreadPool ;
46
- import org .elasticsearch .xpack .constantkeyword .ConstantKeywordPainlessExtension ;
47
- import org .elasticsearch .xpack .spatial .SpatialPainlessExtension ;
48
- import org .elasticsearch .xpack .wildcard .WildcardPainlessExtension ;
23
+ import org .elasticsearch .logstashbridge .common .SettingsBridge ;
24
+ import org .elasticsearch .logstashbridge .core .IOUtilsBridge ;
25
+ import org .elasticsearch .logstashbridge .env .EnvironmentBridge ;
26
+ import org .elasticsearch .logstashbridge .ingest .ProcessorBridge ;
27
+ import org .elasticsearch .logstashbridge .plugins .IngestPluginBridge ;
28
+ import org .elasticsearch .logstashbridge .script .ScriptServiceBridge ;
29
+ import org .elasticsearch .logstashbridge .threadpool .ThreadPoolBridge ;
49
30
50
31
import java .io .Closeable ;
51
- import java .io .IOException ;
52
32
import java .time .Duration ;
53
33
import java .util .ArrayList ;
54
- import java .util .HashMap ;
55
34
import java .util .List ;
56
35
import java .util .Map ;
57
36
import java .util .Objects ;
@@ -91,7 +70,7 @@ public static EventProcessorBuilder fromElasticsearch(final RestClient elasticse
91
70
}
92
71
93
72
public EventProcessorBuilder () {
94
- this .addProcessorsFromPlugin (IngestCommonPlugin :: new , Set .of (
73
+ this .addProcessorsFromPlugin (() -> IngestPluginBridge . wrap ( new org . elasticsearch . ingest . common . IngestCommonPlugin ()) , Set .of (
95
74
org .elasticsearch .ingest .common .AppendProcessor .TYPE ,
96
75
org .elasticsearch .ingest .common .BytesProcessor .TYPE ,
97
76
org .elasticsearch .ingest .common .CommunityIdProcessor .TYPE ,
@@ -126,7 +105,7 @@ public EventProcessorBuilder() {
126
105
org .elasticsearch .ingest .common .URLDecodeProcessor .TYPE ,
127
106
org .elasticsearch .ingest .common .UppercaseProcessor .TYPE ,
128
107
org .elasticsearch .ingest .common .UriPartsProcessor .TYPE ));
129
- this .addProcessorsFromPlugin (IngestUserAgentPlugin :: new );
108
+ this .addProcessorsFromPlugin (() -> IngestPluginBridge . wrap ( new org . elasticsearch . ingest . useragent . IngestUserAgentPlugin ()) );
130
109
this .addProcessorsFromPlugin (RedactPlugin ::new );
131
110
this .addProcessor (SetSecurityUserProcessor .TYPE , SetSecurityUserProcessor .Factory ::new );
132
111
}
@@ -149,7 +128,7 @@ public EventProcessorBuilder() {
149
128
// filer match listener
150
129
private FilterMatchListener filterMatchListener ;
151
130
152
- private final List <Supplier <IngestPlugin >> ingestPlugins = new ArrayList <>();
131
+ private final List <Supplier <IngestPluginBridge >> ingestPlugins = new ArrayList <>();
153
132
154
133
public synchronized EventProcessorBuilder setPipelineConfigurationResolver (final PipelineConfigurationResolver pipelineConfigurationResolver ) {
155
134
if (Objects .nonNull (this .pipelineConfigurationResolver )) {
@@ -214,15 +193,15 @@ private synchronized EventProcessorBuilder setFilterMatchListener(final FilterMa
214
193
return this ;
215
194
}
216
195
217
- public EventProcessorBuilder addProcessor (final String type , final Supplier <Processor .Factory > processorFactorySupplier ) {
196
+ public EventProcessorBuilder addProcessor (final String type , final Supplier <ProcessorBridge .Factory > processorFactorySupplier ) {
218
197
return this .addProcessorsFromPlugin (SingleProcessorIngestPlugin .of (type , processorFactorySupplier ));
219
198
}
220
199
221
- public EventProcessorBuilder addProcessorsFromPlugin (Supplier <IngestPlugin > pluginSupplier , Set <String > requiredProcessors ) {
200
+ public EventProcessorBuilder addProcessorsFromPlugin (Supplier <IngestPluginBridge > pluginSupplier , Set <String > requiredProcessors ) {
222
201
return this .addProcessorsFromPlugin (safeSubset (pluginSupplier , requiredProcessors ));
223
202
}
224
203
225
- public synchronized EventProcessorBuilder addProcessorsFromPlugin (Supplier <IngestPlugin > pluginSupplier ) {
204
+ public synchronized EventProcessorBuilder addProcessorsFromPlugin (Supplier <IngestPluginBridge > pluginSupplier ) {
226
205
this .ingestPlugins .add (pluginSupplier );
227
206
return this ;
228
207
}
@@ -232,7 +211,7 @@ public synchronized EventProcessor build(final PluginContext pluginContext) {
232
211
Objects .requireNonNull (this .eventToIndexNameResolver , "event index name resolver is REQUIRED" );
233
212
Objects .requireNonNull (this .indexNameToPipelineNameResolver , "pipeline name resolver is REQUIRED" );
234
213
235
- final Settings settings = Settings .builder ()
214
+ final SettingsBridge settings = SettingsBridge .builder ()
236
215
.put ("path.home" , "/" )
237
216
.put ("node.name" , "logstash.filter.elastic_integration." + pluginContext .pluginId ())
238
217
.put ("ingest.grok.watchdog.interval" , "1s" )
@@ -244,33 +223,22 @@ public synchronized EventProcessor build(final PluginContext pluginContext) {
244
223
try {
245
224
final ArrayList <Service > services = new ArrayList <>();
246
225
247
- final ThreadPool threadPool = LogstashInternalBridge . createThreadPool (settings );
248
- resourcesToClose .add (() -> ThreadPool .terminate (threadPool , 10 , TimeUnit .SECONDS ));
226
+ final ThreadPoolBridge threadPool = new ThreadPoolBridge (settings );
227
+ resourcesToClose .add (() -> ThreadPoolBridge .terminate (threadPool , 10 , TimeUnit .SECONDS ));
249
228
250
- final ScriptService scriptService = initScriptService (settings , threadPool );
229
+ final ScriptServiceBridge scriptService = new ScriptServiceBridge (settings , threadPool :: absoluteTimeInMillis );
251
230
resourcesToClose .add (scriptService );
252
231
253
- final Environment env = new Environment (settings , null );
254
- final Processor .Parameters processorParameters = new Processor .Parameters (
255
- env ,
256
- scriptService ,
257
- null ,
258
- threadPool .getThreadContext (),
259
- threadPool ::relativeTimeInMillis ,
260
- (delay , command ) -> threadPool .schedule (command , TimeValue .timeValueMillis (delay ), threadPool .generic ()),
261
- null ,
262
- null ,
263
- threadPool .generic ()::execute ,
264
- IngestService .createGrokThreadWatchdog (env , threadPool )
265
- );
232
+ final EnvironmentBridge env = new EnvironmentBridge (settings , null );
233
+ final ProcessorBridge .Parameters processorParameters = new ProcessorBridge .Parameters (env , scriptService , threadPool );
266
234
267
235
IngestPipelineFactory ingestPipelineFactory = new IngestPipelineFactory (scriptService );
268
- for (Supplier <IngestPlugin > ingestPluginSupplier : ingestPlugins ) {
269
- final IngestPlugin ingestPlugin = ingestPluginSupplier .get ();
236
+ for (Supplier <IngestPluginBridge > ingestPluginSupplier : ingestPlugins ) {
237
+ final IngestPluginBridge ingestPlugin = ingestPluginSupplier .get ();
270
238
if (ingestPlugin instanceof Closeable closeableIngestPlugin ) {
271
239
resourcesToClose .add (closeableIngestPlugin );
272
240
}
273
- final Map <String , Processor .Factory > processorFactories = ingestPlugin .getProcessors (processorParameters );
241
+ final Map <String , ProcessorBridge .Factory > processorFactories = ingestPlugin .getProcessors (processorParameters );
274
242
ingestPipelineFactory = ingestPipelineFactory .withProcessors (processorFactories );
275
243
}
276
244
@@ -308,47 +276,8 @@ public synchronized EventProcessor build(final PluginContext pluginContext) {
308
276
indexNameToPipelineNameResolver ,
309
277
resourcesToClose );
310
278
} catch (Exception e ) {
311
- IOUtils .closeWhileHandlingException (resourcesToClose );
279
+ IOUtilsBridge .closeWhileHandlingException (resourcesToClose );
312
280
throw Exceptions .wrap (e , "Failed to build EventProcessor" );
313
281
}
314
282
}
315
-
316
- private static ScriptService initScriptService (final Settings settings , final ThreadPool threadPool ) throws IOException {
317
- Map <String , ScriptEngine > engines = new HashMap <>();
318
- engines .put (PainlessScriptEngine .NAME , getPainlessScriptEngine (settings ));
319
- engines .put (MustacheScriptEngine .NAME , new MustacheScriptEngine (settings ));
320
- return new ScriptService (settings , engines , ScriptModule .CORE_CONTEXTS , threadPool ::absoluteTimeInMillis );
321
- }
322
-
323
- /**
324
- * @param settings the Elasticsearch settings object
325
- * @return a {@link ScriptEngine} for painless scripts for use in {@link IngestScript} and
326
- * {@link IngestConditionalScript} contexts, including all available {@link PainlessExtension}s.
327
- * @throws IOException when the underlying script engine cannot be created
328
- */
329
- private static ScriptEngine getPainlessScriptEngine (final Settings settings ) throws IOException {
330
- try (final PainlessPlugin painlessPlugin = new PainlessPlugin ()) {
331
-
332
- painlessPlugin .loadExtensions (new ExtensiblePlugin .ExtensionLoader () {
333
- @ Override
334
- @ SuppressWarnings ("unchecked" )
335
- public <T > List <T > loadExtensions (Class <T > extensionPointType ) {
336
- if (extensionPointType .isAssignableFrom (PainlessExtension .class )) {
337
- final List <PainlessExtension > extensions = new ArrayList <>();
338
-
339
- extensions .add (new ConstantKeywordPainlessExtension ()); // module: constant-keyword
340
- extensions .add (new ProcessorsWhitelistExtension ()); // module: ingest-common
341
- extensions .add (new SpatialPainlessExtension ()); // module: spatial
342
- extensions .add (new WildcardPainlessExtension ()); // module: wildcard
343
-
344
- return (List <T >) extensions ;
345
- } else {
346
- return List .of ();
347
- }
348
- }
349
- });
350
-
351
- return painlessPlugin .getScriptEngine (settings , Set .of (IngestScript .CONTEXT , IngestConditionalScript .CONTEXT ));
352
- }
353
- }
354
283
}
0 commit comments