首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从其他应用中读取ganglia信息?

如何从其他应用中读取ganglia信息?
EN

Stack Overflow用户
提问于 2014-07-10 11:20:28
回答 1查看 820关注 0票数 1

我已经成功地在集群上安装和配置了Ganglia。我不想只看到ganglia web接口上的所有性能数据,而是希望从其他应用程序(应用程序可能基于Java或Python )读取集群信息。我无法找到它是否可能。

是否有读取Ganglia数据的API?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 08:05:26

我可以帮你了解这件事。但在此之前,我必须告诉您,我不是Java程序员,而是一个C/C++程序员。因此,这意味着我可以让您知道ganglia是如何工作的,您可以在Java/ Python中找到类似的方法来重写您想要的代码。

请告知,在ganglia没有API来实现您想要的。

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

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

GS1和GS2通过UDP单播信道或UDP组播信道发送所有收集的度量。建议在每个gmond.conf中启用UDP单播,以便更容易地实现可伸缩性。

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

GM大量使用两个重要的库来建立UDP连接,并将数据转换成自己可读的格式。它们是用于建立UDP连接和执行相关活动的4月 (),以及用于跨网络发送数据和执行RPC的XDR (外部数据表示)。

您首先需要在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连接建立“和”将数据转换为可读格式“的活动。

上述函数的调用流程如下所示:

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

该函数中的第一个参数包含IP、端口等网络参数。您也可以在Java中找到类似的对象。

代码语言:javascript
运行
复制
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连接等开始。

代码语言:javascript
运行
复制
  socket         = desc->desc.s;
  channel       = desc->client_data;

  apr_pool_create(&p, global_context);
  status = apr_socket_addr_get(&remotesa, APR_LOCAL, socket);

  status = apr_sockaddr_info_get(&remotesa, NULL, remotesa->family, remotesa->port, 0, p);

  /* Grab the data */
  status = apr_socket_recvfrom(remotesa, socket, 0, buf, &len);
  if(status != APR_SUCCESS)
    {
      apr_pool_destroy(p);
      return;
    }  

  apr_sockaddr_ip_buffer_get(remoteip, 256, remotesa);

  /* Check the ACL */
  if(Ganglia_acl_action( channel->acl, remotesa) != GANGLIA_ACCESS_ALLOW)
    {
      apr_pool_destroy(p);
      return;
    }

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

然后,创建XDR流:

代码语言:javascript
运行
复制
xdrmem_create(&x, buf, max_udp_message_len, XDR_DECODE);

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

代码语言:javascript
运行
复制
memset( &fmsg, 0, sizeof(Ganglia_metadata_msg));
memset( &vmsg, 0, sizeof(Ganglia_value_msg));

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

然后,找出接收到的消息是“元数据”还是“度量值”。

代码语言:javascript
运行
复制
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编译器,它的解释可以在这个问题中找到。

注意:这是xdr.c的链接。

这里,id是一个enum,它的声明如下所示:

代码语言:javascript
运行
复制
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生成的)来确定数据包的值类型,如果找到,它也会将其转换为人类可读的格式。

其职能是:

代码语言:javascript
运行
复制
xdr_Ganglia_value_msg(&x, &vmsg);

您可以从第275行的xdr.c中找到该函数的全部扩展。

在此之后,您可以对这些包做您想做的任何事情。

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

我希望这给你一个公平的想法,从你自己的应用程序开始。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24675209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档