在 Rust 用戶端程式庫中啟用遙測信號

Google Cloud 為 Rust 應用程式提供強大的監控、記錄與診斷功能。

Rust 用戶端程式庫會檢測追蹤記錄、指標和記錄資料。這項插碼功能為選擇性,您必須明確啟用。本文件說明可用的信號,以及如何啟用這些信號。

可用的信號

Rust 用戶端程式庫會產生下列信號:

  1. 每個邏輯用戶端要求都有 INFO 範圍。通常用戶端結構體中的單一方法呼叫會取得這類範圍 (例如,在 SecretManagerService 用戶端上呼叫 access_secret_version)。
  2. 直方圖指標,用於測量每個邏輯用戶端要求的經過時間。主要指標為 gcp.client.request.duration
  3. 每個失敗的邏輯用戶端要求都會有 WARN 記錄。
  4. INFO 跨度,適用於每個低階 RPC 嘗試。通常,用戶端結構體中的單一方法會取得一個這類時距,但如果程式庫必須重試遠端程序呼叫 (RPC),則可能會取得更多時距。
  5. DEBUG 記錄,瞭解每次失敗的低階嘗試。

這些時距和記錄會遵循 OpenTelemetry 語意慣例,並包含額外的Google Cloud 屬性。跨度和記錄都應適用於生產監控。

信號包括標準 OpenTelemetry 屬性 (例如 http.response.status_coderpc.system.name) 和 Google Cloud專屬的自訂屬性,可能包括下列屬性和類似屬性:

  • gcp.client.service:服務名稱 (例如 pubsubstorage)。
  • gcp.client.repo:用戶端程式庫存放區 (例如 googleapis/google-cloud-rust)。
  • gcp.client.version:用戶端程式庫版本。
  • gcp.client.artifact:特定模組路徑 (例如 google-cloud-secretmanager)。
  • gcp.resource.destination.id:要執行動作的資源 ID。
  • gcp.errors.domain:可採取行動的錯誤記錄的錯誤網域。
  • gcp.errors.metadata.<key>:失敗要求的其他錯誤中繼資料鍵 (已扁平化)。

如需標準屬性的完整清單,請參閱 OpenTelemetry HTTP 和 gRPC 語意慣例

程式庫也會為每個要求提供 DEBUG 範圍。包括完整要求主體、成功要求的回應主體,以及失敗要求的完整錯誤訊息和詳細資料。

在生產環境中啟用這些要求和回應之前,請先考量內容,因為要求或回應可能包含敏感資料。

這些 DEBUG 時距會使用用戶端程式庫 Crate,然後是 ::tracing 做為目標 (例如 google_cloud_secretmanager_v1::tracing),並使用方法名稱做為時距名稱 (例如 access_secret_version)。您可以透過名稱、目標或兩者來設定篩選器。

啟用遙測功能

為保護機密資料,遙測信號預設為停用。

在 Rust 中,您必須設定用戶端來發出追蹤記錄、指標和記錄檔,設定訂閱者和匯出工具,將這些信號傳送至外部服務。

如要設定用戶端,您可以設定下列環境變數:

export GOOGLE_CLOUD_RUST_LOGGING=true

或者,您也可以在使用用戶端建構工具的 .with_tracing() 方法建構用戶端時,透過程式明確啟用追蹤功能:

use google_cloud_secretmanager_v1::client::SecretManagerService;

let client = SecretManagerService::builder()
    .with_tracing()
    .build()
    .await?;

追蹤內容傳播

即使未使用 .with_tracing() 明確啟用追蹤記錄產生功能,Rust 用戶端程式庫也會自動將有效追蹤記錄內容傳播至Google Cloud 服務。

使用 tracing-opentelemetryopentelemetry Crate 為用戶端程式庫提供追蹤內容。

匯出遙測資料

在用戶端程式庫中啟用遙測功能後,您必須設定應用程式,才能收集這項資料並匯出至可觀測性服務。Rust 用戶端程式庫原生使用 tracing 生態系統。

追蹤

如要將 Google Cloud 用戶端程式庫產生的 tracing 範圍匯出至 OpenTelemetry,您必須在應用程式中設定 Subscriber,將資料導向 OpenTelemetry 匯出工具 (例如 OTLP)。

使用 tracing-opentelemetryopentelemetry-otlp Crate 設定匯出工具:

use google_cloud_secretmanager_v1::client::SecretManagerService;
use opentelemetry::trace::TracerProvider as _;
use tracing_subscriber::Registry;
use tracing_subscriber::layer::SubscriberExt;

pub async fn sample() -> anyhow::Result<()> {
    let exporter = opentelemetry_otlp::SpanExporter::builder()
        .with_tonic()
        .build()?;
    let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder()
        .with_batch_exporter(exporter)
        .build();
    let tracer = provider.tracer("example");

    // Create a tracing layer that sends data to an OpenTelemetry Collector running on localhost.
    let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);

    // Register the subscriber globally
    let