zabbix_sender_api 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,174 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.26
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="file_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'>
61
+ <h1 id="label-zabbix_sender_api">zabbix_sender_api</h1>
62
+
63
+ <p>This gem provides a model for assembling and sending data to Zabbix via its sender/trapper mechanism. It works both with the zabbix_sender command line utility, or by itself using a socket connection to a trapper port direct from Ruby.</p>
64
+
65
+ <p><strong>Detailed documentation for this library is at <a href="https://rubydoc.info/gems/zabbix_sender_api">rubydoc.info</a></strong></p>
66
+
67
+ <p>Look at <a href="https://gitlab.com/svdasein/zfstozab/-/blob/master/exe/zabbix-zfs.rb">the source for the zfstozab gem</a> for a practical example how to use this api.</p>
68
+
69
+ <p>zabbix_sender_api can send data to zabbix via one of two included connection types: * zabbix_sender (this was the original and for quite some time only mode supported) * TCP socket connection directly to a Zabbix “trapper” port (as of vers 1.1.0)</p>
70
+
71
+ <h2 id="label-Installation">Installation</h2>
72
+
73
+ <pre class="code ruby"><code class="ruby">$ gem install zabbix_sender_api
74
+ </code></pre>
75
+
76
+ <h2 id="label-Usage">Usage</h2>
77
+
78
+ <h3 id="label-Synopsis">Synopsis</h3>
79
+
80
+ <pre class="code ruby"><code class="ruby"><span class='comment'>#!/usr/bin/env ruby
81
+ </span><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>zabbix_sender_api</span><span class='tstring_end'>&#39;</span></span>
82
+
83
+ <span class='id identifier rubyid_sender'>sender</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Pipe.html" title="Zabbix::Sender::Pipe (class)">Pipe</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Pipe.html#initialize-instance_method" title="Zabbix::Sender::Pipe#initialize (method)">new</a></span></span>
84
+
85
+ <span class='id identifier rubyid_rawdata'>rawdata</span> <span class='op'>=</span> <span class='lbrace'>{</span> <span class='symbol'>:myFirstKey</span> <span class='op'>=&gt;</span> <span class='int'>0</span><span class='comma'>,</span> <span class='symbol'>:mySecondKey</span> <span class='op'>=&gt;</span> <span class='int'>100</span> <span class='rbrace'>}</span>
86
+
87
+ <span class='id identifier rubyid_data'>data</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Batch.html" title="Zabbix::Sender::Batch (class)">Batch</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Batch.html#initialize-instance_method" title="Zabbix::Sender::Batch#initialize (method)">new</a></span></span>
88
+
89
+ <span class='id identifier rubyid_rawdata'>rawdata</span><span class='period'>.</span><span class='id identifier rubyid_each_pair'>each_pair</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
90
+ <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_addItemData'>addItemData</span><span class='lparen'>(</span><span class='label'>key:</span> <span class='id identifier rubyid_key'>key</span><span class='comma'>,</span><span class='label'>value:</span> <span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
91
+ <span class='rbrace'>}</span>
92
+
93
+ <span class='id identifier rubyid_sender'>sender</span><span class='period'>.</span><span class='id identifier rubyid_sendBatchAtomic'>sendBatchAtomic</span><span class='lparen'>(</span><span class='id identifier rubyid_data'>data</span><span class='rparen'>)</span>
94
+ </code></pre>
95
+
96
+ <p>The above will execute zabbix_sender for you and send data into it as described above.</p>
97
+
98
+ <p>Alternatively you can just</p>
99
+
100
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_to_senderinput'>to_senderinput</span>
101
+ </code></pre>
102
+
103
+ <p>… and do whatever you want w/ the stdout</p>
104
+
105
+ <p>To do low level discovery:</p>
106
+
107
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_disco'>disco</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Discovery.html" title="Zabbix::Sender::Discovery (class)">Discovery</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Discovery.html#initialize-instance_method" title="Zabbix::Sender::Discovery#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='label'>key:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>discoveryRuleKey</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
108
+
109
+ <span class='id identifier rubyid_disco'>disco</span><span class='period'>.</span><span class='id identifier rubyid_add_entity'>add_entity</span><span class='lparen'>(</span><span class='symbol'>:SOMEUSEFULVALUE</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>aValue</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='symbol'>:ANOTHERONE</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>somethingElse</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
110
+
111
+ <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_addDiscovery'>addDiscovery</span><span class='lparen'>(</span><span class='id identifier rubyid_disco'>disco</span><span class='rparen'>)</span>
112
+ </code></pre>
113
+
114
+ <h3 id="label-Under+the+hood">Under the hood</h3>
115
+
116
+ <h4 id="label-Zabbix-3A-3ASender-3A-3APipe+method-3A">Zabbix::Sender::Pipe method:</h4>
117
+
118
+ <p>The zabbix-sender cli utility provides a number of methods by which to insert data into zabbix.</p>
119
+ <ul><li>
120
+ <p>zabbix-sender … -s zabbixHostName -k keyName -o value (one k-v pair at a time)</p>
121
+ </li><li>
122
+ <p>zabbix-sender … -i - (series of kv pairs from stdin using zabbix-sender start time as timestamp)</p>
123
+ </li><li>
124
+ <p>zabbix-sender … -T -i - (series of kv pairs with their own embedded timestamps from stdin)</p>
125
+ </li></ul>
126
+
127
+ <p>In the latter two cases, the zabbix host name (the name of the host that zabbix is monitoring) is embedded in the stdin data.</p>
128
+
129
+ <p>In all cases it is presumed that the zabbix server or proxy to which data should be sent is specified. This can be done either by specifying it explicitly with the -z switch, or indirectly by pointing it to a zabbix sender configuration file with the -c switch. If you let zabbix_sender_api handle executing zabbix_sender, the target will be specified on the command line via the -z switch.</p>
130
+
131
+ <p>zabbix_sender_api utilizes the -T -i - form, so the generated data lines look like this:</p>
132
+
133
+ <pre class="code ruby"><code class="ruby">&quot;theHostBeingMonitored&quot; myFirstKey 1551719379 0
134
+ &quot;theHostBeingMonitored&quot; mySecondKey 1551719379 100
135
+ </code></pre>
136
+
137
+ <p>The above lines will send data to two items associated with the host theHostBeingMonitored: myFirstKey gets the value 0, and mySecondKey gets the value 100. In both cases the time stamp is identical but it need not be (see the exe/example.rb for specifics).</p>
138
+
139
+ <p>Low level discovery (LLD) is also possible with zabbix-sender; the format of the stdin data is not so pretty but zabbix_sender_api handles all that:</p>
140
+
141
+ <pre class="code ruby"><code class="ruby">&quot;theHostBeingMonitored&quot; discoveryRuleKey 1551719797 {&quot;data&quot;:[{&quot;{#SOMEUSEFULVALUE}&quot;:&quot;aValue&quot;,&quot;{#ANOTHERONE}&quot;:&quot;somethingElse&quot;}]}
142
+ </code></pre>
143
+
144
+ <p>The above line sends an LLD discovery structure (formatted as json) to the <a href="https://www.zabbix.com/documentation/4.0/manual/discovery/low_level_discovery#discovery_rule">discovery rule</a> whose key is discoveryRuleKey. It describes one entity by passing the macro values <a href="https://www.zabbix.com/documentation/4.0/manual/config/macros/lld_macros">#SOMEUSEFULVALUE} and #ANOTHERONE to the discovery rule. These ‘{lld macros</a>&#39; are available for use in item,trigger, and graph prototypes.</p>
145
+
146
+ <p>If you wished to use the above lld to actually do some discovery, you&#39;d set things up in zabbix roughly like this:</p>
147
+
148
+ <p><img src="images/Spectacle.Z29721.png"> <img src="images/Spectacle.l29721.png"></p>
149
+
150
+ <h4 id="label-Zabbix-3A-3ASender-3A-3ASocket+method-3A">Zabbix::Sender::Socket method:</h4>
151
+
152
+ <p>You can switch between using the Pipe(zabbix_sender) method and the Socket(direct to zabbix via tcp socket) method very simply. Just change:</p>
153
+
154
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_sender'>sender</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Pipe.html" title="Zabbix::Sender::Pipe (class)">Pipe</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Pipe.html#initialize-instance_method" title="Zabbix::Sender::Pipe#initialize (method)">new</a></span></span>
155
+ </code></pre>
156
+
157
+ <p>to <code> sender = Zabbix::Sender::Socket.new </code></p>
158
+
159
+ <p>If you were specifiying a path to zabbix_sender using the Pipe method, remove that. If you&#39;re using a socket other than 10051 on your server/proxy, you&#39;ll want to add the port: option</p>
160
+
161
+ <p>The socket method doesn&#39;t support sending multiple batches between flushes, so you should just use sendBatchAtomic(aBatch) with the Socket method.</p>
162
+
163
+ <p>You don&#39;t have to change anything else - the rest of zabbix_sender_api works exactly the same with the Socket method, save for that it&#39;s arguably more efficient with system resources. The only drawback might be if zabbix changes the sender protocol. At that point until this library is update to support the change you can revert to the Pipe/zabbix_sender method if needed (if they change the command line switches radically there, changes will be required in this library as well).</p>
164
+ </div></div>
165
+
166
+ <div id="footer">
167
+ Generated on Sat Sep 11 00:00:06 2021 by
168
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
169
+ 0.9.26 (ruby-2.7.4).
170
+ </div>
171
+
172
+ </div>
173
+ </body>
174
+ </html>
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
+ <meta charset="utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <title>File List</title>
19
+ <base id="base_target" target="_parent" />
20
+ </head>
21
+ <body>
22
+ <div id="content">
23
+ <div class="fixed_header">
24
+ <h1 id="full_list_header">File List</h1>
25
+ <div id="full_list_nav">
26
+
27
+ <span><a target="_self" href="class_list.html">
28
+ Classes
29
+ </a></span>
30
+
31
+ <span><a target="_self" href="method_list.html">
32
+ Methods
33
+ </a></span>
34
+
35
+ <span><a target="_self" href="file_list.html">
36
+ Files
37
+ </a></span>
38
+
39
+ </div>
40
+
41
+ <div id="search">Search: <input type="text" /></div>
42
+ </div>
43
+
44
+ <ul id="full_list" class="file">
45
+
46
+
47
+ <li id="object_README" class="odd">
48
+ <div class="item"><span class="object_link"><a href="index.html" title="README">README</a></span></div>
49
+ </li>
50
+
51
+
52
+
53
+ </ul>
54
+ </div>
55
+ </body>
56
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Documentation by YARD 0.9.26</title>
6
+ </head>
7
+ <script type="text/javascript">
8
+ var match = unescape(window.location.hash).match(/^#!(.+)/);
9
+ var name = match ? match[1] : 'index.html';
10
+ name = name.replace(/^(\w+):\/\//, '').replace(/^\/\//, '');
11
+ window.top.location = name;
12
+ </script>
13
+ <noscript>
14
+ <h1>Oops!</h1>
15
+ <h2>YARD requires JavaScript!</h2>
16
+ </noscript>
17
+ </html>
data/public/index.html ADDED
@@ -0,0 +1,174 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.26
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'>
61
+ <h1 id="label-zabbix_sender_api">zabbix_sender_api</h1>
62
+
63
+ <p>This gem provides a model for assembling and sending data to Zabbix via its sender/trapper mechanism. It works both with the zabbix_sender command line utility, or by itself using a socket connection to a trapper port direct from Ruby.</p>
64
+
65
+ <p><strong>Detailed documentation for this library is at <a href="https://rubydoc.info/gems/zabbix_sender_api">rubydoc.info</a></strong></p>
66
+
67
+ <p>Look at <a href="https://gitlab.com/svdasein/zfstozab/-/blob/master/exe/zabbix-zfs.rb">the source for the zfstozab gem</a> for a practical example how to use this api.</p>
68
+
69
+ <p>zabbix_sender_api can send data to zabbix via one of two included connection types: * zabbix_sender (this was the original and for quite some time only mode supported) * TCP socket connection directly to a Zabbix “trapper” port (as of vers 1.1.0)</p>
70
+
71
+ <h2 id="label-Installation">Installation</h2>
72
+
73
+ <pre class="code ruby"><code class="ruby">$ gem install zabbix_sender_api
74
+ </code></pre>
75
+
76
+ <h2 id="label-Usage">Usage</h2>
77
+
78
+ <h3 id="label-Synopsis">Synopsis</h3>
79
+
80
+ <pre class="code ruby"><code class="ruby"><span class='comment'>#!/usr/bin/env ruby
81
+ </span><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>zabbix_sender_api</span><span class='tstring_end'>&#39;</span></span>
82
+
83
+ <span class='id identifier rubyid_sender'>sender</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Pipe.html" title="Zabbix::Sender::Pipe (class)">Pipe</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Pipe.html#initialize-instance_method" title="Zabbix::Sender::Pipe#initialize (method)">new</a></span></span>
84
+
85
+ <span class='id identifier rubyid_rawdata'>rawdata</span> <span class='op'>=</span> <span class='lbrace'>{</span> <span class='symbol'>:myFirstKey</span> <span class='op'>=&gt;</span> <span class='int'>0</span><span class='comma'>,</span> <span class='symbol'>:mySecondKey</span> <span class='op'>=&gt;</span> <span class='int'>100</span> <span class='rbrace'>}</span>
86
+
87
+ <span class='id identifier rubyid_data'>data</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Batch.html" title="Zabbix::Sender::Batch (class)">Batch</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Batch.html#initialize-instance_method" title="Zabbix::Sender::Batch#initialize (method)">new</a></span></span>
88
+
89
+ <span class='id identifier rubyid_rawdata'>rawdata</span><span class='period'>.</span><span class='id identifier rubyid_each_pair'>each_pair</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
90
+ <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_addItemData'>addItemData</span><span class='lparen'>(</span><span class='label'>key:</span> <span class='id identifier rubyid_key'>key</span><span class='comma'>,</span><span class='label'>value:</span> <span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
91
+ <span class='rbrace'>}</span>
92
+
93
+ <span class='id identifier rubyid_sender'>sender</span><span class='period'>.</span><span class='id identifier rubyid_sendBatchAtomic'>sendBatchAtomic</span><span class='lparen'>(</span><span class='id identifier rubyid_data'>data</span><span class='rparen'>)</span>
94
+ </code></pre>
95
+
96
+ <p>The above will execute zabbix_sender for you and send data into it as described above.</p>
97
+
98
+ <p>Alternatively you can just</p>
99
+
100
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_to_senderinput'>to_senderinput</span>
101
+ </code></pre>
102
+
103
+ <p>… and do whatever you want w/ the stdout</p>
104
+
105
+ <p>To do low level discovery:</p>
106
+
107
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_disco'>disco</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Discovery.html" title="Zabbix::Sender::Discovery (class)">Discovery</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Discovery.html#initialize-instance_method" title="Zabbix::Sender::Discovery#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='label'>key:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>discoveryRuleKey</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
108
+
109
+ <span class='id identifier rubyid_disco'>disco</span><span class='period'>.</span><span class='id identifier rubyid_add_entity'>add_entity</span><span class='lparen'>(</span><span class='symbol'>:SOMEUSEFULVALUE</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>aValue</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='symbol'>:ANOTHERONE</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>somethingElse</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
110
+
111
+ <span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_addDiscovery'>addDiscovery</span><span class='lparen'>(</span><span class='id identifier rubyid_disco'>disco</span><span class='rparen'>)</span>
112
+ </code></pre>
113
+
114
+ <h3 id="label-Under+the+hood">Under the hood</h3>
115
+
116
+ <h4 id="label-Zabbix-3A-3ASender-3A-3APipe+method-3A">Zabbix::Sender::Pipe method:</h4>
117
+
118
+ <p>The zabbix-sender cli utility provides a number of methods by which to insert data into zabbix.</p>
119
+ <ul><li>
120
+ <p>zabbix-sender … -s zabbixHostName -k keyName -o value (one k-v pair at a time)</p>
121
+ </li><li>
122
+ <p>zabbix-sender … -i - (series of kv pairs from stdin using zabbix-sender start time as timestamp)</p>
123
+ </li><li>
124
+ <p>zabbix-sender … -T -i - (series of kv pairs with their own embedded timestamps from stdin)</p>
125
+ </li></ul>
126
+
127
+ <p>In the latter two cases, the zabbix host name (the name of the host that zabbix is monitoring) is embedded in the stdin data.</p>
128
+
129
+ <p>In all cases it is presumed that the zabbix server or proxy to which data should be sent is specified. This can be done either by specifying it explicitly with the -z switch, or indirectly by pointing it to a zabbix sender configuration file with the -c switch. If you let zabbix_sender_api handle executing zabbix_sender, the target will be specified on the command line via the -z switch.</p>
130
+
131
+ <p>zabbix_sender_api utilizes the -T -i - form, so the generated data lines look like this:</p>
132
+
133
+ <pre class="code ruby"><code class="ruby">&quot;theHostBeingMonitored&quot; myFirstKey 1551719379 0
134
+ &quot;theHostBeingMonitored&quot; mySecondKey 1551719379 100
135
+ </code></pre>
136
+
137
+ <p>The above lines will send data to two items associated with the host theHostBeingMonitored: myFirstKey gets the value 0, and mySecondKey gets the value 100. In both cases the time stamp is identical but it need not be (see the exe/example.rb for specifics).</p>
138
+
139
+ <p>Low level discovery (LLD) is also possible with zabbix-sender; the format of the stdin data is not so pretty but zabbix_sender_api handles all that:</p>
140
+
141
+ <pre class="code ruby"><code class="ruby">&quot;theHostBeingMonitored&quot; discoveryRuleKey 1551719797 {&quot;data&quot;:[{&quot;{#SOMEUSEFULVALUE}&quot;:&quot;aValue&quot;,&quot;{#ANOTHERONE}&quot;:&quot;somethingElse&quot;}]}
142
+ </code></pre>
143
+
144
+ <p>The above line sends an LLD discovery structure (formatted as json) to the <a href="https://www.zabbix.com/documentation/4.0/manual/discovery/low_level_discovery#discovery_rule">discovery rule</a> whose key is discoveryRuleKey. It describes one entity by passing the macro values <a href="https://www.zabbix.com/documentation/4.0/manual/config/macros/lld_macros">#SOMEUSEFULVALUE} and #ANOTHERONE to the discovery rule. These ‘{lld macros</a>&#39; are available for use in item,trigger, and graph prototypes.</p>
145
+
146
+ <p>If you wished to use the above lld to actually do some discovery, you&#39;d set things up in zabbix roughly like this:</p>
147
+
148
+ <p><img src="images/Spectacle.Z29721.png"> <img src="images/Spectacle.l29721.png"></p>
149
+
150
+ <h4 id="label-Zabbix-3A-3ASender-3A-3ASocket+method-3A">Zabbix::Sender::Socket method:</h4>
151
+
152
+ <p>You can switch between using the Pipe(zabbix_sender) method and the Socket(direct to zabbix via tcp socket) method very simply. Just change:</p>
153
+
154
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_sender'>sender</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Zabbix.html" title="Zabbix (module)">Zabbix</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender.html" title="Zabbix::Sender (module)">Sender</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Zabbix/Sender/Pipe.html" title="Zabbix::Sender::Pipe (class)">Pipe</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Zabbix/Sender/Pipe.html#initialize-instance_method" title="Zabbix::Sender::Pipe#initialize (method)">new</a></span></span>
155
+ </code></pre>
156
+
157
+ <p>to <code> sender = Zabbix::Sender::Socket.new </code></p>
158
+
159
+ <p>If you were specifiying a path to zabbix_sender using the Pipe method, remove that. If you&#39;re using a socket other than 10051 on your server/proxy, you&#39;ll want to add the port: option</p>
160
+
161
+ <p>The socket method doesn&#39;t support sending multiple batches between flushes, so you should just use sendBatchAtomic(aBatch) with the Socket method.</p>
162
+
163
+ <p>You don&#39;t have to change anything else - the rest of zabbix_sender_api works exactly the same with the Socket method, save for that it&#39;s arguably more efficient with system resources. The only drawback might be if zabbix changes the sender protocol. At that point until this library is update to support the change you can revert to the Pipe/zabbix_sender method if needed (if they change the command line switches radically there, changes will be required in this library as well).</p>
164
+ </div></div>
165
+
166
+ <div id="footer">
167
+ Generated on Sat Sep 11 00:00:06 2021 by
168
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
169
+ 0.9.26 (ruby-2.7.4).
170
+ </div>
171
+
172
+ </div>
173
+ </body>
174
+ </html>
data/public/js/app.js ADDED
@@ -0,0 +1,314 @@
1
+ (function() {
2
+
3
+ var localStorage = {}, sessionStorage = {};
4
+ try { localStorage = window.localStorage; } catch (e) { }
5
+ try { sessionStorage = window.sessionStorage; } catch (e) { }
6
+
7
+ function createSourceLinks() {
8
+ $('.method_details_list .source_code').
9
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
10
+ $('.toggleSource').toggle(function() {
11
+ $(this).parent().nextAll('.source_code').slideDown(100);
12
+ $(this).text("Hide source");
13
+ },
14
+ function() {
15
+ $(this).parent().nextAll('.source_code').slideUp(100);
16
+ $(this).text("View source");
17
+ });
18
+ }
19
+
20
+ function createDefineLinks() {
21
+ var tHeight = 0;
22
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
23
+ $('.toggleDefines').toggle(function() {
24
+ tHeight = $(this).parent().prev().height();
25
+ $(this).prev().css('display', 'inline');
26
+ $(this).parent().prev().height($(this).parent().height());
27
+ $(this).text("(less)");
28
+ },
29
+ function() {
30
+ $(this).prev().hide();
31
+ $(this).parent().prev().height(tHeight);
32
+ $(this).text("more...");
33
+ });
34
+ }
35
+
36
+ function createFullTreeLinks() {
37
+ var tHeight = 0;
38
+ $('.inheritanceTree').toggle(function() {
39
+ tHeight = $(this).parent().prev().height();
40
+ $(this).parent().toggleClass('showAll');
41
+ $(this).text("(hide)");
42
+ $(this).parent().prev().height($(this).parent().height());
43
+ },
44
+ function() {
45
+ $(this).parent().toggleClass('showAll');
46
+ $(this).parent().prev().height(tHeight);
47
+ $(this).text("show all");
48
+ });
49
+ }
50
+
51
+ function searchFrameButtons() {
52
+ $('.full_list_link').click(function() {
53
+ toggleSearchFrame(this, $(this).attr('href'));
54
+ return false;
55
+ });
56
+ window.addEventListener('message', function(e) {
57
+ if (e.data === 'navEscape') {
58
+ $('#nav').slideUp(100);
59
+ $('#search a').removeClass('active inactive');
60
+ $(window).focus();
61
+ }
62
+ });
63
+
64
+ $(window).resize(function() {
65
+ if ($('#search:visible').length === 0) {
66
+ $('#nav').removeAttr('style');
67
+ $('#search a').removeClass('active inactive');
68
+ $(window).focus();
69
+ }
70
+ });
71
+ }
72
+
73
+ function toggleSearchFrame(id, link) {
74
+ var frame = $('#nav');
75
+ $('#search a').removeClass('active').addClass('inactive');
76
+ if (frame.attr('src') === link && frame.css('display') !== "none") {
77
+ frame.slideUp(100);
78
+ $('#search a').removeClass('active inactive');
79
+ }
80
+ else {
81
+ $(id).addClass('active').removeClass('inactive');
82
+ if (frame.attr('src') !== link) frame.attr('src', link);
83
+ frame.slideDown(100);
84
+ }
85
+ }
86
+
87
+ function linkSummaries() {
88
+ $('.summary_signature').click(function() {
89
+ document.location = $(this).find('a').attr('href');
90
+ });
91
+ }
92
+
93
+ function summaryToggle() {
94
+ $('.summary_toggle').click(function(e) {
95
+ e.preventDefault();
96
+ localStorage.summaryCollapsed = $(this).text();
97
+ $('.summary_toggle').each(function() {
98
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
99
+ var next = $(this).parent().parent().nextAll('ul.summary').first();
100
+ if (next.hasClass('compact')) {
101
+ next.toggle();
102
+ next.nextAll('ul.summary').first().toggle();
103
+ }
104
+ else if (next.hasClass('summary')) {
105
+ var list = $('<ul class="summary compact" />');
106
+ list.html(next.html());
107
+ list.find('.summary_desc, .note').remove();
108
+ list.find('a').each(function() {
109
+ $(this).html($(this).find('strong').html());
110
+ $(this).parent().html($(this)[0].outerHTML);
111
+ });
112
+ next.before(list);
113
+ next.toggle();
114
+ }
115
+ });
116
+ return false;
117
+ });
118
+ if (localStorage.summaryCollapsed == "collapse") {
119
+ $('.summary_toggle').first().click();
120
+ } else { localStorage.summaryCollapsed = "expand"; }
121
+ }
122
+
123
+ function constantSummaryToggle() {
124
+ $('.constants_summary_toggle').click(function(e) {
125
+ e.preventDefault();
126
+ localStorage.summaryCollapsed = $(this).text();
127
+ $('.constants_summary_toggle').each(function() {
128
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
129
+ var next = $(this).parent().parent().nextAll('dl.constants').first();
130
+ if (next.hasClass('compact')) {
131
+ next.toggle();
132
+ next.nextAll('dl.constants').first().toggle();
133
+ }
134
+ else if (next.hasClass('constants')) {
135
+ var list = $('<dl class="constants compact" />');
136
+ list.html(next.html());
137
+ list.find('dt').each(function() {
138
+ $(this).addClass('summary_signature');
139
+ $(this).text( $(this).text().split('=')[0]);
140
+ if ($(this).has(".deprecated").length) {
141
+ $(this).addClass('deprecated');
142
+ };
143
+ });
144
+ // Add the value of the constant as "Tooltip" to the summary object
145
+ list.find('pre.code').each(function() {
146
+ console.log($(this).parent());
147
+ var dt_element = $(this).parent().prev();
148
+ var tooltip = $(this).text();
149
+ if (dt_element.hasClass("deprecated")) {
150
+ tooltip = 'Deprecated. ' + tooltip;
151
+ };
152
+ dt_element.attr('title', tooltip);
153
+ });
154
+ list.find('.docstring, .tags, dd').remove();
155
+ next.before(list);
156
+ next.toggle();
157
+ }
158
+ });
159
+ return false;
160
+ });
161
+ if (localStorage.summaryCollapsed == "collapse") {
162
+ $('.constants_summary_toggle').first().click();
163
+ } else { localStorage.summaryCollapsed = "expand"; }
164
+ }
165
+
166
+ function generateTOC() {
167
+ if ($('#filecontents').length === 0) return;
168
+ var _toc = $('<ol class="top"></ol>');
169
+ var show = false;
170
+ var toc = _toc;
171
+ var counter = 0;
172
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
173
+ var i;
174
+ var curli;
175
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
176
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
177
+ var lastTag = parseInt(tags[0][1], 10);
178
+ $(tags.join(', ')).each(function() {
179
+ if ($(this).parents('.method_details .docstring').length != 0) return;
180
+ if (this.id == "filecontents") return;
181
+ show = true;
182
+ var thisTag = parseInt(this.tagName[1], 10);
183
+ if (this.id.length === 0) {
184
+ var proposedId = $(this).attr('toc-id');
185
+ if (typeof(proposedId) != "undefined") this.id = proposedId;
186
+ else {
187
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
188
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
189
+ this.id = proposedId;
190
+ }
191
+ }
192
+ if (thisTag > lastTag) {
193
+ for (i = 0; i < thisTag - lastTag; i++) {
194
+ if ( typeof(curli) == "undefined" ) {
195
+ curli = $('<li/>');
196
+ toc.append(curli);
197
+ }
198
+ toc = $('<ol/>');
199
+ curli.append(toc);
200
+ curli = undefined;
201
+ }
202
+ }
203
+ if (thisTag < lastTag) {
204
+ for (i = 0; i < lastTag - thisTag; i++) {
205
+ toc = toc.parent();
206
+ toc = toc.parent();
207
+ }
208
+ }
209
+ var title = $(this).attr('toc-title');
210
+ if (typeof(title) == "undefined") title = $(this).text();
211
+ curli =$('<li><a href="#' + this.id + '">' + title + '</a></li>');
212
+ toc.append(curli);
213
+ lastTag = thisTag;
214
+ });
215
+ if (!show) return;
216
+ html = '<div id="toc"><p class="title hide_toc"><a href="#"><strong>Table of Contents</strong></a></p></div>';
217
+ $('#content').prepend(html);
218
+ $('#toc').append(_toc);
219
+ $('#toc .hide_toc').toggle(function() {
220
+ $('#toc .top').slideUp('fast');
221
+ $('#toc').toggleClass('hidden');
222
+ $('#toc .title small').toggle();
223
+ }, function() {
224
+ $('#toc .top').slideDown('fast');
225
+ $('#toc').toggleClass('hidden');
226
+ $('#toc .title small').toggle();
227
+ });
228
+ }
229
+
230
+ function navResizeFn(e) {
231
+ if (e.which !== 1) {
232
+ navResizeFnStop();
233
+ return;
234
+ }
235
+
236
+ sessionStorage.navWidth = e.pageX.toString();
237
+ $('.nav_wrap').css('width', e.pageX);
238
+ $('.nav_wrap').css('-ms-flex', 'inherit');
239
+ }
240
+
241
+ function navResizeFnStop() {
242
+ $(window).unbind('mousemove', navResizeFn);
243
+ window.removeEventListener('message', navMessageFn, false);
244
+ }
245
+
246
+ function navMessageFn(e) {
247
+ if (e.data.action === 'mousemove') navResizeFn(e.data.event);
248
+ if (e.data.action === 'mouseup') navResizeFnStop();
249
+ }
250
+
251
+ function navResizer() {
252
+ $('#resizer').mousedown(function(e) {
253
+ e.preventDefault();
254
+ $(window).mousemove(navResizeFn);
255
+ window.addEventListener('message', navMessageFn, false);
256
+ });
257
+ $(window).mouseup(navResizeFnStop);
258
+
259
+ if (sessionStorage.navWidth) {
260
+ navResizeFn({which: 1, pageX: parseInt(sessionStorage.navWidth, 10)});
261
+ }
262
+ }
263
+
264
+ function navExpander() {
265
+ var done = false, timer = setTimeout(postMessage, 500);
266
+ function postMessage() {
267
+ if (done) return;
268
+ clearTimeout(timer);
269
+ var opts = { action: 'expand', path: pathId };
270
+ document.getElementById('nav').contentWindow.postMessage(opts, '*');
271
+ done = true;
272
+ }
273
+
274
+ window.addEventListener('message', function(event) {
275
+ if (event.data === 'navReady') postMessage();
276
+ return false;
277
+ }, false);
278
+ }
279
+
280
+ function mainFocus() {
281
+ var hash = window.location.hash;
282
+ if (hash !== '' && $(hash)[0]) {
283
+ $(hash)[0].scrollIntoView();
284
+ }
285
+
286
+ setTimeout(function() { $('#main').focus(); }, 10);
287
+ }
288
+
289
+ function navigationChange() {
290
+ // This works around the broken anchor navigation with the YARD template.
291
+ window.onpopstate = function() {
292
+ var hash = window.location.hash;
293
+ if (hash !== '' && $(hash)[0]) {
294
+ $(hash)[0].scrollIntoView();
295
+ }
296
+ };
297
+ }
298
+
299
+ $(document).ready(function() {
300
+ navResizer();
301
+ navExpander();
302
+ createSourceLinks();
303
+ createDefineLinks();
304
+ createFullTreeLinks();
305
+ searchFrameButtons();
306
+ linkSummaries();
307
+ summaryToggle();
308
+ constantSummaryToggle();
309
+ generateTOC();
310
+ mainFocus();
311
+ navigationChange();
312
+ });
313
+
314
+ })();