自定义 Istio 指标

此任务向您展示如何自定义 Istio 生成的指标。

Istio 生成各种 dashboard 使用的遥测数据,以帮助您可视化您的网格。 例如,支持 Istio 的 dashboard 包括:

默认情况下,Istio 定义并生成一组标准指标(例如:requests_total),但您也可以使用 Telemetry API 自定义标准指标并创建新指标。

自定义统计配置

Istio 使用 Envoy 代理生成指标并在 manifests/charts/istio-control/istio-discovery/templates/telemetryv2_1.19.yaml 文件的 EnvoyFilter 中提供配置。

配置自定义统计信息涉及 EnvoyFilter 的两个部分:definitionsmetrics。 在 definitions 部分支持用名字、期望值表达式和指标类型(countergaugehistogram)创建新的指标。 在 metrics 的部分以表达式的形式提供指标维度的值,并允许您删除或覆盖现有的指标维度。 您可以调整标准指标定义,利用 tags_to_remove 或重新定义维度。 这些配置设置也用 istioctl 安装选项公开, 允许您为网关和边车以及入站或出站方向自定义不同的指标。

开始之前

在集群中安装 Istio并部署应用程序。 或者,您可以设置自定义统计作为 Istio 安装的一部分。

Bookinfo 示例应用程序在此任务中用作示例应用程序。 关于安装说明,请参阅部署 Bookinfo 示例

启用自定义指标

例如要自定义遥测 v2 指标,可以使用以下命令,沿着入站和出站方向,将 request_hostdestination_port 维度添加到同由 Gateway 和 Sidecar 发出的 requests_total

  1. $ cat <<EOF > ./custom_metrics.yaml
  2. apiVersion: telemetry.istio.io/v1alpha1
  3. kind: Telemetry
  4. metadata:
  5. name: namespace-metrics
  6. spec:
  7. metrics:
  8. - providers:
  9. - name: prometheus
  10. overrides:
  11. - match:
  12. metric: REQUEST_COUNT
  13. tagOverrides:
  14. destination_port:
  15. value: "string(destination.port)"
  16. request_host:
  17. value: "request.host"
  18. EOF
  19. $ kubectl apply -f custom_metrics.yaml

验证结果

将流量发送到网格。对于 Bookinfo 示例,请 http://$GATEWAY_URL/productpage 在您的网络浏览器中访问或发出以下命令:

  1. $ curl "http://$GATEWAY_URL/productpage"

$GATEWAY_URLBookinfo 示例中设置的值。

使用以下命令验证 Istio 是否为您的新维度或修改后的维度生成数据:

  1. $ kubectl exec "$(kubectl get pod -l app=productpage -o jsonpath='{.items[0].metadata.name}')" -c istio-proxy -- curl -sS 'localhost:15000/stats/prometheus' | grep istio_requests_total

例如,在输出中,找到指标 istio_requests_total 并验证它是否包含您的新维度。

代理开始应用配置可能需要很短的时间。如果未收到该指标,您可以在稍等片刻后重试发送请求, 然后再次查找该指标。

对值使用表达式

指标配置中的值是常用表达式,这意味着您 JSON 中的字符必须双引号(例如:”‘string value’”)。 与 Mixer 表达式语言不同,不支持 pipe(|)运算符,但您 可以使用 hasin 操作符来模拟它,例如:

  1. has(request.host) ? request.host : "unknown"

有关详细信息,请参阅通用表达式语言

Istio 公开了所有标准 Envoy 属性。 对等元数据可用作出站属性 upstream_peer 和入站属性 downstream_peer,具有以下字段:

字段类型
namestringPod 的名字。
namespacestringPod 运行的命名空间。
labelsmap工作负载标签。
ownerstring工作负载所有者。
workload_namestring工作负载名称。
platform_metadatamap带有前缀键的平台元数据。
istio_versionstring代理的版本标识符。
mesh_idstring网格的唯一标识符。
app_containerslist<string>应用程序容器的短名称列表。
cluster_idstring此工作负载所属的集群的标识符。

例如,要在出站配置中使用的对等 app 标签的表达式是 upstream_peer.labels['app'].value

清理

要删除 Bookinfo 示例应用及其配置,请参阅 Bookinfo 清理