Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

org.jolokia.server.core.service.impl.JulLogHandler is broken in the java agent. #631

Closed
fbacchella opened this issue Dec 20, 2023 · 9 comments
Assignees
Labels
Milestone

Comments

@fbacchella
Copy link

I configure the java agent to use org.jolokia.server.core.service.impl.JulLogHandler as the logger using the property logHandlerClass.

But it fails because the agent search for a constructor with no arguments:

Caused by: java.lang.IllegalArgumentException: Cannot instantiate class jrds.agent.RProbeJolokiaImpl$JulLogHandler: java.lang.NoSuchMethodException: jrds.agent.RProbeJolokiaImpl$JulLogHandler.<init>()
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:163)
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:137)
	at org.jolokia.jvmagent.JolokiaServer.createLogHandler(JolokiaServer.java:288)
	at org.jolokia.jvmagent.JolokiaServer.init(JolokiaServer.java:220)
	at org.jolokia.jvmagent.JolokiaServer.init(JolokiaServer.java:191)
	at org.jolokia.jvmagent.JolokiaServer.<init>(JolokiaServer.java:84)
	at jrds.agent.RProbeJolokiaImpl.register(RProbeJolokiaImpl.java:75)
	at jrds.agent.Start.start(Start.java:117)
	... 1 more
Caused by: java.lang.NoSuchMethodException: jrds.agent.RProbeJolokiaImpl$JulLogHandler.<init>()
	at java.base/java.lang.Class.getConstructor0(Class.java:3585)
	at java.base/java.lang.Class.getConstructor(Class.java:2271)
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:154)

And the constructor for this handler is:

    public JulLogHandler(String pCategory) {
        logger = Logger.getLogger(pCategory != null ? pCategory : "org.jolokia");
    }
@grgrzybek
Copy link
Contributor

I don't know what jrds.agent.RProbeJolokiaImpl is. Indeed, there's no support for constructors other than no-arg, but I see a place for improvement - I can check in January.

Thanks for the report.

@grgrzybek grgrzybek added this to the 2.0.1 milestone Dec 20, 2023
@grgrzybek grgrzybek self-assigned this Dec 20, 2023
@rhuss
Copy link
Member

rhuss commented Dec 20, 2023

Indeed, a LogHandler needs to have a noop constructor. @fbacchella could you just add another constructor with-no arg like in

public JulLogHandler() {
  this(null);
}

@fbacchella
Copy link
Author

jrds.agent.RProbeJolokiaImpl is my code, not related to jolokia.

@rhuss
Copy link
Member

rhuss commented Dec 20, 2023

Ah sorry, I was a bit confused of jrds.agent.RProbeJolokiaImpl$JulLogHandler in the stacktrace that indicated that this might be an inner class of your code. But you are referring to shipped JulLogHandler. Yes, indeed, this should have a no-arg constructor. Thanks for raising this!

@grgrzybek
Copy link
Contributor

There's

if (pArguments.length == 0) {
    return pClass.getConstructor().newInstance();
} else {
    Constructor<T> ctr = lookupConstructor(pClass, pArguments);
    return ctr.newInstance(pArguments);
}

in org.jolokia.server.core.util.ClassUtil#newInstance(java.lang.Class<T>, java.lang.Object...) and jrds.agent.RProbeJolokiaImpl$JulLogHandler seem to be an inner class inside jrds.agent.RProbeJolokiaImpl, can we see the source code of your class?

@rhuss
Copy link
Member

rhuss commented Dec 20, 2023

Yeah, but this is called by

    // Creat a log handler from either the given class or by creating a default log handler printing
    // out to stderr
    private LogHandler createLogHandler(String pLogHandlerClass, final boolean pIsDebug) {
        if (pLogHandlerClass != null) {
            return ClassUtil.newInstance(pLogHandlerClass);
        } else {
            return new StdoutLogHandler(pIsDebug);
        }
    }

so without arguments, and hence newInstance requires a no-arg constructor (which our JulLogHandler has not). We don't have a category here either at that point. So, we still should add a no-arg constructor to JulLogHandler ;-)

@fbacchella
Copy link
Author

fbacchella commented Dec 20, 2023

I pasted the wrong stack. jrds.agent.RProbeJolokiaImpl$JulLogHandler was an exact copy-past to help me understand the cause of the problem I had with org.jolokia.server.core.service.impl.JulLogHandler and exactly the same error message. And doing so I saw that the empty constructor was missing. Sorry for the confusion.

@fbacchella
Copy link
Author

The right stack:

Exception in thread "main" jrds.agent.CollectException: failed to start jrdsagent
	at jrds.agent.Start.start(Start.java:132)
	at jrds.agent.Start.main(Start.java:86)
Caused by: java.lang.IllegalArgumentException: Cannot instantiate class org.jolokia.server.core.service.impl.JulLogHandler: java.lang.NoSuchMethodException: org.jolokia.server.core.service.impl.JulLogHandler.<init>()
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:163)
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:137)
	at org.jolokia.jvmagent.JolokiaServer.createLogHandler(JolokiaServer.java:288)
	at org.jolokia.jvmagent.JolokiaServer.init(JolokiaServer.java:220)
	at org.jolokia.jvmagent.JolokiaServer.init(JolokiaServer.java:191)
	at org.jolokia.jvmagent.JolokiaServer.<init>(JolokiaServer.java:84)
	at jrds.agent.RProbeJolokiaImpl.register(RProbeJolokiaImpl.java:46)
	at jrds.agent.Start.start(Start.java:117)
	... 1 more
Caused by: java.lang.NoSuchMethodException: org.jolokia.server.core.service.impl.JulLogHandler.<init>()
	at java.base/java.lang.Class.getConstructor0(Class.java:3585)
	at java.base/java.lang.Class.getConstructor(Class.java:2271)
	at org.jolokia.server.core.util.ClassUtil.newInstance(ClassUtil.java:154)
	... 8 more

@grgrzybek
Copy link
Contributor

Fixed with #651.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants