无代理 gRPC 的可观测性
用于无代理 gRPC 的 Cloud Service Mesh 可观测性基于现有的 gRPC OpenTelemetry 插件构建,可为启用了 Cloud Service Mesh 的所有 gRPC 渠道和服务器记录指标(延迟时间、消息大小等),并提供显示 Cloud Service Mesh 流量的拓扑网格信息的其他属性。如果 gRPC 渠道从 Cloud Service Mesh 控制平面获取配置,则该渠道会视为已启用 Cloud Service Mesh,同时所有 gRPC 服务器都会视为已启用 Cloud Service Mesh。
网格属性
以下网格属性适用于指标。
本地环境标签:
csm.mesh_id
- 网格 ID。
- 其他本地环境属性是从 OpenTelemetry 资源获取的。
- Managed Service for Prometheus (GMP) 可设置为使用 Google 基础设施来存储指标。如果使用此功能,描述应用本地环境的资源属性会自动添加为 MonitoredResource。
- 如果使用非 Google 基础设施来导出和存储指标,收集流水线应在指标上添加描述应用运行所在环境的属性。
远程环境标签:
csm.remote_workload_type
- 远程对等体的类型。(对于 GKE,为“gcp_kubernetes_engine”)。
- 系统会根据对等体的类型显示其他属性。
- 对于在 GKE 上运行的对等体:
csm.remote_workload_project_id
- 与此资源关联的项目的标识符,例如“my-project”。
csm.remote_workload_location
*包含容器的集群的物理位置。csm.remote_workload_cluster_name
- 容器运行所在的集群。
csm.remote_workload_namespace_name
The namespace where the container is running.
csm.remote_workload_name
- 远程工作负载的名称。这应该是包含 Pod 定义的对象的名称(例如,Deployment、ReplicaSet,或者仅为裸 Pod 的 Pod 名称)。
服务标签:有关 RPC 路由到的后端服务(xDS 集群)的信息。请注意,只有通过 Gateway API 配置后端服务时才提供此信息。
csm.service_name
- 服务名称。
csm.service_namespace_name
- 服务命名空间名称。
remote_workload 一词是指对等体,即对于客户端,作为 RPC 目标的服务器 Pod 是远程工作负载;而对于服务器,发起 RPC 的客户端 Pod 是远程工作负载。
请注意,grpc.client.attempt.started
和 grpc.server.call.started
上不会提供这些属性,因为这些指标的收集点不提供所有拓扑网格信息。
可观测性设置说明
本部分介绍了如何在服务网格设置中为无代理 gRPC 启用 Cloud Service Mesh 可观测性。
C++
可观测性支持只能通过 Bazel 构建系统获得。需要将目标 grpcpp_csm_observability
添加为依赖项。
所需的代码更改
为了利用 Cloud Service Mesh 可观测性,需要将以下代码添加到 gRPC 客户端和服务器。
#include <grpcpp/ext/csm_observability.h>
int main() {
// …
auto observability = grpc::CsmObservabilityBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegister();
assert(observability.ok());
// …
}
在执行任何 gRPC 操作(包括创建渠道、服务器或凭证)之前,使用 CsmObservabilityBuilder API 注册插件。以下示例展示了如何使用 Prometheus 导出器设置 Cloud Service Mesh 可观测性。
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = "0.0.0.0:9464";
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
meter_provider->AddMetricReader(std::move(prometheus_exporter));
auto observability = grpc:::CsmObservabilityBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegister();
CsmObservabilityBuilder()
上的 SetMeterProvider()
API 允许用户设置可使用导出器进行配置的 MeterProvider 对象。
Java
如需为 Java gRPC 应用启用 Cloud Service Mesh 可观测性,请执行以下步骤:
确保项目包含
grpc-gcp-csm-observability
制品。使用 gRPC 1.65.0 版或更高版本。在
main()
方法中,通过为已配置的 OpenTelemetry SDK 实例提供MeterProvider
来收集和导出指标,从而初始化 Cloud Service Mesh 可观测性。在执行任何 gRPC 操作(例如设置渠道或服务器)之前,务必使用
CsmObservability.Builder()
API 注册 OpenTelemetry SDK。创建 CsmObservability 实例后,对该实例调用
registerGlobal()
即可为所有 Cloud Service Mesh 渠道和服务器启用 Cloud Service Mesh 可观测性。以下示例演示了如何使用 Prometheus 导出器设置 Cloud Service Mesh 可观测性。
import io.grpc.gcp.csm.observability.CsmObservability;
...
public static void main(String[] args) {
...
int prometheusPort = 9464;
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
.registerMetricReader(
PrometheusHttpServer.builder().setPort(prometheusPort).build())
.build();
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setMeterProvider(sdkMeterProvider)
.build();
CsmObservability observability = new CsmObservability.Builder()
.sdk(openTelemetrySdk)
.build();
observability.registerGlobal();
// ... (continue with channel and server configuration)
}
Go
在执行任何 gRPC 操作(包括创建 ClientConn、服务器或凭证)之前,使用 MeterProvider
全局配置 Cloud Service Mesh 可观测性。以下示例展示了如何设置 Cloud Service Mesh 可观测性。设置 Cloud Service Mesh 可观测性后,任何 Cloud Service Mesh 渠道和所有服务器都会选择配置有提供的选项和其他 Cloud Service Mesh 标签的 OpenTelemetry 统计数据插件。非 Cloud Service Mesh 渠道会获得不带 Cloud Service Mesh 标签的 OpenTelemetry 统计数据插件。
import (
"context"
"google.golang.org/grpc/stats/opentelemetry"
"google.golang.org/grpc/stats/opentelemetry/csm"
"go.opentelemetry.io/otel/sdk/metric"
)
func main() {
reader := metric.NewManualReader()
provider := metric.NewMeterProvider(metric.WithReader(reader))
opts := opentelemetry.Options{
MetricsOptions: opentelemetry.MetricsOptions{
MeterProvider: provider,
},
}
cleanup := csm.EnableObservability(context.Background(), opts)
defer cleanup()
// Any created ClientConns and servers will be configured with an
// OpenTelemetry stats plugin configured with provided options.
}
Python
Cloud Service Mesh 可观测性需要以下 gRPC 依赖项:
grpcio>=1.65.0
grpcio-observability>=1.65.0
grpcio-csm-observability>=1.65.0
在执行任何 gRPC 操作(包括创建渠道、服务器或凭证)之前,使用 CsmOpenTelemetryPlugin API 创建并注册插件:
import grpc_csm_observability
# ...
csm_plugin = grpc_csm_observability.CsmOpenTelemetryPlugin(
meter_provider=[your_meter_provider],
)
csm_plugin.register_global()
# Create server or client
执行所有 gRPC 操作后,使用以下代码取消注册并清理资源:
csm_plugin.deregister_global()
以下示例展示了如何使用 Prometheus 导出器设置 Cloud Service Mesh 可观测性:
import grpc_csm_observability
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from prometheus_client import start_http_server
start_http_server(port=9464, addr="0.0.0.0")
reader = PrometheusMetricReader()
meter_provider = MeterProvider(metric_readers=[reader])
csm_plugin = CsmOpenTelemetryPlugin(
meter_provider=meter_provider,
)
csm_plugin.register_global()
# Clean up after use
csm_plugin.deregister_global()
在上述示例中,您可以爬取 localhost:9464/metrics
以获取 Cloud Service Mesh 可观测性报告的指标。
请注意,为了使添加到 gRPC 指标的网格属性起作用,需要使用 CsmObservability 设置客户端和服务器二进制程序。
如果使用非 Google 基础设施来导出和存储指标,收集流水线应在指标上添加描述应用运行所在环境的属性。此属性以及前面介绍的网格属性可用于查看在网格上运行的流量。
规范更改
Cloud Service Mesh 可观测性通过环境变量确定网格拓扑信息,这些环境变量需要添加到容器的 env 中,无论是客户端还是服务器都是如此。此信息可通过 Cloud Service Mesh 可观测性向对等体提供,以便进行指标报告。
spec:
containers:
- image: IMAGE_NAME
name: CONTAINER_NAME
env:
- name: GRPC_XDS_BOOTSTRAP
value: "/tmp/grpc-xds/td-grpc-bootstrap.json" #created by td-grpc-bootstrap
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NAMESPACE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: CSM_WORKLOAD_NAME
value: CSM_WORKLOAD_NAME
- name: CONTAINER_NAME
value: CONTAINER_NAME
- name: OTEL_RESOURCE_ATTRIBUTES
value: k8s.pod.name=$(POD_NAME),k8s.namespace.name=$(NAMESPACE_NAME),k8s.container.name=CONTAINER_NAME
替换以下内容:
- 将 IMAGE_NAME 替换为映像的名称。
- 将 CONTAINER_NAME 替换为容器的名称。
- 将 CSM_WORKLOAD_NAME 替换为工作负载名称,例如部署名称。