根据请求或响应对指标进行分类
根据网格中服务处理的请求和响应的类型来可视化遥测数据非常有用。 例如,书商跟踪请求书评的次数。书评请求具有以下结构:
GET /reviews/{review_id}
计算审查请求的数量必须考虑到无界元素 review_id
。 GET /reviews/1
紧随其后的 GET /reviews/2
应该算作两次获得评论的请求。
Istio 允许您使用 AttributeGen 插件 创建分类规则,该插件将请求分组为固定数量的逻辑操作。 例如,您可以创建一个名为 GetReviews
的操作, ,这是使用 Open API Spec operationId。 此信息作为 istio_operationId
属性注入到请求处理中值等于 GetReviews
。 您可以将属性用作 Istio 标准指标中的维度。 相似地,您可以根据其他操作(例如 ListReviews
和 CreateReviews
)。
有关详细信息,请参阅参考内容。
Istio 使用 Envoy 代理生成指标并在 EnvoyFilter
在 manifests/charts/istio-control/istio-discovery/templates/telemetryv2_1.17.yaml。 因此,编写分类规则涉及将属性添加到 EnvoyFilter
。
按请求分类指标
您可以根据请求的类型对请求进行分类,例如: ListReview
、 GetReview
、 CreateReview
。
创建一个文件,例如
attribute_gen_service.yaml
,并使用以下内容保存它。 这会将istio.attributegen
插件添加到EnvoyFilter
。它还创建一个属性,istio_operationId
并使用类别值填充它以计为指标。此配置是特定于服务的,因为请求路径通常是特定于服务的。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: istio-attributegen-filter
spec:
workloadSelector:
labels:
app: reviews
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
proxy:
proxyVersion: '1\.9.*'
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
subFilter:
name: "istio.stats"
patch:
operation: INSERT_BEFORE
value:
name: istio.attributegen
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration:
"@type": type.googleapis.com/google.protobuf.StringValue
value: |
{
"attributes": [
{
"output_attribute": "istio_operationId",
"match": [
{
"value": "ListReviews",
"condition": "request.url_path == '/reviews' && request.method == 'GET'"
},
{
"value": "GetReview",
"condition": "request.url_path.matches('^/reviews/[[:alnum:]]*$') && request.method == 'GET'"
},
{
"value": "CreateReview",
"condition": "request.url_path == '/reviews/' && request.method == 'POST'"
}
]
}
]
}
vm_config:
runtime: envoy.wasm.runtime.null
code:
local: { inline_string: "envoy.wasm.attributegen" }
使用以下命令应用您的更改:
$ kubectl -n istio-system apply -f attribute_gen_service.yaml
查找
stats-filter-1.17
EnvoyFilter
资源从istio-system
命名空间中istio-system
,使用以下命令:$ kubectl -n istio-system get envoyfilter | grep ^stats-filter-1.17
stats-filter-1.17 2d
创建
EnvoyFilter
配置的本地文件系统副本,使用以下命令:$ kubectl -n istio-system get envoyfilter stats-filter-1.17 -o yaml > stats-filter-1.17.yaml
使用文本编辑器打开
stats-filter-1.17.yaml
并找到name: istio.stats
扩展配置。更新它以映射request_operation
requests_total
标准指标中的指标到istio_operationId
属性。 更新后的配置文件部分应如下所示。name: istio.stats
typed_config:
'@type': type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration:
"@type": type.googleapis.com/google.protobuf.StringValue
value: |
{
"metrics": [
{
"name": "requests_total",
"dimensions": {
"request_operation": "istio_operationId"
}
}]
}
保存
stats-filter-1.17.yaml
,然后使用以下命令应用配置:$ kubectl -n istio-system apply -f stats-filter-1.17.yaml
将以下配置添加到网格配置中。这导致添加了
request_operation
作为istio_requests_total
指标的新维度。 没有它,一个名为envoy_request_operation___somevalue___istio_requests_total
的新指标 被建造。meshConfig:
defaultConfig:
extraStatTags:
- request_operation
通过向您的应用程序发送流量来生成指标。
更改生效后,访问 Prometheus 并查找新的或更改的维度,例如:
istio_requests_total
。
按响应对指标进行分类
您可以使用与请求类似的过程对响应进行分类。请注意,response_code
默认情况下该维度已存在。下面的示例将更改它的填充方式。
创建一个文件,例如
attribute_gen_service.yaml
,并使用以下内容。 这会将istio.attributegen
插件添加到EnvoyFilter
并生成istio_responseClass
属性供统计插件。此示例对各种响应进行分类,例如将所有响应分组将
200
范围内的代码作为2xx
维度。apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: istio-attributegen-filter
spec:
workloadSelector:
labels:
app: productpage
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
proxy:
proxyVersion: '1\.9.*'
listener:
filterChain:
filter:
name: "envoy.http_connection_manager"
subFilter:
name: "istio.stats"
patch:
operation: INSERT_BEFORE
value:
name: istio.attributegen
typed_config:
"@type": type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration:
"@type": type.googleapis.com/google.protobuf.StringValue
value: |
{
"attributes": [
{
"output_attribute": "istio_responseClass",
"match": [
{
"value": "2xx",
"condition": "response.code >= 200 && response.code <= 299"
},
{
"value": "3xx",
"condition": "response.code >= 300 && response.code <= 399"
},
{
"value": "404",
"condition": "response.code == 404"
},
{
"value": "429",
"condition": "response.code == 429"
},
{
"value": "503",
"condition": "response.code == 503"
},
{
"value": "5xx",
"condition": "response.code >= 500 && response.code <= 599"
},
{
"value": "4xx",
"condition": "response.code >= 400 && response.code <= 499"
}
]
}
]
}
vm_config:
runtime: envoy.wasm.runtime.null
code:
local: { inline_string: "envoy.wasm.attributegen" }
使用以下命令应用您的更改:
$ kubectl -n istio-system apply -f attribute_gen_service.yaml
从
istio-system
中找到stats-filter-1.17
EnvoyFilter
资源 命名空间,使用以下命令:$ kubectl -n istio-system get envoyfilter | grep ^stats-filter-1.17
stats-filter-1.17 2d
创建
EnvoyFilter
配置的本地文件系统副本,使用以下命令:$ kubectl -n istio-system get envoyfilter stats-filter-1.17 -o yaml > stats-filter-1.17.yaml
使用文本编辑器打开
stats-filter-1.17.yaml
并找到name: istio.stats
扩展配置。 更新它以映射response_code
在requests_total
标准指标中的维度到istio_responseClass
属性。 更新后的配置文件部分应如下所示。name: istio.stats
typed_config:
'@type': type.googleapis.com/udpa.type.v1.TypedStruct
type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
value:
config:
configuration:
"@type": type.googleapis.com/google.protobuf.StringValue
value: |
{
"metrics": [
{
"name": "requests_total",
"dimensions": {
"response_code": "istio_responseClass"
}
}]
}
保存
stats-filter-1.17.yaml
,然后使用以下命令应用配置:$ kubectl -n istio-system apply -f stats-filter-1.17.yaml
验证结果
通过向您的应用程序发送流量来生成指标。
访问 Prometheus 并查找新的或更改的维度,例如:
2xx
。 或者,使用以下命令验证 Istio 是否为您的新维度生成数据:$ kubectl exec pod-name -c istio-proxy -- curl -sS 'localhost:15000/stats/prometheus' | grep istio_
在输出中,找到指标(例如:
istio_requests_total
)并验证是否存在新的或更改的维度。
故障排除
如果分类未按预期进行,请检查以下潜在原因和解决方法。
查看具有您应用了配置更改的服务的 Pod 的 Envoy 代理日志。 在您使用以下命令配置分类的 Pod (pod-name
) 上的 Envoy 代理日志中检查服务是否没有报告错误:
$ kubectl logs pod-name -c istio-proxy | grep -e "Config Error" -e "envoy wasm"
此外,通过在以下命令的输出中查找重新启动的迹象,确保没有 Envoy 代理崩溃:
$ kubectl get pods pod-name