One can send a bunch of key => values to zabbix with the zabbix-trapper items.

Using this nice article  as a base I have packed everthing in a class so that you can use it:

Example usage:

values = {
  total_ram: 0,
  wrong_data_center: 0,
  linode_hosts: 0,
  missing_from_zabbix: 0,
  missing_from_graylog: 0,
}

zabbix_sender = ZabbixSender.new(Figaro['zabbix_server'])
zabbix_sender.message('super_druper_hostname', values)
require 'json'

class ZabbixSender

  def initialize zabbix_host
    @zabbix_host = zabbix_host
  end

  def message hostname, values
    values_with_host = with_host(hostname, values)

    params = {
      "request" => "sender data",
      "data" => values_with_host,
    }

    body = JSON.generate params
    data_length = body.bytesize
    data_header = "ZBXD\1".encode("ascii") + \
    [data_length].pack("i") + \
    "\x00\x00\x00\x00"
    data_to_send = data_header + body

    send data_to_send
  end

  private

  def with_host hostname, hash
    values = []

    hash.each_pair do |key, value|
      values << {
        key: key,
        value: value,
        host: hostname,
      }
    end
    values
  end

  def send data_to_send
    socket = TCPSocket.new(@zabbix_host, 10051)
    socket.write data_to_send.to_s
    response_header = socket.recv(5)
    if not response_header == "ZBXD\1"
      puts "response: #{response_header}"
      raise 'Got invalid response'
    end

    response_data_header = socket.recv(8)
    response_length = response_data_header[0,4].unpack("i")[0]
    response_raw = socket.recv(response_length)
    socket.close
    response = JSON.load(response_raw)
  end

end