Überwachen von Spring Boot Applikationen mit GCP Monitoring

Roman Bertolami

Unsere Managed Services betreiben wir auf der Google Kubernetes Engine (GKE). In der Google Cloud überwachen wir die Applikationen mittels einfachen Dashboards und aus Metriken abgeleiteten Alarmen. Dabei überwachen wir nicht nur technische Metriken wie Anzahl Requests oder Antwortzeiten sondern auch fachliche Metriken wie beispielsweise die Anzahl Buchungen.

Im Folgenden wird beschrieben wie wir unseren bestehende Monitoring Ansatz durch eine modernere elegantere Lösung ersetzt haben.

Ausgangslage

Unsere Services laufen als Spring Boot Applikationen in Containern auf GKE. Dabei werden die Application Logs aller Container in Cloud Logging gesammelt.

Bis vor kurzen haben wir aus Log Einträgen, die einer bestimmten Konvention entsprachen, Metriken erstellt (sogenannte “Log-Based Metrics”). GCP scannt dabei die Log Files und generiert, basierend auf den definierten Filter (e.g. resource.type="k8s_container" "BOOKED_OFFER") Datenpunkte, die wiederum in Dashboards zusammengestellt werden können.

Der Vorteil von Log-Based Metrics ist, dass kein zusätzlicher Kanal zwischen Applikation und Plattform nötig ist und sie sehr einfach implementiert werden können. Der Nachteil ist, dass die Logs gescannt werden müssen und dass die Definition der Metriken relativ mühsam ist.

Neu sollen die Metriken direkt über die Metrics Facade Micrometer von der Applikation an GCP geschickt werden. Damit können die Metriken strukturierter erfasst und verarbeitet werden.

Micrometer

Micrometer (micrometer.io) bietet eine einfache Fassade um Vendor-unabhängig Metriken aus Java Applikationen an Monitoring Plattformen zu schicken.

Die Installation geschieht dabei über eine Spring Cloud GCP Abhängigkeit

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-metrics</artifactId>
</dependency>

Zusätzlich konfigurieren müssen wir noch das GCP Projekt an welches die Metriken geschickt werden sollen. Dies kann über die Standard Spring Configuration erledigt werden.

Wenn unkontrolliert alle möglichen Metriken von verschiedenen Frameworks aus der Applikation an GCP gesendet werden können unerwünschte Kosten anfallen. Daher definieren wir einzeln, welche Metriken gesendet werden sollen.

Die resultierenden Eintrage der application.properties Datei sehen wiefolgt aus:

management.metrics.export.stackdriver.project-id=dsi-demo
management.metrics.enable.all=false
management.metrics.enable.dsidemo=true

Damit werden alle Metriken, die mit dsidemo starten an das GCP Projekt dsi-demo geschickt.

Spring Boot Integration

Die Integration in Spring Boot ist denkbar einfach. Objekte der Klasse MeterRegistry werden von Spring Boot automatisch instanziert. Mit diesen Objekten können dann Metriken gemeldet werden, indem die entsprechende Methode aufgerufen wird. Im folgenden kurzen Snippet ist ersichtlich, wie die MeterRegistry einfach verwendet werden kann und eine Counter-Metrik dsidemo.foo mit einem Tag type geschickt wird. Ein Tag kann zum Beispiel verwendet werden, um verschiedene Ausprägungen einer Metrik zu unterscheiden.

@RestController
@RequestMapping("/api/v1/")
public class TripController {

    private final MeterRegistry meterRegistry;

    public TripController(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    @GetMapping("/foo")
    public Response foo() {
        meterRegistry.counter("dsidemo.foo", "type", "mytype").increment();
        return null;
    }
}

Alternativ kann auch mit den Annotations von micrometer gearbeitet werden. Diese müssen aber in Spring Boot mit einem ensprechenden Aspect konfiguriert werden. Für die @Timed Annotation sieht das wiefolgt aus.

@Timed("dsidemo.bar")
public void bar() {
    // do something
}

@Configuration
public class TimedConfiguration {
    @Bean
    public TimedAspect timedAspect(MeterRegistry registry) {
        return new TimedAspect(registry);
    }
}

Damit kann unsere Applikation beliebige Metriken an GCP Monitoring schicken. Was noch fehlt ist die Zugriffsberechtigung, die die Applikation autorisiert Metriken an GCP zu senden.

Zugriff mittels Workload Identity

Da unsere Applikation in einem Container auf GKE läuft, können wir den Zugriff mit einer Workload Identity herstellen. Workload Identity ist die von Google empfohlene Art Zugriffe auf GCP Services aus GKE zu autorisieren.

Der Workload Identity Ansatz ermöglicht es einen Kubernetes Service Account mit einem GCP Service Account zu verbinden und die Rechte in GCP zu managen. Dazu muss zuerst der entsprechende GCP Service Account erstellt werden. Dieser Service Account wird dann in unserem Fall berechtigt, auf das Monitoring von GCP zuzugreifen:

gcloud iam service-accounts create dsidemo-gcp-serviceaccount

gcloud projects add-iam-policy-binding dsi-demo --member "serviceAccount:dsidemo-gcp-serviceaccount@dsi-demo.iam.gserviceaccount.com" --role "roles/monitoring.metricWriter"

In der Deployment Konfiguration YAML der Applikation fügen wir nun einen Service Account hinzu. Dieser wird zudem verknüpft mit dem eben erstellten Service Account von GCP:

template:
    spec:
    serviceAccountName: dsidemo-serviceaccount-k8s

apiVersion: v1
kind: ServiceAccount
metadata:
    name: dsidemo-serviceaccount-k8s
    annotations:
        iam.gke.io/gcp-service-account: dsidemo-gcp-serviceaccount@dsi-demo.iam.gserviceaccount.com

Nun müssen wir in GCP nur noch die beiden Service Accounts als Workload Identitity verbinden:

gcloud iam service-accounts add-iam-policy-binding dsidemo-gcp-serviceaccount@$dsi-demo.iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member "serviceAccount:dsi-demo.svc.id.goog[${K8S_NAMESPACE}/dsidemo-serviceaccount-k8s]"

Damit kann die Applikation nun Metriken an GCP Monitoring schicken und wir können diese im Metrics Explorer unter dem Namen custom/dsidemo/foo, respektive custom/dsidemo/bar, anzeigen. Wir können sie in Dashboards visualisieren und Alerts definieren, analog anderer Metriken aus GCP.

Möchten Sie Ihren aktuellen Monitoring Ansatz prüfen und weiterentwickeln? Wir beraten Sie gerne.