最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

java - Difference of behavior between JVM and Native builds in Quarkus - Stack Overflow

programmeradmin2浏览0评论

I'm trying to log CloudWatch metrics to stdout. I setup the relevant code, and when testing in dev, the logs are as expected.

Here is the relevant code -

public class MetricsService {
    MetricsLogger metricsLogger;

    public MetricsService() {
        var namespace = ConfigProvider.getConfig()
                .getOptionalValue("aws.emf.namespace", String.class)
                .orElse("OceanAnalytics");
        this.metricsLogger = new MetricsLogger().setNamespace(namespace);
    }
}

I then proceed to build the images, one for JVM and one for Native. The amazon-lambda extension is being used. And I'm using the following commands For jvm -

./mvnw clean package

For native -

./mvnw clean package -Dnative=true

When I run the app using the provide SAM template, the JVM one produces the expected logs. However, the Native one always logs an empty object as {}.

I tried adding the MetricsService to --initialize-at-run-time=my.package.MetricsService for the Native Image build args, but to no success.

Any ideas what may be going wrong? I really can't figure it out and it hurts observability a lot.

My pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=";
         xsi:schemaLocation=".0.0 .0.0.xsd">
    <properties>
        <compiler-plugin.version>3.13.0</compiler-plugin.version>
        <mavenpiler.release>17</mavenpiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.18.3</quarkus.platform.version>
        <aws.sdk.version>2.29.45</aws.sdk.version>
        <embedded.metrics.version>4.2.0</embedded.metrics.version>
        <lombok.version>1.18.34</lombok.version>
        <surefire-plugin.version>3.5.2</surefire-plugin.version>
        <skipITs>true</skipITs>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${aws.sdk.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-amazon-lambda-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-jackson</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest-jackson</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-reactive-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-reactive-pg-client</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>secretsmanager</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>software.amazon.awssdk</groupId>
                    <artifactId>apache-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>url-connection-client</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.cloudwatchlogs</groupId>
            <artifactId>aws-embedded-metrics</artifactId>
            <version>${embedded.metrics.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                            <goal>native-image-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner
                        </native.image.path>
                        <java.util.logging.manager>.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.diffplug.spotless</groupId>
                <artifactId>spotless-maven-plugin</artifactId>
                <version>2.43.0</version>
                <configuration>
                    <java>
                        <palantirJavaFormat>
                            <version>2.39.0</version>
                            <style>PALANTIR</style>
                        </palantirJavaFormat>
                    </java>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties>
                <skipITs>false</skipITs>
                <quarkus.native.enabled>true</quarkus.native.enabled>
            </properties>
        </profile>
    </profiles>
</project>

I'm trying to log CloudWatch metrics to stdout. I setup the relevant code, and when testing in dev, the logs are as expected.

Here is the relevant code -

public class MetricsService {
    MetricsLogger metricsLogger;

    public MetricsService() {
        var namespace = ConfigProvider.getConfig()
                .getOptionalValue("aws.emf.namespace", String.class)
                .orElse("OceanAnalytics");
        this.metricsLogger = new MetricsLogger().setNamespace(namespace);
    }
}

I then proceed to build the images, one for JVM and one for Native. The amazon-lambda extension is being used. And I'm using the following commands For jvm -

./mvnw clean package

For native -

./mvnw clean package -Dnative=true

When I run the app using the provide SAM template, the JVM one produces the expected logs. However, the Native one always logs an empty object as {}.

I tried adding the MetricsService to --initialize-at-run-time=my.package.MetricsService for the Native Image build args, but to no success.

Any ideas what may be going wrong? I really can't figure it out and it hurts observability a lot.

My pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache./POM/4.0.0" xmlns:xsi="http://www.w3./2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache./POM/4.0.0 https://maven.apache./xsd/maven-4.0.0.xsd">
    <properties>
        <compiler-plugin.version>3.13.0</compiler-plugin.version>
        <mavenpiler.release>17</mavenpiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.18.3</quarkus.platform.version>
        <aws.sdk.version>2.29.45</aws.sdk.version>
        <embedded.metrics.version>4.2.0</embedded.metrics.version>
        <lombok.version>1.18.34</lombok.version>
        <surefire-plugin.version>3.5.2</surefire-plugin.version>
        <skipITs>true</skipITs>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${aws.sdk.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-amazon-lambda-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-jackson</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest-jackson</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-reactive-panache</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-reactive-pg-client</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>secretsmanager</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>software.amazon.awssdk</groupId>
                    <artifactId>apache-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>url-connection-client</artifactId>
        </dependency>
        <dependency>
            <groupId>software.amazon.cloudwatchlogs</groupId>
            <artifactId>aws-embedded-metrics</artifactId>
            <version>${embedded.metrics.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                            <goal>native-image-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <java.util.logging.manager>.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <systemPropertyVariables>
                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner
                        </native.image.path>
                        <java.util.logging.manager>.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.diffplug.spotless</groupId>
                <artifactId>spotless-maven-plugin</artifactId>
                <version>2.43.0</version>
                <configuration>
                    <java>
                        <palantirJavaFormat>
                            <version>2.39.0</version>
                            <style>PALANTIR</style>
                        </palantirJavaFormat>
                    </java>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <properties>
                <skipITs>false</skipITs>
                <quarkus.native.enabled>true</quarkus.native.enabled>
            </properties>
        </profile>
    </profiles>
</project>
Share Improve this question edited Mar 30 at 8:06 Karan Ahlawat asked Mar 29 at 19:07 Karan AhlawatKaran Ahlawat 213 bronze badges 4
  • Can you show your pom.xml? – dan1st Commented Mar 30 at 7:55
  • @dan1st Updated with pom – Karan Ahlawat Commented Mar 30 at 8:07
  • Can you try registering the classes in software.amazon.cloudwatchlogs.emf.model (methods, declared fields and enum constants) for reflection? Specially RootNode, Metadata, MetricDefinition, Unit and StorageResolution. – dan1st Commented Mar 30 at 8:28
  • Okay that worked. I'll create a proper answer crediting you. – Karan Ahlawat Commented Mar 30 at 15:04
Add a comment  | 

1 Answer 1

Reset to default 0

To solve this problem, you need to create a reflection-config.json file which has the following content

[
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.RootNode",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.Metadata",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.MetricDefinition",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.Unit",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.StorageResolution",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.DimensionSet",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.EmptyMetricsFilter",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.MetricDirective",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.model.MetricsContext",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.serializers.InstantSerializer",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.serializers.UnitSerializer",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.serializers.StorageResolutionSerializer",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  },
  {
    "name": "software.amazon.cloudwatchlogs.emf.serializers.StorageResolutionFilter",
    "allDeclaredConstructors":true,
    "allPublicConstructors":true,
    "allDeclaredMethods":true,
    "allPublicMethods":true,
    "allDeclaredFields":true,
    "allPublicFields":true
  }
]

Basically, all the classes in software.amazon.cloudwatchlogs.emf.model and all the classes except the deserializers software.amazon.cloudwatchlogs.emf.serializers

Then, provide the argument -H:ReflectionConfigurationFiles=reflection-config.json to the native-image command line

Answer courtesy of @dan1st

发布评论

评论列表(0)

  1. 暂无评论