As your monitoring infrastructures evolve, you might hit a point when there’s no avoiding using the Zabbix API. The Zabbix API can be used to automate a particular part of your day-to-day workflow, troubleshoot your monitoring or to simply analyze or get statistics about a specific set of entities.
In this blog post, we will take a look at some of the more advanced API methods and specific method parameters and learn how they can be used to improve your API workflows.
1. Count entities with CountOutput
Let’s start with gathering some statistics. Let’s say you have to count the number of some matching entities – here we can use the CountOutput parameter. For a more advanced use case – what if we have to count the number of events for some time period? Let’s combine countOutput with time_from and time_till (in unixtime) and get the number of events created for the month of November. Let’s get all of the events for the month of November that have the Disaster severity:
{ "jsonrpc": "2.0", "method": "event.get", "params": { "output": "extend", "time_from": "1635717600", "time_till": "1638223200", "severities": "5", "countOutput": "true" }, "auth": "xxxxxx", "id": 1 }
2. Use API to perform Configuration export/import
Next, let’s take a look at how we can use the configuration.export method to export one of our templates in yaml:
{ "jsonrpc": "2.0", "method": "configuration.export", "params": { "options": { "templates": [ "10001" ] }, "format": "yaml" }, "auth": "xxxxxx", "id": 1 }
Now let’s copy and paste the result of the export and import the template into another environment. It’s extremely important to remember that for this method to work exactly as we intend to, we need to include the parameters that specify the behavior of particular entities contained in the configuration string, such as items/value maps/templates, etc. For example, if I exclude the templates parameter here, no templates will be imported.
{ "jsonrpc": "2.0", "method": "configuration.import", "params": { "format": "yaml", "rules": { "valueMaps": { "createMissing": true, "updateExisting": true }, "items": { "createMissing": true, "updateExisting": true, "deleteMissing": true }, "templates": { "createMissing": true, "updateExisting": true }, "templateLinkage": { "createMissing": true } }, "source": "zabbix_export:\n version: '5.4'\n date: '2021-11-13T09:31:29Z'\n groups:\n -\n uuid: 846977d1dfed4968bc5f8bdb363285bc\n name: 'Templates/Operating systems'\n templates:\n -\n uuid: e2307c94f1744af7a8f1f458a67af424\n template: 'Linux by Zabbix agent active'\n name: 'Linux by Zabbix agent active'\n ... }, "auth": "xxxxxx", "id": 1 }
3. Expand trigger functions and macros with expand parameters
Using trigger.get to obtain information about a particular set of triggers is a relatively common practice. One particular caveat that we have to consider is that by default macros in trigger name, expression or descriptions are not expanded. To expand the available macros we need to use the expand parameters:
{ "jsonrpc": "2.0", "method": "trigger.get", "params": { "triggerids": "18135", "output": "extend", "expandExpression":"1", "selectFunctions": "extend" }, "auth": "xxxxxx", "id": 1 }
4. Obtaining additional LLD information for a discovered item
If we wish to display additional LLD information for a discovered entity, in this case – an item, we can use the selectDiscoveryRule and selectItemDiscovery parameters.
While selectDiscoveryRule will provide the ID of the LLD rule that created the item, selectItemDiscovery can point us at the parent item prototype id from which the item was created, last discovery time, item prototype key, and more.
The example below will return the item details and will also provide the LLD rule and Item prototype IDs, the time when the lost item will be deleted and the last time the item was discovered:
{ "jsonrpc": "2.0", "method": "item.get", "params": { "itemids":"36717", "selectDiscoveryRule":"1", "selectItemDiscovery":["lastcheck","ts_delete","parent_itemid"] }, "auth":"xxxxxx", "id": 1 }
5. Searching through the matched entities with search parameters
Zabbix API provides a couple of standard parameters for performing a search. With search parameter, we can search string or text fields and try to find objects based on a single or multiple entries. searchByAny parameter is capable of extending the search – if you set this as true, we will search by ANY of the criteria in the search array, instead of trying to find an entity that matches ALL of them (default behavior).
The following API call will find items that match agent and Zabbix keys on a particular template:
{ "jsonrpc": "2.0", "method": "item.get", "params": { "output": "extend", "templateids": "10001", "search": { "key_": ["agent.","zabbix"] }, "searchByAny":"true", "sortfield": "name" }, "auth": "xxxxxx", "id": 1 }
These were but a few examples of what can be done with the Zabbix API. If you wish to get more hands-on practical experience under the guidance of a Zabbix certified trainer – the official Automation and integration with Zabbix API one-day training courses cover many other use cases and can help you establish a strong knowledge-base which can be leveraged to automate your Zabbix workflows by using Zabbix API.
Feel free to take the above examples, change them around so they fit your use case and you should be able to quite easily implement them in your environment. There are many other use cases that we might potentially cover down the line – if you have a specific API use case that you wish for us to cover, feel free to leave a comment under this post and we just might cover it in one of the upcoming blog posts!