在 Google Cloud 上設定具備微服務可觀察性的 gRPC 應用程式

微服務觀測工具可讓您檢測應用程式,以便在 Cloud Monitoring、Cloud Logging 和 Cloud Trace 中,收集並呈現部署在 Google Cloud 和其他位置的 gRPC 工作負載遙測資料。微服務可觀測性適用於任何已啟用 Microservices API,並獲准存取 Monitoring、Logging 和 Trace 的部署作業。

在本教學課程中,您將在 Google Cloud 使用 Compute Engine 建構簡單的 gRPC 應用程式,並透過微服務可觀測性功能檢測應用程式,然後在 Monitoring 和 Logging 中即時查看結果,瞭解如何使用微服務可觀測性功能。

建立及連線至 Compute Engine VM

請按照這些操作說明建立及連線至 Compute Engine VM 執行個體。在 VM 上部署應用程式,然後使用微服務可觀測性功能檢測應用程式。

  1. 建立 VM 執行個體:

    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. 連線至 VM 執行個體:

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

將應用程式部署至 Compute Engine VM

您可以選擇將應用程式部署至上一步建立的 Compute Engine VM,然後略過這個步驟,也可以使用範例,繼續以偏好語言查看操作說明。

C++

  1. 連線至 VM 執行個體後,請執行下列指令。

    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. 確認您已安裝 Go。

    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. 複製 gRPC-Go 範例。

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

Java

  1. 連線至 VM 執行個體後,請確認已安裝 Java 8 以上版本。

    sudo apt update
    sudo apt upgrade
    sudo apt install git
    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. 複製 grpc-java 存放區。

    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 可觀測性設定檔

您需要個別的 gRPC Google Cloud 可觀測性設定檔,才能為伺服器和用戶端啟用微服務可觀測性。這個檔案的位置會在後續步驟中匯出為 GRPC_GCP_OBSERVABILITY_CONFIG_FILE。請按照下列說明,在設定檔中設定不同參數。

範例 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"
  }
}

以下各節包含在個別元件的設定中啟用資料收集功能的說明。如果您在本教學課程中使用 gRPC 範例,可以照常使用這個設定 (更新 your-project-here 後),或將這個設定做為應用程式的範本。此外,您也可以參考這個範例,瞭解如何以環境變數的形式提供設定資訊。

啟用指標

如要啟用指標,請將 cloud_monitoring 物件新增至設定,並將其值設為 {}

如要進一步瞭解指標,請參閱「指標定義」。

啟用追蹤功能

如要啟用追蹤功能,請按照下列步驟操作:

  1. cloud_trace 物件新增至設定。
  2. cloud_trace.sampling_rate 設為 0.5,隨機追蹤 50% 的 RPC。

如果您打算跨服務啟用追蹤功能,請確保服務支援將從上游接收 (或自行啟動) 的追蹤內容傳播至下游。

如要進一步瞭解追蹤功能,請參閱「追蹤定義」。

啟用記錄功能

如要啟用記錄功能,請按照下列步驟操作:

  1. cloud_logging 物件新增至設定。
  2. client_rpc_events 和/或 server_rpc_events 中新增模式,指定要產生傳輸層級事件記錄的服務或方法集,以及要記錄的標頭和訊息位元組數。

如要進一步瞭解記錄功能,請參閱「記錄定義」。

為可觀測性外掛程式檢測應用程式

如要檢測應用程式,以便使用微服務可觀測性外掛程式,請按照您偏好語言的下列操作說明操作。

C++

從 gRPC C++ v1.54 開始,您可以使用 C++ 搭配微服務可觀測性。範例存放區位於 GitHub。

  1. 觀測功能僅支援 Bazel 建構系統。將目標 grpcpp_gcp_observability 新增為依附元件。

  2. 如要啟用微服務可觀測性,需要額外的依附元件 (可觀測性模組),以及對現有 gRPC 用戶端、伺服器或兩者進行下列程式碼變更:

    #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
    }
    

    在執行任何 gRPC 作業 (包括建立管道、伺服器或憑證) 之前,請先叫用下列項目:

    grpc::GcpObservability::Init();
    

    這會傳回 absl::StatusOr<GcpObservability>,請儲存該值。狀態有助於判斷可觀測性是否已成功初始化。隨附的 GcpObservability 物件會控管可觀測性的生命週期,並在超出範圍時自動關閉及清除可觀測性資料。

Go

  1. gRPC Go v1.54.0 以上版本支援微服務可觀測性外掛程式。範例存放區位於 GitHub。

使用 Go 模組時,如要啟用微服務可觀測性,需要可觀測性模組和下列程式碼:

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()
  
}

observability.Start 呼叫會剖析環境變數中的設定、建立相應的匯出工具,並將收集邏輯注入呼叫後建立的用戶端連線和伺服器。延遲的 observability.End 呼叫會清除資源,並確保緩衝資料在應用程式關閉前排清。

更新應用程式程式碼後,請執行下列指令來更新 go.mod 檔案。

go mod tidy

Java

如要將微服務觀測功能與 Java 應用程式搭配使用,請修改建構作業,加入 grpc-gcp-observability 構件。使用 gRPC 1.54.1 以上版本。

在 Gradle 和 Maven 建構工具部分的建構程式碼片段中,grpcVersion 會設為 1.54.1。

範例存放區位於 GitHub。

  1. 如要順利檢測 Java 應用程式,以取得微服務可觀測性,請將下列程式碼新增至 main()
...
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();
...
}

請注意,您必須先呼叫 GcpObservability.grpcInit(),才能建立任何 gRPC 管道或伺服器。GcpObservability.grpcInit() 函式會讀取微服務可觀測性設定,並使用該設定建立每個管道和伺服器中記錄、指標和追蹤功能所需的全域攔截器和追蹤器。GcpObservability.grpcInit() 是執行緒安全,且必須呼叫一次。這個方法會傳回 GcpObservability 的例項,您必須儲存這個例項,才能在稍後呼叫 close()

GcpObservability.close() 會取消分配資源。之後建立的任何頻道或伺服器都不會記錄任何內容。

GcpObservability 會實作 java.lang.AutoCloseable,如果您使用 try-with-resource,系統會自動關閉 java.lang.AutoCloseable,如下所示:

...
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 建構工具

如果您使用 Gradle 建構工具,請加入下列項目:

def grpcVersion = '1.54.1'

...

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

使用 Maven 建構工具 (pom.xml)

如果您使用 Maven 建構工具,請加入下列項目:

<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>

執行應用程式

只有在教學課程中使用 gRPC 範例時,才需要按照本節的操作說明進行。您可以修改 run 指令,指定應用程式二進位檔。

執行伺服器

C++

  1. 建立 VM 的 SSH 工作階段。
  2. 匯出環境變數。按照上述步驟建立 server_config.json

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/server_config.json"
    
  3. 執行伺服器應用程式 shell cd grpc tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_server

Go

  1. 建立 VM 的 SSH 工作階段。
  2. 匯出環境變數。按照上述步驟建立 server_config.json

    export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./server/serverConfig.json
    
  3. 執行伺服器應用程式 shell go run ./server/main.go

Java

  1. 在 examples 目錄中開啟 README 檔案,然後按照檔案中的操作說明操作。
  2. 當指示要求您開啟另一個終端機視窗時,請發出下列指令: shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm

執行用戶端

C++

  1. 建立另一個連往 VM 的 SSH 工作階段。
  2. 匯出環境變數。按照上述步驟建立 client_config.json 檔案。

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/client_config.json"
    
  3. 執行用戶端應用程式

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

Go

  1. 建立另一個連往 VM 的 SSH 工作階段。
  2. 匯出環境變數。使用上述步驟建立 client_config.json 檔案。 shell export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./client/clientConfig.json
  3. 執行用戶端應用程式

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

Java

  1. 在範例目錄中開啟 README 檔案,然後按照檔案中的操作說明操作。
  2. 當操作說明要求您開啟另一個終端機視窗時,請發出下列指令: shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm