gRPC-Anwendung mit Beobachtbarkeit von Mikrodiensten auf Google Cloud einrichten

Mit Tools zur Beobachtbarkeit von Mikrodiensten können Sie Ihre Anwendungen instrumentieren, um Telemetriedaten in Cloud Monitoring, Cloud Logging und Cloud Trace zu erfassen und zu präsentieren, die von gRPC-Arbeitslasten stammen, die in Google Cloud und an anderen Orten bereitgestellt werden. Die Beobachtbarkeit von Mikrodiensten funktioniert mit jeder Bereitstellung, der durch Aktivieren der Microservices API Zugriff auf Monitoring, Logging, und Trace gewährt wurde.

In dieser Anleitung erfahren Sie, wie Sie Features für die Beobachtbarkeit von Mikrodiensten nutzen, indem Sie eine einfache gRPC-Anwendung in Google Cloud mit Compute Engine erstellen und Ihre Anwendung mit Beobachtbarkeit für Mikrodienste instrumentieren und sie live in Monitoring and Logging anzeigen.

Compute Engine-VM erstellen und Verbindung zu dieser herstellen

Folgen Sie dieser Anleitung, um eine Compute Engine-VM-Instanz zu erstellen und eine Verbindung zu ihr herzustellen. Auf der VM stellen Sie Ihre Anwendung bereit und instrumentieren sie dann mit der Beobachtbarkeit von Mikrodiensten.

  1. Erstellen Sie eine VM-Instanz:

    gcloud compute instances create grpc-observability-vm \
      --image-family=debian-11 \
      --image-project=debian-cloud \
      --service-account=SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  2. Verbindung zur VM-Instanz herstellen

    gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm
    

Anwendung auf der Compute Engine-VM bereitstellen

Sie können entweder eine Anwendung Ihrer Wahl auf der Compute Engine-VM bereitstellen, die Sie im vorherigen Schritt erstellt haben, und diesen Schritt überspringen, oder Sie können ein Beispiel verwenden, um mit der Anleitung in Ihrer bevorzugten Sprache fortzufahren.

C++

  1. Nachdem Sie eine Verbindung zur VM-Instanz hergestellt haben, führen Sie den folgenden Befehl aus.

    sudo apt-get update -y
    sudo apt-get install -y git build-essential clang
    git clone -b v1.54.0 https://github.com/grpc/grpc.git --depth=1
    

Go

  1. Prüfen Sie, ob Go installiert ist.

    sudo apt-get install -y git
    sudo apt install wget
    wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz
    sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf \
    go1.20.2.linux-amd64.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    
  2. Klonen Sie die gRPC-Go-Beispiele.

    git clone https://github.com/grpc/grpc-go.git
    cd grpc-go/
    git checkout -b run-observability-example
    875c97a94dca8093bf01ff2fef490fbdd576373d
    

Java

  1. Nachdem Sie eine Verbindung zur VM-Instanz hergestellt haben, prüfen Sie, ob Java 8 oder höher installiert ist.

    sudo apt update
    sudo apt upgrade
    sudo apt install git
    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. Klonen Sie das grpc-java-Repository.

    export EXAMPLES_VERSION=v1.54.1
    git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \
    https://github.com/grpc/grpc-java.git
    

gRPC Google Cloud Observability-Konfigurationsdatei erstellen

Sie benötigen eine separate gRPC Google Cloud Observability-Konfigurationsdatei, um die Beobachtbarkeit von Mikrodiensten für Server und Client zu aktivieren. Der Speicherort dieser Datei wird in den nächsten Schritten als GRPC_GCP_OBSERVABILITY_CONFIG_FILE exportiert. Folgen Sie der Anleitung unten, um die verschiedenen Parameter in der Konfigurationsdatei einzurichten.

Beispiel GRPC_GCP_OBSERVABILITY_CONFIG_FILE

{
  "project_id": "your-project-here",
  "cloud_logging": {
    "client_rpc_events": [
    {
      "methods": ["google.pubsub.v1.Subscriber/Acknowledge", "google.pubsub.v1.Publisher/CreateTopic"],
      "exclude": true,
    },
    {
      "methods": ["google.pubsub.v1.Subscriber/*", "google.pubsub.v1.Publisher/*"],
      "max_metadata_bytes": 4096,
      "max_message_bytes": 4096,
    }],
    "server_rpc_events": [{
      "methods": ["*"],
      "max_metadata_bytes": 4096,
      "max_message_bytes": 4096
    }],
  },
  "cloud_monitoring": {},
  "cloud_trace": {
    "sampling_rate": 0.5,
  }
  "labels": {
    "SOURCE_VERSION": "J2e1Cf",
    "SERVICE_NAME": "payment-service-1Cf",
    "DATA_CENTER": "us-west1-a"
  }
}

In den folgenden Abschnitten finden Sie eine Anleitung zum Aktivieren der Datenerfassung in Ihrer Konfiguration für die einzelnen Komponenten. Wenn Sie das gRPC-Beispiel in dieser Anleitung verwendet haben, können Sie diese Konfiguration unverändert verwenden (nachdem your-project-here aktualisiert) oder dies als Vorlage für Ihre Anwendung und ein Beispiel für die Konfigurationsinformationen in einer Umgebungsvariablen verwenden.

Messwerte aktivieren

Fügen Sie zum Aktivieren von Messwerten das Objekt cloud_monitoring zur Konfiguration hinzu und setzen Sie den Wert auf {}.

Weitere Informationen zu Messwerten finden Sie unter Messwertdefinitionen.

Tracing aktivieren

So aktivieren Sie Tracing:

  1. Fügen Sie das Objekt cloud_trace zur Konfiguration hinzu.
  2. Legen Sie cloud_trace.sampling_rate auf 0.5 fest, um 50% der RPCs nach dem Zufallsprinzip zu verfolgen.

Wenn Sie das Tracing über Dienste hinweg aktivieren möchten, müssen Sie dafür sorgen, dass die Dienste die Weitergabe von Trace-Kontext vom vorgelagerten (oder selbst gestarteten) zum nachgelagerten Dienst unterstützen.

Weitere Informationen zum Tracing finden Sie unter Trace-Definitionen.

Logging aktivieren

So aktivieren Sie das Logging:

  1. Fügen Sie das Objekt cloud_logging zur Konfiguration hinzu.
  2. Fügen Sie ein Muster entweder zu client_rpc_events, zu server_rpc_events oder zu beiden hinzu, um die Dienste oder Methoden anzugeben, für die Sie ein Ereignis-Logging auf Transportebene generieren möchten und die Anzahl der zu protokollierenden Byte für Header und Nachrichten.

Weitere Informationen zum Logging finden Sie unter Logeinträge.

Anwendungen für das Beobachtbarkeits-Plug-in instrumentieren

Verwenden Sie die folgende Anleitung für Ihre bevorzugte Sprache, um Ihre Anwendungen so zu instrumentieren, dass sie das Mikrodienste-Beobachtbarkeits-Plug-in verwenden können.

C++

Sie können C++ mit der Beobachtbarkeit von Mikrodiensten ab gRPC C++ v1.54 verwenden. Das Beispiel-Repository befindet sich auf GitHub.

  1. Die Unterstützung für die Beobachtbarkeit ist nur über das Bazel-Build-System verfügbar. Fügen Sie das Ziel grpcpp_gcp_observability als Abhängigkeit hinzu.

  2. Die Aktivierung der Beobachtbarkeit von Mikrodiensten erfordert eine zusätzliche Abhängigkeit (ein Beobachtbarkeitsmodul) und die folgenden Codeänderungen an vorhandenen gRPC-Clients, -Servern oder beidem:

    #include <grpcpp/ext/gcp_observability.h>
    
    int main(int argc, char** argv) {
      auto observability = grpc::GcpObservability::Init();
      assert(observability.ok());
      
      // Observability data flushed when object goes out of scope
    }
    

    Rufen Sie vor allen gRPC-Vorgängen, einschließlich des Erstellens eines Kanals, Servers oder Anmeldedaten, Folgendes auf:

    grpc::GcpObservability::Init();
    

    Es wird absl::StatusOr<GcpObservability> zurückgegeben, das gespeichert werden sollte. Der Status hilft bei der Feststellung, ob die Beobachtbarkeit erfolgreich initialisiert wurde. Das zugehörige GcpObservability-Objekt steuert die Lebensdauer der Beobachtbarkeit und schließt und entfernt Daten zur Beobachtbarkeit automatisch, wenn sie außerhalb des Gültigkeitsbereichs liegen.

Go

  1. Plug-ins für Beobachtbarkeit von Mikrodiensten werden in gRPC Go-Versionen v1.54.0 und höher unterstützt. Das Beispiel-Repository befindet sich auf GitHub.

Wenn Sie die Beobachtbarkeit von Mikrodiensten aktivieren, sind für das Go-Modul ein Beobachtbarkeitsmodul und der folgende Code erforderlich:

import "google.golang.org/grpc/gcp/observability"

func main() {
  ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  defer cancel()
  if err := observability.Start(ctx); err != nil {
    log.Warning("Unable to start gRPC observability:", err)
  }
  defer observability.End()
  
}

Der Aufruf observability.Start parst die Konfiguration aus Umgebungsvariablen, erstellt entsprechend Exporter und fügt eine Erfassungslogik in Clientverbindungen und Server ein, die nach dem Aufruf erstellt werden. Der zurückgestellte Aufruf observability.End bereinigt Ressourcen und stellt sicher, dass die Daten im Zwischenspeicher gelöscht werden, bevor die Anwendung geschlossen wird.

Führen Sie nach dem Aktualisieren des Anwendungscodes den folgenden Befehl aus, um die Datei go.mod zu aktualisieren.

go mod tidy

Java

Um die Beobachtbarkeit von Mikrodiensten für Java-Anwendungen zu verwenden, ändern Sie den Build so, dass das Artefakt grpc-gcp-observability enthalten ist. Verwenden Sie die gRPC-Version 1.54.1 oder höher.

In den Build-Snippets in den Abschnitten der Gradle- und Maven-Build-Tools ist grpcVersion auf den Wert 1.54.1 festgelegt.

Das Beispiel-Repository befindet sich auf GitHub.

  1. Fügen Sie den folgenden Code zu main() hinzu, um Ihre Java-Anwendungen für die Beobachtbarkeit von Mikrodiensten zu instrumentieren.
...
import io.grpc.gcp.observability.GcpObservability;
...

// Main application class
...

public static void main(String[] args) {
...
  // call GcpObservability.grpcInit() to initialize & get observability
  GcpObservability observability = GcpObservability.grpcInit();

...
  // call close() on the observability instance to shutdown observability
  observability.close();
...
}

Sie müssen GcpObservability.grpcInit() aufrufen, bevor gRPC-Kanäle oder -Server erstellt werden. Die Funktion GcpObservability.grpcInit() liest die Konfiguration der Mikrodienst-Beobachtbarkeit und verwendet sie, um die globalen Interceptor und Tracer einzurichten, die für die Logging-, Messwert- und Trace-Funktionalität in jedem erstellten Kanal und Server erforderlich sind. GcpObservability.grpcInit() ist threadsicher und muss genau einmal aufgerufen werden. Die Funktion gibt eine Instanz von GcpObservability zurück, die Sie speichern müssen, um später close() aufrufen zu können.

GcpObservability.close() hebt die Zuweisung von Ressourcen auf. Kanäle, die danach erstellt werden, führen kein Logging durch.

GcpObservability implementiert java.lang.AutoCloseable, das automatisch geschlossen wird, wenn Sie try-with-resources so verwenden:

...
import io.grpc.gcp.observability.GcpObservability;
...

// Main application class
...

public static void main(String[] args) {
...
  // call GcpObservability.grpcInit() to initialize & get observability
  try (GcpObservability observability = GcpObservability.grpcInit()) {

...
  } // observability.close() called implicitly
...
}

Gradle-Build-Tool verwenden

Wenn Sie das Gradle-Build-Tool verwenden, geben Sie Folgendes an:

def grpcVersion = '1.54.1'

...

dependencies {
...
implementation "io.grpc:grpc-gcp-observability:${grpcVersion}"
...
}

Maven-Build-Tool (pom.xml) verwenden

Wenn Sie das Maven-Build-Tool verwenden, geben Sie Folgendes an:

<properties>
...
<grpc.version>1.54.1</grpc.version>
...
</properties>

...

<dependencies>
...
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-gcp-observability</artifactId>
<version>${grpc.version}</version>
</dependency>
...
</dependencies>

Führen Sie Ihre Anwendung aus

Folgen Sie der Anleitung in diesem Abschnitt nur, wenn Sie das gRPC-Beispiel für das Tutorial verwendet haben. Sie können den Befehl run so ändern, dass er auf das Binärprogramm Ihrer Anwendung ausgerichtet ist.

Run Server

C++

  1. Erstellen Sie eine SSH-Sitzung zur VM.
  2. Umgebungsvariablen exportieren Erstellen Sie server_config.json anhand der oben beschriebenen Schritte.

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/server_config.json"
    
  3. Serveranwendung ausführen shell cd grpc tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_server

Go

  1. Erstellen Sie eine SSH-Sitzung zur VM.
  2. Umgebungsvariablen exportieren Erstellen Sie server_config.json anhand der oben beschriebenen Schritte.

    export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./server/serverConfig.json
    
  3. Serveranwendung ausführen shell go run ./server/main.go

Java

  1. Öffnen Sie im Verzeichnis „examples“ die README-Datei und folgen Sie der Anleitung in der Datei.
  2. Wenn Sie aufgefordert werden, ein weiteres Terminalfenster zu öffnen, führen Sie diesen Befehl aus: shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm

Run Client

C++

  1. Erstellen Sie eine weitere SSH-Sitzung in der VM.
  2. Umgebungsvariablen exportieren Führen Sie die oben beschriebenen Schritte aus, um die Datei client_config.json zu erstellen.

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/client_config.json"
    
  3. Clientanwendung ausführen

    cd grpc
    tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_client
    

Go

  1. Erstellen Sie eine weitere SSH-Sitzung in der VM.
  2. Umgebungsvariablen exportieren Folgen Sie der Anleitung oben, um die Datei client_config.json zu erstellen. shell export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./client/clientConfig.json
  3. Clientanwendung ausführen

    cd grpc-go/examples/features/observability
    go run ./client/main.go
    

Java

  1. Öffnen Sie im Verzeichnis „examples“ die README-Datei und folgen Sie der Anleitung in der Datei.
  2. Wenn Sie aufgefordert werden, ein weiteres Terminalfenster zu öffnen, geben Sie diesen Befehl ein: shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm