Table of Contents
Table of Contents |
---|
Creating an opEvents Object inside a parser plugin
opEvents Object is the object core to process and parse all the events.
This example shows how we can create the opEvents object for use inside a parser plugin.
If you have opEvents installed in another location dir=> "/usr/local/omk/conf" will need to change to reflect the full path of your conf directory
...
language | perl |
---|---|
title | Minimal Example |
...
Table of Contents
Table of Contents |
---|
Creating an opEvents Object inside a parser plugin
opEvents Object is the object core to process and parse all the events.
This example shows how we can create the opEvents object for use inside a parser plugin.
If you have opEvents installed in another location dir=> "/usr/local/omk/conf" will need to change to reflect the full path of your conf directory
Code Block | ||||
---|---|---|---|---|
| ||||
package Event_State_Example;
our $VERSION="0.0.0";
use lib "/usr/local/omk/lib";
use strict;
use OMK::Common;
use OMK::opEvents;
use OMK::Log;
# arguments: the line (currently being parsed),
# and reference to the live event properties
# returns: (status-or-error)
#
# zero or undef: parsing for this event is aborted,
# and no event is created.
# 1: indicates success, event is created and changed event
# properties are incorporated.
# any other value: treated as error message, changed event
# properties are NOT incorporated but event parsing continues.
sub parse_enrich
{
my ($line, $event) = @_;
my $confCommon = loadOmkConfTable(conf=> "opCommon", dir=> "/usr/local/omk/conf");
my $logger = OMK::Log->new(level => $confCommon->{"omkd_log_level"} || 'info',
path => $confCommon->{'<omk_logs>'}."/opEvents.log");
my $OPE = OMK::opEvents->new(config => $confCommon,
logprefix => "Plugin::Event_State_Example",
log => $logger);
$OPE->getDb();
$event->{Plugin_Used} = "Event_State_Example";
return 1;
}
1; |
Info |
---|
opEvents-4.1.1 has a new interface to make working with the opEvents object easier, to retain backwards compat with your current plugins set set opevents_parser_plugin_use_events_obj: "true" in opCommon.json |
opEvents-4.1.1 Events Object Interface
We have provided the current functions to make working with opEvents easier, we plan to add to this list overtime and if there is something your think is missing and could make working with opEvents easier please contact us.
function | description | version | args | returns |
---|---|---|---|---|
create_nmis_event | Creates a new event in nmis | 4.1.1 | node event element details level | event hash and error message or undef |
create_event | Creates a new event in opEvents | 4.1.1 | event (hash) | event id and error message or undef |
update_event | Updates a opEvents event | 4.1.1 | eventid (string) upddates (hash) | 1 or 0 for success / failure and undef or error a error string |
acknowledge_event | Acknowledges an event | 4.1.1 | eventid (string) | 1 or 0 for success / failure and undef or error a error string |
opEvents 3.2.4 Changes
From 3.2.4 opEvents sends an opEvents objects so all the resources can be reused in the plugin. , in version 4.1.1 set opevents_parser_plugin_use_events_obj: "true" to retain functionality with $OPE in the below documentation
Following changes should be applied in the plugin:
Code Block | ||||
---|---|---|---|---|
| ||||
package Event_State_Example; our $VERSION="0.0.0"; use lib "/usr/local/omk/lib"; use strict; use OMK::Common; use OMK::opEvents; use OMK::Log; # arguments: the line (currently being parsed), # and reference to the live event properties # returns: (status-or-error) # # zero or undef: parsing for this event is aborted, # and no event is created. # 1: indicates success, event is created and changed event # properties are incorporated. # any other value: treated as error message, changed event # properties are NOT incorporated but event parsing continues. sub parse_enrich { my ($line, $event, $OPE) = @_; $event->{Plugin_Used} = "Event_State_Example"; return 1; } 1; |
Much more clean and simple!
...
Code Block |
---|
my $OPE = OMK::opEvents->new(config => $confCommon, logprefix => "Plugin::TestPlugin, ", log => $logger); $OPE->getDb(); my $nmisx = $OPE->{nmisx}; my $event = { node => "asgard-local", event => "Event from opEvents plugin", element => "plugin", details => "Event from opEvents plugin details", level => 8 }; my ($response, $eventobj) = $nmisx->createNmisEvent(event => $event); $OPE->log->info("MYParserPlugin:: Response: \n" . Dumper($response)); |
...
Code Block | ||
---|---|---|
| ||
'_id' => $arg{id}, 'time' => { '$gte' => $time_start, '$lt' => $time_end }, 'event' => $arg{event}, 'node_uuid' => $arg{node_uuid}, 'type' => $arg{type}, 'element' => $arg{element}, 'details' => $arg{details}, 'eventid' => $arg{event_id}, # only useful in actionlog 'action' => $arg{action}, # only useful in actionlog 'archive' => $arg{archive}, # only useful in archive log 'entry' => $arg{entry}, # only in raw log 'state' => $arg{state}, 'nodeinfo.configuration.location' => {'$regex' => $arg{'nodeinfo.configuration_location'} || $arg{location}}, 'nodeinfo.configuration.group' => {'$regex' => $arg{'nodeinfo.configuration_group'} || $arg{group}}, 'acknowledged' => numify($arg{acknowledged}), 'escalate' => numify($arg{escalate}), 'priority' => numify($arg{priority}), }); |
Creating Events
opEvents object provides an easy way to create an event:
Code Block |
---|
# Tell opEvents object to create the event my ($error, $eventid) = $OPE->createEvent(event => $event); |
...
Code Block |
---|
# Create Event Object my $event = {}; my @maybeprops = grep($_ !~ /^(act|debug|quiet|conf|confdir|baseurl|username|password)$/, keys %$Q); if (@maybeprops) { my @rawinputs; for my $key (@maybeprops) { next if ($Q->{$key} eq ''); # supress empty properties die "argument $key cannt be set multiple times!\n" if (ref($Q->{$key}) eq "ARRAY"); # ensure numeric values for anything numeric, or mongo comparison ops will # fail badly (especially true for time, which breaks the gui) $event->{$key} = numify($Q->{$key}); push @rawinputs, "'$key=$Q->{$key}'"; } $event->{entry} = join(" ", @rawinputs); } |
Updating Events
opEvents object also provides an easy way to update an event. We will need to pass the following arguments:
- _id: for identify the event to be updated
- _constraints: to disable db key munging
Everything else will be recorded as content, as-is, except "status_history" and "trigger_eventids":
- status_history: optional but special: must be array and this array will be ADDED to an existing status_history array.
- trigger_eventids: always saved as array, and a new value is ADDED.
- buttons: always saved as array, and a new value is ADDED.
returns undef if ok, error message otherwise (also logged)
As an example:
Code Block |
---|
my $failure = $OPE->updateEvent( "_id" => $e->{_id}, priority => 5, status_history => [ $now, $thisuser, "priority", 5 ], ); |
...
Code Block | ||
---|---|---|
| ||
package Event_State_Example;
our $VERSION="0.0.0";
use lib "/usr/local/omk/lib";
use strict;
#use func;
use OMK::Common;
use Data::Dumper;
use OMK::opEvents;
use OMK::Log;
# arguments: the line (currently being parsed),
# and reference to the live event properties
# returns: (status-or-error)
#
# zero or undef: parsing for this event is aborted,
# and no event is created.
# 1: indicates success, event is created and changed event
# properties are incorporated.
# any other value: treated as error message, changed event
# properties are NOT incorporated but event parsing continues.
sub parse_enrich
{
my ($line, $event) = @_;
my $confCommon = loadOmkConfTable(conf=> "opCommon", dir=> "/usr/local/omk/conf");
my $logger = OMK::Log->new(level => $confCommon->{"omkd_log_level"} || 'info',
path => $confCommon->{'<omk_logs>'}."/opEvents.log");
my $OPE = OMK::opEvents->new(config => $confCommon,
logprefix => "Plugin::Event_State_Example",
log => $logger);
$OPE->getDb();
#We can get an event with an id
my $modelData = $OPE->getEventLogsModel(log_name => "events", id => '60516246c6c2b17094225a9c');
my $otherEvent = $modelData->[0];
$event->{other_event_ack} = [];
my $thisuser = "Plugin::Event_State_Example";
#lets get an event by name and mark them acknowledged
#you must pass time start and end if we are looking for events and not and event by an id
#lets ack them
foreach my $e (@{$toBeAcknowledged}){
my $now = time;
my $failure = $OPE->updateEvent( "_id" => $e->{_id},
acknowledged => 1,
status_history => [ $now, $thisuser, "acknowledged", 1 ], );
push @{$event->{other_event_ack}}, $e->{_id}->to_string;
#TODO better error handling
return if($failure);
}
$event->{Plugin_Used} = "Event_State_Example";
$event->{node} = "fulla-localhost";
$event->{host} = "127.0.0.1";
$event->{other_event} = $otherEvent->{_id}->to_string;
return 1;
}
1; |
Lookup node by node name
The first option, Build up a search hash and pass this to getEventLogsModel
...