尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
第八篇:《可观测性(二):Envoy 访问日志与自定义指标》
在上一篇文章中我们学习了 Istio 可观测性的三大支柱——Kiali 拓扑、Jaeger 追踪和 Grafana 指标。但这些工具主要提供的是宏观视图和预置数据。当需要深入排查具体问题时Envoy 访问日志提供了每个请求的详细信息来源、目标、状态码、耗时等而自定义指标则能针对业务需求采集特定的监控数据。本文深入讲解如何配置 Envoy 访问日志包括 JSON 格式和 Trace ID 关联、如何使用 Telemetry API 精细化控制日志采集以及如何通过 Telemetry API 自定义 Prometheus 指标帮助你构建从“宏观监控”到“微观排查”的完整可观测性链路。一、Envoy 访问日志每个请求的“黑匣子”Envoy 访问日志记录了经过 Sidecar 代理的每一个请求的详细信息包括来源 IP、目标服务、HTTP 方法、路径、状态码、响应时间等。它是排查单次请求失败或延迟问题的第一手资料。1.1 启用访问日志Istio 提供了多种启用访问日志的方法Telemetry API 是当前推荐的方式。方法一使用 Telemetry API推荐创建一个 Telemetry 资源在 istio-system 命名空间中启用全局访问日志apiVersion:telemetry.istio.io/v1kind:Telemetrymetadata:name:mesh-logging-defaultnamespace:istio-systemspec:accessLogging:-providers:-name:envoy应用配置kubectl apply-f-EOF apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: mesh-logging-default namespace: istio-system spec: accessLogging: - providers: - name: envoy EOF方法二使用 MeshConfig备选如果使用 IstioOperator 安装也可以在配置中开启访问日志spec:meshConfig:accessLogFile:/dev/stdout启用后Envoy 会将访问日志输出到 istio-proxy 容器的标准输出可通过 kubectl logs 查看kubectl logspod-name-cistio-proxy1.2 配置 JSON 格式日志默认的访问日志是文本格式难以被日志采集系统如 ELK、Loki解析。推荐切换为 JSON 格式。通过 MeshConfig 配置 JSON 格式spec:meshConfig:accessLogFile:/dev/stdoutaccessLogEncoding:JSON设置 accessLogEncoding: JSON 后Envoy 会使用 Istio 默认的 JSON 模板输出日志。1.3 自定义日志格式与 Trace ID 关联默认的访问日志格式不包含 Trace ID导致日志和追踪数据难以关联。为了在排查问题时能从日志直接跳转到对应的 Trace需要在日志格式中增加 trace_id 和 span_id 字段。以下配置将访问日志格式化为 JSON并包含 trace_id 和 span_idapiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:meshConfig:accessLogFile:/dev/stdoutaccessLogEncoding:JSONaccessLogFormat:|{ timestamp: %START_TIME%, method: %REQ(:METHOD)%, path: %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%, protocol: %PROTOCOL%, response_code: %RESPONSE_CODE%, response_flags: %RESPONSE_FLAGS%, duration: %DURATION%, upstream_service_time: %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%, request_id: %REQ(X-REQUEST-ID)%, trace_id: %REQ(X-B3-TRACEID)%, span_id: %REQ(X-B3-SPANID)%, source_namespace: %ENVIRONMENT(POD_NAMESPACE)%, source_app: %ENVIRONMENT(APP)%, upstream_host: %UPSTREAM_HOST%, upstream_cluster: %UPSTREAM_CLUSTER% }关键字段解读 OpenTelemetry 用户如果使用 W3C Trace Contexttraceparent 头应将 trace_id 替换为 traceparent 字段。1.4 精细化控制Telemetry API 的高级用法Telemetry API 不仅支持全局开启还可以在命名空间或工作负载级别进行精细化控制。禁用特定工作负载的访问日志apiVersion:telemetry.istio.io/v1kind:Telemetrymetadata:name:disable-curl-loggingnamespace:defaultspec:selector:matchLabels:app:curlaccessLogging:-providers:-name:envoydisabled:true按流量方向过滤日志可以配置只记录入站流量mode: CLIENT或出站流量mode: SERVER减少日志量。spec:accessLogging:-providers:-name:envoyfilter:expression:request.method GET二、自定义 Prometheus 指标Istio 默认提供了丰富的标准指标如 istio_requests_total、istio_request_duration_milliseconds但业务场景往往需要自定义指标——例如按“用户类型”统计订单创建数、按“支付渠道”统计交易成功率等。从 Istio 1.18 开始推荐使用 Telemetry API 来定制遥测指标。2.1 使用 Telemetry API 定义自定义指标Telemetry API 的 metrics 字段允许定义自定义指标从请求中提取特定属性作为维度。以下示例定义了一个自定义 Counter 指标 myapp_requests_total按 response_code 和 destination_service 分组apiVersion:telemetry.istio.io/v1kind:Telemetrymetadata:name:mesh-metricsnamespace:istio-systemspec:metrics:-providers:-name:prometheusoverrides:-match:metric:REQUEST_COUNTtagOverrides:response_code:value:response.codedestination_service:value:destination.service.host⚠️ 注意高基数标签如 path、user_id会导致 Prometheus 指标爆炸严重影响性能。应谨慎选择维度优先使用有限的枚举值如 response_code、method。2.2 通过 EnvoyFilter 定义更复杂的自定义指标对于更复杂的指标定制需求可以使用 EnvoyFilter 直接配置 Envoy 的统计输出。以下示例定义了一个自定义指标 custom_requests_total包含 user_type 维度apiVersion:networking.istio.io/v1alpha3kind:EnvoyFiltermetadata:name:custom-metricsnamespace:istio-systemspec:configPatches:-applyTo:HTTP_FILTERmatch:context:SIDECAR_INBOUNDlistener:filterChain:filter:name:envoy.filters.network.http_connection_managerpatch:operation:MERGEvalue:stat_prefix:istiohttp_filters:-name:envoy.filters.http.routertyped_config:type:type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerstats:-name:custom_requests_totaltags:-tag_name:user_typemetadata:kind:Requestkey:user_type三、日志、指标与追踪的关联排查问题的完整链路可观测性的三大信号——日志、指标和追踪——只有相互关联才能发挥最大价值指标告诉你“出问题了”如错误率飙升。追踪告诉你“哪里出了问题”如订单服务调用库存服务超时。日志告诉你“为什么出问题”如数据库连接超时的具体错误信息。而将它们串联起来的“线”就是 Trace ID。通过前面配置的包含 trace_id 的 JSON 访问日志排查流程可以这样串联Grafana 中发现 order-service 的错误率异常升高。跳转到 Jaeger筛选包含 order-service 的 Trace找到一条耗时异常的调用链。从 Jaeger 中复制该 Trace 的 Trace ID。在日志系统如 Loki 或 ELK中搜索该 Trace ID找到对应的 Envoy 访问日志查看具体的错误信息如 response_flags、response_code。text┌─────────────────────────────────────────────────────────────────┐│ 排查链路示例 ││ ││ Grafana 指标告警 ││ ↓ ││ Jaeger 追踪找到慢 Trace复制 Trace ID ││ ↓ ││ Loki/ELK 日志搜索用 Trace ID 过滤日志找到具体错误 ││ ↓ ││ 定位根因库存服务数据库连接超时 │└─────────────────────────────────────────────────────────────────┘四、小结Envoy 访问日志通过 Telemetry API 启用推荐使用 JSON 格式便于日志系统采集。Trace ID 关联在访问日志格式中包含 trace_id 和 span_id 字段实现日志与追踪的关联。自定义指标使用 Telemetry API 的 metrics 字段定义自定义 Prometheus 指标注意避免高基数标签。精细化控制Telemetry API 支持在命名空间和工作负载级别控制日志和指标的采集。三大信号关联指标发现问题→ 追踪定位服务→ 日志找出原因形成完整的可观测性闭环。
RELATED

相关推荐

Unity事件分发系统全解析:从UnityEvent到全局事件中心的架构实践

Unity事件分发系统全解析:从UnityEvent到全局事件中心的架构实践

1. 项目概述:为什么Unity开发者需要关注事件分发系统?在Unity开发中,尤其是涉及到UI交互、游戏逻辑解耦和模块化设计时,我们经常会遇到一个核心问题:如何让不同的游戏对象或系统组件之间高效、清晰地通信?新…

📅 2026/9/24 23:54:25
Win32控制台贪吃蛇游戏开发:C++实现与API深度解析

Win32控制台贪吃蛇游戏开发:C++实现与API深度解析

1. 项目概述与核心价值最近在翻看一些老项目的源码时,偶然发现了ZEC大佬分享的一个名为“彩色控制台贪吃蛇游戏(Win32)”的C源代码,版本号是v0.05。这个标题一下子就抓住了我的眼球,因为它精准地戳中了几个经典的技术组…

📅 2026/8/22 18:38:25
Godot引擎中基于GDScript的2D随机地图生成算法与实践

Godot引擎中基于GDScript的2D随机地图生成算法与实践

1. 项目概述:为什么要在Godot里折腾随机地图? 如果你和我一样,是个独立游戏开发者,或者对Roguelike、地牢探险这类游戏情有独钟,那你肯定对“随机地图生成”这个概念不陌生。每次开局,世界都是新的&#xf…

📅 2026/9/8 17:34:50
MORE NEWS

更多资讯

📰

video-use:用ffmpeg+Remotion+Manim+Claude Code构建可编程视频生成工作流

1. 从“video-use”这个标题说起:它到底想解决什么问题第一次看到video-use这个标题,我脑子里蹦出来的第一个念头是:这大概率不是一个单纯的播放器,也不是一个简单的视频剪辑脚本,而是一套“让程序化视频生成这件事变得…

📰

Substrate区块链开发框架入门:从核心概念到自定义Pallet实战

1. 从零认识 Substrate:它到底是什么,能解决什么问题第一次听到 Substrate 这个词,很多人会以为是某个前端框架或者构建工具。其实不是。Substrate 是一个用于构建区块链的开发框架,由 Parity Technologies 团队打造,最…

📰

Substrate区块链开发实战:从核心架构到自定义Pallet与运行时升级

1. 从零认识 Substrate:它到底是什么,能解决什么问题第一次听到 Substrate 这个词,很多人会以为是某个前端框架或者构建工具,其实它是一套用于构建区块链底层系统的开发框架。你可以把它理解成一套“区块链操作系统内核”——它把…

📰

Windows中nul文件为何删不掉?底层设备名机制解析

1. 那个“删不掉”的nul文件,根本就不是文件 你有没有在Windows 11里,右键一个叫 nul 的文件,点“删除”,然后弹出“无法删除:找不到指定的文件”?或者用 del nul 命令,系统回你一句“文件…

📰

CAP定理速查:分布式存储选型与CP/AP决策指南

这问题我被人问过无数次:新系统评审,架构师指着架构图问“你这个存储到底是CP还是AP”,会议室里一片安静,有人小声接了句“都支持吧”。其实这个回答也不算错,但“支持”和“你在分区时保哪个”是两件完全不同的事。CA…

📰

MybatisPlus分页插件配置与深分页优化:分页失效与500条限制实战

如果你的项目里用了 MybatisPlus,并且已经写过头几个 CRUD 接口,那你迟早会在分页这件事上踩坑。我接触 MybatisPlus 的第二天,就撞上了两个很典型的问题:列表接口第一屏数据正常,翻到后面 limit 参数完全不生效&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬