org.elasticsearch.hadoop.util.ecs.HostData Maven / Gradle / Ivy
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.hadoop.util.ecs;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Collects and stores Host information for use across the entire active JVM
*/
public final class HostData {
private static final Log LOG = LogFactory.getLog(HostData.class);
private static volatile HostData INSTANCE;
public static HostData getInstance() {
if (INSTANCE == null) {
synchronized (HostData.class) {
if (INSTANCE == null) {
INSTANCE = collectHostData();
}
}
}
return INSTANCE;
}
private static HostData collectHostData() {
String osName = getPropOrNull("os.name");
String osVersion = getPropOrNull("os.version");
String osArch = getPropOrNull("os.arch");
InetAddress localAddress;
try {
localAddress = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// Swallow and set the host info to null;
LOG.warn("Could not collect host information for error tracing. Continuing with null host info.", e);
localAddress = null;
}
String hostName;
String hostip;
if (localAddress != null) {
hostName = localAddress.getHostName();
hostip = localAddress.getHostAddress();
} else {
hostName = null;
hostip = null;
}
Long hostTz = TimeUnit.SECONDS.convert(TimeZone.getDefault().getRawOffset(), TimeUnit.MILLISECONDS);
return new HostData(hostName, hostip, hostTz, osName, osVersion, osArch);
}
private static String getPropOrNull(String prop) {
try {
// TODO: Should these privileged blocks be moved further up the call stack?
return AccessController.doPrivileged(new GetPropAction(prop));
} catch (SecurityException se) {
return null;
}
}
private static class GetPropAction implements PrivilegedAction{
private final String propName;
GetPropAction(String propName) {
this.propName = propName;
}
@Override
public String run() {
return System.getProperty(propName);
}
}
public static HostData emptyHostData() {
return new HostData(null, null, null, null, null, null);
}
private final boolean hasData;
private final String name;
private final String ip;
private final Long timezoneOffsetSec;
private final String osName;
private final String osVersion;
private final String architecture;
private HostData(String hostName, String hostIp, Long hostTzOffset, String osName, String osVersion, String osArch) {
this.name = hostName;
this.ip = hostIp;
this.timezoneOffsetSec = hostTzOffset;
this.osName = osName;
this.osVersion = osVersion;
this.architecture = osArch;
boolean hasData = (hostName != null);
hasData |= (hostIp != null);
hasData |= (hostTzOffset != null);
hasData |= (osName != null);
hasData |= (osVersion != null);
hasData |= (osArch != null);
this.hasData = hasData;
}
public boolean hasData() {
return hasData;
}
public String getName() {
return name;
}
public String getIp() {
return ip;
}
public Long getTimezoneOffsetSec() {
return timezoneOffsetSec;
}
public String getOsName() {
return osName;
}
public String getOsVersion() {
return osVersion;
}
public String getArchitecture() {
return architecture;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
HostData hostData = (HostData) o;
if (name != null ? !name.equals(hostData.name) : hostData.name != null) return false;
if (ip != null ? !ip.equals(hostData.ip) : hostData.ip != null) return false;
if (timezoneOffsetSec != null ? !timezoneOffsetSec.equals(hostData.timezoneOffsetSec) : hostData.timezoneOffsetSec != null)
return false;
if (osName != null ? !osName.equals(hostData.osName) : hostData.osName != null) return false;
if (osVersion != null ? !osVersion.equals(hostData.osVersion) : hostData.osVersion != null) return false;
return architecture != null ? architecture.equals(hostData.architecture) : hostData.architecture == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (ip != null ? ip.hashCode() : 0);
result = 31 * result + (timezoneOffsetSec != null ? timezoneOffsetSec.hashCode() : 0);
result = 31 * result + (osName != null ? osName.hashCode() : 0);
result = 31 * result + (osVersion != null ? osVersion.hashCode() : 0);
result = 31 * result + (architecture != null ? architecture.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "HostData{" +
"hostName='" + name + '\'' +
", hostIp='" + ip + '\'' +
", hostTzOffset=" + timezoneOffsetSec +
", osName='" + osName + '\'' +
", osVersion='" + osVersion + '\'' +
", osArch='" + architecture + '\'' +
'}';
}
}