如何从其他应用程序读取ganglia信息?

2024-03-28 10:49:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地在我的集群上安装和配置Ganglia。我不想只看到GangliaWeb界面上的所有性能数据,而是想从其他应用程序(应用程序可能是基于Java或Python的)读取集群信息。我不知道这是否可能。在

有没有API可以读取Ganglia数据?在

为了测试Ganglia,我使用了telnet master 8649,Ganglia在控制台上向我展示了漂亮的XML文本。但是如何使用Java或Python来做同样的事情呢?我肯定可以使用套接字连接到8649,但在那之后,我需要向Ganglia守护进程发送一些东西吗?在


Tags: 数据文本masterapi信息应用程序界面集群
1条回答
网友
1楼 · 发布于 2024-03-28 10:49:31

我可以帮你了解这件事。但在此之前,我必须告诉你,我不是java程序员,而是C++程序员。所以,这意味着我可以让你知道ganglia中的工作原理,你可以在Java/Python中找到等价的方法来重写你想要的代码。在

请注意,ganglia中没有API可以实现您想要的功能。在

首先考虑以下神经节的设置,以正确理解:

ganglia minimal setup

GS1和GS2正在收集系统指标并将其提交给通用汽车。 因此,根据您的问题,如果您想通过您自己的基于Java/Python的应用程序收集所有这些度量,那么您可能必须在主服务器上安装该应用程序(即用您自己的应用程序替换GS)。在

GS1和GS2通过UDP单播信道或UDP多播信道发送所有收集到的度量。建议在每个gmond.conf公司更易于扩展。在

我不会在GS1和GS2上讨论太多,因为你的问题更多的是用你自己的工具取代通用汽车。在

GM大量使用两个重要的库来建立UDP连接并将数据转换为自己可读的格式。它们是APR(Apache可移植运行时)用于建立UDP连接并执行相关活动,XDR(外部数据表示)用于跨网络发送数据并执行RPC。在

首先需要在Java和Python中找到APR和XDR等价的库。XDR已经在Java中可用,APR可以由您自己的基本实现来代替,以执行网络间的操作(即创建UDP套接字等)。在

打开ganglia的gmond.c源文件并转到第1436行。你会发现一个C函数:

static void process_udp_recv_channel(const apr_pollfd_t *desc, apr_time_t now)。在

此功能主要执行“建立UDP连接”和“将数据转换为可读格式”活动。在

上述函数的调用流程如下:
Call flow

现在,让我们扩展1436行的函数以了解更多信息。在

此函数中的第一个参数携带网络参数,如IP、端口等。结构在下面展开。在Java中也可以找到类似的对象。在

struct apr_pollfd_t {
    apr_pool_t *p;              /**< associated pool */
    apr_datatype_e desc_type;   /**< descriptor type */
    apr_int16_t reqevents;      /**< requested events */
    apr_int16_t rtnevents;      /**< returned events */
    apr_descriptor desc;        /**< @see apr_descriptor */
    void *client_data;          /**< allows app to associate context */
};

如果SFLOW被禁用,则第二个参数与此无关。在

所以,从创建APR池、UDP连接等开始

^{pr2}$

所有变量声明都可以在扩展函数的开头找到(第1439行到1456行)。在

然后,创建XDR流:

xdrmem_create(&x, buf, max_udp_message_len, XDR_DECODE);

刷新保存元数据和度量值的结构的数据:

memset( &fmsg, 0, sizeof(Ganglia_metadata_msg));
memset( &vmsg, 0, sizeof(Ganglia_value_msg));

fmsg(Ganglia_metadata_msg)和vmsg(Ganglia_value_msg)结构定义可以在gm_protocol.h头文件中找到。用Java重写它们。在

然后,确定收到的消息是“元数据”还是“度量值”。在

xdr_Ganglia_msg_formats(&x, &id); // this function is located in the source file gm_protocol_xdr.c and this file is generated by rpcgen.

注意:rpcgen是一个rpc编译器,它的解释可以在question中找到。在

注意:这里是gm_protocol_xdr.c的链接。在

这里,idenum,其声明如下所示:

enum Ganglia_msg_formats {
    gmetadata_full = 128,
    gmetric_ushort = 128 + 1,
    gmetric_short = 128 + 2,
    gmetric_int = 128 + 3,
    gmetric_uint = 128 + 4,
    gmetric_string = 128 + 5,
    gmetric_float = 128 + 6,
    gmetric_double = 128 + 7,
    gmetadata_request = 128 + 8,
};
typedef enum Ganglia_msg_formats Ganglia_msg_formats;

根据id的值,可以确定数据包的值类型。 为此,这个函数调用另一个函数(实际上是由rpcgen生成的)来确定包的值类型,如果找到了,它也会将其转换为人类可读的格式。在

其功能是:

xdr_Ganglia_value_msg(&x, &vmsg);

您可以在第275行的gm_protocol_xdr.c中找到该函数的完整展开。在

以后你想用这些包做什么都行。在

最后,必须释放所有分配的XDR变量和APR池。在

我希望这能给你一个公平的想法,让你从自己的申请开始。在

相关问题 更多 >