源码分析Zabbix客户端如何向服务端发起请求

简介: 源码分析Zabbix客户端如何向服务端发起请求

zabbix提供的请求方法

zabbix_sender

在源码的src\zabbix_sender\win32\zabbix_sender.c中,定义了zabbix_sender_send_values方法来发送请求

zabbix_sender_send_values

函数声明为:

int zabbix_sender_send_values(const char *address, unsigned short port, const char *source,
    const zabbix_sender_value_t *values, int count, char **result)

这个函数是 Zabbix Sender 库中实现向 Zabbix 服务器发送请求的主要功能代码。以下是函数中每一个参数的作用以及函数主要实现的功能:

  • address: 要发送数据的 Zabbix 服务器的 IP 地址或主机名。
  • port: Zabbix 服务器的端口号。
  • source: 发送数据的源地址。
  • values: 一个指向 zabbix_sender_value_t 结构体数组的指针,包含要发送的数据的信息,包括主机名、键和值。
  • count: 要发送的数据项的数量。
  • result: 一个指向指针的指针,用于存储函数执行结果的字符串。

函数主要实现的功能包括:

  1. 参数检查:检查 address 不为 NULL,count 大于 1。
  2. 创建或清理用于存储服务器地址信息的数据结构。
  3. 构建 JSON 数据:使用 zbx_json 相关函数构建要发送的 JSON 数据,其中包括主机名、键和值。
  4. 设置 TLS 连接配置:初始化一个 zbx_config_tls_t 结构体,并将连接模式设置为 ZBX_TCP_SEC_UNENCRYPTED
  5. 连接到 Zabbix 服务器:使用 zbx_connect_to_server 函数连接到 Zabbix 服务器,其中包括服务器地址、端口、超时等信息。
  6. 发送数据:使用 zbx_tcp_send 函数发送构建好的 JSON 数据。
  7. 接收响应:使用 zbx_tcp_recv 函数接收来自服务器的响应。
  8. 存储响应:将服务器的响应存储在 result 指针指向的位置。
  9. 关闭连接:使用 zbx_tcp_close 函数关闭与服务器的连接。
  10. 处理错误:如果发生错误,将错误信息存储在 result 中。

总体而言,该函数的目标是构建一个符合 Zabbix Sender 协议的 JSON 数据,然后通过 TCP 连接将其发送到指定的 Zabbix 服务器。函数返回执行结果,通过 result 参数传递响应或错误信息。

zbx_connect_to_server

这个函数是 Zabbix Sender 库中用于与 Zabbix 服务器建立连接的关键功能代码。以下是函数中每一个参数的作用以及函数主要实现的功能:

int zbx_connect_to_server(zbx_socket_t *sock, const char *source_ip, zbx_vector_ptr_t *addrs, int timeout,
                           int connect_timeout, int retry_interval, int level, const zbx_config_tls_t *config_tls)
  • sock: 一个指向 zbx_socket_t 结构体的指针,用于存储与服务器建立的连接信息。
  • source_ip: 发起连接的源 IP 地址。
  • addrs: 一个指向 zbx_vector_ptr_t 结构体的指针,其中存储了要连接的服务器的地址信息。
  • timeout: 连接超时时间,单位为秒。
  • connect_timeout: 建立连接的超时时间,单位为秒。
  • retry_interval: 如果连接失败,重试连接的时间间隔,单位为秒。
  • level: 日志级别,用于记录连接相关的日志。
  • config_tls: 一个指向 zbx_config_tls_t 结构体的指针,包含有关 TLS 连接的配置信息。

函数主要实现的功能包括:

  1. 根据 TLS 连接模式配置 tls_arg1tls_arg2 的值,以便传递给连接函数。
  2. 调用 zbx_tcp_connect_failover 函数进行连接,其中包括连接重试逻辑和 TLS 配置信息。
  3. 如果连接失败,根据 retry_interval 进行重试。在重试期间,函数会记录连接状态的警告日志。
  4. 如果连接成功,将连接信息存储在 sock 指针指向的结构体中。

总体而言,该函数的目标是与 Zabbix 服务器建立连接。如果连接失败,可以选择在指定的时间间隔内进行重试。函数的执行结果通过返回值传递。如果连接成功,返回 SUCCEED;如果连接失败,返回 FAIL

发起请求的例子

build\win32\examples\zabbix_sender\sender.c

在zabbix的源码中,提供了向zabbix服务端发起请求的例子代码,如下:

int main(int argc, char *argv[])
{
  if (5 == argc)
  {
    char      *result = NULL;
    zabbix_sender_info_t  info;
    zabbix_sender_value_t value = {argv[2], argv[3], argv[4]};
    int     response;
    WSADATA     sockInfo;

    if (0 != WSAStartup(MAKEWORD(2, 2), &sockInfo))
    {
      printf("Cannot initialize Winsock DLL\n");
      return EXIT_FAILURE;
    }

    /* send one value to the argv[1] IP address and the default trapper port 10051 */
    if (-1 == zabbix_sender_send_values(argv[1], 10051, NULL, &value, 1, &result))
    {
      printf("sending failed: %s\n", result);
    }
    else
    {
      printf("sending succeeded:\n");

      /* parse the server response */
      if (0 == zabbix_sender_parse_result(result, &response, &info))
      {
        printf("  response: %s\n", 0 == response ? "success" : "failed");
        printf("  info from server: \"processed: %d; failed: %d; total: %d; seconds spent: %lf\"\n",
            info.total - info.failed, info.failed, info.total, info.time_spent);
      }
      else
        printf("  failed to parse server response\n");
    }

    /* free the server response */
    zabbix_sender_free_result(result);
    while (0 == WSACleanup());
  }
  else
  {
    printf("Simple zabbix_sender implementation with zabbix_sender library\n\n");
    printf("usage: %s <server> <hostname> <key> <value>\n\n", argv[0]);
    printf("Options:\n");
    printf("  <server>    Hostname or IP address of Zabbix server\n");
    printf("  <hostname>  Host name\n");
    printf("  <key>       Item key\n");
    printf("  <value>     Item value\n");
  }

  return EXIT_SUCCESS;
}

里面包含了一个main函数,这个main函数是Zabbix的一部分实现,具有以下功能:

  1. 检查程序是否使用确切的5个命令行参数调用(argc是参数计数)。
  2. 如果有5个参数,它会初始化一些变量,包括一个结构(zabbix_sender_value_t),用于存储要发送的数据的信息。
  3. 使用WSAStartup初始化Winsock(Windows套接字)。这对于在Windows上进行网络操作是必要的。
  4. 调用zabbix_sender_send_values向Zabbix服务器发送一个值。服务器的IP地址在argv[1]中指定,默认的trapper端口设置为10051。
  5. 如果发送值失败,它会打印错误消息。如果成功,它会打印成功消息。
  6. 使用zabbix_sender_parse_result解析服务器的响应,并打印关于响应的信息,包括是否成功,已处理和失败的值的数量,总值的数量以及花费的时间。
  7. 使用zabbix_sender_free_result释放用于服务器响应的内存。
  8. 使用WSACleanup清理Winsock。
  9. 如果没有确切的5个参数,它会打印一个使用消息,解释如何使用程序。

总之,这个程序期望使用5个命令行参数调用,并使用Zabbix发送器库向Zabbix服务器发送一个值。如果成功,它会打印有关服务器响应的信息。如果参数不足,它会打印一个使用消息。

在这个main函数中,利用zabbix_sender_send_values向zabbix服务器发送了一个值。

也就是说,zabbix客户端服务端是通过socket进行的交互。这也是一种远程过程调用的方式。

目录
相关文章
|
2月前
|
监控 关系型数据库 Linux
|
6月前
|
监控 网络协议 Unix
zabbix通过agent客户端监控主机
zabbix通过agent客户端监控主机
|
9月前
|
监控
Zabbix实战之客户端自动发现
Zabbix实战之客户端自动发现
103 0
|
9月前
|
存储 监控 数据可视化
Zabbix-客户端部署全过程
客户端部署全过程
194 0
|
9月前
|
监控 Windows
Zabbix监控Windows客户端设置
Zabbix监控Windows客户端设置
129 0
|
9月前
|
监控 安全 Linux
Zabbix-客户端部署
Zabbix-客户端部署
116 0
|
监控 Linux 网络安全
【zabbix教程三】——centos7 安装zabbix客户端并监控
【zabbix教程三】——centos7 安装zabbix客户端并监控
301 0
【zabbix教程三】——centos7 安装zabbix客户端并监控
|
监控 关系型数据库 MySQL
【zabbix教程二】——Centos7 安装zabbix3.07服务端
【zabbix教程二】——Centos7 安装zabbix3.07服务端
181 0
【zabbix教程二】——Centos7 安装zabbix3.07服务端
|
监控 关系型数据库 MySQL
【zabbix教程八】——Centos7 安装zabbix3.07服务端 补充
【zabbix教程八】——Centos7 安装zabbix3.07服务端 补充
96 0
【zabbix教程八】——Centos7 安装zabbix3.07服务端 补充
|
3月前
|
存储 SQL 监控
修改Zabbix源码实现监控数据双写,满足业务需求!
虽然对接Elasticsearch后有诸多好处,但是它不往数据库写历史数据了,同时还不再计算趋势数据了。有这么一个场景...
修改Zabbix源码实现监控数据双写,满足业务需求!