다른 응용 프로그램에서 신경절 정보를 읽는 방법은 무엇입니까?

셰 카르

클러스터에 Ganglia를 설치하고 구성했습니다. ganglia 웹 인터페이스에서 모든 성능 데이터를보고 싶지 않고 대신 다른 애플리케이션에서 클러스터 정보를 읽고 싶습니다 (애플리케이션은 Java 또는 Python 기반 일 수 있음). 나는 그것이 가능한지 아닌지를 찾을 수 없습니다.

Ganglia 데이터를 읽을 수있는 API가 있습니까?

Ganglia를 테스트하기 위해 사용 telnet master 8649했고 Ganglia는 콘솔에 멋진 XML 텍스트를 보여주었습니다. 그러나 Java 또는 Python을 사용하여 동일한 작업을 어떻게 수행합니까? 소켓을 사용하여 8649에 확실히 연결할 수 있지만 그 후에 Ganglia 데몬에 무언가를 보내야합니까?

Rohit

이에 대한 통찰력을 얻을 수 있도록 도와 드릴 수 있습니다. 하지만 그 전에 저는 Java 프로그래머가 아니라 C / C ++ 프로그래머입니다. 즉, ganglia에서 어떻게 작동하는지 알려줄 수 있으며 Java / Python에서 원하는 코드를 다시 작성하는 동등한 메서드를 찾을 수 있습니다.

원하는 것을 달성하기위한 ganglia에는 API가 없습니다.

먼저 제대로 이해하기 위해 아래의 신경절 설정을 고려하십시오.

신경절 최소 설정

GS1과 GS2는 시스템 메트릭스를 수집하여 GM에 푸시하고 있습니다. 따라서 질문에 따라 자체 Java / Python 기반 애플리케이션에서 이러한 모든 메트릭을 수집하려면 마스터 서버에 애플리케이션을 설치해야 할 수 있습니다 (예 : GS를 자신의 애플리케이션으로 대체).

GS1 및 GS2는 수집 된 모든 메트릭을 UDP 유니 캐스트 채널 또는 UDP 멀티 캐스트 채널로 보냅니다. 보다 쉬운 확장 성을 위해 모든 gmond.conf에서 UDP 유니 캐스트를 활성화하는 것이 좋습니다.

귀하의 질문은 GM을 귀하의 도구로 대체하는 것에 관한 것이기 때문에 GS1 및 GS2에 대해서는 많이 논의하지 않을 것입니다.

GM은 UDP 연결을 설정하고 데이터를 자체 판독 가능한 형식으로 변환하기 위해 두 개의 중요한 라이브러리를 많이 사용합니다. UDP 연결을 설정하고 관련 활동을 수행 하는 APR (Apache Portable Runtime)과 네트워크를 통해 데이터를 전송하고 RPC를 수행하는 XDR (External Data Representation)입니다.

먼저 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에서도 유사한 객체를 찾을 수 있습니다.

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 연결 등을 만드는 것으로 시작하십시오.

  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 스트림을 만듭니다.

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 컴파일러 이며이 질문 에서 설명을 찾을 수 있습니다 .

참고 : 다음은 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 풀을 해제해야합니다.

나는 이것이 당신 자신의 응용 프로그램으로 시작하는 공정한 아이디어를 제공하기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다른 응용 프로그램에서 QTextEdit 콘텐츠를 읽는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램이 macOS에서 마우스 이벤트를 수신하지 못하도록 방지하는 방법은 무엇입니까?

분류에서Dev

Android의 특정 응용 프로그램에서 다중 열기를 피하는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램에 웹캠 효과를 적용하는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램에 웹캠 효과를 적용하는 방법은 무엇입니까?

분류에서Dev

Erlang 응용 프로그램에서 종속성의 코드 경로를로드하는 올바른 방법은 무엇입니까?

분류에서Dev

명령 줄에서 응용 프로그램의 경로를 찾는 방법은 무엇입니까?

분류에서Dev

응용 프로그램에서 SIM 카드를 다시 초기화하는 방법은 무엇입니까?

분류에서Dev

응용 프로그램에서 SharedPreferences를 얻는 방법은 무엇입니까?

분류에서Dev

동일한 사용자로 실행되는 다른 응용 프로그램에서 홈 폴더 파일을 보호하는 방법은 무엇입니까?

분류에서Dev

다른 출력 장치에서 다른 응용 프로그램의 오디오를 재생하는 방법은 무엇입니까?

분류에서Dev

Angular js를 사용하여 다중 페이지 응용 프로그램에서 두 개의 다른 헤더를 만드는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램의 사전 빌드 프로세스에서 cmd 응용 프로그램을 호출하는 방법은 무엇입니까?

분류에서Dev

UI5 1.38에서 다른 응용 프로그램의 구성 요소를 재사용하는 방법은 무엇입니까?

분류에서Dev

다른 작업 공간에서 응용 프로그램을 시작하는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램에서 Chrome 창을 닫는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램의 버전 번호를 얻는 방법은 무엇입니까?

분류에서Dev

각도 응용 프로그램이 다른 응용 프로그램에서 각도 모듈을 지연로드하는 방법은 무엇입니까?

분류에서Dev

다른 레거시 Windows 응용 프로그램에 대해 다른 ANSI 코드 페이지를 설정하는 방법은 무엇입니까?

분류에서Dev

내 응용 프로그램에서 다른 응용 프로그램의 숨겨진 창을 표시하는 방법은 무엇입니까?

분류에서Dev

다른 응용 프로그램에서 시작된 응용 프로그램을 디버깅하는 방법은 무엇입니까? (VB6)

분류에서Dev

Qt에서 다른 응용 프로그램의 출력 비디오를 표시하는 방법은 무엇입니까?

분류에서Dev

한 콘솔 응용 프로그램에서 텍스트 파일을 읽은 다음 다른 파일에 쓰는 방법은 무엇입니까?

분류에서Dev

시작 응용 프로그램의 순서를 변경하는 방법은 무엇입니까?

분류에서Dev

Windows에서 응용 프로그램별로 화면 밝기를 설정하는 방법은 무엇입니까?

분류에서Dev

Servlet 프로그램에서 올바른 파일 경로를 얻는 방법은 무엇입니까?

분류에서Dev

탈옥 된 iPhone에서 SpringBoard 또는 다른 응용 프로그램에서 액세스 할 수있는 전역 환경 변수를 만드는 방법은 무엇입니까?

분류에서Dev

WPF에서 응용 프로그램의 다양한 상태에 대한 신호등 색상을 구현하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

특정 응용 프로그램에서 소리를 비활성화하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    다른 응용 프로그램에서 QTextEdit 콘텐츠를 읽는 방법은 무엇입니까?

  2. 2

    다른 응용 프로그램이 macOS에서 마우스 이벤트를 수신하지 못하도록 방지하는 방법은 무엇입니까?

  3. 3

    Android의 특정 응용 프로그램에서 다중 열기를 피하는 방법은 무엇입니까?

  4. 4

    다른 응용 프로그램에 웹캠 효과를 적용하는 방법은 무엇입니까?

  5. 5

    다른 응용 프로그램에 웹캠 효과를 적용하는 방법은 무엇입니까?

  6. 6

    Erlang 응용 프로그램에서 종속성의 코드 경로를로드하는 올바른 방법은 무엇입니까?

  7. 7

    명령 줄에서 응용 프로그램의 경로를 찾는 방법은 무엇입니까?

  8. 8

    응용 프로그램에서 SIM 카드를 다시 초기화하는 방법은 무엇입니까?

  9. 9

    응용 프로그램에서 SharedPreferences를 얻는 방법은 무엇입니까?

  10. 10

    동일한 사용자로 실행되는 다른 응용 프로그램에서 홈 폴더 파일을 보호하는 방법은 무엇입니까?

  11. 11

    다른 출력 장치에서 다른 응용 프로그램의 오디오를 재생하는 방법은 무엇입니까?

  12. 12

    Angular js를 사용하여 다중 페이지 응용 프로그램에서 두 개의 다른 헤더를 만드는 방법은 무엇입니까?

  13. 13

    다른 응용 프로그램의 사전 빌드 프로세스에서 cmd 응용 프로그램을 호출하는 방법은 무엇입니까?

  14. 14

    UI5 1.38에서 다른 응용 프로그램의 구성 요소를 재사용하는 방법은 무엇입니까?

  15. 15

    다른 작업 공간에서 응용 프로그램을 시작하는 방법은 무엇입니까?

  16. 16

    다른 응용 프로그램에서 Chrome 창을 닫는 방법은 무엇입니까?

  17. 17

    다른 응용 프로그램의 버전 번호를 얻는 방법은 무엇입니까?

  18. 18

    각도 응용 프로그램이 다른 응용 프로그램에서 각도 모듈을 지연로드하는 방법은 무엇입니까?

  19. 19

    다른 레거시 Windows 응용 프로그램에 대해 다른 ANSI 코드 페이지를 설정하는 방법은 무엇입니까?

  20. 20

    내 응용 프로그램에서 다른 응용 프로그램의 숨겨진 창을 표시하는 방법은 무엇입니까?

  21. 21

    다른 응용 프로그램에서 시작된 응용 프로그램을 디버깅하는 방법은 무엇입니까? (VB6)

  22. 22

    Qt에서 다른 응용 프로그램의 출력 비디오를 표시하는 방법은 무엇입니까?

  23. 23

    한 콘솔 응용 프로그램에서 텍스트 파일을 읽은 다음 다른 파일에 쓰는 방법은 무엇입니까?

  24. 24

    시작 응용 프로그램의 순서를 변경하는 방법은 무엇입니까?

  25. 25

    Windows에서 응용 프로그램별로 화면 밝기를 설정하는 방법은 무엇입니까?

  26. 26

    Servlet 프로그램에서 올바른 파일 경로를 얻는 방법은 무엇입니까?

  27. 27

    탈옥 된 iPhone에서 SpringBoard 또는 다른 응용 프로그램에서 액세스 할 수있는 전역 환경 변수를 만드는 방법은 무엇입니까?

  28. 28

    WPF에서 응용 프로그램의 다양한 상태에 대한 신호등 색상을 구현하는 가장 좋은 방법은 무엇입니까?

  29. 29

    특정 응용 프로그램에서 소리를 비활성화하는 방법은 무엇입니까?

뜨겁다태그

보관