服务网格ASM提供日志、监控指标、链路追踪维度的可观测配置功能。您可以通过ASM控制台为全局、命名空间或指定工作负载自定义相关配置,例如日志输出的格式、指标的维度、是否启用特定监控指标、设置链路追踪的采样率等。本文介绍如何使用可观测配置功能。
前提条件
作用范围
类型 | 说明 |
全局 | 全局配置支持日志、监控指标、链路追踪设置。全局配置只有一份,无法删除。仅全局配置支持链路追踪设置。 |
命名空间 | 为命名空间创建专有的可观测配置。每个命名空间只能有一份命名空间级可观测配置。 |
自定义 | 通过工作负载选择器选定一个自定义配置的生效范围。每个工作负载至多被一个自定义配置选中。 |
操作步骤
全局
命名空间
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在可观测配置页面,单击命名空间页签,单击创建,选择目标命名空间,按需配置日志和监控指标,然后单击创建。
您可以单击下表的链接,查看配置的详细说明。
配置区域
说明
自定义
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在可观测配置页面,单击自定义页签,选择目标命名空间,单击创建,输入名称和匹配标签,按需配置日志和监控指标,然后单击创建。
您可以单击下表的链接,查看配置的详细说明。
配置区域
说明
日志设置说明
日志设置包括启用或禁用访问日志输出、设置日志输出形式、自定义日志格式、日志过滤。
启用或禁用访问日志输出
在日志设置区域,按需打开或关闭启用日志输出开关。
打开开关,服务网格数据平面Sidecar或网关会将访问日志输出至容器标准输出。
关闭开关,服务网格数据平面Sidecar或网关停止将日志输出到容器标准输出。
在数据平面Sidecar容器的标准输出查看日志。
下文以使用kubectl查看访问日志为例进行说明。
执行以下命令,查看Sidecar日志。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1
执行以下命令,查看入口网关日志。
kubectl -n istio-system logs istio-ingressgateway-6cff9b6b58-r**** --tail 1
(可选)通过容器服务控制台查看访问日志。
如果您使用阿里云容器服务集群,还可以通过容器服务控制台查看访问日志。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在容器组页面,单击目标Pod名称,然后在页面下方单击日志页签,查看访问日志。
设置日志输出形式
该功能仅支持1.20.6.36及以上版本的ASM实例。关于升级实例的具体操作,请参见升级ASM实例。
在日志设置区域,按需将日志输出形式设置为JSON或TEXT。
设置为JSON,访问日志将以JSON字符串的形式输出至容器标准输出。
设置为TEXT,访问日志将以纯文本字符串的形式输出至容器标准输出。
自定义日志格式
在日志设置区域,按需选中字段、修改自定义字段信息或在最下方日志指标右侧单击图标,新增日志字段。
只有打开启用日志输出开关,才能自定义日志格式。在日志格式区域,默认选中的日志字段为默认必选字段,不支持修改。日志字段支持从请求Header、响应Header、Envoy内置值中取值。
下文以打印请求中的accept-encoding Header为例,配置变量名称为accept-encoding,类型为请求属性,变量值为Accept-Encoding。
执行以下命令,查看服务网格数据平面组件日志。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto
可以看到步骤1新增的Accept-Encoding Header的值,已被输出至访问日志。
日志过滤
在日志设置区域下方,按需选中启用日志过滤以激活日志过滤,然后在下方日志表达式文本框输入日志过滤表达式。未能与表达式匹配的请求对应的访问日志将不会输出。
例如,如果您希望只输出Response Http Status >=400
的请求日志,则表达式为response.code >= 400
。详细信息,请参见CEL表达式和常用字段。
CEL表达式和常用字段
日志过滤表达式为标准CEL(Common Expression Language)表达式。CEL表达式的常用字段如下。更多信息,请参见CEL和Envoy。
属性 | 类型 | 说明 |
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 | 请求协议,取值为 |
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作为服务端被动接受访问时所产生的指标数据。
在监控指标设置区域的CLIENT侧指标或SERVER侧指标列,按需选中或取消选中目标指标对应的启用。
启用指标:服务网格数据平面Sidecar或网关会将该指标通过15020端口的
/stats/prometheus
路径进行暴露。不启用指标:该指标不会通过上述端口进行暴露。
执行以下命令,查看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指标来筛选请求客户端为特定应用的指标。
编辑默认维度
您可以通过以下步骤对默认维度进行编辑。
在监控指标设置区域的CLIENT侧指标或SERVER侧指标列,单击已启用指标对应的编辑维度。
在自定义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
添加自定义维度
您可以通过以下步骤添加自定义维度:
在监控指标设置区域的CLIENT侧指标或SERVER侧指标列,单击已启用指标对应的编辑维度。
在自定义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和环境变量。类型的说明及标签配置示例如下。
类型 | 说明 | 标签配置示例 |
固定值 | 固定值类型标签的值将固定为您设置的值。 |
|
请求Header | 请求Header标签的值将以您指定的请求Header的值作为标签值。若Header在请求中不存在,则使用默认值作为标签值。 例如,从Header User-Agent中获取标签值,当Header不存在时则将标签值设置为默认值unknow。 |
|
环境变量 | 环境变量标签将从工作负载的指定环境变量中获取标签值。若环境变量在工作负载中不存在,则使用默认值作为标签值。 例如,从环境变量ENV中获取标签值,当环境变量不存在时则将标签值设置为默认值unknow。 |
|