codelibs / elasticsearch-cluster-runner

Elasticsearch Cluster Launcher on One JVM Instance
Other
66 stars 17 forks source link

cluster-runner 7.16.3 causes NPE, can't find plugin #47

Open bunchrt opened 2 years ago

bunchrt commented 2 years ago

2022-02-17 15:18:50,152 SUITE-MyTest-seed#[66F66F576B5EB0AF] ERROR Unable to locate plugin type for HeaderWarningAppender 2022-02-17 15:18:50,200 SUITE-MyTest-seed#[66F66F576B5EB0AF] ERROR Unable to locate plugin for HeaderWarningAppender 2022-02-17 15:18:50,200 SUITE-MyTest-seed#[66F66F576B5EB0AF] ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.config.AppendersPlugin for element Appenders: java.lang.NullPointerException java.lang.NullPointerException at org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor.visit(PluginElementVisitor.java:52) at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.generateParameters(PluginBuilder.java:262) at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135) at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1120) at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1045) at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:651) at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:247) at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:293) at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:626) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:699) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:716) at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:270) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599) at com.av.harness.elasticsearch.AbstractElasticsearchTestHarness.(AbstractElasticsearchTestHarness.java:46) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:623)

2022-02-17 15:18:50,201 SUITE-MyTest-seed#[66F66F576B5EB0AF] ERROR Unable to locate appender "console" for logger config "root" 2022-02-17 15:18:50,201 SUITE-MyTest-seed#[66F66F576B5EB0AF] ERROR Unable to locate appender "header_warning" for logger config "org.elasticsearch.deprecation"

this is new behavior after changing from cluster runner 7.8.0 to 7.16.3.

marevol commented 2 years ago

Could you provide info to reproduce it?

bunchrt commented 2 years ago

` for i in $(find . -type f | egrep -v '.idea/|.iml|.DS_Store'); do printf "\n\n ~[ %s ]~~~~ \n\n" $i; cat $i; done



<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.my</groupId>
    <artifactId>my-elasticsearch-testharness</artifactId>
    <version>2.2</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

<!--        <elasticsearch.version>7.8.0</elasticsearch.version>-->
<!--        <embedded-es.version>7.8.0</embedded-es.version>-->
<!--        <cluster-runner.version>7.8.0.0</cluster-runner.version>-->
        <elasticsearch.version>7.16.3</elasticsearch.version>
        <embedded-es.version>7.16.3</embedded-es.version>
        <cluster-runner.version>7.16.3.0</cluster-runner.version>
        <log4j2.version>2.17.1</log4j2.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.test</groupId>
            <artifactId>framework</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.codelibs</groupId>
            <artifactId>elasticsearch-cluster-runner</artifactId>
            <version>${cluster-runner.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
    </dependencies>
    <!--  added specifically for elasticsearch-cluster-runner > 7.10.0.0 -->
    <!--  REF https://github.com/codelibs/elasticsearch-cluster-runner/tree/elasticsearch-cluster-runner-7.16.3.0 -->
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo1.maven.org/maven2</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>codelibs.org</id>
            <name>CodeLibs Repository</name>
            <url>https://maven.codelibs.org/</url>
        </repository>
    </repositories>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.8.7</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        </plugins>
    </build>
</project>

 ~~~[ ./src/test/resources/log4j2-test.xml ]~~~~~~~~~~ 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${env:LOG_LEVEL:-ERROR}">
            <AppenderRef ref="Console"/>
        </Root>

        <Logger name="com.my" level="${env:MY_LOG_LEVEL:-TRACE}"/>
        <Logger name="com.carrotsearch" level="OFF"/>
        <Logger name="org.elasticsearch" level="WARN"/>
    </Loggers>
</Configuration>

 ~~~[ ./src/test/java/com/my/harness/elasticsearch/MyTest.java ]~~~~~~~~~~ 

package com.my.harness.elasticsearch;

import com.carrotsearch.randomizedtesting.RandomizedRunner;
import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
import junit.framework.TestSuite;
import org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner;
import org.elasticsearch.common.settings.Settings;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;

import static org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner.newConfigs;

@ThreadLeakScope(ThreadLeakScope.Scope.NONE)
@RunWith(RandomizedRunner.class)
public class MyTest extends TestSuite {

    public static final Integer BASE_ES_PORT = 41091;
    public static final String CLUSTER_NAME = "my_cluster";

    ElasticsearchClusterRunner runner = new ElasticsearchClusterRunner();

    @Before
    public void before() throws IOException {
        // create runner instance
        String clusterName = CLUSTER_NAME + "_" + System.currentTimeMillis();
        ElasticsearchClusterRunner.Builder builder = new ElasticsearchClusterRunner.Builder() {

            @Override
            public void build(int i, Settings.Builder settingsBuilder) {
                settingsBuilder.put("http.cors.enabled", true);
                settingsBuilder.put("http.cors.allow-origin", "*");
//                settingsBuilder.put("node.master", true);
//                settingsBuilder.put("node.data", true);
//                settingsBuilder.put("node.ingest", true);
//                settingsBuilder.putList("discovery.seed_hosts", "127.0.0.1:41091", "127.0.0.1:41092");
                settingsBuilder.put("cluster.initial_master_nodes", "127.0.0.1");
            }
        };
        runner.setMaxHttpPort(41099);
        runner.onBuild(builder).build(newConfigs().clusterName(clusterName).numOfNode(1).baseHttpPort(BASE_ES_PORT));
    }

    @Test
    public void test() {
        System.out.println("pause");
    }

    @After
    public void after() throws IOException {
        runner.close();
        runner.clean();
    }
}

`
bunchrt commented 2 years ago

difference between elasticsearch-7.16.3/config/log4j.properties (1st set) and your embedded log4j.properties (2nd set), for the block that appears relevant to the stack trace above (around the context of HeaderWarningAppender)

diff <(cat -n log4j2.properties | head -78 | tail -19) <(cat -n __elasticsearch-cluster-runner-7163-log4j2.properties | head -78 | tail -19)

x-opaque line not covered in cluster-runner log4j2.props (at least in this block) ESJsonLayout vs ECSJsonLayout (lines 64, at least in this block) data.set vs type_name (line 65/66, at least in this block)

  60        ######## Deprecation JSON #######################
  61        appender.deprecation_rolling.type = RollingFile
  62        appender.deprecation_rolling.name = deprecation_rolling
  63        appender.deprecation_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.json
  64        appender.deprecation_rolling.layout.type = ESJsonLayout
  65        appender.deprecation_rolling.layout.type_name = deprecation.elasticsearch
  66        appender.deprecation_rolling.layout.esmessagefields=x-opaque-id,key,category,elasticsearch.elastic_product_origin ### not represented in cluster-runner log4j2.props
  67        appender.deprecation_rolling.filter.rate_limit.type = RateLimitingFilter
  68
  69        appender.deprecation_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%i.json.gz
  70        appender.deprecation_rolling.policies.type = Policies
  71        appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy
  72        appender.deprecation_rolling.policies.size.size = 1GB
  73        appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy
  74        appender.deprecation_rolling.strategy.max = 4
  75
  76        appender.header_warning.type = HeaderWarningAppender
  77        appender.header_warning.name = header_warning
  78        #################################################

  60        ######## Deprecation JSON #######################
  61        appender.deprecation_rolling.type = RollingFile
  62        appender.deprecation_rolling.name = deprecation_rolling
  63        appender.deprecation_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.json
  64        appender.deprecation_rolling.layout.type = ECSJsonLayout  ### vs ESJsonLayout (no C)
  65        # Intentionally follows a different pattern to above
  66        appender.deprecation_rolling.layout.dataset = deprecation.elasticsearch  ### vs. type_name
  67        appender.deprecation_rolling.filter.rate_limit.type = RateLimitingFilter
  68
  69        appender.deprecation_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%i.json.gz
  70        appender.deprecation_rolling.policies.type = Policies
  71        appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy
  72        appender.deprecation_rolling.policies.size.size = 1GB
  73        appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy
  74        appender.deprecation_rolling.strategy.max = 4
  75
  76        appender.header_warning.type = HeaderWarningAppender
  77        appender.header_warning.name = header_warning
  78        #################################################