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
: 一个指向指针的指针,用于存储函数执行结果的字符串。
函数主要实现的功能包括:
- 参数检查:检查
address
不为 NULL,count
大于 1。 - 创建或清理用于存储服务器地址信息的数据结构。
- 构建 JSON 数据:使用
zbx_json
相关函数构建要发送的 JSON 数据,其中包括主机名、键和值。 - 设置 TLS 连接配置:初始化一个
zbx_config_tls_t
结构体,并将连接模式设置为ZBX_TCP_SEC_UNENCRYPTED
。 - 连接到 Zabbix 服务器:使用
zbx_connect_to_server
函数连接到 Zabbix 服务器,其中包括服务器地址、端口、超时等信息。 - 发送数据:使用
zbx_tcp_send
函数发送构建好的 JSON 数据。 - 接收响应:使用
zbx_tcp_recv
函数接收来自服务器的响应。 - 存储响应:将服务器的响应存储在
result
指针指向的位置。 - 关闭连接:使用
zbx_tcp_close
函数关闭与服务器的连接。 - 处理错误:如果发生错误,将错误信息存储在
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 连接的配置信息。
函数主要实现的功能包括:
- 根据 TLS 连接模式配置
tls_arg1
和tls_arg2
的值,以便传递给连接函数。 - 调用
zbx_tcp_connect_failover
函数进行连接,其中包括连接重试逻辑和 TLS 配置信息。 - 如果连接失败,根据
retry_interval
进行重试。在重试期间,函数会记录连接状态的警告日志。 - 如果连接成功,将连接信息存储在
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的一部分实现,具有以下功能:
- 检查程序是否使用确切的5个命令行参数调用(
argc
是参数计数)。 - 如果有5个参数,它会初始化一些变量,包括一个结构(
zabbix_sender_value_t
),用于存储要发送的数据的信息。 - 使用
WSAStartup
初始化Winsock(Windows套接字)。这对于在Windows上进行网络操作是必要的。 - 调用
zabbix_sender_send_values
向Zabbix服务器发送一个值。服务器的IP地址在argv[1]
中指定,默认的trapper端口设置为10051。 - 如果发送值失败,它会打印错误消息。如果成功,它会打印成功消息。
- 使用
zabbix_sender_parse_result
解析服务器的响应,并打印关于响应的信息,包括是否成功,已处理和失败的值的数量,总值的数量以及花费的时间。 - 使用
zabbix_sender_free_result
释放用于服务器响应的内存。 - 使用
WSACleanup
清理Winsock。 - 如果没有确切的5个参数,它会打印一个使用消息,解释如何使用程序。
总之,这个程序期望使用5个命令行参数调用,并使用Zabbix发送器库向Zabbix服务器发送一个值。如果成功,它会打印有关服务器响应的信息。如果参数不足,它会打印一个使用消息。
在这个main函数中,利用zabbix_sender_send_values
向zabbix服务器发送了一个值。
也就是说,zabbix客户端服务端是通过socket进行的交互。这也是一种远程过程调用的方式。