可观测配置

服务网格ASM提供日志、监控指标、链路追踪维度的可观测配置功能。您可以通过ASM控制台为全局、命名空间或指定工作负载自定义相关配置,例如日志输出的格式、指标的维度、是否启用特定监控指标、设置链路追踪的采样率等。本文介绍如何使用可观测配置功能。

前提条件

已创建ASM实例,且版本为1.17.2.35及以上。具体操作,请参见创建ASM实例升级ASM实例

作用范围

类型

说明

全局

全局配置支持日志、监控指标、链路追踪设置。全局配置只有一份,无法删除。仅全局配置支持链路追踪设置。

命名空间

为命名空间创建专有的可观测配置。每个命名空间只能有一份命名空间级可观测配置。

自定义

通过工作负载选择器选定一个自定义配置的生效范围。每个工作负载至多被一个自定义配置选中。

操作步骤

全局

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 可观测配置

  3. 可观测配置页面,单击全局页签,按需配置日志、监控指标和链路追踪,然后单击提交

    您可以单击下表的链接,查看配置的详细说明。

    配置区域

    说明

    日志设置

    监控指标设置

    链路追踪设置

命名空间

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 可观测配置

  3. 可观测配置页面,单击命名空间页签,单击创建,选择目标命名空间,按需配置日志和监控指标,然后单击创建

    您可以单击下表的链接,查看配置的详细说明。

    配置区域

    说明

    日志设置

    监控指标设置

自定义

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 可观测配置

  3. 可观测配置页面,单击自定义页签,选择目标命名空间,单击创建,输入名称匹配标签,按需配置日志和监控指标,然后单击创建

    您可以单击下表的链接,查看配置的详细说明。

    配置区域

    说明

    日志设置

    监控指标设置

日志设置说明

日志设置包括启用或禁用访问日志输出、设置日志输出形式、自定义日志格式、日志过滤。

启用或禁用访问日志输出

  1. 日志设置区域,按需打开或关闭启用日志输出开关。

    • 打开开关,服务网格数据平面Sidecar或网关会将访问日志输出至容器标准输出。

    • 关闭开关,服务网格数据平面Sidecar或网关停止将日志输出到容器标准输出。

  2. 在数据平面Sidecar容器的标准输出查看日志。

    下文以使用kubectl查看访问日志为例进行说明。

    1. 执行以下命令,查看Sidecar日志。

      kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1

      展开查看示例输出

      {
          "authority_for":"47.110.XX.XXX",
          "bytes_received":"0",
          "bytes_sent":"22382",
          "downstream_local_address":"192.168.0.29:80",
          "downstream_remote_address":"221.220.XXX.XXX:0",
          "duration":"80",
          "istio_policy_status":"-",
          "method":"GET",
          "path":"/static/favicon.ico",
          "protocol":"HTTP/1.1",
          "request_id":"0f2cf829-3da5-4810-a618-08d9745d****",
          "requested_server_name":"outbound_.8000_._.httpbin.default.svc.cluster.local",
          "response_code":"200",
          "response_flags":"-",
          "route_name":"default",
          "start_time":"2023-06-30T04:00:36.841Z",
          "trace_id":"-",
          "upstream_cluster":"inbound|80||",
          "upstream_host":"192.168.0.29:80",
          "upstream_local_address":"127.0.X.X:55879",
          "upstream_response_time":"79",
          "upstream_service_time":"79",
          "upstream_transport_failure_reason":"-",
          "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
          "x_forwarded_for":"221.220.XXX.XXX"
      }
    2. 执行以下命令,查看入口网关日志。

      kubectl -n istio-system logs istio-ingressgateway-6cff9b6b58-r**** --tail 1

      展开查看示例输出

      {
          "authority_for":"47.110.XX.XXX",
          "bytes_received":"0",
          "bytes_sent":"22382",
          "downstream_local_address":"192.168.0.63:80",
          "downstream_remote_address":"221.220.XXX.XXX:64284",
          "duration":"81",
          "istio_policy_status":"-",
          "method":"GET",
          "path":"/static/favicon.ico",
          "protocol":"HTTP/1.1",
          "request_id":"0f2cf829-3da5-4810-a618-08d9745d****",
          "requested_server_name":"-",
          "response_code":"200",
          "response_flags":"-",
          "route_name":"httpbin",
          "start_time":"2023-06-30T04:00:36.841Z",
          "trace_id":"-",
          "upstream_cluster":"outbound|8000||httpbin.default.svc.cluster.local",
          "upstream_host":"192.168.0.29:80",
          "upstream_local_address":"192.168.0.63:36140",
          "upstream_response_time":"81",
          "upstream_service_time":"81",
          "upstream_transport_failure_reason":"-",
          "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
          "x_forwarded_for":"221.220.XXX.XXX"
      }
  3. (可选)通过容器服务控制台查看访问日志。

    如果您使用阿里云容器服务集群,还可以通过容器服务控制台查看访问日志。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组

    3. 容器组页面,单击目标Pod名称,然后在页面下方单击日志页签,查看访问日志。

设置日志输出形式

说明

该功能仅支持1.20.6.36及以上版本的ASM实例。关于升级实例的具体操作,请参见升级ASM实例

日志设置区域,按需将日志输出形式设置为JSONTEXT

  • 设置为JSON,访问日志将以JSON字符串的形式输出至容器标准输出。

  • 设置为TEXT,访问日志将以纯文本字符串的形式输出至容器标准输出。

自定义日志格式

  1. 日志设置区域,按需选中字段、修改自定义字段信息或在最下方日志指标右侧单击增加.png图标,新增日志字段。

    只有打开启用日志输出开关,才能自定义日志格式。在日志格式区域,默认选中的日志字段为默认必选字段,不支持修改。日志字段支持从请求Header、响应Header、Envoy内置值中取值。

    下文以打印请求中的accept-encoding Header为例,配置变量名称accept-encoding类型请求属性变量值Accept-Encoding日志格式.png

  2. 执行以下命令,查看服务网格数据平面组件日志。

    kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto

    展开查看示例输出

    {
        "bytes_received":"0",
        "bytes_sent":"9593",
        "downstream_local_address":"192.168.0.29:80",
        "downstream_remote_address":"69.164.XXX.XX:0",
        "duration":"2",
        "istio_policy_status":"-",
        "method":"GET",
        "path":"/",
        "protocol":"HTTP/1.1",
        "request_id":"29939dc9-62be-4ddf-acf6-32cb098d****",
        "requested_server_name":"outbound_.8000_._.httpbin.default.svc.cluster.local",
        "response_code":"200",
        "response_flags":"-",
        "route_name":"default",
        "start_time":"2023-06-30T04:18:19.734Z",
        "trace_id":"-",
        "upstream_cluster":"inbound|80||",
        "upstream_host":"192.168.0.29:80",
        "upstream_local_address":"127.0.X.X:34723",
        "upstream_service_time":"2",
        "upstream_transport_failure_reason":"-",
        "user_agent":"Mozilla/5.0 zgrab/0.x",
        "x_forwarded_for":"69.164.XXX.XX",
        "authority_for":"47.110.XX.XXX",
        "upstream_response_time":"2",
        "accept-encoding":"gzip"
    }

    可以看到步骤1新增的Accept-Encoding Header的值,已被输出至访问日志。

日志过滤

日志设置区域下方,按需选中启用日志过滤以激活日志过滤,然后在下方日志表达式文本框输入日志过滤表达式。未能与表达式匹配的请求对应的访问日志将不会输出。

例如,如果您希望只输出Response Http Status >=400的请求日志,则表达式为response.code >= 400。详细信息,请参见CEL表达式和常用字段

CEL表达式和常用字段

日志过滤表达式为标准CEL(Common Expression Language)表达式。CEL表达式的常用字段如下。更多信息,请参见CELEnvoy

属性

类型

说明

request.path

string

请求路径。

request.url_path

string

不包含Query的请求路径。

request.host

string

URL中的主机名部分。

request.method

string

请求方法。

request.headers

map<string, string>

以全小写Header名索引的全部Request Header。

request.useragent

string

User Agent头的值。

request.time

timestamp

请求首个字节到达的时间。

request.id

string

请求ID。

request.protocol

string

请求协议,取值为HTTP/1.0HTTP/1.1HTTP/2HTTP/3

request.query

string

请求URL中的Query串。

response.code

int

HTTP响应的返回码。

response.code_details

string

响应代码详细信息。

response.grpc_status

int

响应中的gRPC状态码。

response.headers

map<string, string>

以全小写Header名索引的全部Response Header。

response.size

int

Response Body的大小,单位为byte。

response.total_size

int

Response消息的完整大小,单位为byte。

监控指标设置说明

监控指标设置包括启用或禁用监控指标生成、指标维度。

启用或禁用监控指标生成

监控指标分为CLIENT侧指标和SERVER侧指标。

  • CLIENT侧指标:Sidecar作为客户端主动发起请求时所产生的指标数据,网关指标也属于CLIENT类别。

  • SERVER侧指标:Sidecar作为服务端被动接受访问时所产生的指标数据。

  1. 监控指标设置区域的CLIENT侧指标SERVER侧指标列,按需选中或取消选中目标指标对应的启用

    • 启用指标:服务网格数据平面Sidecar或网关会将该指标通过15020端口的/stats/prometheus路径进行暴露。

    • 不启用指标:该指标不会通过上述端口进行暴露。

  2. 执行以下命令,查看Sidecar或网关暴露的监控指标。

    您可以通过kubectl命令在Sidecar或网关容器内执行curl命令,访问本地15020端口的/stats/prometheus路径,查看导出的监控指标。

    kubectl exec httpbin-5c5944c58c-w**** -c istio-proxy -- curl 127.0.0.1:15020/stats/prometheus|head -n 10

    示例输出:

    # TYPE istio_agent_cert_expiry_seconds gauge
    istio_agent_cert_expiry_seconds{resource_name="default"} 46725.287654548
    # HELP istio_agent_endpoint_no_pod Endpoints without an associated pod.
    # TYPE istio_agent_endpoint_no_pod gauge
    istio_agent_endpoint_no_pod 0
    # HELP istio_agent_go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
    # TYPE istio_agent_go_gc_duration_seconds summary
    istio_agent_go_gc_duration_seconds{quantile="0"} 5.0149e-05
    istio_agent_go_gc_duration_seconds{quantile="0.25"} 9.8807e-05
    ......

指标维度

指标携带的维度可以表达更丰富的信息。您可以利用这些维度在Prometheus中筛选出目标指标。例如,您可以通过source_app指标来筛选请求客户端为特定应用的指标。

编辑默认维度

您可以通过以下步骤对默认维度进行编辑。

  1. 监控指标设置区域的CLIENT侧指标SERVER侧指标列,单击已启用指标对应的编辑维度

  2. 自定义CLIENT 维度配置自定义SERVER 维度配置对话框,按需选中或取消选中导出指标的维度,然后单击确认

例如,当未关闭任何维度的情况下,通过kubectl在Sidecar或网关容器内执行curl命令,访问本地15020端口的/stats/prometheus路径,查看导出的监控指标。

kubectl exec httpbin-5c5944c58c-w**** -c istio-proxy -- curl 127.0.0.1:15020/stats/prometheus

以其中一个istio_request_bytes_sum(对应控制面板的REQUEST_SIZE指标)为例,可以看到其中包含了所有的维度。

istio_request_bytes_sum{reporter="destination",source_workload="istio-ingressgateway",source_canonical_service="unknown",source_canonical_revision="latest",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway",source_app="istio-ingressgateway",source_version="unknown",source_cluster="c479fc4abd2734bfaaa54e9e36fb26c01",destination_workload="httpbin",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/httpbin",destination_app="httpbin",destination_version="v1",destination_service="httpbin.default.svc.cluster.local",destination_canonical_service="httpbin",destination_canonical_revision="v1",destination_service_name="httpbin",destination_service_namespace="default",destination_cluster="c479fc4abd2734bfaaa54e9e36fb26c01",request_protocol="http",response_code="200",grpc_response_status="",response_flags="-",connection_security_policy="mutual_tls"} 18000

修改SERVER侧默认REQUEST_SIZE指标,只保留response_code维度,通过kubectl在Sidecar或网关容器内执行curl命令,访问本地15020端口的/stats/prometheus路径,查看导出的监控指标。可以看到其中只包含了response_code维度。

istio_request_bytes_sum{response_code="200"} 16550

添加自定义维度

您可以通过以下步骤添加自定义维度:

  1. 监控指标设置区域的CLIENT侧指标SERVER侧指标列,单击已启用指标对应的编辑维度

  2. 自定义CLIENT 维度配置自定义SERVER 维度配置对话框的自定义维度选项中,编辑指标的维度名称和取值,然后单击确认

例如,在SERVER侧编辑REQUEST_SIZE指标的自定义维度,添加维度名称为request_path,维度取值为request.path后,通过kubectl命令在Sidecar或网关容器内执行curl命令,访问本地15020端口的/stats/prometheus路径,查看导出的监控指标。可以看出,此时指标中包含自定义维度request_path

istio_request_bytes_sum{response_code="200",request_path="/spec.json"} 5800
重要

您可以通过移除业务不需要的默认维度来减少Envoy和Prometheus的内存消耗,但通常大多数维度都需要保留,因此监控指标设置区域仅展示被移除的维度。

链路追踪设置说明

链路追踪设置包括采样百分比、自定义标签。该功能仅支持全局配置。

采样百分比

您可以自定义链路追踪的采样百分比,即触发上报链路追踪的请求的比例。设置为0表示关闭链路追踪,没有任何请求会触发上报。

自定义标签

您可以自定义上报的链路追踪Span携带的标签。在链路追踪设置区域,单击新增自定义标签,配置名称类型

类型取值包括固定值、请求Header和环境变量。类型的说明及标签配置示例如下。

类型

说明

标签配置示例

固定值

固定值类型标签的值将固定为您设置的值。

  • 名称:env

  • 类型:固定值

  • :prod

请求Header

请求Header标签的值将以您指定的请求Header的值作为标签值。若Header在请求中不存在,则使用默认值作为标签值。

例如,从Header User-Agent中获取标签值,当Header不存在时则将标签值设置为默认值unknow。

  • 名称:useragent

  • 类型:请求Header

    • header名称:User-Agent

    • 默认值:unknow

环境变量

环境变量标签将从工作负载的指定环境变量中获取标签值。若环境变量在工作负载中不存在,则使用默认值作为标签值。

例如,从环境变量ENV中获取标签值,当环境变量不存在时则将标签值设置为默认值unknow。

  • 名称:env

  • 类型:环境变量

    • 环境变量名称:ENV

    • 默认值:unknow