Dropwizard als REST-App-Server

Monitoring, Konfiguration

Monitoring ist fester Bestandteil von Dropwizard, nicht nur aufgrund der eingebauten Metrics-Bibliothek. Das Framework stellt schon für die minimale Hello-World-Anwendung über Port 8081 automatisch viele Metriken bereit. Dazu gehört die Möglichkeit, via curl http://localhost:8081/threads einen Thread Dump zu erhalten oder über http://localhost:8081/metrics eine Reihe von Messwerten abzurufen. Darunter fallen zum einen aktuelle JVM-Metriken, zum anderen aber auch einige zu den registrierten JAX-RS-Ressourcen, beispielsweise zu den durchgeführten HTTP-Operationen. Spezifische Kenngrößen wie die Anzahl der Aufrufe oder der Durchsatz über die Zeit lassen sich leicht messen, wenn die JAX-RS-Methoden mit @Metered oder @Timed annotiert werden:

@Path("/")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {

@GET @Timed
public HelloWorld sayHello() {
return new HelloWorld();
}
}

Der Entwickler kann die Ergebnisse via HTTP und JSON abfragen. Der nächste Codeauszug zeigt die so via HTTP/JSON verfügbaren Metriken der Methode:

"net.sweblog.hd.dropwizard.minimal.resources.HelloWorldResource.sayHello": {
"count": 39397,
"m15_rate": 36.473036644562875,
"m1_rate": 526.3796007293131,
"m5_rate": 108.81403091076342,
"mean_rate": 3655.8314631816347,
"units": "events/second"
}

Mit Metrics lassen sich darüber hinausgehende Messungen selber erheben.

Die Konfiguration einer Anwendung stellt immer eine wichtige Infrastrukturaufgabe dar. Hierfür gibt es viele Möglichkeiten, und jeder Entwickler dürfte schon einmal seinen eigenen Mechanismus entwickelt haben. Für die Konfiguration einer Dropwizard-Anwendung kommt ein Gespann aus einer von Configuration abgeleiteten Klasse und einer Konfigurationsdatei im YAML-Format zum Einsatz. Letztere stellt dabei die serialisierte Form der Konfigurationsklasse dar. Beim Start liest Dropwizard die Konfigurationsdatei via Jackson ein und konfiguriert damit die Klasse. Da es keine weiteren von den Defaults abweichenden Einstellungen gibt, ließ sich für das Hello-World-Beispiel die Configuration-Klasse von Dropwizard direkt nutzen.

Angenommen, es soll ein Online-Bestellsystem für Kaffee mit Dropwizard entwickelt werden, dass via REST Bestellungen entgegennimmt. Die passende Konfiguration dafür könnte wie folgt aussehen:

server:
maxThreads: 128
applicationConnectors:
- type: http
port: 8000
requestLog:
appenders:
- type: file
threshold: ALL
archivedLogFilenamePattern: /var/log/request-%d.log
currentLogFilename: /var/log/request.log

logging:
level: WARN
appenders:
- type: file
archivedLogFilenamePattern: /var/log/application-%d.log
currentLogFilename: /var/log/application.log
orderlimit:
min: 2
max: 100


public class CoffeeStoreConfiguration extends Configuration {
private OrderLimit orderLimit;

@JsonProperty("orderlimit") @Valid
public OrderLimit getOrderLimit() {
return orderLimit;
}

public void setOrderLimit(OrderLimit limit) {
orderLimit = limit;
}
}

public class OrderLimit {
private int min;
private int max;

@Min(1)
public int getMin() {
return min;
}

public void setMin(int value) {
min = value;
}

@Max(100)
public int getMax() {
return max;
}

public void setMax(int value) {
max = value;
}
}

Im Beispiel wird zuerst Jetty über das server-Element eingerichtet, gefolgt von der Konfiguration des Logging-Verhaltens der Anwendung. Ganz am Ende beschränkt der Entwickler mit orderlimit die mögliche Bestellgröße des fiktiven Online-Shops. Damit Dropwizard die Konfiguration einlesen kann, ist von der Klasse Configuration die eigene Klasse CoffeeStoreConfiguration abzuleiten, deren Feld orderLimit vom Typ OrderLimit ist. Die Einstellungen für server und logging werden auf die Basisklasse Configuration abgebildet, alle darüber hinausgehende Werte auf die eigene Klasse.

Um eine valide Konfiguration sicherzustellen, lassen sich die Felder mit Hibernate Validator überprüfen. Hierfür sind die Annotationen @Max und @Min in OrderLimit gedacht, damit keine Bestellgröße über 100 möglich ist. Schlägt die Validierung fehl, startet die Anwendung nicht. Um solche Fehler frühzeitig festzustellen, kann Dropwizard auch nur die Konfiguration prüfen, ohne die Anwendung selbst zu starten. Hierfür ist die Anwendung mit java -jar app.jar check config.yml aufzurufen.