Schau mir in die Augen – Anwendungsüberwachung mit Azure Application Insights

Mit Application Insights liefert Microsoft einen Dienst zur Anwendungsüberwachung für Entwicklung und DevOps. Damit kann so gut wie alles erfasst werden – von Antwortzeiten und -raten über Fehler und Ausnahmen, Seitenaufrufe, Benutzer (-Sitzungen), Backend bis hin zu Desktop-Anwendungen.

Die Überwachung beschränkt sich keinesfalls nur auf Webseiten. Application Insights lässt sich auch bei Webdiensten sowie im Backend einsetzen. Sogar Desktop-Anwendungen lassen sich überwachen. Anschließend können die Daten über unterschiedliche Wege analysiert und ausgewertet werden (siehe Abbildung 1).

Einsatzmöglichkeiten von Application Insights
Abbildung 1: Einsatzmöglichkeiten von Application Insights (Quelle: https://docs.microsoft.com/de-de/azure/azure-monitor/app/app-insights-overview)

Loggen

Als Ausgangsbasis wird eine Azure Subscription mit einer Application-Insights-Instanz benötigt. Ist diese angelegt, findet man in der Übersicht den sogenannten Instrumentation Key – dieser fungiert als Connection String.

Sobald die Instanz bereitgestellt wurde, kann auch schon mit der Implementierung begonnen werden. Programmiertechnisch ist man hier keinesfalls auf Azure-Ressourcen oder .Net beschränkt. Microsoft unterstützt eine Vielzahl an Sprachen und Plattformen.

Als Beispiel dient hier eine kleine .Net-Core-Konsolenanwendung. Dazu muss lediglich das NuGet-Paket Microsoft.ApplicationInsights eingebunden werden und schon kann es losgehen.

Als erstes wird ein Telemetry Client erstellt. Hier wird einfach der passende Instrumentation Key aus der eigenen Application-Insights-Instanz eingefügt und schon ist die Anwendung bereit für die ersten Log-Einträge.

  • Mit Trace erzeugt man einen einfachen Trace-Log-Eintrag mit entsprechender Message und passendem Severity Level.
  • Events eignen sich für strukturierte Logs, welche sowohl Text als auch numerische Werte enthalten können.
  • Metrics sind dagegen ausschließlich numerische Werte und dienen daher vor allem zur Erfassung regelmäßiger Ereignisse.
static void Main(string[] args)
{
Console.WriteLine("Schau mir in die Augen");

       var config = TelemetryConfiguration.CreateDefault();
       config.InstrumentationKey = "INSTRUMENTATIONKEY";
       var tc = new TelemetryClient(config);

       // Track traces
       tc.TrackTrace("BlogTrace", SeverityLevel.Information);

       // Track custom events
       var et = new EventTelemetry();
       et.Name = "BlogEvent";
       et.Properties.Add("Source", "console");
       et.Properties.Add("Context", "Schau mir in die Augen");
       tc.TrackEvent(et);

       // Track custom metric
       var mt = new MetricTelemetry();
       mt.Name = "BlogMetric";
       mt.Sum = new Random().Next(1,100);
       tc.TrackMetric(mt);

       tc.Flush();
}

Als Hinweis sei noch erwähnt, dass die Log-Einträge mit bis zu fünf Minuten Verzögerung im Application Insights erscheinen.

Zusammenspiel mit NLog

Application Insights lässt sich mit wenigen Schritten auch in eine bestehende NLog-Konfiguration einbinden.

Dazu müssen das NuGet-Paket Microsoft.ApplicationInsights.NLogTarget installiert und danach die NLog-Konfiguration um folgende Einträge erweitern werden:

  • Extensions mit dem Verweis auf die Application Insights Assembly hinzufügen
  • Neues Target vom Typ Application Insights Target (hier wieder den eigenen Instrumentation Key angeben)
  • Neue Regel mit Ziel auf das Application Insights Target
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwConfigExceptions="true">

  <extensions>
    <add assembly="Microsoft.ApplicationInsights.NLogTarget" />
  </extensions>

  <targets>
    <target name="logfile" xsi:type="File" fileName="log.txt" />
    <target name="logconsole" xsi:type="Console" />
    <target xsi:type="ApplicationInsightsTarget" name="aiTarget">
      <instrumentationKey>INSTRUMENTATIONKEY</instrumentationKey>
      <contextproperty name="threadid" layout="${threadid}" />
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />
    <logger name="*" minlevel="Trace" writeTo="aiTarget" />
  </rules>
</nlog>

Auswertung

Die Auswertung erfolgt anschließend über das Application-Insights-Portal. Sämtliche Logs finden sich anschließend unter Protokolle in der jeweiligen Tabelle (siehe Abbildung 2).

Auswertungen mit Application Insights
Abbildung 2: Auswertungen mit Application Insights

Die in der Konsolenanwendung erzeugten Trace-Logs können der Tabelle traces entnommen werden. Abfragen werden mit der Kusto Query Language (KQL) formuliert. Die Traces aus dem obigen Beispiel können über folgende Query abgefragt werden:

traces
| where message contains "BlogTrace"

Die geloggten Metriken lassen sich mit folgender Abfrage auch grafisch als Liniendiagramm darstellen (siehe Abbildung 3):

customMetrics
| where timestamp >= ago(12h)
| where name contains "Blog"
| render timechart 
Grafische Darstellung der geloggten Metriken
Abbildung 3: Grafische Darstellung der geloggten Metriken

Dashboards & Warnungsregeln

Um Unregelmäßigkeiten frühzeitig zu erkennen, können individuelle Dashboards und Warnungsregeln angelegt werden. Im Falle der oben verwendeten Metriken kann man das Diagramm an ein freigegebenes Dashboard anheften. Dies lässt sich mit weiteren Abfragen beliebig fortsetzen, bis die gewünschten Informationen zu einer Übersicht zusammengetragen sind.

Das folgende Dashboard zeigt die Metrik der Konsolenanwendung. Gleichzeitig sind darin auch exemplarisch Informationen über Serveranfragen, fehlerhafte Anfragen, Antwortzeiten sowie Leistung und Verfügbarkeit enthalten (siehe Abbildung 4).

Informationen auf einen Blick auf dem Dashboard
Abbildung 4: Informationen auf einen Blick auf dem Dashboard

Hat man das Dashboard mal nicht im Blick und es kommt zu Anomalien, kann man sich auch über Warnungsregeln direkt per E-Mail oder SMS informieren lassen.

Einzelne Warnungsregeln lassen sich über den Menüpunkt Warnungen im Application-Insights-Portal anlegen und verwalten. Eine Warnungsregel besteht aus einer Signallogik (Bedingung) sowie einer Aktionsgruppe.

Bei der Bedingung wird ein Signal, z. B. eine Metrik, ausgewählt und mit einem Schwellwert versehen: „traces größer als 80“. Erhält man nun innerhalb eines definierten Zeitraumes mehr als 80 trace-Einträge, wird die Warnung ausgelöst.

Die Aktionsgruppe legt abschließend fest, was im Falle einer Warnung zu tun ist. Hier lassen sich einfache Hinweis-E-Mails oder SMS an festgelegte Personen verschicken oder komplexere Handlungen programmatisch über Runbooks, Azure Functions, Logik-Apps oder Webhooks abbilden (siehe Abbildung 5).

Verschiedene Aktionstypen in einer Aktionsgruppe
Abbildung 5: Verschiedene Aktionstypen in einer Aktionsgruppe

REST API

Besteht der Bedarf, die Daten auch außerhalb von Application Insights zu verarbeiten, können diese über eine REST API abgefragt werden.

Die URL für die API-Aufrufe setzt sich aus einem Basis-Teil und der gewünschten Operation zusammen. Operationen sind metrics, events oder query. Dazu muss noch ein API-Key als „X-API-Key“ HTTP-Header übergeben werden:

https://api.applicationinsights.io/v1/apps/{app-id}/{operation}/[path]?[parameters]

Die App-ID ist in den Settings unter API Access zu finden.

Abbildung 6: URL der API-Aufrufe
Abbildung 6: URL der API-Aufrufe (Quelle: https://dev.applicationinsights.io/quickstart)

Um bei den oben beschriebenen Metriken zu bleiben, hier der API-Aufruf mit query-Operation für die Anzahl aller Einträge der letzten 24 Stunden:

https://api.applicationinsights.io/v1/apps/{}app-id}/query?query=customMetrics | where timestamp >= ago(24h) | where name contains „Blog“ | summarize count()

Das Ergebnis kommt im JSON-Format zurück:

{
    "tables": [
        {
            "name": "PrimaryResult",
            "columns": [
                {
                    "name": "count_",
                    "type": "long"
                }
            ],
            "rows": [
                [
                    13
                ]
            ]
        }
    ]
}

Fazit

Wie anhand dieses kleinen Beispiels zu sehen ist, lässt sich ein zentralisiertes Logging mit Hilfe von Application Insights in wenigen Schritten aufbauen und verwalten. Neben der schnellen und einfachen Integration ist auch die automatisierte Infrastruktur von Vorteil. Man muss sich um kein Hosting kümmern und sollte die Last einmal steigen, skaliert Application Insights automatisch.

Aktuelle Trends und Herausforderungen in der Softwareentwicklung – iJS & W-Jax 2017

… das sagten die Teilnehmer der iJS und W-JAX

Dass nicht nur in Sachsen was geht, sondern vor allem auch an unserem Hauptsitz in München, zeigten Ende letzten Jahres die „International JavaScript Conference“ und die „W-JAX“. Beide Konferenzen fanden kurz nacheinander statt und lockten zahlreiche Besucher in die bayrische Landeshauptstadt.

Wie schon die S&S Media Group als Veranstalter der iJS (international JavaScript Conference) feststellt, ist „JavaScript [mittlerweile] überall: kaum ein digitales Business kann heute auf JavaScript und high-level Frameworks, wie Angular, React, oder NodeJS verzichten.“ Da wundert es kaum, dass diesem Thema auf der iJS vom 23.-27.10.2017 im Holiday Inn Munich City Centre eine eigene Konferenz mit zahlreichen Keynotes, Sessions und Power Workshops gewidmet wird. Auch die W-JAX beschäftigt sich zum Teil mit diesen Themenfeldern, bietet aber zusätzlich noch zahlreiche weitere Impulse im Bereich Enterprise-Technologie, Softwarearchitektur, Agilität & Java.

Wegweiser mit Namen der Konferenzen
Abbildung 1: iJS & W-Jax

Wir nutzten bei beiden Konferenzen die Gelegenheit, uns intensiv mit der Community auszutauschen und hatten deswegen einige Fragen im Gepäck, die wir an die Teilnehmer der Konferenzen richteten. Insgesamt konnten wir fast 100 Umfragen durchführen, die sich in gleichen Teilen auf die beiden Veranstaltungen aufteilten. Wir danken an dieser Stelle noch einmal allen, die sich die Zeit genommen haben, sich an unserer Befragung zu beteiligen. Nur durch einen intensiven Austausch mit Partnern, Kunden und Community kann es gelingen, sich stets zu verbessern. Diesen Ansatz der kontinuierlichen Verbesserung, der auch im agilen Manifest verankert ist, verfolgen wir nicht nur in unseren Projekten, sondern leben wir auch unternehmensweit.

Während unsere Experten Manuel Mauky und Alexander Casall zu Themen wie „Angular-Anwendungen mit Redux“ und „Offlinefähige Desktopanwendungen mit Angular und Electron“ sprachen, wollten wir von unseren Interviewpartnern zuallererst wissen, welche Frameworks und Sprachen sie in ihren aktuellen Hauptprojekten einsetzen. Am häufigsten wurden Angular und JQuery genutzt, dicht gefolgt von JavaEE und Spring. React kam dagegen beispielsweise noch recht selten zum Einsatz. Dabei nutzten 72 von 88 Befragten JavaScript, 69 HTML und 51 Java als Programmiersprache. Ruby, Groovy und Coffeescript dagegen wurden kaum verwendet und bekamen jeweils maximal 5 Stimmen.

Welche Frameworks verwenden Sie in Ihrem aktuellen Hauptprojekt?
Abbildung 2: Welche Frameworks verwenden Sie in Ihrem aktuellen Hauptprojekt?

Natürlich interessierte uns nicht nur, mit welchen Technologien momentan gearbeitet wird, sondern vor allem in welche Richtung sich die Trends der Softwareentwicklung bewegen. Immer mehr Anwender von Geschäftsanwendungen erwarten moderne Webanwendungen anstelle bestehender Desktop-Software. Die Usability von Bestandssoftware trifft in Zeiten von modernen B2C-Applikationen oft nicht mehr die Erwartungshaltung der Nutzer und es werden immer mehr webbasierte Lösungen etabliert, die ihre Nutzer aktiv in der Arbeit unterstützen. Daher ist es auch nicht verwunderlich, dass 70 % der Befragten planen, in nächster Zeit mit Angular, React oder einer anderen reactiven Technologie (z.B. ReactiveX, RxJS, …) zu arbeiten. Vue.JS (14 Stimmen) und JavaFX (3 Stimmen) spielen dagegen bei den Umfrageteilnehmern nur untergeordnete Rollen.

Planen Sie in nächster Zeit mit einer der folgenden Technologien zu arbeiten?
Abbildung 3: Planen Sie in nächster Zeit mit einer der folgenden Technologien zu arbeiten?

Die Hälfte der Befragten konnte sich schon recht genau positionieren und hatte sich auf Angular, React oder zumindest eine reactive Technologie festgelegt. Rund 20 % dagegen waren noch indifferent und konnten sich noch nicht zwischen Angular oder einer reactiven Technologie entscheiden. Hilfestellung könnte hier die von uns evaluierte Entscheidungsmatrix bieten, die mithilfe eines Fragenkatalogs eine persönliche Technologieempfehlung gibt. Diese basiert auf den Erfahrungen unserer Webexperten.

Weiterhin entscheidend bei der Auswahl einer geeigneten Programmiersprache oder eines Frameworks ist selbstverständlich auch der Inhalt des eigentlichen Projektes. Wir fragten daher, was die Umfrageteilnehmer in ihrem Hauptprojekt tun. Der Großteil der Befragten beschäftigte sich hier mit Softwareevolutionsprojekten (61 Stimmen), dicht gefolgt von Neuentwicklungen (56 Stimmen). Rund ein Fünftel der Umfrageteilnehmer beschäftigte sich in ihrem Arbeitsalltag mit DevOps. Je nachdem, ob man eine bestehende Software wartet oder ein „grüne Wiese“-Projekt auf dem Tisch hat, sind die Spielräume bei der Auswahl der Programmiersprachen und verwendeten Tools natürlich sehr unterschiedlich breit.

Was tun Sie in Ihrem Projekt?
Abbildung 4: Was tun Sie in Ihrem Projekt?

Nachdem wir nun etwas näher herausgefunden hatten, womit die Befragten, bei denen es sich zum Großteil um Softwareentwickler verschiedenster Nationalitäten und aus unterschiedlichsten Branchen und Unternehmensgrößen handelte, wollten wir auch wissen, was sie im aktuellen Projekt am meisten behindert. An dieser Stelle gaben wir bewusst eher offene Antwortmöglichkeiten, wie „schlechter Code“ oder „schlechte Architektur“ vor, die dem Interviewteilnehmer noch Spielraum für Interpretation gaben und somit die Befragten bewusst dazu auffordern sollten, näher auf die Probleme einzugehen und gegebenenfalls einen ersten Dialog zu Problemlösung zu fördern.

Die häufigsten genannten Probleme sind der folgenden Grafik zu entnehmen. Neben den hier auftauchenden Antworten, bei denen sich „unklare Anforderungen“ nach wie vor als eines der Hauptprobleme darstellte, gab es auch einige freie Antworten. Relativ häufig wurde hier „legacy code“, „Warten auf den Auftraggeber / den Kunden“ oder „stark gewachsene und unübersichtliche Softwarearchitektur“ genannt.

Was behindert Sie in Ihrem Hauptprojekt am meisten?
Abbildung 5: Was behindert Sie in Ihrem Hauptprojekt am meisten?

Schlussendlich wandten wir uns noch einigen Fragestellungen aus dem Bereich „Moderne Webentwicklung“ zu, um hier zu prüfen, welche Trends sich tatsächlich von der Community bestätigen lassen oder welche Themen zwar im Netz „gehypt“ werden, aber im tatsächlichen Entwickleralltag noch nicht angekommen sind. Einer dieser Trends in der IT ist beispielsweise GraphQL. Hier stellten wir erst einmal die grundsätzliche Frage, wie die Konferenzbesucher zu der Technologie standen. Lediglich ein Viertel der Befragten plante den Einsatz dieser REST-Alternative für die Zukunft oder hatte GraphQL bereits im Einsatz, während immerhin fast die Hälfte noch nie von der Technologie gehört hatten.

Wie stehen Sie zur Technologie "GraphQL"?
Abbildung 6: Wie stehen Sie zur Technologie „GraphQL“?

Wir wollten hier außerdem noch wissen, ob die Befragten in ihren Projekten Cloud-Technologien einsetzen. Hier war das Verhältnis der Antworten relativ ausgeglichen. 45 % der Umfrageteilnehmer bejahten hier, während die restlichen 55 % nicht, oder zumindest nicht in ihrem Hauptprojekt, mit Cloud-Technologien arbeiteten. Die zweite Frage aus diesem Themenblock war, welche Technologie die Befragten aktuell für das State-Management verwendeten. Zur Auswahl standen React/Angular (ohne Dritt-Framework für das State-Management), Redux oder MobX. Während letzteres lediglich eine Stimme bekam, setzte der Großteil der Umfrageteilnehmer (knapp 50 %) kein Drittframework ein und rund 25 % arbeiteten mit Redux, während wiederum ca. 20 % hier keine Antwort gaben, was das Ergebnis der Umfrage leider etwas verfälscht.

Sie interessieren sich für weitere Umfrageergebnisse? Dann stöbern Sie doch einfach noch ein wenig in unserem Blog, und lesen Sie, welche aktuelle Trends und Herausforderungen in der Softwareentwicklung wir auf der solutions.hamburg 2016, der OOP 2017, der WJAX 2016 oder der DWX 2017 erfragen konnten.

Paartherapie – Dienstleister erfolgreich integrieren

In einer Studie der Capgemini (Capgemini Consulting, 2016) benennen die Befragten „Zu wenig Mitarbeiter mit entsprechendem Know-how“ als größte Hürde der Digitalisierung in ihrem Unternehmen. Nicht selten versucht man, diesem Problem durch die Integration eines oder mehrerer externer Dienstleister beizukommen. Aus gleicher Studie geht zudem hervor, dass diese Dienstleister zusehends in Bereichen oder Projekten eingesetzt werden, in denen innovative Lösungen geschaffen werden sollen. Vermutlich in diesem Zusammenhang gehen durchschnittlich bereits 23,3% der Befragten in Projekten nach agilen Frameworks, Methodiken oder Philosophien wie Scrum, Kanban, DevOps oder Scaled Agile Framework vor.

Wir setzen als Dienstleistungsunternehmen schon seit Langem auf agile Vorgehensweisen. Seit 2013 bilden wir gemischte Teams aus Auftraggeber und Dienstleister nach unserem Konzept für verteilte agile Entwicklung: Ein Team, ein Office, kurz ETEO und geben diesen Teams Werkzeuge und Good Practices für diese anfangs außergewöhnliche Arbeitssituation an die Hand. Das Konzept bedient sich der Erkenntnisse aus der Befragung unserer Teams, die bereits nach diesem Muster arbeiteten und wurde anschließend in einem crossfunktionalen Team wissenschaftlich fundiert weiterentwickelt, wobei immer neue Erkenntnisse aus unseren Teams einflossen.

Bei uns sitzt das Team gemeinsam in einem Projektraum. Die typischerweise 2-3 physischen Räume an den einzelnen Standorten sind über permanente Videokonferenz verbunden. Jeder Standort verfügt idealerweise über einen 80-Zoll-Bildschirm pro Standort, sodass der Eindruck entsteht, das andere Teilteam durch ein Fenster zu sehen.

Ein Werkzeug, mit dem wir sowohl in unseren Teams, als auch bei externen Coachings arbeiten, ist der ETEO Wertekompass, welcher die fünf Scrum Werte Offenheit, Verpflichtung, Fokus, Respekt und Mut mit weiteren Werten vereint, die speziell – aber nicht nur – in verteilten Teams kritisch zu sein scheinen: Identität, Vertrauen, Empathie, Zusammenarbeit und Einfachheit.

Während der Coachings befragen wir die Teams meist, welcher Wert für sie der wichtigste ist. Wenig überraschend wird hier häufig der Wert Vertrauen genannt. Schon Patrick Lencioni beschrieb in seinen „Five Dysfunctions of a Team“ (Lencioni, 2002) das Vertrauen als die Basis jeglicher Zusammenarbeit im Team. Und letztlich scheinen auch die einzelnen Werte in Wechselwirkung zueinander zu stehen. Beispielsweise schafft Offenheit im Team Vertrauen untereinander. Auch ist es bei Scrum – wo nicht der einzelne Beitrag, sondern die Teamleistung zählt – nur dann möglich, sich auf ein gemeinsames Sprintziel zu verpflichten, wenn man einander vertraut.

Doch wie schafft man in einem verteilten Team Vertrauen, in dem man sich nur vergleichsweise selten sieht und kleine Missverständnisse sich nicht mal eben in der Mittagspause oder bei einem gemeinsamen Heißgetränk in der Kaffeeküche aufklären lassen? Unausgesprochene Dinge können schnell zu Konfliktherden heranschwielen und lassen das Vertrauen im Team sinken oder sogar ganz verschwinden.

Paartherapie

Deshalb ist es besonders wichtig, sich zunächst durch eine ausgiebige Präsenzphase über 4-6 Wochen kennenzulernen, um einander einschätzen zu können. Denn gerade über schriftliche, asynchrone Kommunikation wie E-Mail entstehen schnell Missverständnisse. Hier hat sich die ständige Videokonferenzschaltung bewährt, denn sie hilft zu sehen, wer gerade anwesend ist und wie sich jeder augenscheinlich fühlt. Doch selbst wenn man eine Videokonferenzanlage im Einsatz hat, sollte man darauf achten, diese nicht ausschließlich für den fachlichen Austausch zu nutzen. Ist das Vertrauen einmal gering, überrascht es uns immer wieder, wie schnell kleine verbale oder nonverbale Signale dazu führen können, dass das Vertrauen gänzlich erschüttert wird. Beispielsweise hatten wir in einem Projektteam die Situation, dass sich die Teammitglieder an einem Standort aus Bequemlichkeit im Daily vor der Videokonferenz an einen hinter ihnen stehenden Tisch lehnten. Die Kollegen am anderen Standort beschrieben, dass dies wie eine bedrohliche Front auf sie wirkte. Solche Missverständnisse treten vor allem dann auf, wenn nicht in die Stärkung des Vertrauens investiert wird und sich das Team nicht in regelmäßigen Abständen (alle 6-8 Wochen) wieder trifft.

Noch günstiger ist es, jeden Sprintwechsel an einem Standort verbringen zu können. Dies eröffnet auch die Möglichkeit, die Sprint Retrospektive gemeinsam in einem Raum durchzuführen – ein großer Vorteil bei einem Meeting, dass einen großen Mehrwert aus dem Vertrauen schöpft, das im Team herrscht. Denn Vertrauen bildet ein Fundament für den Respekt voreinander sowie für den Mut, Verbesserungspotential im Team mit kreativen, innovativen Lösungsansätzen zu entfachen.

Die Arbeit mit einem gemeinsamen Wertesystem ist jedoch nur eine Herausforderung bei der Integration eines externen Dienstleisters. Mehr erfahren Sie in unserem Vortrag „Liebling, ich habe einen Neuen – Dienstleister erfolgreich integrieren“ auf der solutions.hamburg. Der Track „Paartherapie 2.0“ bietet weitere spannende Eindrücke und Therapieansätze aus dem Spannungsfeld „IT meets Business“.


Verweise

  • Capgemini Consulting. (2016). IT Trends 2016. Von capgemini: https://www.de.capgemini.com/resource-file-access/resource/pdf/capgemini-it-trends-studie-2016_0.pdf abgerufen
  • Lencioni, P. (2002). 5 Dysfunctions of a Team. Jossey-Bass.

So geht REST – W-JAX 2015

In der ersten Novemberwoche fand in München die W-JAX statt und die Saxonia Systems AG (seit 03/2020 ZEISS Digital Innovation) war als Gold Partner mit einem Stand und drei Speakern dabei. Die Themen reichten in diesem Jahr vom klassischen Java Enterprise über Microservice Architekturen, REST, Reactive Programming, DevOps und Continuous Delivery zu Testing und Security.

Für die Saxonia Systems AG sprachen Alexander Casall, Manuel Mauky und Kay Grebenstein zu verschiedenen Themen rund um JavaFX. Schade war, dass der Vortrag von Alexander und Manuel am Mittwoch parallel zum Vortrag von Kay angesetzt war, so teilte sich die JavaFX interessierte Zuhörerschaft auf beide Vorträge auf.

Ein Thema, welches in diversen Vorträgen im Vordergrund stand, waren RESTful Webservices. Da ich in den letzten Jahren in Projekten immer öfter auf diese Thematik gestoßen bin, habe ich ein paar dieser Vorträge besucht, um Wissen zu erweitern, zu vertiefen oder auch einfach nur abzugleichen, wie gut oder schlecht man vielleicht selbst in der Vergangenheit an dieses Thema gegangen ist.

REST – ein Überblick

Einen Überblick über das Thema lieferte Silvia Schreier (innoQ) mit ihrem Vortrag „REST 2015“. REST – der REpresentational State Transfer – ist prinzipiell nichts Neues, wurden die Grundlagen dafür schon Mitte der 90er Jahre von Roy Fielding definiert. Doch erst in den letzten Jahren sind RESTful Webservices verstärkt im Kommen. Hierbei werden die Ressourcen des Dienstes – beispielsweise Bücher und Autoren bei einem Bücherservice – per eindeutiger URI zugreifbar gemacht. Zum Beispiel würde GET /books/123 eine Repräsentation eines speziellen Buches liefern, GET /books eine Liste aller Bücher.

Operationen auf diesen Ressourcen werden mit HTTP Verben abgebildet. Anstelle einer speziellen URI zum Ändern eines Datensatzes wie /authors/456/update, wird die Ressource verändert, indem beispielsweise ein PUT oder PATCH Request auf sie ausgeführt wird. Ebenso dient DELETE zum Löschen und POST zum Erzeugen neuer Ressourcen. Für die Antwort bietet HTTP dem REST Service eine einfache Möglichkeit, den Aufrufer über den Status der Anfrage zu informieren. Die 200er Status Codes bedeuten eine erfolgreiche Anfrage, 300er Weiterleitungen, 400er Fehler des Clients und 500er Fehler auf Server Seite. Zusätzlich dazu gibt es eine Vielzahl standardisierter Header, welche Client und Server nutzen können und sollten, um beispielsweise den Typ des Inhalts auszuhandeln, Informationen über Autorisierung und Caching anzugeben und vieles mehr.

Ein wesentliches Architekturprinzip für gute RESTful Webservices ist HATEOAS – Hypermedia as the Engine of Application State. Hier erfolgt die Navigation des Clients ausschließlich über URLs, die entweder in den Ressourcen oder den Header-Informationen vom Server bereitgestellt werden. Hierdurch wird eine lose Kopplung erreicht, was es dem Schnittstellenanbieter erleichtert, Änderungen an dieser zu machen.

Neben diesen grundsätzlichen Informationen wurden noch eine Reihe von Best Practices zu weiteren Themen rund um RESTful Webservices gegeben. Beispielsweise lassen sich alle Mechanismen gleichermaßen nutzen, um auch die Dokumentation der eigenen Schnittstelle als spezielle Ressourcen verfügbar zu machen. Der Überblick wurde abgerundet durch das Thema Sicherheit. Hier gibt es viele Möglichkeiten der Authentifizierung und Autorisierung wie Basic Auth, Cookie basierte Mechanismen, OAuth 1 und 2, OpenID Connect und weitere Verfahren. Welches sich in der jeweiligen Anwendung eignet oder genutzt werden sollte, kommt auf den Anwendungsfall und die Art der Clients an.

Spring Data REST

Nach der Theorie stellt sich die Frage, wie sich nun REST-konforme Schnittstellen mit Java entwickeln lassen. Da in meinen bisherigen Projekten immer Implementierungen des JAX-RS Standards zum Einsatz kamen, war es interessant sich den Ansatz von Spring anzuschauen. Den hierzu passenden Vortrag „Spring Data REST – Repositories meet Hypermedia“ gab es von Oliver Gierke (Pivotal Software, Inc.). Out of the Box generiert Spring Data REST HATEOAS-konforme Ressource-Repräsentationen im HAL-Format aus den Domänenobjekten. Das HAL – Hypertext Application Language – Format definiert die Art und Weise wie Hyperlinks in Ressourcen dargestellt werden. Bei einer HAL-konformen Schnittstelle kann der Client allein durch die gegebenen Links und deren Relationen durch die komplette Schnittstelle navigieren. Spring kümmert sich automatisch, um die Übersetzung des Domänenmodells, indem beispielsweise aggregierte Objekte direkt als Sub-Ressourcen, Relationen zwischen Objekten als Links oder IDs als URIs abgebildet werden. Spring Data REST bietet bereits vieles, was – zumindest bis jetzt – bei JAX-RS noch händisch gemacht werden muss. Je nachdem, worauf der Fokus im Projekt gelegt wird, kann sich der Umstieg auf das Spring Ökosystem durchaus lohnen.

Dokumentation von REST Schnittstellen

Ein Thema welches gern mal ignoriert oder zumindest stiefmütterlich behandelt wird, ist die Dokumentation. Doch gerade bei Schnittstellen ist diese oft unverzichtbar für die Anwender der Schnittstelle bzw. die Entwickler, welche diese Schnittstelle nutzen sollen. Welche Möglichkeiten es gibt, sich mit Hilfe von Open Source Werkzeugen Dokumentationen von REST Schnittstellen generieren zu lassen, war Thema in Martin Walters (Deutsche Welle) Vortrag „REST-Architekturen erstellen und dokumentieren“. Hierbei gibt es verschiedene Ansätze, wie apiary.io zum Schreiben von Dokumentationen in einer Wiki-Syntax oder Javadoc basierten Lösungen wie SpringDoclet und apidoc.js, bei denen spezielle Kommentare im Quellcode genutzt werden für die automatische Generierung von Dokumentationen. Das umfangreichste Werkzeug bzw. Sammlung von Werkzeugen bietet Swagger. Dokumentationen können hier mittels Annotationen aus dem Code heraus erzeugt, mit JSON oder YAML geschrieben oder mit Hilfe von Editoren erzeugt werden. Aus der JSON Definition können wiederum Client- und Serverendpunkte in verschiedensten Sprachen generiert werden. Des Weiteren bietet Swagger ein UI zur Darstellung der Schnittstelle mit der Möglichkeit, diese direkt auszutesten.

Fazit

Für mich war es die erste W-JAX Teilnahme und ich wurde nicht enttäuscht. Es gab viele Themen und wirklich gute Vorträge. Neben den bereits im Detail erwähnten Vorträgen rund um REST möchte ich hier auf jeden Fall noch Axel Fontaine (Boxfuse GmbH) mit seinem Vortrag „Immutable Infrastructure auf AWS“ und Steffen Müller (Incloud GmbH) mit „Cross-Plattform-App-Entwicklung“ nennen. Beide Vorträge waren sowohl inhaltlich als auch vom Stil her sehr interessant und erfrischend. Was ich persönlich ein wenig schade fand, war die große Anzahl von jeweils 10 parallelen Vorträgen. So blieb vieles auf der Strecke, da es oft zwei oder drei parallele Themen gab, die ich gern besucht hätte. Trotz allem komme ich gern wieder!