资讯动态

gRPC Python CSM 可观测性示例实战:基于 xDS 控制面的服务网格遥测接入指南

发布时间:2026/9/10 8:37:14 来源:尧图企业网站定制
gRPC Python CSM 可观测性示例实战基于 xDS 控制面的服务网格遥测接入指南【免费下载链接】grpcC based gRPC (C, Python, Ruby, Objective-C, PHP, C#)项目地址: https://gitcode.com/GitHub_Trending/gr/grpcgRPC 官方仓库在 examples/python/observability/csm 目录下提供了一个 CSMCloud Service Mesh可观测性 Hello World 示例。它是在 Python xDS 示例 的基础上改造而成的客户端与服务端改为从 xDS 控制面获取配置同时通过CsmOpenTelemetryPlugin插件把 gRPC 调用指标导出到 Prometheus。读完本文你将掌握该示例的命令行参数语义、OpenTelemetry 插件与 xDS 凭据的接线方式、Docker/Bazel 构建流程以及 CSM 标签注入与端到端遥测的底层实现原理。示例结构与整体思路CSM 场景的核心差异在于应用不直接指定后端地址而是以xds:///前缀的逻辑名称作为 target由 xDS 控制面例如 Google Traffic Director完成服务发现、负载均衡与安全凭据下发gRPC 层再叠加 OpenTelemetry 指标观测形成网格内可观测的闭环。该目录下包含以下关键文件csm_greeter_client.pyCSM 版 Hello World 客户端csm_greeter_server.pyCSM 版 Hello World 服务端helloworld.proto与通用示例一致的 Greeter 服务定义BUILD.bazelBazel 构建规则负责生成 pb2 代码并打包两个py_binaryDockerfile.client 与 Dockerfile.server用于产出可部署镜像。其中服务定义与标准 Hello World 完全一致Greeter.SayHello(HelloRequest) returns (HelloReply)服务端收到name后返回Hello {name}见 helloworld.proto 与 csm_greeter_server.py。差异全部集中在通道构建方式与可观测性插件的启用上。命令行参数客户端与服务端配置详解客户端参数客户端csm_greeter_client.py支持以下参数参数类型默认值说明--targetstringlocalhost:50051客户端连接的地址。README 中给出的是典型网格用法xds:///helloworld:50051——以xds:///为前缀的逻辑名由 xDS 解析并路由到真实后端可按需覆盖--secure_modeboolFalse是否启用 xDS 从控制面获取服务端凭据详见下文安全模式说明--prometheus_endpointint端口9464Prometheus HTTP 指标暴露端口值得说明的两点细节README 与代码默认值存在出入本目录 README.md 文本描述客户端默认连接xds:///helloworld:50051而当前仓库的argparse实际默认值是localhost:50051。前者描述了接入网格后的语义后者则是纯本地直接运行时的默认地址实际以代码为准布尔参数由自定义bool_arg解析csm_greeter_client.py接受true/yes/y与false/no/n不区分大小写其余输入抛出argparse.ArgumentTypeError。服务端参数服务端csm_greeter_server.py支持的参数参数类型默认值说明--portint50051Greeter 服务的监听端口--secure_modeboolFalse是否启用 xDS 服务端凭据grpc.xds_server_credentials--server_idstringpython_server标识当前服务端的 ID解析后随配置传入服务初始化流程供网格侧对齐后端实例身份--prometheus_endpointint端口9464Prometheus 指标暴露端口服务端固定监听0.0.0.0_LISTEN_HOST线程池大小_THREAD_POOL_SIZE为 256csm_greeter_server.py。secure_mode 的两种实现路径--secure_mode的接线方式最能体现 xDS 与普通 gRPC 的差异客户端侧csm_greeter_client.py开启时先构造 fallback 明文凭据再通过grpc.xds_channel_credentials(fallback_creds)包装为 xDS 通道凭据最后用grpc.secure_channel(target, channel_creds)建立通道关闭时退化为grpc.insecure_channel(target)。服务端侧csm_greeter_server.py 与 L164-L175开启时需以xdssecure_mode创建grpc.server服务端同样构造 fallback 凭据并用grpc.xds_server_credentials包装后add_secure_port关闭时直接add_insecure_port。xDS 凭据机制意味着证书由控制面动态下发应用侧只需提供一份兜底凭据。OpenTelemetry 指标链路从插件注册到 Prometheus 暴露客户端与服务端复用同一套可观测性初始化逻辑两份源码中的_prepare_csm_observability_plugin完全一致主要步骤如下调用start_http_server(portprometheus_endpoint, addr0.0.0.0)启动一个 Prometheus HTTP 抓取端点创建PrometheusMetricReader与基于它的MeterProvider实例化CsmOpenTelemetryPlugin(meter_provider...)并调用register_global()将插件挂入全局 gRPC 调用链服务结束时调用deregister_global()完成清理示例中客户端因持续运行仅在注释中说明见 csm_greeter_client.py。依赖关系上该示例通过 Bazel 直接链接仓库内的grpcio_csm_observability目标与opentelemetry-exporter-prometheus依赖见 BUILD.bazel。其中也保留了 TODO一旦grpcio-csm-observability正式发布将改用 pip 安装而非 Bazel 构建。直方图聚合边界_create_views()为指标配置了两类显式桶直方图聚合视图csm_greeter_client.py时延直方图instrument_units边界从 0 到 100 秒覆盖 0.00001 s 至 50 s 共 40 余个指数分布的桶可精确刻画毫秒到秒级的 RPC 时延分布消息大小直方图instrument_unitBy边界从 0 到 4294967296 B4 GiB覆盖 1 KiB、4 KiB、16 MiB 等发送/接收的压缩消息体大小档位。源码注释明确指出这些边界as defined in gRFC指 OpenTelemetry stats 设计文档 A66。这种 View 级配置保证无论 OTel SDK 默认聚合策略如何上报到 Prometheus 的_bucket序列都符合 gRPC 官方统计口径便于与既有面板对齐。客户端持续压测模式客户端在建立通道后进入死循环每秒调用一次SayHello打印服务端回包若调用失败仅记录 info 日志并继续csm_greeter_client.py。注释明确initial setup 阶段请求失败是正常现象——因为服务发现与后端就绪存在时间差。这种自循环设计让该示例可以充当轻量压测源为指标面板持续产生流量。本地运行与镜像构建Bazel 直接运行Dockerfile 显示官方默认用 Bazel 构建可执行产物tools/bazel build -c dbg //examples/python/observability/csm:csm_greeter_client见 Dockerfile.client。在 gRPC workspace 根目录执行同样的 bazel 命令即可得到 self-contained 的可执行文件随后在配置好 xDS bootstrap 的环境中直接运行。Docker 构建与推送在 gRPC workspace 根目录执行README 给出的官方命令# 构建客户端镜像 docker build -f examples/python/observability/csm/Dockerfile.client -t us-docker.pkg.dev/grpc-testing/examples/csm-o11y-example-python-client . # 构建服务端镜像 docker build -f examples/python/observability/csm/Dockerfile.server -t us-docker.pkg.dev/grpc-testing/examples/csm-o11y-example-python-server .构建完成后用docker push将镜像推送到自己的镜像仓库把标签中的us-docker.pkg.dev/grpc-testing替换为实际可写的 registry 即可。两个 Dockerfile 均为多阶段构建Dockerfile.client、Dockerfile.server第一阶段基于python:3.10-slim-bookworm安装build-essential clang curl把整个 workspaceCOPY进容器后执行上述 Bazel 构建再把bazel-bin/.../csm_greeter_client*或 server 产物拷贝到/artifacts第二阶段仍是精简的python:3.10-slim-bookwormserver 额外安装python3运行时从第一阶段COPY --from0 /artifacts ./并设置ENTRYPOINT直接启动该可执行文件。由于该示例默认依赖 xDS 控制面与网格注入镜像在非网格环境单独运行时服务发现与指标标签可能不完整建议在已配置GRPC_XDS_BOOTSTRAP或等效 bootstrap 机制的集群/网格中部署。指标观测与验证CSM 示例与普通 observability 示例见 examples/python/observability/README.md的差异在于导出方式普通 OpenTelemetry 示例把指标名直接打印到 stdout客户端侧为grpc.client.call.duration、grpc.client.attempt.started等服务端侧为grpc.server.call.started、grpc.server.call.duration等CSM 示例则通过PrometheusMetricReader在9464端口暴露/metrics抓取端点。运行期间可用curl http://localhost:9464/metrics直接查看直方图桶、计数等原始序列或在 Prometheus / Cloud Monitoring 中按csm.remote_workload_*等标签聚合查询。原理纵深CSM 标签注入与元数据交换示例使用的CsmOpenTelemetryPlugin位于 src/python/grpcio_csm_observability/grpc_csm_observability其底层实现可以解释为什么 CSM 指标能区分对端工作负载本地工作负载标签来自三处_csm_observability_plugin.py环境变量CSM_CANONICAL_SERVICE_NAME、CSM_WORKLOAD_NAME、CSM_MESH_ID缺失时回退为字符串unknownGCP 资源检测器GoogleCloudResourceDetector().detect()识别运行环境是 GKEgcp_kubernetes_engine还是 GCEgcp_compute_engine进而采集命名空间、集群名、可用区/区域、项目 ID 等资源类型决定最终上报哪些标签维度。对端工作负载标签通过 gRPC 元数据交换实现插件用XEnvoyPeerMetadata作为交换键把上述结构化字段如canonical_service、workload_name、namespace_name、cluster_name、location、project_id等见 _csm_observability_plugin.py随请求一并携带双方据此推导出csm.remote_workload_*标签。由此无论本地还是对端的服务身份 部署位置都能进入指标标签支撑跨命名空间、跨集群的服务网格拓扑观测与 SLO 归因。使用前提与注意事项本示例以 xDS 控制面为前置依赖xds:///目标与 xDS 凭据的解析均需正确配置 bootstrap 且控制面可连通--secure_mode仅控制是否走 xDS 凭据通道不代表强制的传输安全级别——fallback 凭据若为明文最终安全性取决于控制面下发的证书策略文档文本描述的默认 target 与代码实际默认值存在差异见上文排查问题时优先以python -m ... --help输出为准端口9464同时被客户端与服务端默认使用同机多进程运行时应通过--prometheus_endpoint显式区分端口避免抓取端点冲突。【免费下载链接】grpcC based gRPC (C, Python, Ruby, Objective-C, PHP, C#)项目地址: https://gitcode.com/GitHub_Trending/gr/grpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价