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:
- Install the Datadog plugin on Jenkins version < 2.338
- Upgrade to Jenkins version >= 2.338
- See error on Jenkins startup
Expected behavior
Jenkins should start normally with no error.
Screenshots
Here's the stacktrace I see on startup:

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.
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:
Expected behavior
Jenkins should start normally with no error.
Screenshots
Here's the stacktrace I see on startup:
Environment and Versions (please complete the following information):
Additional context
Here is the stacktrace visible in the UI (same as in the screenshot above):
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.