Skip to content

Commit

Permalink
Refactor health checking logic separate objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
akiellor committed Mar 4, 2014
1 parent c098f6b commit d395366
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 22 deletions.
36 changes: 16 additions & 20 deletions health/src/main/java/services/HealthResource.java
Expand Up @@ -6,6 +6,9 @@
import org.xbill.DNS.SRVRecord;
import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.Type;
import services.doctor.Doctor;
import services.doctor.EnvironmentHealth;
import services.registry.ServiceRegistry;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
Expand All @@ -16,31 +19,24 @@

@Path("/health")
public class HealthResource {
private final String dnsHost;
private final ServiceRegistry registry;
private final Doctor doctor;

public HealthResource(String dnsHost) {
this.dnsHost = dnsHost;
public HealthResource(ServiceRegistry registry, Doctor doctor) {
this.registry = registry;
this.doctor = doctor;
}

@Path("/{environment}")
@GET
public Response services(@PathParam("environment") String environment) throws Exception {
Lookup lookup = new Lookup(environment + ".skydns.local", Type.SRV);
lookup.setResolver(new SimpleResolver(dnsHost));
Record[] records = lookup.run();
public Response services(@PathParam("environment") String environmentName) throws Exception {
ServiceRegistry.Environment environment = registry.resolve(environmentName);
EnvironmentHealth health = doctor.check(environment);


if(records == null) {
return Response.status(200).type("application/json").entity(new EnvironmentHealth(environment)).build();
} else {
List<Health> services = new ArrayList<Health>();
for(Record record : records) {
int port = ((SRVRecord) record).getPort();
String host = ((SRVRecord) record).getTarget().toString();
boolean ok = true;
services.add(new Health(host, port, ok));
}
return Response.status(200).type("application/json").entity(Optional.of(new EnvironmentHealth(environment, services))).build();
}
return Response
.status(200)
.type("application/json")
.entity(health)
.build();
}
}
7 changes: 6 additions & 1 deletion health/src/main/java/services/HealthService.java
Expand Up @@ -2,6 +2,8 @@

import com.yammer.dropwizard.config.Bootstrap;
import com.yammer.dropwizard.config.Environment;
import services.doctor.Doctor;
import services.registry.ServiceRegistry;

import static org.quartz.JobBuilder.newJob;

Expand All @@ -19,6 +21,9 @@ public void initialize(Bootstrap<SkyDnsServiceConfiguration> bootstrap) {

@Override
public void run(SkyDnsServiceConfiguration configuration, final Environment environment) {
environment.addResource(new HealthResource(configuration.getSkyDnsHost()));
ServiceRegistry registry = new ServiceRegistry(configuration.getSkyDnsHost(), ".skydns.local");
Doctor doctor = new Doctor();

environment.addResource(new HealthResource(registry, doctor));
}
}
17 changes: 17 additions & 0 deletions health/src/main/java/services/doctor/Doctor.java
@@ -0,0 +1,17 @@
package services.doctor;

import services.Health;
import services.registry.ServiceRegistry;

import java.util.ArrayList;
import java.util.List;

public class Doctor {
public EnvironmentHealth check(ServiceRegistry.Environment environment) {
List<Health> health = new ArrayList<Health>();
for (ServiceRegistry.Service service : environment.getServices()) {
health.add(new Health(service.getDomain(), service.getPort(), true));
}
return new EnvironmentHealth(environment.getEnvironment(), health);
}
}
@@ -1,7 +1,8 @@
package services;
package services.doctor;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableList;
import services.Health;

import java.util.List;

Expand Down
84 changes: 84 additions & 0 deletions health/src/main/java/services/registry/ServiceRegistry.java
@@ -0,0 +1,84 @@
package services.registry;

import com.google.common.collect.ImmutableList;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.Record;
import org.xbill.DNS.SRVRecord;
import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.Type;

import java.util.ArrayList;
import java.util.List;

public class ServiceRegistry {
public static class Service {
private final String domain;
private final int port;

public Service(String domain, int port) {
this.domain = domain;
this.port = port;
}

public String getDomain() {
return domain;
}

public int getPort() {
return port;
}
}

public static class Environment {
private final String environment;
private final List<Service> services;

public Environment(String environment, List<Service> services) {
this.environment = environment;
this.services = services;
}

public Environment(String environment) {
this(environment, ImmutableList.<Service>of());
}

public String getEnvironment() {
return environment;
}

public List<Service> getServices() {
return services;
}
}

private final String domain;
private final String dns;

public ServiceRegistry(String dns, String domain) {
this.dns = dns;
this.domain = domain;
}

public Environment resolve(String environment) {
Record[] records = null;
try {
Lookup lookup = new Lookup(environment + domain, Type.SRV);
lookup.setResolver(new SimpleResolver(dns));
records = lookup.run();
} catch (Exception e) {
throw new RuntimeException(e);
}

if (records == null) {
return new Environment(environment);
} else {
List<Service> services = new ArrayList<Service>();
for (Record record : records) {
int port = ((SRVRecord) record).getPort();
String host = ((SRVRecord) record).getTarget().toString();
services.add(new Service(host, port));
}
return new Environment(environment, services);
}
}
}

0 comments on commit d395366

Please sign in to comment.