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
|
1 Answer
Reset to default 0To 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
software.amazon.cloudwatchlogs.emf.model
(methods, declared fields and enum constants) for reflection? SpeciallyRootNode
,Metadata
,MetricDefinition
,Unit
andStorageResolution
. – dan1st Commented Mar 30 at 8:28