zabbix-java-gatewayにJavaのSocketから接続し、JavaアプリケーションからJMXを取得する方法です。

package zabbix_java_gateway_client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HexFormat;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class ZabbixJavaGatewayClient {
	public static void main(String args[]) {
		exe();
	}
	
	public static void exe() {
//		14:17:31.169064 lo    In  IP localhost.51760 > localhost.10052: Flags [P.], seq 1:191, ack 1, win 512, options [nop,nop,TS val 1276167244 ecr 1276167244], length 190
//        0x0000:  4500 00f2 2b3e 4000 4006 10c6 7f00 0001  E...+>@.@.......
//        0x0010:  7f00 0001 ca30 2744 5f1e f5d9 5351 96eb  .....0'D_...SQ..
//        0x0020:  8018 0200 fee6 0000 0101 080a 4c10 c44c  ............L..L
//        0x0030:  4c10 c44c 5a42 5844 01b1 0000 0000 0000  L..LZBXD........
//        0x0040:  007b 2272 6571 7565 7374 223a 226a 6176  .{"request":"jav
//        0x0050:  6120 6761 7465 7761 7920 6a6d 7822 2c22  a.gateway.jmx","
//        0x0060:  6a6d 785f 656e 6470 6f69 6e74 223a 2273  jmx_endpoint":"s
//        0x0070:  6572 7669 6365 3a6a 6d78 3a72 6d69 3a2f  ervice:jmx:rmi:/
//        0x0080:  2f2f 6a6e 6469 2f72 6d69 3a2f 2f31 3932  //jndi/rmi://192
//        0x0090:  2e31 3638 2e35 362e 3135 303a 3132 3334  .168.56.150:1234
//        0x00a0:  352f 6a6d 7872 6d69 222c 226b 6579 7322  5/jmxrmi","keys"
//        0x00b0:  3a5b 226a 6d78 5b5c 226a 6176 612e 6c61  :["jmx[\"java.la
//        0x00c0:  6e67 3a74 7970 653d 4d65 6d6f 7279 5c22  ng:type=Memory\"
//        0x00d0:  2c5c 2248 6561 704d 656d 6f72 7955 7361  ,\"HeapMemoryUsa
//        0x00e0:  6765 2e63 6f6d 6d69 7474 6564 5c22 5d22  ge.committed\"]"
//        0x00f0:  5d7d                                     ]}
		//上は、zabbix=>zabbix-java-gateway間をtcpdumpしたもの
		
		byte zbxf[] = {'Z','B','X','D',0x01};
		
		String hexString = HexFormat.of().formatHex(zbxf);
		System.out.println(hexString); 
			
		String jmxRequest = createJmxRequest();
        byte mxRequestBytes[] = jmxRequest.getBytes();
        System.out.println(HexFormat.of().formatHex(mxRequestBytes));
        
        int size = zbxf.length + 8 + mxRequestBytes.length;
        ByteBuffer reqDataByteBuf = ByteBuffer.allocate(size);
        reqDataByteBuf.put(zbxf);
        
        ByteBuffer buffer = ByteBuffer.allocate(8);
        buffer.order(ByteOrder.LITTLE_ENDIAN).putInt( mxRequestBytes.length );
        reqDataByteBuf.put(buffer.array());
        
        reqDataByteBuf.put(mxRequestBytes);
        
        byte bytesForZabbixJavaGateway[] = reqDataByteBuf.array();
        System.out.println(HexFormat.of().formatHex(bytesForZabbixJavaGateway));
        
        try {
            //zabbix-java-gatewayに送信する
			sendData(bytesForZabbixJavaGateway);
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
	
	public static void sendData(byte[] bytesForZabbixJavaGateway) throws IOException {
        Socket socket = null;
        OutputStream os = null;
        try {
            InetAddress serverIp = InetAddress.getByName("192.168.56.150");
            int port = 10052;
            socket = new Socket(serverIp, port);

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            os = socket.getOutputStream();
            os.write(bytesForZabbixJavaGateway);

            System.out.println("[サーバーからの応答]" + reader.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	os.close();
            //4,接続を遮断する
            socket.close();   
        }
    }

	public static String createJmxRequest() {
		Gson gson = new GsonBuilder()
			    .setDateFormat("yyyy-MM-dd HH:mm:ss")  // 日付フォーマットの指定
			    .serializeNulls()                     	  // null値も含めてシリアライズ
			    .setPrettyPrinting()                    // 整形されたJSONを出力
			    .disableHtmlEscaping()                // HTML特殊文字のエスケープを無効化
			    .create();
		
		List<String> jmxList = new ArrayList<>();
		jmxList.add("jmx[\"java.lang:type=Memory\",\"HeapMemoryUsage.used\"]");
		jmxList.add("jmx[\"java.lang:type=Memory\",\"HeapMemoryUsage.committed\"]");
		
		User user = new User("service:jmx:rmi:///jndi/rmi://192.168.56.150:12345/jmxrmi", jmxList);
		String json = gson.toJson(user);
		System.out.println(json);
		
		return json;
	}
}

class User {
	private final String request = "java gateway jmx";
	private String jmx_endpoint;
    private List<String> keys;
	public User(String jmx_endpoint_, List<String> keys_) {
		this.jmx_endpoint = jmx_endpoint_;
		this.keys = keys_;
	}
	public String getJmx_endpoint() {
		return jmx_endpoint;
	}
	public void setJmx_endpoint(String jmx_endpoint) {
		this.jmx_endpoint = jmx_endpoint;
	}
	public List<String> getKeys() {
		return keys;
	}
	public void setKeys(List<String> keys) {
		this.keys = keys;
	}
	public String getRequest() {
		return request;
	}	   
}

投稿者 MJfr6SPbeaJRee8Y