[ 
https://issues.apache.org/jira/browse/FLINK-40592?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Weicheng Ji updated FLINK-40592:
--------------------------------
     Attachment: java11-reproduction.txt
    Description: 
h3. Problem

With the published Flink 2.3.0 Prometheus reporter JAR on Java 11, 17 and 21, 
configuring both username and password causes {{PrometheusPushGatewayReporter}} 
construction to fail with {{NoClassDefFoundError: 
javax/xml/bind/DatatypeConverter}} when JAXB is not on the classpath. The same 
factory call without credentials succeeds.

h3. Environment and version scope

* Original reproduction: Ubuntu 24.04.4 LTS under WSL 2, x86_64; OpenJDK 
17.0.20.
* Independent reproduction: macOS 26.0 arm64; JetBrains Runtime / JDK 21.0.8.
* Additional independent reproduction: macOS 26.0 arm64; OpenJDK 11.0.28 
(Homebrew).
* Published Flink 2.3.0 artifacts and SLF4J, using the six pinned JARs listed 
in the attachment's {{SHA256SUMS}}, without additional JAXB libraries.

The authentication path was introduced by FLINK-27661 / [PR 
#27576|https://github.com/apache/flink/pull/27576] for 2.3.0. Source inspection 
also found it on release-2.3 and master (2.4-SNAPSHOT); release-2.2.0 does not 
contain this path. Runtime reproduction was performed on 2.3.0 only.

These checks call the reporter factory directly. A full Flink distribution or 
cluster has not been tested.

h3. Reproduction

On Linux/WSL, extract {{flink-pushgateway-reproducer.zip}} and run {{bash 
run.sh}} with JDK 17, Bash, curl, sha256sum, and access to Maven Central. The 
script downloads and verifies the six pinned artifacts, then compiles and runs 
the following source. No running Pushgateway is required: the authenticated 
case fails during construction, before an HTTP request.

{code:java}
import org.apache.flink.metrics.MetricConfig;
import org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory;

public class ReporterRepro {
    public static void main(String[] args) throws Exception {
        MetricConfig config = new MetricConfig();
        config.setProperty("hostUrl", "http://127.0.0.1:9091";);
        config.setProperty("deleteOnShutdown", "false");
        PrometheusPushGatewayReporterFactory factory = new 
PrometheusPushGatewayReporterFactory();
        factory.createMetricReporter(config).close();
        System.out.println("PASS: reporter without credentials initializes and 
closes");
        config.setProperty("username", "test-user");
        config.setProperty("password", "test-password");
        System.out.println("Creating reporter with credentials...");
        factory.createMetricReporter(config).close();
        System.out.println("PASS: reporter with credentials initializes and 
closes");
    }
}
{code}

The README includes the explicit classpath commands. The ZIP contains the 
original Java 17 logs and independent Java 21 logs; the Java 21 check used 
direct javac/java commands. Java 11 was reproduced with the same source and six 
checksum-verified artifacts using direct javac/java commands. Its environment 
and full output are in {{java11-reproduction.txt}}.

h3. Expected and actual behavior

Expected: initialization succeeds with or without credentials, without 
requiring an additional JAXB dependency solely for Base64 encoding.

Actual: the unauthenticated control succeeds; the authenticated call throws the 
following error (excerpt from the Java 17 output):

{code:none}
PASS: reporter without credentials initializes and closes
Creating reporter with credentials...
Exception in thread "main" java.lang.NoClassDefFoundError: 
javax/xml/bind/DatatypeConverter
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.encode(BasicAuthHttpConnectionFactory.java:31)
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:14)
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:18)
    at 
org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter.<init>(PrometheusPushGatewayReporter.java:60)
    at 
org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory.createMetricReporter(PrometheusPushGatewayReporterFactory.java:86)
    at ReporterRepro.main(ReporterRepro.java:15)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
{code}

The Java process exits with code 1. The wrapper script exits with code 0 when 
it confirms this known failure. Full output is included in the attachment.

h3. Root cause and proposed approach

The reporter constructs simpleclient's {{BasicAuthHttpConnectionFactory}} when 
both credentials are present. The [Flink module 
POM|https://github.com/apache/flink/blob/release-2.3.0/flink-metrics/flink-metrics-prometheus/pom.xml]
 uses Prometheus 0.8.1; in that version, 
[BasicAuthHttpConnectionFactory|https://github.com/prometheus/client_java/blob/parent-0.8.1/simpleclient_pushgateway/src/main/java/io/prometheus/client/exporter/BasicAuthHttpConnectionFactory.java]
 calls JAXB's {{DatatypeConverter.printBase64Binary}} from its constructor. 
JAXB was removed from the JDK in Java 11 ([JEP 
320|https://openjdk.org/jeps/320]).

One possible fix is an internal {{HttpConnectionFactory}} using 
{{java.util.Base64}} and UTF-8 to set the Basic Authorization header while 
preserving existing connection and credential configuration behavior. This 
would avoid adding JAXB solely for Base64 encoding. I am open to the approach 
preferred by maintainers.

AI assistance: OpenAI Codex assisted with the investigation, reproducer, 
candidate fix and tests, and this report.


  was:
h3. Problem

With the published Flink 2.3.0 Prometheus reporter JAR on Java 17 and 21, 
configuring both username and password causes {{PrometheusPushGatewayReporter}} 
construction to fail with {{NoClassDefFoundError: 
javax/xml/bind/DatatypeConverter}} when JAXB is not on the classpath. The same 
factory call without credentials succeeds.

h3. Environment and version scope

* Original reproduction: Ubuntu 24.04.4 LTS under WSL 2, x86_64; OpenJDK 
17.0.20.
* Independent reproduction: macOS 26.0 arm64; JetBrains Runtime / JDK 21.0.8.
* Published Flink 2.3.0 artifacts and SLF4J, using the six pinned JARs listed 
in the attachment's {{SHA256SUMS}}, without additional JAXB libraries.

The authentication path was introduced by FLINK-27661 / [PR 
#27576|https://github.com/apache/flink/pull/27576] for 2.3.0. Source inspection 
also found it on release-2.3 and master (2.4-SNAPSHOT); release-2.2.0 does not 
contain this path. Runtime reproduction was performed on 2.3.0 only.

These checks call the reporter factory directly. A full Flink distribution or 
cluster has not been tested.

h3. Reproduction

On Linux/WSL, extract {{flink-pushgateway-reproducer.zip}} and run {{bash 
run.sh}} with JDK 17, Bash, curl, sha256sum, and access to Maven Central. The 
script downloads and verifies the six pinned artifacts, then compiles and runs 
the following source. No running Pushgateway is required: the authenticated 
case fails during construction, before an HTTP request.

{code:java}
import org.apache.flink.metrics.MetricConfig;
import org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory;

public class ReporterRepro {
    public static void main(String[] args) throws Exception {
        MetricConfig config = new MetricConfig();
        config.setProperty("hostUrl", "http://127.0.0.1:9091";);
        config.setProperty("deleteOnShutdown", "false");
        PrometheusPushGatewayReporterFactory factory = new 
PrometheusPushGatewayReporterFactory();
        factory.createMetricReporter(config).close();
        System.out.println("PASS: reporter without credentials initializes and 
closes");
        config.setProperty("username", "test-user");
        config.setProperty("password", "test-password");
        System.out.println("Creating reporter with credentials...");
        factory.createMetricReporter(config).close();
        System.out.println("PASS: reporter with credentials initializes and 
closes");
    }
}
{code}

The README includes the explicit classpath commands. The attachment contains 
the original Java 17 logs and independent Java 21 logs; the Java 21 check used 
direct javac/java commands.

h3. Expected and actual behavior

Expected: initialization succeeds with or without credentials, without 
requiring an additional JAXB dependency solely for Base64 encoding.

Actual: the unauthenticated control succeeds; the authenticated call throws the 
following error (excerpt from the Java 17 output):

{code:none}
PASS: reporter without credentials initializes and closes
Creating reporter with credentials...
Exception in thread "main" java.lang.NoClassDefFoundError: 
javax/xml/bind/DatatypeConverter
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.encode(BasicAuthHttpConnectionFactory.java:31)
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:14)
    at 
io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:18)
    at 
org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter.<init>(PrometheusPushGatewayReporter.java:60)
    at 
org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory.createMetricReporter(PrometheusPushGatewayReporterFactory.java:86)
    at ReporterRepro.main(ReporterRepro.java:15)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
{code}

The Java process exits with code 1. The wrapper script exits with code 0 when 
it confirms this known failure. Full output is included in the attachment.

h3. Root cause and proposed approach

The reporter constructs simpleclient's {{BasicAuthHttpConnectionFactory}} when 
both credentials are present. The [Flink module 
POM|https://github.com/apache/flink/blob/release-2.3.0/flink-metrics/flink-metrics-prometheus/pom.xml]
 uses Prometheus 0.8.1; in that version, 
[BasicAuthHttpConnectionFactory|https://github.com/prometheus/client_java/blob/parent-0.8.1/simpleclient_pushgateway/src/main/java/io/prometheus/client/exporter/BasicAuthHttpConnectionFactory.java]
 calls JAXB's {{DatatypeConverter.printBase64Binary}} from its constructor. 
JAXB was removed from the JDK in Java 11 ([JEP 
320|https://openjdk.org/jeps/320]).

One possible fix is an internal {{HttpConnectionFactory}} using 
{{java.util.Base64}} and UTF-8 to set the Basic Authorization header while 
preserving existing connection and credential configuration behavior. This 
would avoid adding JAXB solely for Base64 encoding. I am open to the approach 
preferred by maintainers.

AI assistance: OpenAI Codex assisted with the investigation, reproducer, 
candidate fix and tests, and this report.


    Environment: Original reproduction: Ubuntu 24.04.4 LTS under WSL 2, x86_64; 
OpenJDK 17.0.20. Independent reproductions: macOS 26.0 arm64; OpenJDK 11.0.28 
(Homebrew) and JetBrains Runtime / JDK 21.0.8. All reproductions use published 
Flink 2.3.0 artifacts from Maven Central and an explicit classpath of six 
checksum-verified JARs without JAXB. Direct reporter factory reproduction; no 
full Flink cluster test.  (was: Original reproduction: Ubuntu 24.04.4 LTS under 
WSL 2, x86_64; OpenJDK 17.0.20. Independent reproduction: macOS 26.0 arm64; 
JetBrains Runtime / JDK 21.0.8. Both use published Flink 2.3.0 artifacts from 
Maven Central and an explicit classpath of six checksum-verified JARs without 
JAXB. Direct reporter factory reproduction; no full Flink cluster test.)
        Summary: PrometheusPushGatewayReporter fails to initialize with basic 
authentication  (was: PrometheusPushGatewayReporter fails to initialize with 
basic authentication on Java 17 and 21)

> PrometheusPushGatewayReporter fails to initialize with basic authentication
> ---------------------------------------------------------------------------
>
>                 Key: FLINK-40592
>                 URL: https://issues.apache.org/jira/browse/FLINK-40592
>             Project: Flink
>          Issue Type: Bug
>          Components: Runtime / Metrics
>    Affects Versions: 2.3.0
>         Environment: Original reproduction: Ubuntu 24.04.4 LTS under WSL 2, 
> x86_64; OpenJDK 17.0.20. Independent reproductions: macOS 26.0 arm64; OpenJDK 
> 11.0.28 (Homebrew) and JetBrains Runtime / JDK 21.0.8. All reproductions use 
> published Flink 2.3.0 artifacts from Maven Central and an explicit classpath 
> of six checksum-verified JARs without JAXB. Direct reporter factory 
> reproduction; no full Flink cluster test.
>            Reporter: Weicheng Ji
>            Priority: Major
>         Attachments: flink-pushgateway-reproducer.zip, java11-reproduction.txt
>
>
> h3. Problem
> With the published Flink 2.3.0 Prometheus reporter JAR on Java 11, 17 and 21, 
> configuring both username and password causes 
> {{PrometheusPushGatewayReporter}} construction to fail with 
> {{NoClassDefFoundError: javax/xml/bind/DatatypeConverter}} when JAXB is not 
> on the classpath. The same factory call without credentials succeeds.
> h3. Environment and version scope
> * Original reproduction: Ubuntu 24.04.4 LTS under WSL 2, x86_64; OpenJDK 
> 17.0.20.
> * Independent reproduction: macOS 26.0 arm64; JetBrains Runtime / JDK 21.0.8.
> * Additional independent reproduction: macOS 26.0 arm64; OpenJDK 11.0.28 
> (Homebrew).
> * Published Flink 2.3.0 artifacts and SLF4J, using the six pinned JARs listed 
> in the attachment's {{SHA256SUMS}}, without additional JAXB libraries.
> The authentication path was introduced by FLINK-27661 / [PR 
> #27576|https://github.com/apache/flink/pull/27576] for 2.3.0. Source 
> inspection also found it on release-2.3 and master (2.4-SNAPSHOT); 
> release-2.2.0 does not contain this path. Runtime reproduction was performed 
> on 2.3.0 only.
> These checks call the reporter factory directly. A full Flink distribution or 
> cluster has not been tested.
> h3. Reproduction
> On Linux/WSL, extract {{flink-pushgateway-reproducer.zip}} and run {{bash 
> run.sh}} with JDK 17, Bash, curl, sha256sum, and access to Maven Central. The 
> script downloads and verifies the six pinned artifacts, then compiles and 
> runs the following source. No running Pushgateway is required: the 
> authenticated case fails during construction, before an HTTP request.
> {code:java}
> import org.apache.flink.metrics.MetricConfig;
> import 
> org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory;
> public class ReporterRepro {
>     public static void main(String[] args) throws Exception {
>         MetricConfig config = new MetricConfig();
>         config.setProperty("hostUrl", "http://127.0.0.1:9091";);
>         config.setProperty("deleteOnShutdown", "false");
>         PrometheusPushGatewayReporterFactory factory = new 
> PrometheusPushGatewayReporterFactory();
>         factory.createMetricReporter(config).close();
>         System.out.println("PASS: reporter without credentials initializes 
> and closes");
>         config.setProperty("username", "test-user");
>         config.setProperty("password", "test-password");
>         System.out.println("Creating reporter with credentials...");
>         factory.createMetricReporter(config).close();
>         System.out.println("PASS: reporter with credentials initializes and 
> closes");
>     }
> }
> {code}
> The README includes the explicit classpath commands. The ZIP contains the 
> original Java 17 logs and independent Java 21 logs; the Java 21 check used 
> direct javac/java commands. Java 11 was reproduced with the same source and 
> six checksum-verified artifacts using direct javac/java commands. Its 
> environment and full output are in {{java11-reproduction.txt}}.
> h3. Expected and actual behavior
> Expected: initialization succeeds with or without credentials, without 
> requiring an additional JAXB dependency solely for Base64 encoding.
> Actual: the unauthenticated control succeeds; the authenticated call throws 
> the following error (excerpt from the Java 17 output):
> {code:none}
> PASS: reporter without credentials initializes and closes
> Creating reporter with credentials...
> Exception in thread "main" java.lang.NoClassDefFoundError: 
> javax/xml/bind/DatatypeConverter
>     at 
> io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.encode(BasicAuthHttpConnectionFactory.java:31)
>     at 
> io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:14)
>     at 
> io.prometheus.client.exporter.BasicAuthHttpConnectionFactory.<init>(BasicAuthHttpConnectionFactory.java:18)
>     at 
> org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter.<init>(PrometheusPushGatewayReporter.java:60)
>     at 
> org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory.createMetricReporter(PrometheusPushGatewayReporterFactory.java:86)
>     at ReporterRepro.main(ReporterRepro.java:15)
> Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
> {code}
> The Java process exits with code 1. The wrapper script exits with code 0 when 
> it confirms this known failure. Full output is included in the attachment.
> h3. Root cause and proposed approach
> The reporter constructs simpleclient's {{BasicAuthHttpConnectionFactory}} 
> when both credentials are present. The [Flink module 
> POM|https://github.com/apache/flink/blob/release-2.3.0/flink-metrics/flink-metrics-prometheus/pom.xml]
>  uses Prometheus 0.8.1; in that version, 
> [BasicAuthHttpConnectionFactory|https://github.com/prometheus/client_java/blob/parent-0.8.1/simpleclient_pushgateway/src/main/java/io/prometheus/client/exporter/BasicAuthHttpConnectionFactory.java]
>  calls JAXB's {{DatatypeConverter.printBase64Binary}} from its constructor. 
> JAXB was removed from the JDK in Java 11 ([JEP 
> 320|https://openjdk.org/jeps/320]).
> One possible fix is an internal {{HttpConnectionFactory}} using 
> {{java.util.Base64}} and UTF-8 to set the Basic Authorization header while 
> preserving existing connection and credential configuration behavior. This 
> would avoid adding JAXB solely for Base64 encoding. I am open to the approach 
> preferred by maintainers.
> AI assistance: OpenAI Codex assisted with the investigation, reproducer, 
> candidate fix and tests, and this report.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to