Skip to content

Datadog plugin incompatible with Jenkins 2.338 and up #285

Description

@usmonster

Describe the bug

Since version 2.338 of Jenkins, the Datadog plugin generates errors that prevent Jenkins from starting normally. This appears to be due to Jenkins's recent removal of the Java Native Runtime (JNR) library from its core. Since the plugin seems to rely on this library, either directly or indirectly, Jenkins startup fails and shows a stacktrace in the UI.

To Reproduce
Steps to reproduce the behavior:

  1. Install the Datadog plugin on Jenkins version < 2.338
  2. Upgrade to Jenkins version >= 2.338
  3. See error on Jenkins startup

Expected behavior
Jenkins should start normally with no error.

Screenshots
Here's the stacktrace I see on startup:

Stacktrace in UI

Environment and Versions (please complete the following information):

  • Jenkins version 2.338
  • Datadog plugin version 3.51

Additional context

Here is the stacktrace visible in the UI (same as in the screenshot above):

java.lang.UnsatisfiedLinkError: could not get native definition for type `POINTER`, original error message follows: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file.  Tried [jni/x86_64-Linux/libjffi-1.2.so, /jni/x86_64-Linux/libjffi-1.2.so]
	at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:450)
	at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:375)
	at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:278)
	at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:487)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:398)
	at com.kenai.jffi.Init.load(Init.java:68)
	at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49)
	at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45)
	at com.kenai.jffi.Foreign.getInstance(Foreign.java:103)
	at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242)
	at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237)
	at com.kenai.jffi.Type.resolveSize(Type.java:155)
	at com.kenai.jffi.Type.size(Type.java:138)
	at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178)
	at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48)
	at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:57)
	at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41)
	at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:53)
	at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49)
	at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at java.base/java.lang.Class.newInstance(Class.java:584)
	at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68)
	at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57)
	at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35)
	at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82)
	at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67)
	at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46)
	at jnr.unixsocket.SockAddrUnix$DefaultSockAddrUnix.<init>(SockAddrUnix.java:208)
	at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174)
	at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:53)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1416)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1413)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticAddressResolution(NonBlockingStatsDClient.java:1433)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticStatsDAddressResolution(NonBlockingStatsDClient.java:1450)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:364)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:210)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:182)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.reinitializeStatsDClient(DatadogAgentClient.java:217)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.getInstance(DatadogAgentClient.java:133)
	at org.datadog.jenkins.plugins.datadog.clients.ClientFactory.getClient(ClientFactory.java:52)
	at org.datadog.jenkins.plugins.datadog.clients.ClientFactory.getClient(ClientFactory.java:84)
	at org.datadog.jenkins.plugins.datadog.listeners.DatadogItemListener.onCRUD(DatadogItemListener.java:81)
	at org.datadog.jenkins.plugins.datadog.listeners.DatadogItemListener.onUpdated(DatadogItemListener.java:69)
	at hudson.model.listeners.ItemListener.lambda$fireOnUpdated$2(ItemListener.java:205)
	at jenkins.util.Listeners.lambda$notify$0(Listeners.java:59)
	at jenkins.util.Listeners.notify(Listeners.java:70)
	at hudson.model.listeners.ItemListener.fireOnUpdated(ItemListener.java:205)
	at com.cloudbees.hudson.plugins.folder.AbstractFolder.save(AbstractFolder.java:1315)
	at hudson.util.PersistedList.onModified(PersistedList.java:193)
	at hudson.util.PersistedList._onModified(PersistedList.java:224)
	at hudson.util.PersistedList.add(PersistedList.java:85)
	at com.cloudbees.hudson.plugins.folder.AbstractFolder.addProperty(AbstractFolder.java:616)
	at jenkins.branch.OrganizationFolder.onLoad(OrganizationFolder.java:242)
	at hudson.model.Items.load(Items.java:376)
	at jenkins.model.Jenkins$13.run(Jenkins.java:3418)
	at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:175)
	at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:305)
	at jenkins.model.Jenkins$5.runTask(Jenkins.java:1156)
	at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:222)
	at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:121)
	at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

	at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:253)
	at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237)
	at com.kenai.jffi.Type.resolveSize(Type.java:155)
	at com.kenai.jffi.Type.size(Type.java:138)
	at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178)
	at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48)
	at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:57)
	at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41)
	at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:53)
	at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49)
	at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at java.base/java.lang.Class.newInstance(Class.java:584)
	at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68)
	at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57)
	at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35)
	at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82)
	at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67)
	at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46)
	at jnr.unixsocket.SockAddrUnix$DefaultSockAddrUnix.<init>(SockAddrUnix.java:208)
	at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174)
	at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:53)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1416)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1413)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticAddressResolution(NonBlockingStatsDClient.java:1433)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticStatsDAddressResolution(NonBlockingStatsDClient.java:1450)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:364)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:210)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:182)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.reinitializeStatsDClient(DatadogAgentClient.java:217)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.getInstance(DatadogAgentClient.java:133)
	at org.datadog.jenkins.plugins.datadog.clients.ClientFactory.getClient(ClientFactory.java:52)
	at org.datadog.jenkins.plugins.datadog.clients.ClientFactory.getClient(ClientFactory.java:84)
	at org.datadog.jenkins.plugins.datadog.listeners.DatadogItemListener.onCRUD(DatadogItemListener.java:81)
	at org.datadog.jenkins.plugins.datadog.listeners.DatadogItemListener.onUpdated(DatadogItemListener.java:69)
	at hudson.model.listeners.ItemListener.lambda$fireOnUpdated$2(ItemListener.java:205)
	at jenkins.util.Listeners.lambda$notify$0(Listeners.java:59)
	at jenkins.util.Listeners.notify(Listeners.java:70)
	at hudson.model.listeners.ItemListener.fireOnUpdated(ItemListener.java:205)
	at com.cloudbees.hudson.plugins.folder.AbstractFolder.save(AbstractFolder.java:1315)
	at hudson.util.PersistedList.onModified(PersistedList.java:193)
	at hudson.util.PersistedList._onModified(PersistedList.java:224)
	at hudson.util.PersistedList.add(PersistedList.java:85)
	at com.cloudbees.hudson.plugins.folder.AbstractFolder.addProperty(AbstractFolder.java:616)
	at jenkins.branch.OrganizationFolder.onLoad(OrganizationFolder.java:242)
	at hudson.model.Items.load(Items.java:376)
	at jenkins.model.Jenkins$13.run(Jenkins.java:3418)
	at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:175)
	at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:305)
	at jenkins.model.Jenkins$5.runTask(Jenkins.java:1156)
	at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:222)
	at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:121)
	at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused: java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider
	at jnr.ffi.provider.InvalidRuntime.newLoadError(InvalidRuntime.java:101)
	at jnr.ffi.provider.InvalidRuntime.findType(InvalidRuntime.java:42)
	at jnr.ffi.Struct$NumberField.<init>(Struct.java:872)
	at jnr.ffi.Struct$Unsigned16.<init>(Struct.java:1240)
	at jnr.unixsocket.SockAddrUnix$DefaultSockAddrUnix.<init>(SockAddrUnix.java:209)
	at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174)
	at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:53)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1416)
	at com.timgroup.statsd.NonBlockingStatsDClient$5.call(NonBlockingStatsDClient.java:1413)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticAddressResolution(NonBlockingStatsDClient.java:1433)
	at com.timgroup.statsd.NonBlockingStatsDClient.staticStatsDAddressResolution(NonBlockingStatsDClient.java:1450)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:364)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:210)
	at com.timgroup.statsd.NonBlockingStatsDClient.<init>(NonBlockingStatsDClient.java:182)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.reinitializeStatsDClient(DatadogAgentClient.java:217)
	at org.datadog.jenkins.plugins.datadog.clients.DatadogAgentClient.event(DatadogAgentClient.java:421)
	at org.datadog.jenkins.plugins.datadog.listeners.DatadogComputerListener.onOnline(DatadogComputerListener.java:82)
	at jenkins.model.Jenkins.<init>(Jenkins.java:1020)
	at hudson.model.Hudson.<init>(Hudson.java:86)
	at hudson.model.Hudson.<init>(Hudson.java:82)
	at hudson.WebAppMain$3.run(WebAppMain.java:247)
Caused: hudson.util.HudsonFailedToLoad
	at hudson.WebAppMain$3.run(WebAppMain.java:261)

Here are the logs from Jenkins startup: jenkins.log

As a workaround, I tried installing the standalone JNR Posix API Plugin, but it did not change anything as I believe some action must be done to have the Datadog plugin rely on this.

One fix would be for the Datadog plugin to declare it as an explicit dependency, like other plugins have done.

Another possible longer-term fix could be to remove any JNR library dependency from the plugin altogether.

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugBug related issue

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions