Here’s a bootstrap C function for Zabbix Discovery rules.

I’m often writing custom discovery (and standard check) functions for the Windows Zabbix agent instead of using external script. It is faster and more efficient than calling external scripts but also some challenges have been too difficult without native API access (e.g. finding the GUID of a GPT disk).

With each new function I’ve been referencing old samples for the basic conventions of Zabbix item function so I’ve taken the time to write a template and I hope it will be of benefit to you also.

If you’re creating a new C file for your function, make sure to include it in build/win32/project/ or the appropriate files.

#include "common.h"
#include "sysinfo.h"
#include "log.h"
#include "zbxjson.h"
 * Custom key custom.discovery
 * Replace this section with the details of your custom item check.
 * Use this function as a template for custom item checks.
 * The `zbx_json_*` functions are only required for Discovery rules.
 * Be sure to change all function name, parameter and output
 * field names as required.
 * Your function name should be declared in `include/sysinfo.h` after line 201.
 * Your item check key needs to be declared added to `parameters_specific[]` in
 * `src/libs/zbxsysinfo/win32.h` (for Windows) or equivelent.
 * Returns:
 * {
 *        "data":[
 *                {
 *                        "{#MACRO}":"Some value"]}]}
    int        ret = SYSINFO_RET_FAIL;            // Request result code
    const char    *__function_name = "CUSTOM_ITEM";    // Function name for log file
    char    *param;                    // Request parameter
    struct    zbx_json j;                // JSON response for discovery rule
    zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
     * Parse agent request
    // Validate parameter count
    if (2 != request->nparam)
    goto clean;
    // Get and validate first parameter
    param = get_rparam(request, 0);
    if(NULL == param || '\0' == *param)
    goto clean;
    // Create JSON array of discovered objects
    zbx_json_init(&j, ZBX_JSON_STAT_BUF_LEN);
    zbx_json_addarray(&j, ZBX_PROTO_TAG_DATA);
     * DO THINGS
     * Add JSON object and properties for each discovered asset
    zbx_json_addobject(&j, NULL);
    zbx_json_addstring(&j, "{#MACRO}", "Some value", ZBX_JSON_TYPE_STRING);
    // Finalize JSON response
    SET_STR_RESULT(result, strdup(j.buffer));
    // Success?
    ret = SYSINFO_RET_OK;
     * Free allocated memory and handles
    zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name);
    return ret;