package com.bizo.asperatus.logging.error; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.bizo.asperatus.model.Dimension; public final class MachineInfo { private MachineInfo() { } /** Map of Application -> $APPLICATION, etc. */ public static final Map<String, String> info = Collections.unmodifiableMap(getMachineInfo()); /** List of all machine info: application, stage, instance id, region, and version. */ private static final List<Dimension> allDimensions = Collections.unmodifiableList(toDimensions(info)); /** List of default dimensions for tracking: Application, Version */ public static final List<Dimension> defaultDimensions = Collections.unmodifiableList(with("Application", "Version").toDimensions()); public static MachineInfoBuilder with(final String... includes) { return new MachineInfoBuilder().with(includes); } public static MachineInfoBuilder with(final Collection<String> includes) { return new MachineInfoBuilder().with(includes); } public static MachineInfoBuilder without(final String... excludes) { return new MachineInfoBuilder().without(excludes); } public static MachineInfoBuilder without(final Collection<String> excludes) { return new MachineInfoBuilder().without(excludes); } @SuppressWarnings("serial") private static final Map<String, String> ENV_MAPPING() { return new HashMap<String, String>() { { put("APPLICATION", "Application"); put("STAGE", "Stage"); put("EC2_INSTANCE_ID", "InstanceId"); put("EC2_REGION", "Region"); put("VERSION", "Version"); } }; } private static final Map<String, String> getMachineInfo() { final Map<String, String> info = new HashMap<String, String>(); for (final Map.Entry<String, String> env : ENV_MAPPING().entrySet()) { final String val = System.getProperty(env.getKey(), System.getenv(env.getKey())); if (val != null) { info.put(env.getValue(), val); } } return info; } private static final List<Dimension> toDimensions(final Map<String, String> info) { final List<Dimension> dims = new ArrayList<Dimension>(info.size()); for (final Map.Entry<String, String> env : info.entrySet()) { dims.add(new Dimension(env.getKey(), env.getValue())); } return dims; } public static final class MachineInfoBuilder { private final Collection<Dimension> defaults; private Set<String> includes = new HashSet<String>(); private Set<String> excludes = new HashSet<String>(); MachineInfoBuilder(final Collection<Dimension> defaults) { this.defaults = defaults; } MachineInfoBuilder() { this(MachineInfo.allDimensions); } public MachineInfoBuilder with(final Collection<String> includes) { this.includes.addAll(includes); return this; } public MachineInfoBuilder without(final Collection<String> excludes) { this.excludes.addAll(excludes); return this; } public MachineInfoBuilder with(final String... includes) { this.includes.addAll(Arrays.asList(includes)); return this; } public MachineInfoBuilder without(final String... excludes) { this.excludes.addAll(Arrays.asList(excludes)); return this; } public List<Dimension> toDimensions() { final List<Dimension> ret = new ArrayList<Dimension>(includes.size()); for (final Dimension d : defaults) { if (includes.contains(d.getName()) && (! excludes.contains(d.getName()))) { ret.add(d); } } return ret; } } }