微服務可觀察性參考資訊

設定資料

下表定義了環境變數中的設定資料。

欄位 規格
project_id 字串

要傳送可觀察性資料的專案 ID。如果為空白,gRPC 可觀察性外掛程式會嘗試從環境變數或預設憑證擷取專案 ID。

如果找不到,觀察功能初始化函式會傳回錯誤。
cloud_logging 物件

記錄選項分類如下表所示。
如果未提供,系統會停用記錄功能。
cloud_logging.client_rpc_events[] List

client_rpc_events 設定清單,代表二進位檔傳出 RPC 的設定。

系統會依照文字順序評估 client_rpc_events 設定,並使用第一個相符的設定。如果 RPC 不符合項目,就會繼續處理清單中的下一個項目。
cloud_logging.client_rpc_events[].methods[] 清單 [字串]

方法 ID 清單。

根據預設,清單為空白,不會比對任何方法。

方法的值為 [service]/[method] 格式。

* 可做為下列萬用字元:
  • 方法名稱。如果值為 [service]/*,則會比對指定服務中的所有方法。
  • 與任何 [service]/[method] 相符的欄位完整值。如果 client_rpc_events[].exclude 為 true,則不支援此功能。
  • * 萬用字元無法單獨用於服務名稱,系統不支援 */[method]

指定的服務名稱必須是完整的服務名稱,包括套件名稱。

例子:
  • goo.Foo/Bar 只會選取服務 goo.Foo 中的 Bar 方法,其中 goo 是套件名稱。
  • goo.Foo/* 會選取服務 goo.Foo 中的所有方法
  • * 會選取所有服務的所有方法。
cloud_logging.client_rpc_events[].exclude Bool

是否應將 client_rpc_events[].methods[] 表示的方法排除在記錄之外。

預設值為 false,表示記錄記錄中會包含 client_rpc_events[].methods[] 所表示的方法。

如果值為 true,萬用字元 (*) 就無法用於 client_rpc_events[].methods[]. 中的整個值
cloud_logging.client_rpc_events[].max_metadata_bytes Int

要記錄的最大結構描述資料位元組數量。如果中繼資料的大小超過定義的限制,系統就不會記錄超出限制的鍵/值組合。

預設值為 0,表示不會記錄任何中繼資料。
cloud_logging.client_rpc_events[].max_message_bytes Int

每個要記錄的訊息的位元組數上限。如果訊息大小超過定義的限制,超過限制的內容會遭到截斷。

預設值為 0,表示不會記錄任何訊息酬載。
cloud_logging.server_rpc_events[] 清單

server_rpc_events 設定清單,代表對二進位檔傳入的 RPC 的設定。

系統會依照文字順序評估 server_rpc_events 設定,並使用第一個相符的設定。如果 RPC 與項目不符,就會繼續處理清單中的下一個

項目。
cloud_logging.server_rpc_events[].methods[] 清單 [字串]

可選取一組方法的字串清單。

根據預設,清單為空白,不會比對任何方法。

方法的值為 [service]/[method] 格式。

* 可做為下列萬用字元:
  • 方法名稱。如果值為 [service]/*,則會比對指定服務中的所有方法。
  • 與任何 [service]/[method] 相符的方法的完整值。server_rpc_events[].exclude 為 true 時不支援。
  • * 萬用字元無法單獨用於服務名稱,系統不支援 */[method]

指定的服務名稱必須是完整的服務名稱,包括套件名稱。

例子:
  • goo.Foo/Bar 只會選取服務 goo.Foo 中的 Bar 方法,此處 goo 是套件名稱。
  • goo.Foo/* 會選取服務 goo.Foo 中的所有方法
  • * 會選取所有服務的所有方法。
cloud_logging.server_rpc_events[].exclude Bool

是否應將 server_rpc_events[].methods[] 表示的方法排除在記錄之外。

預設值為 false,表示會記錄 server_rpc_events[].methods[] 所表示的方法。

如果值為 true,萬用字元 (*) 就無法用於 server_rpc_events[].methods[] 的任何項目,做為整個值。
cloud_logging.server_rpc_events[].max_metadata_bytes Int

要記錄的最大結構描述資料位元組數量。如果中繼資料的大小超過定義的限制,系統就不會記錄超出限制的鍵/值組合。

預設值為 0,表示不會記錄任何中繼資料。
cloud_logging.server_rpc_events[].max_message_bytes Int

每個要記錄的訊息的位元組數上限。如果訊息大小超過定義的限制,超過限制的內容會遭到截斷。

預設值為 0,表示不會記錄任何訊息酬載。
cloud_monitoring 物件

啟用 Cloud Monitoring。沒有任何設定選項。如果您提供空白的設定異議,系統會啟用監控功能。如果您未提供設定物件,系統會停用監控功能。

舉例來說,如果未指定其他選項,空白的設定區段會啟用監控功能。
export GRPC_GCP_OBSERVABILITY_CONFIG='{
    "project_id": "your-project-here",
    "cloud_monitoring": {
    }
}'
cloud_trace 物件

空白的設定區段會啟用追蹤功能,並使用預設的設定選項。如果您未提供設定物件,系統會停用追蹤功能。

舉例來說,空白設定區段會啟用追蹤功能,並使用預設設定選項。
export GRPC_GCP_OBSERVABILITY_CONFIG='{
    "project_id": "your-project-here",
    "cloud_trace": {
    }
}'


啟用追蹤功能時,即使設定為 `0` 的取樣率,系統也會傳播取樣特定追蹤記錄的決定。
cloud_trace.sampling_rate 數字

全域設定,用於控制 RPC 被追蹤的機率。例如:
  • 值為 0.05 表示 RPC 有 5% 的機率會被追蹤。
  • 值為 1.0 表示會追蹤每個呼叫。
  • 0 表示不要啟動新的追蹤記錄。

預設的 sampling_rate 為 0

外掛程式會遵循上游的取樣決定。如果選擇使用 RPC 進行上游取樣,外掛程式會收集跨度並將資料上傳至後端,不受外掛程式的取樣率設定影響。
labels 物件

包含一組鍵/值組合的 JSON 物件。鍵和值都是字串。

標籤會同時套用至 Cloud Logging、Cloud Monitoring 和 Cloud Trace。

追蹤定義

本節提供追蹤功能的相關資訊。

追蹤內容傳播

跨服務追蹤功能才能運作,服務擁有者必須支援從上游 (或自行啟動) 收到的追蹤內容傳播至下游。追蹤記錄會透過 gRPC 中繼資料在服務之間傳播。請務必啟用 Cloud Monitoring、Cloud Logging、Cloud Trace API 和 Microservices API,讓這個設定中的服務將遙測資料回報給適當的服務。

如果沒有傳播支援功能,下游服務就無法為追蹤產生跨度。現有的跨度不會受到影響。微服務可觀測性外掛程式支援 OpenCensus 二進位格式,可用於編碼和編碼追蹤記錄內容。

時距數量

區間的名稱格式如下:

類型 範例值 用量
RPC 跨距 [Sent|Recv].helloworld.Greeter.SayHello 跨度名稱是完整的方法名稱,以點號連接,且沒有前置斜線。
區隔名稱的前置字串為 Sent. (用於用戶端 RPC 區隔) 和 Recv. (用於伺服器 RPC 區隔),並置於完整方法名稱之前。
嘗試範圍 Attempt.helloworld.Greeter.SayHello 在完整方法名稱前方附加前置字串 Attempt.

時距標籤

整合功能會提供不同的跨度標籤。

對於嘗試區間,系統會附加兩個重試相關的額外屬性 (區間標籤):

標籤 範例值 用量
previous-rpc-attempts 0 這個 RPC 之前的重試嘗試次數。
transparent-retry True/False 這個 RPC 是否由公開重試啟動。

指標定義

系統會提供下列指標,並在名為「微服務 (gRPC) 監控」的資訊主頁中顯示,以便針對常見的使用者歷程進行監控。

以下是 gRPC 用戶端指標的指標:

指標名稱 說明 類型、類型、單位 標籤
custom.googleapis.com/opencensus/grpc.io/client/started_rpcs 已啟動的用戶端 RPC 嘗試次數,包括未完成的嘗試。 累計,Int64,1 grpc_client_method
custom.googleapis.com/opencensus/grpc.io/client/completed_rpcs 完成的用戶端 RPC 數量,例如伺服器收到或傳送回應時。 累計,Int64,1 grpc_client_methodgrpc_client_status
custom.googleapis.com/opencensus/grpc.io/client/roundtrip_latency 完成 RPC 嘗試所需的端對端時間,包括選取子通道的時間。 累積、分布、毫秒 grpc_client_method
custom.googleapis.com/opencensus/grpc.io/client/api_latency 從應用程式角度來看,gRPC 程式庫完成 RPC 所需的總時間。 累積、分布、毫秒 grpc_client_methodgrpc_client_status
custom.googleapis.com/opencensus/grpc.io/client/sent_compressed_message_bytes_per_rpc 每個 RPC 嘗試中,所有要求訊息傳送的總位元組數 (已壓縮,未加密)。 累計、分布、依 grpc_client_methodgrpc_client_status
custom.googleapis.com/opencensus/grpc.io/client/received_compressed_message_bytes_per_rpc 每個 RPC 嘗試中,所有回應訊息收到的總位元組數 (已壓縮,未加密)。 累計、分布、依 grpc_client_methodgrpc_client_status

可用的 gRPC 伺服器端指標如下:

指標名稱 說明 類型、類型、單位 標籤
custom.googleapis.com/opencensus/grpc.io/server/started_rpcs
伺服器曾經收到的 RPC 數量,包括尚未完成的 RPC。
累計,Int64,1 grpc_server_method
custom.googleapis.com/opencensus/grpc.io/server/completed_rpcs
已完成的 RPC 總數,例如伺服器傳送回應時。
累計,Int64,1 grpc_server_methodgrpc_server_status
custom.googleapis.com/opencensus/grpc.io/server/sent_compressed_message_bytes_per_rpc
每個 RPC 在所有回應訊息中傳送的總位元組數 (已壓縮,未加密)。
累計、分布、依 grpc_server_methodgrpc_server_status
custom.googleapis.com/opencensus/grpc.io/server/received_compressed_message_bytes_per_rpc
每個 RPC 在所有要求訊息中收到的總位元組數 (已壓縮,未加密)。
累計、分布、依 grpc_server_methodgrpc_server_status
custom.googleapis.com/opencensus/grpc.io/server/server_latency
從伺服器傳輸 (HTTP2 / inproc / cronet) 的角度來看,RPC 所需的總時間。
累積、分布、毫秒 grpc_server_method

上表中的每個分布都包含以下值區的直方圖:

  • 大小 (以位元組為單位):0、1024、2048、4096、16384、65536、262144、1048576、4194304、16777216、67108864、268435456、1073741824、4294967296

  • 延遲時間 (以毫秒為單位):0、0.01、0.05、0.1、0.3、0.6、0.8、1、2、3、4、5、6、8、10、13、16、20、25、30、40、50、65、80、100、130、160、200、250、300、400、500、650、800、1000、2000、5000、10000、20000、50000、100000

標記說明:

  • grpc_client_method:完整的 gRPC 方法名稱,包括套件、服務和方法,例如 google.bigtable.v2.Bigtable/CheckAndMutateRow
  • grpc_client_status:收到的 gRPC 伺服器狀態碼,例如 OKCANCELLEDDEADLINE_EXCEEDED
  • grpc_server_method:完整的 gRPC 方法名稱,包括套件、服務和方法,例如 com.exampleapi.v4.BookshelfService/Checkout
  • grpc_server_status:gRPC 伺服器傳回的狀態碼,例如 OKCANCELLEDDEADLINE_EXCEEDED

記錄檔定義

微服務觀測記錄會使用記錄名稱上傳至 Cloud Logging (PROJECT_ID 是代表專案的字串預留位置):

logName=projects/[PROJECT_ID]/logs/microservices.googleapis.com%2Fobservability%2Fgrpc

以下是產生記錄檔的 JSON 表示法:

{
    "authority": string,
    "callId": string,
    "type": string,
    "logger": string,
    "serviceName": string,
    "methodName": string,
    "peer": {
        "type": string,
        "address": string,
        "ipPort": int
    },
    "payload": {
        "timeout": string,
        "metadata":
            {
                string: string,
                string: string
            },
        "statusCode": string,
        "statusMessage": string,
        "statusDetails": string,
        "message": string,
        "messageLength": int,
    },
    "sequenceId": int
}

下表說明記錄項目中的欄位:

欄位 規格
權威 String

單一程序可用於執行多個具有不同身分的虛擬伺服器。

主機名稱是此類伺服器身分的名稱。通常是 URI 的一部分,格式為主機或主機:通訊埠。
callId 字串

用於唯一識別 [用戶端/伺服器] 呼叫,該呼叫為 UUID。每個呼叫可能會有多個記錄項目。這些事件都具有相同的 callId。
類型 字串

記錄事件的類型。

事件類型:
EVENT_TYPE_UNKNOWN
CLIENT_HEADER
SERVER_HEADER
CLIENT_MESSAGE
SERVER_MESSAGE
CLIENT_HALF_CLOSE
SERVER_TRAILER
CANCEL
記錄器 字串

事件記錄器的類型。

事件記錄器的類型:
LOGGER_UNKNOWNCLIENTSERVER
serviceName 字串

服務名稱。
methodName 字串

RPC 方法的名稱。
節點 物件

對等端位址資訊。在用戶端,伺服器標頭事件和預告片事件會記錄對等端。在伺服器端,peer 一律會在用戶端標頭事件中記錄。
peer.type 字串

位址類型,可能是 IPv4、IPv6 或 UNIX。
peer.address 字串

地址的內容。
peer.ip_port Int

地址的通訊埠號碼。僅適用於 IPv4 和 IPv6 位址。
酬載 物件

酬載可根據事件,包含中繼資料、逾時、訊息和狀態的組合。

  • 針對訊息事件,酬載是傳遞的實際資料,以及訊息長度。
  • 標頭事件的酬載包含標頭名稱和值。
  • 對於預告片事件,酬載會包含狀態詳細資料,以及預告片中繼資料 (如有)。
  • 對於用戶端標頭事件,如果已設定逾時期限,酬載也會包含逾時期限。
payload.timeout 字串

代表 google.protobuf.Duration 的字串,例如「1.2 秒」。

RPC 逾時值。
payload.metadata Mapping[String, String]

標頭事件或預告片事件使用。
payload.message 字串 (位元組)

訊息酬載。
payload.messageLength Int

訊息大小,無論是否記錄完整訊息 (例如,可能會截斷或省略)。
payload.statusCode 字串

gRPC 狀態碼。
payload.statusMessage 字串

gRPC 狀態訊息。
payload.statusDetails 字串

grpc-status-details-bin 中繼資料鍵的值 (如有)。這一律是已編碼的 google.rpc.Status 訊息。
payloadTruncated Bool

如果訊息或中繼資料欄位因設定選項而截斷或省略,則為 True。
sequenceId Int

此呼叫的訊息序號 ID。第一則訊息的值為 1,可與未設定的值區分開。這個欄位的目的是在無法保證耐用性或排序的環境中,偵測缺少的項目。

資源標籤

資源標籤可識別產生可觀察性資料的來源。每個資源標籤都是鍵/值組合,其中鍵是特定來源環境 (例如 GKE 或 Compute Engine) 的預先定義值。

針對 GKE 部署的指標和追蹤,系統會預設填入資源標籤,但容器名稱和命名空間名稱除外。您可以使用 Downward API 填入缺少的值。

以下是環境變數鍵:

  • CONTAINER_NAME
  • NAMESPACE

例如,以下 env 部分包含兩個資源標籤:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: app1
  name: app1
spec:
  replicas: 2
  selector:
    matchLabels:
      run: app1
  template:
    metadata:
      labels:
        run: app1
    spec:
      containers:
        - image: 'o11y-examples:1.00'
          name: container1
          ports:
            - protocol: TCP
              containerPort: 50051
          env:
            - name: CONTAINER_NAME
              value: container1
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace

自訂標籤

自訂標籤代表觀察性資料中使用者提供的其他資訊。標籤由鍵和值組成。鍵/值組合會以跨距標籤的形式附加至追蹤資料、以指標標籤的形式附加至指標資料,以及以記錄項目標籤的形式附加至記錄資料。所有自訂標籤都是 STRING 類型。

您可以在設定中提供自訂標籤,方法是指定 labels 的鍵/值組合清單。實作會讀取設定,並為每個鍵/值組合建立獨立的標籤,然後將標籤附加至可觀察性資料。例如:

"labels": {
    "DATACENTER": "SAN_JOSE_DC",
    "APP_ID": "24512"
  }

每個記錄項目都包含下列額外標籤:

{
   "DATACENTER": "SAN_JOSE_DC"
   "APP_ID": "24512"
}

後續步驟