Thursday, 29 January 2015

Could not create instance of fetchlet : SNMP

Hopefully this post and the others like it will save others the numerous days I spent hacking around in the dark trying to find a solutions for developing my Oracle Enterprise Manager 12c Plugin.

My plugin collects it's metric data using SNMP. No prizes for guessing, but after the first time I deployed my plugin it didn't work. When you define your metrics you get to choose a fetchlet type, so naturally I chose SNMP. Whenever any of my metric collections ran I would get the error;
oracle.sysman.emSDK.agent.fetchlet.exception.UnknownFetchletException: Could not create instance of fetchlet : SNMP
at oracle.sysman.gcagent.target.interaction.execution.FetchletFactory.getItem(FetchletFactory.java:308)
at oracle.sysman.gcagent.target.interaction.execution.FetchletFactory.loadFetchlet(FetchletFactory.java:317)
at oracle.sysman.gcagent.target.interaction.execution.FetchletFactory.<init>(FetchletFactory.java:207)
at oracle.sysman.gcagent.target.interaction.execution.ExecuteTask.runTask(ExecuteTask.java:3900)
at oracle.sysman.gcagent.target.interaction.execution.ExecuteTask.call(ExecuteTask.java:5098)
at oracle.sysman.gcagent.metadata.impl.collection.MetricColl$1.call(MetricColl.java:552)
at oracle.sysman.gcagent.metadata.impl.collection.MetricColl$1.call(MetricColl.java:513)
at oracle.sysman.gcagent.task.TaskFutureImpl$WrappedTask.accountedCall(TaskFutureImpl.java:599)
at oracle.sysman.gcagent.task.TaskFutureImpl$WrappedTask.call(TaskFutureImpl.java:643)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at oracle.sysman.gcagent.task.TaskFutureImpl.run1(TaskFutureImpl.java:380)
at oracle.sysman.gcagent.task.TaskFutureImpl.run(TaskFutureImpl.java:337)
at oracle.sysman.gcagent.task.CompositeTask.runSubtask(CompositeTask.java:70)
at oracle.sysman.gcagent.task.CompositeTask.run(CompositeTask.java:77)
at oracle.sysman.gcagent.metadata.impl.collection.CollectionItem$CollectionItemTask.run(CollectionItem.java:2536)
at oracle.sysman.gcagent.task.AbstractTemplateTask.call(AbstractTemplateTask.java:198)
at oracle.sysman.gcagent.task.AbstractTemplateTask.call(AbstractTemplateTask.java:49)
at oracle.sysman.gcagent.task.executor.DiagWrappedTask.call(DiagWrappedTask.java:60)
at oracle.sysman.gcagent.task.TaskFutureImpl$WrappedTask.accountedCall(TaskFutureImpl.java:599)
at oracle.sysman.gcagent.task.TaskFutureImpl$WrappedTask.call(TaskFutureImpl.java:643)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at oracle.sysman.gcagent.task.TaskFutureImpl.run1(TaskFutureImpl.java:380)
at oracle.sysman.gcagent.task.TaskFutureImpl.run(TaskFutureImpl.java:337)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at oracle.sysman.gcagent.task.executor.TrackThreadFactory$1.run(TrackThreadFactory.java:54)
at oracle.sysman.gcagent.util.system.GCAThread$RunnableWrapper.run(GCAThread.java:189)
at java.lang.Thread.run(Thread.java:662)
I spent ages trying to figure out what the hell I'd done wrong.  Rather unsurprisingly after several hours of hacking I figured out that my first mistake was using the plugin builder that ships with the EDK 12.1.0.4, or more specifically using it to chose and define my metric definitions and collections.  The Plugin Builder defines the SNMP Fetchlet ID as "SNMP" it should be "Snmp" so after manually editing the targetType XML and redeploying my plugin it works like a treat.  make sure if you are using an SNMP fetchet that you define the QueryDescriptor as;
<QueryDescriptor FETCHLET_ID="Snmp">