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;
}
}