micronaut-gcp icon indicating copy to clipboard operation
micronaut-gcp copied to clipboard

Native image generation fails when adding a dependency with io.micronaut.gcp:micronaut-gcp-tracing

Open codependent opened this issue 4 years ago • 6 comments

Expected Behavior

A native image should be generated

Actual Behaviour

The following error is shown:

[application:29]     analysis:  53,123.08 ms,  4.90 GB
Error: Classes that should be initialized at run time got initialized during image building:
 io.grpc.netty.shaded.io.netty.handler.ssl.PemPrivateKey the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted). To see why io.grpc.netty.shaded.io.netty.handler.ssl.PemPrivateKey got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.handler.ssl.PemPrivateKey
io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf
io.grpc.netty.shaded.io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf
io.grpc.netty.shaded.io.netty.buffer.UnpooledDirectByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.UnpooledDirectByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.UnpooledDirectByteBuf
io.grpc.netty.shaded.io.netty.buffer.AbstractPooledDerivedByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.AbstractPooledDerivedByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.AbstractPooledDerivedByteBuf
io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil the class was requested to be initialized at run time (from jar:file:///home/app/libs/grpc-netty-shaded-1.39.0.jar!/META-INF/native-image/io.netty/buffer/native-image.properties with 'io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil'). To see why io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil
io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf the class was requested to be initialized at run time (from jar:file:///home/app/libs/grpc-netty-shaded-1.39.0.jar!/META-INF/native-image/io.netty/buffer/native-image.properties with 'io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf'). To see why io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf
io.grpc.netty.shaded.io.netty.handler.ssl.PemValue the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted). To see why io.grpc.netty.shaded.io.netty.handler.ssl.PemValue got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.handler.ssl.PemValue
io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted the class was requested to be initialized at run time (from jar:file:///home/app/libs/grpc-netty-shaded-1.39.0.jar!/META-INF/native-image/io.netty/common/native-image.properties with 'io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted'). To see why io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted
io.grpc.netty.shaded.io.netty.buffer.ByteBufAllocator the class was requested to be initialized at run time (from jar:file:///home/app/libs/grpc-netty-shaded-1.39.0.jar!/META-INF/native-image/io.netty/buffer/native-image.properties with 'io.grpc.netty.shaded.io.netty.buffer.ByteBufAllocator'). To see why io.grpc.netty.shaded.io.netty.buffer.ByteBufAllocator got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.ByteBufAllocator
io.grpc.netty.shaded.io.netty.buffer.PooledUnsafeDirectByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.PooledUnsafeDirectByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.PooledUnsafeDirectByteBuf
io.grpc.netty.shaded.io.netty.buffer.UnpooledUnsafeDirectByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.UnpooledUnsafeDirectByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.UnpooledUnsafeDirectByteBuf
io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator the class was requested to be initialized at run time (from jar:file:///home/app/libs/grpc-netty-shaded-1.39.0.jar!/META-INF/native-image/io.netty/buffer/native-image.properties with 'io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator'). To see why io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator
io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf the class was requested to be initialized at run time (subtype of io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf). To see why io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf got initialized use --trace-class-initialization=io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf

Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
[application:29]      [total]:  59,798.31 ms,  4.90 GB
# Printing build artifacts to: /home/app/application.build_artifacts.txt
Error: Image build request failed with exit status 1


> Task :dockerBuildNative FAILED

Steps To Reproduce

  1. Clone the repository from https://github.com/codependent/micro-tracing
  2. Run ./gradlew dockerBuildNative
  3. The error is shown in the logs
  4. Comment out this dependency: implementation("io.micronaut.gcp:micronaut-gcp-tracing")
  5. Run ./gradlew dockerBuildNative
  6. This time it works fine

Environment Information

MacOS Java 17 Temurin Buiding using Docker

Example Application

https://github.com/codependent/micro-tracing

Version

3.2.3

codependent avatar Dec 24 '21 12:12 codependent

I don't know how can make it with gradle but with maven when you add this two configuration you'll not have that problem.

  <profiles>
    <profile>
      <id>graalvm</id>
      <dependencies>
        <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>native-image-support</artifactId>
          <scope>compile</scope>
          <version>${native-image-support.version}</version>
        </dependency>
      </dependencies>
    </profile>
  </profiles>

<plugins>
 <build>
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        </configuration>
      </plugin>
    </plugins>
  </build>

glats avatar Mar 16 '22 20:03 glats

For the record. I'm seeing the same issue with the following versions:

micronaut-gcp: 3.4 graal-vm: 22.1.0 native-image-support: 0.12.11

I've tried with and without the native-image-support dependency for native image compilation. Including it just produces a different error.

The gradle dependency code:

nativeImageCompileOnly("com.google.cloud:native-image-support")

The graalvm output error:

Fatal error: org.graalvm.compiler.debug.GraalError: 
com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:
Detected a PlatformManagedObject (a MXBean defined by the virtual machine) in the image heap.
This bean is introspecting the VM that runs the image builder, i.e., a VM instance that is no longer available at image runtime.
Class of disallowed object: com.sun.management.internal.HotSpotDiagnostic
To see how this object got instantiated use --trace-object-instantiation=com.sun.management.internal.HotSpotDiagnostic.
The object was probably created by a class initializer and is reachable from a static field.
You can request class initialization at image runtime by using the option --initialize-at-run-time=<class-name>.
Or you can write your own initialization methods and call them explicitly from your main entry point.

snorremd avatar Jul 08 '22 11:07 snorremd

With graal-vm: 22.1.0, you need to the use the 0.14.1 version of GCP native-image-support.

shingjo avatar Jul 08 '22 13:07 shingjo

I upgraded the sample application to Micronaut Framework 4 .

io.micronaut.gcp:micronaut-gcp-tracing causes the following error:

Error: java.util.concurrent.ExecutionException: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of ch.qos.logback.core.status.InfoStatus are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use --trace-object-instantiation=ch.qos.logback.core.status.InfoStatus.
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception

@msupic could you look into this?

sdelamo avatar Aug 03 '23 09:08 sdelamo

@graemerocher - in the example created by @sdelamo, the dockerBuildNative task fails with the following error:

Error: java.util.concurrent.ExecutionException: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of ch.qos.logback.core.status.InfoStatus are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized by the io.grpc.netty.shaded.io.netty.channel.AbstractChannel class initializer with a trace: 
     at ch.qos.logback.core.status.InfoStatus.<init>(InfoStatus.java:18)
    at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:85)
    at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:77)
    at ch.qos.logback.classic.spi.LogbackServiceProvider.initializeLoggerContext(LogbackServiceProvider.java:52)
    at ch.qos.logback.classic.spi.LogbackServiceProvider.initialize(LogbackServiceProvider.java:41)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:183)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:170)
    at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:455)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:441)
    at io.grpc.netty.shaded.io.netty.util.internal.logging.Slf4JLoggerFactory.<init>(Slf4JLoggerFactory.java:42)

The error happens because micronaut-gcp-tracing has dependency on io.grpc:grpc-netty-shaded. In the shared metadata repository there is no metadata for grpc-netty-shaded that would override metadata from grpc-netty-shaded library like there is for io.netty libs. So to fix the issue, I guess we need to add metadata for io.grpc:grpc-netty-shaded that would override the library metadata. @graemerocher - your thoughts?

msupic avatar Aug 03 '23 14:08 msupic

I raised the topic of shading of netty a while back with Vojin, really the metadata is the same as for Netty so it is duplicated work every time netty is shaded

graemerocher avatar Aug 04 '23 09:08 graemerocher