diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfo.java index a8148cf956a..e94727b2459 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfo.java @@ -21,6 +21,10 @@ package org.elasticsearch.action.admin.cluster.node.info; import org.elasticsearch.action.support.nodes.NodeOperationResponse; import org.elasticsearch.cluster.node.DiscoveryNode; +import org.elasticsearch.monitor.jvm.JvmInfo; +import org.elasticsearch.monitor.network.NetworkInfo; +import org.elasticsearch.monitor.os.OsInfo; +import org.elasticsearch.monitor.process.ProcessInfo; import org.elasticsearch.util.collect.ImmutableMap; import org.elasticsearch.util.io.stream.StreamInput; import org.elasticsearch.util.io.stream.StreamOutput; @@ -39,17 +43,26 @@ public class NodeInfo extends NodeOperationResponse { private Settings settings; + private OsInfo os; + + private ProcessInfo process; + + private JvmInfo jvm; + + private NetworkInfo network; + NodeInfo() { } - public NodeInfo(DiscoveryNode node, Map attributes, Settings settings) { - this(node, ImmutableMap.copyOf(attributes), settings); - } - - public NodeInfo(DiscoveryNode node, ImmutableMap attributes, Settings settings) { + public NodeInfo(DiscoveryNode node, ImmutableMap attributes, Settings settings, + OsInfo os, ProcessInfo process, JvmInfo jvm, NetworkInfo network) { super(node); this.attributes = attributes; this.settings = settings; + this.os = os; + this.process = process; + this.jvm = jvm; + this.network = network; } public ImmutableMap attributes() { @@ -68,6 +81,38 @@ public class NodeInfo extends NodeOperationResponse { return settings(); } + public OsInfo os() { + return this.os; + } + + public OsInfo getOs() { + return os(); + } + + public ProcessInfo process() { + return process; + } + + public ProcessInfo getProcess() { + return process(); + } + + public JvmInfo jvm() { + return jvm; + } + + public JvmInfo getJvm() { + return jvm(); + } + + public NetworkInfo network() { + return network; + } + + public NetworkInfo getNetwork() { + return network(); + } + public static NodeInfo readNodeInfo(StreamInput in) throws IOException { NodeInfo nodeInfo = new NodeInfo(); nodeInfo.readFrom(in); @@ -83,6 +128,18 @@ public class NodeInfo extends NodeOperationResponse { } attributes = builder.build(); settings = ImmutableSettings.readSettingsFromStream(in); + if (in.readBoolean()) { + os = OsInfo.readOsInfo(in); + } + if (in.readBoolean()) { + process = ProcessInfo.readProcessInfo(in); + } + if (in.readBoolean()) { + jvm = JvmInfo.readJvmInfo(in); + } + if (in.readBoolean()) { + network = NetworkInfo.readNetworkInfo(in); + } } @Override public void writeTo(StreamOutput out) throws IOException { @@ -93,5 +150,29 @@ public class NodeInfo extends NodeOperationResponse { out.writeUTF(entry.getValue()); } ImmutableSettings.writeSettingsToStream(settings, out); + if (os == null) { + out.writeBoolean(false); + } else { + out.writeBoolean(true); + os.writeTo(out); + } + if (process == null) { + out.writeBoolean(false); + } else { + out.writeBoolean(true); + process.writeTo(out); + } + if (jvm == null) { + out.writeBoolean(false); + } else { + out.writeBoolean(true); + jvm.writeTo(out); + } + if (network == null) { + out.writeBoolean(false); + } else { + out.writeBoolean(true); + network.writeTo(out); + } } } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/TransportNodesInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/TransportNodesInfo.java index 99a936b452b..0ca2bab6544 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/TransportNodesInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/cluster/node/info/TransportNodesInfo.java @@ -25,6 +25,7 @@ import org.elasticsearch.action.support.nodes.NodeOperationRequest; import org.elasticsearch.action.support.nodes.TransportNodesOperationAction; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterService; +import org.elasticsearch.monitor.MonitorService; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; import org.elasticsearch.util.MapBuilder; @@ -37,15 +38,19 @@ import java.util.List; import java.util.concurrent.atomic.AtomicReferenceArray; /** - * @author kimchy (Shay Banon) + * @author kimchy (shay.banon) */ public class TransportNodesInfo extends TransportNodesOperationAction { + private final MonitorService monitorService; + private volatile ImmutableMap nodeAttributes = ImmutableMap.of(); @Inject public TransportNodesInfo(Settings settings, ClusterName clusterName, ThreadPool threadPool, - ClusterService clusterService, TransportService transportService) { + ClusterService clusterService, TransportService transportService, + MonitorService monitorService) { super(settings, clusterName, threadPool, clusterService, transportService); + this.monitorService = monitorService; } public synchronized void putNodeAttribute(String key, String value) { @@ -92,7 +97,9 @@ public class TransportNodesInfo extends TransportNodesOperationAction { private final JvmMonitorService jvmMonitorService; - @Inject public MonitorService(Settings settings, MemoryMonitorService memoryMonitorService, JvmMonitorService jvmMonitorService) { + private final OsService osService; + + private final ProcessService processService; + + private final JvmService jvmService; + + private final NetworkService networkService; + + @Inject public MonitorService(Settings settings, MemoryMonitorService memoryMonitorService, JvmMonitorService jvmMonitorService, + OsService osService, ProcessService processService, JvmService jvmService, NetworkService networkService) { super(settings); this.memoryMonitorService = memoryMonitorService; this.jvmMonitorService = jvmMonitorService; + this.osService = osService; + this.processService = processService; + this.jvmService = jvmService; + this.networkService = networkService; + } + + public OsService osService() { + return this.osService; + } + + public ProcessService processService() { + return this.processService; + } + + public JvmService jvmService() { + return this.jvmService; + } + + public NetworkService networkService() { + return this.networkService; } @Override protected void doStart() throws ElasticSearchException { diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/jvm/JvmInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/jvm/JvmInfo.java index c7d2a8a2b27..b382c3a5e0c 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/jvm/JvmInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/jvm/JvmInfo.java @@ -22,6 +22,8 @@ package org.elasticsearch.monitor.jvm; import org.elasticsearch.util.io.stream.StreamInput; import org.elasticsearch.util.io.stream.StreamOutput; import org.elasticsearch.util.io.stream.Streamable; +import org.elasticsearch.util.xcontent.ToXContent; +import org.elasticsearch.util.xcontent.builder.XContentBuilder; import java.io.IOException; import java.io.Serializable; @@ -34,7 +36,7 @@ import java.util.Map; /** * @author kimchy (shay.banon) */ -public class JvmInfo implements Streamable, Serializable { +public class JvmInfo implements Streamable, Serializable, ToXContent { private static JvmInfo INSTANCE; @@ -181,6 +183,16 @@ public class JvmInfo implements Streamable, Serializable { return systemProperties; } + @Override public void toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject("jvm"); + builder.field("pid", pid); + builder.field("vm_name", vmName); + builder.field("vm_version", vmVersion); + builder.field("vm_vendor", vmVendor); + builder.field("start_time", startTime); + builder.endObject(); + } + public static JvmInfo readJvmInfo(StreamInput in) throws IOException { JvmInfo jvmInfo = new JvmInfo(); jvmInfo.readFrom(in); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/NetworkInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/NetworkInfo.java index 3ab3ff5811a..9fe0b7f4857 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/NetworkInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/NetworkInfo.java @@ -22,6 +22,8 @@ package org.elasticsearch.monitor.network; import org.elasticsearch.util.io.stream.StreamInput; import org.elasticsearch.util.io.stream.StreamOutput; import org.elasticsearch.util.io.stream.Streamable; +import org.elasticsearch.util.xcontent.ToXContent; +import org.elasticsearch.util.xcontent.builder.XContentBuilder; import java.io.IOException; import java.io.Serializable; @@ -29,7 +31,7 @@ import java.io.Serializable; /** * @author kimchy (shay.banon) */ -public class NetworkInfo implements Streamable, Serializable { +public class NetworkInfo implements Streamable, Serializable, ToXContent { public static final Interface NA_INTERFACE = new Interface(); @@ -43,6 +45,24 @@ public class NetworkInfo implements Streamable, Serializable { return primaryInterface(); } + @Override public void toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject("network"); + if (primary != NA_INTERFACE) { + builder.startObject("primary_interface"); + builder.field("address", primary.address()); + builder.field("name", primary.name()); + builder.field("mac_address", primary.macAddress()); + builder.endObject(); + } + builder.endObject(); + } + + public static NetworkInfo readNetworkInfo(StreamInput in) throws IOException { + NetworkInfo info = new NetworkInfo(); + info.readFrom(in); + return info; + } + @Override public void readFrom(StreamInput in) throws IOException { primary = Interface.readNetworkInterface(in); } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/SigarNetworkProbe.java b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/SigarNetworkProbe.java index 30921d5c171..329215bd165 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/SigarNetworkProbe.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/network/SigarNetworkProbe.java @@ -46,8 +46,8 @@ public class SigarNetworkProbe extends AbstractComponent implements NetworkProbe NetworkInfo networkInfo = new NetworkInfo(); try { - NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(); - networkInfo.primary = new NetworkInfo.Interface(netInterfaceConfig.getName(), netInterfaceConfig.getAddress(), netInterfaceConfig.getAddress()); + NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(null); + networkInfo.primary = new NetworkInfo.Interface(netInterfaceConfig.getName(), netInterfaceConfig.getAddress(), netInterfaceConfig.getHwaddr()); } catch (SigarException e) { // ignore } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/os/OsInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/os/OsInfo.java index 16f15e322f9..674a56f89d3 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/os/OsInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/os/OsInfo.java @@ -23,6 +23,8 @@ import org.elasticsearch.util.SizeValue; import org.elasticsearch.util.io.stream.StreamInput; import org.elasticsearch.util.io.stream.StreamOutput; import org.elasticsearch.util.io.stream.Streamable; +import org.elasticsearch.util.xcontent.ToXContent; +import org.elasticsearch.util.xcontent.builder.XContentBuilder; import java.io.IOException; import java.io.Serializable; @@ -30,7 +32,7 @@ import java.io.Serializable; /** * @author kimchy (shay.banon) */ -public class OsInfo implements Streamable, Serializable { +public class OsInfo implements Streamable, Serializable, ToXContent { Cpu cpu = null; @@ -65,6 +67,35 @@ public class OsInfo implements Streamable, Serializable { return swap(); } + @Override public void toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject("os"); + if (cpu != null) { + builder.startObject("cpu"); + builder.field("vendor", cpu.vendor()); + builder.field("model", cpu.model()); + builder.field("mhz", cpu.mhz()); + builder.field("total_cores", cpu.totalCores()); + builder.field("total_sockets", cpu.totalSockets()); + builder.field("cores_per_socket", cpu.coresPerSocket()); + builder.field("cache_size", cpu.cacheSize().toString()); + builder.field("cache_size_in_bytes", cpu.cacheSize().bytes()); + builder.endObject(); + } + if (mem != null) { + builder.startObject("mem"); + builder.field("total", mem.total().toString()); + builder.field("total_in_bytes", mem.total().bytes()); + builder.endObject(); + } + if (swap != null) { + builder.startObject("swap"); + builder.field("total", swap.total().toString()); + builder.field("total_in_bytes", swap.total().bytes()); + builder.endObject(); + } + builder.endObject(); + } + public static OsInfo readOsInfo(StreamInput in) throws IOException { OsInfo info = new OsInfo(); info.readFrom(in); @@ -182,6 +213,62 @@ public class OsInfo implements Streamable, Serializable { } + public String vendor() { + return this.vendor; + } + + public String getVendor() { + return vendor(); + } + + public String model() { + return model; + } + + public String getModel() { + return model; + } + + public int mhz() { + return mhz; + } + + public int getMhz() { + return mhz; + } + + public int totalCores() { + return totalCores; + } + + public int getTotalCores() { + return totalCores(); + } + + public int totalSockets() { + return totalSockets; + } + + public int getTotalSockets() { + return totalSockets(); + } + + public int coresPerSocket() { + return coresPerSocket; + } + + public int getCoresPerSocket() { + return coresPerSocket(); + } + + public SizeValue cacheSize() { + return new SizeValue(cacheSize); + } + + public SizeValue getCacheSize() { + return cacheSize(); + } + public static Cpu readCpu(StreamInput in) throws IOException { Cpu cpu = new Cpu(); cpu.readFrom(in); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/process/ProcessInfo.java b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/process/ProcessInfo.java index 08d9c46d546..aec28673814 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/process/ProcessInfo.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/monitor/process/ProcessInfo.java @@ -22,6 +22,8 @@ package org.elasticsearch.monitor.process; import org.elasticsearch.util.io.stream.StreamInput; import org.elasticsearch.util.io.stream.StreamOutput; import org.elasticsearch.util.io.stream.Streamable; +import org.elasticsearch.util.xcontent.ToXContent; +import org.elasticsearch.util.xcontent.builder.XContentBuilder; import java.io.IOException; import java.io.Serializable; @@ -29,7 +31,7 @@ import java.io.Serializable; /** * @author kimchy (shay.banon) */ -public class ProcessInfo implements Streamable, Serializable { +public class ProcessInfo implements Streamable, Serializable, ToXContent { private long id; @@ -55,6 +57,12 @@ public class ProcessInfo implements Streamable, Serializable { return id(); } + @Override public void toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject("process"); + builder.field("id", id); + builder.endObject(); + } + public static ProcessInfo readProcessInfo(StreamInput in) throws IOException { ProcessInfo info = new ProcessInfo(); info.readFrom(in); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/cluster/node/info/RestNodesInfoAction.java b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/cluster/node/info/RestNodesInfoAction.java index a4b0fa754e3..eded703c5fd 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/cluster/node/info/RestNodesInfoAction.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/cluster/node/info/RestNodesInfoAction.java @@ -89,6 +89,19 @@ public class RestNodesInfoAction extends BaseRestHandler { builder.endObject(); } + if (nodeInfo.os() != null) { + nodeInfo.os().toXContent(builder, request); + } + if (nodeInfo.process() != null) { + nodeInfo.process().toXContent(builder, request); + } + if (nodeInfo.jvm() != null) { + nodeInfo.jvm().toXContent(builder, request); + } + if (nodeInfo.network() != null) { + nodeInfo.network().toXContent(builder, request); + } + builder.endObject(); } builder.endObject(); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/util/SizeValue.java b/modules/elasticsearch/src/main/java/org/elasticsearch/util/SizeValue.java index 2222a5709eb..030289c5d81 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/util/SizeValue.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/util/SizeValue.java @@ -111,13 +111,13 @@ public class SizeValue implements Serializable, Streamable { String suffix = "b"; if (bytes >= SizeUnit.C3) { value = gbFrac(); - suffix = "gb"; + suffix = "g"; } else if (bytes >= SizeUnit.C2) { value = mbFrac(); - suffix = "mb"; + suffix = "m"; } else if (bytes >= SizeUnit.C1) { value = kbFrac(); - suffix = "kb"; + suffix = "k"; } return Strings.format1Decimals(value, suffix); }