Enhancing the `logs-*-*` index template with a default ingest pipeline that is first doing a pre-flight check if the `message` field might be JSON and then uses the JSON processor to decode the JSON and merge it top-level with the document.

See also this prototype: https://gist.github.com/felixbarny/a9a2f6243153d5508643fd95ac968a88#file-routing-yml-L114-L174

Open questions and things to consider
* How do users opt-out of default JSON parsing? They could override the index template. Maybe that's good enough.
* Similarly to the logs@custom component template, should we call out to a custom index pipeline? Align with naming in Fleet.
x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistryTests.java
ActionListener<?> listener
    ) {
        assertThat(action, instanceOf(PutComponentTemplateAction.class));
        assertThat(request, instanceOf(PutComponentTemplateAction.Request.class));
        final PutComponentTemplateAction.Request putRequest = (PutComponentTemplateAction.Request) request;
        assertThat(putRequest.name(), equalTo("custom-plugin-settings"));
        ComponentTemplate componentTemplate = putRequest.componentTemplate();
        assertThat(componentTemplate.template().settings().get("index.default_pipeline"), equalTo("custom-plugin-default_pipeline"));
        assertThat(componentTemplate.metadata().get("description"), equalTo("settings for my application logs"));
        assertNotNull(listener);
        calledTimes.incrementAndGet();
    }
    private static void assertPutComposableIndexTemplateAction(
        AtomicInteger calledTimes,
        ActionType<?> action,
        ActionRequest request,
        ActionListener<?> listener
    ) {
        assertThat(request, instanceOf(PutComposableIndexTemplateAction.Request.class));
        PutComposableIndexTemplateAction.Request putComposableTemplateRequest = (PutComposableIndexTemplateAction.Request) request;
        assertThat(putComposableTemplateRequest.name(), equalTo("custom-plugin-template"));
        ComposableIndexTemplate composableIndexTemplate = putComposableTemplateRequest.indexTemplate();
        assertThat(composableIndexTemplate.composedOf(), hasSize(2));
        assertThat(composableIndexTemplate.composedOf().get(0), equalTo("custom-plugin-settings"));
        assertThat(composableIndexTemplate.composedOf().get(1), equalTo("syslog@custom"));
        assertThat(composableIndexTemplate.getIgnoreMissingComponentTemplates(), hasSize(1));
        assertThat(composableIndexTemplate.getIgnoreMissingComponentTemplates().get(0), equalTo("syslog@custom"));
        assertNotNull(listener);
        calledTimes.incrementAndGet();
    }