仪器
使用标准工具和自定义工具收集测量数据
一个工具在<.style data-emotion="css 154yii">.css-154yii{-webkit-text-decoration:underline;text-decoration:underline;text-decoration-style:dotted;text-decoration-thickness:1.5px;text-decoration-color:var(--chakra-colors-gray-300);text-underline-offset:0.2em;}.css-154yii:hover,.css-154yii[data-hover]{cursor:help;}.chakra-ui-dark .css-154yii:not([data-theme]),[data-theme=dark] .css-154yii:not([data-theme]),.css-154yii[data-theme=dark]{text-decoration-color:var(--chakra-colors-blue-400);}路由器收集数据并向后端指标报告测量结果。支持的工具包括来自OpenTelemetry的标准工具、路由器请求生命周期的标准工具和自定义工具。支持的仪器类型包括计数器和直方图。
您可以在router.yaml
中配置工具,使用telemetry.instrumentation.instruments
。
OpenTelemetry标准工具
OpenTelemetry指定了多个标准指标工具,这些工具在:路由器:
在路由器服务:
http.server.active_requests
- 正在传输的活动请求数。http.server.request.body.size
- 路由器处理的请求请求体大小的直方图。http.server.request.duration
- 路由器处理的请求持续时间的直方图。
在子图服务:
http.client.request.body.size
- 子图处理的请求请求体大小的直方图。http.client.request.duration
- 子图处理的请求持续时间的直方图。http.client.response.body.size
- 子图处理的请求响应体大小的直方图。
这些工具可以在router.yaml
中进行配置:
telemetry:instrumentation:instruments:router:http.server.active_requests: true # (default false)http.server.request.body.size: true # (default false)http.server.request.duration: true # (default false)subgraph:http.client.request.body.size: true # (default false)http.client.request.duration: true # (default false)http.client.response.body.size: true # (default false)
它们可以通过添加或删除属性进行自定义。有关配置属性的更多信息,请参阅属性。
telemetry:instrumentation:instruments:default_requirement_level: requiredrouter:http.server.active_requests:attributes:http.request.method: truesubgraph:http.client.request.duration:attributes:subgraph.name: true
Apollo标准工具
了解 Apollo 提供的标准指标工具,见 路由器's 请求生命周期,请参阅 路由器工具。
自定义工具
此功能仅适用于 GraphOS 专用或企业版计划。
要比较所有计划类型对 GraphOS 功能的支持,请参阅 价格页面.
您可以在路由器、supergraph 和 子图 服务中定义自定义工具。您还可以为路由器返回给客户端的响应数据中的每个 JSON 元素定义自定义工具。
以下示例配置定义了四个自定义工具
acme.request.duration
在路由器
服务上acme.graphql.requests
在supergraph
服务上acme.graphql.subgraph.errors
在子图
服务上acme.graphql.list.lengths
在每个返回给客户端的 JSON 元素上(定义在graphql
)
telemetry:instrumentation:instruments:router:http.server.active_requests: trueacme.request.duration:value: durationtype: counterunit: kbdescription: "my description"condition:eq:- 200- response_status: codeattributes:http.response.status_code: true"my_attribute":response_header: "x-my-header"supergraph:acme.graphql.requests:value: unittype: counterunit: countdescription: "supergraph requests"subgraph:acme.graphql.subgraph.errors:value: unittype: counterunit: countdescription: "my description"graphql:acme.graphql.list.lengths:value:list_length: valuetype: histogramunit: countdescription: "my description"
ⓘ **注意**
请注意,您添加的遥测数据量可能会影响您 路由器 的性能。
- 自定义指标、事件和属性比标准指标消耗更多的处理资源。添加过多的(标准或自定义)可能会减慢您 路由器 的速度。
- 例如,
events.*.request|error|response
之类的配置,该配置为所有 路由器 生命周期服务生成输出,应仅用于开发或调试,而不是用于生产。
对于正确记录的遥测数据,您应使用 info
级别的日志详细程度。设置 RUST_LOG
或 APOLLO_ROUTER_LOG
环境变量的值,以及 --log
CLI 选项为 info
。使用较简单的日志记录,如 error
,可能会导致一些属性丢失。
工具命名约定
当定义自定义工具时,务必参考 OpenTelemetry (OTel) 语义约定。OTel 语义约定可以帮助您:
- 为何取名一个好的工具名称。
- 查看哪些标准属性可以附加到您的工具上。
一些需要特别注意的指导原则
- 不要在度量名称中包含单位名称。例如,
size_kb
应该是size
并且单位应该是kb
。 - 不要将
_total
作为后缀包含在内。例如,使用http.server.active_requests
,而不是http.server.active_requests_total
。 - 使用点表示法来在度量名称中分隔命名空间。例如,使用
http.server.active_requests
,而不是http_server_active_requests
。
仪器配置
default_requirement_level
将default_requirement_level
选项设置为要附加到默认标准仪器的默认属性,该属性由OpenTelemetry语义约定定义。
有效值
required
(默认)- 默认情况下将附加必需属性到标准仪器。recommended
- 默认情况下将附加推荐属性到标准仪器。
telemetry:instrumentation:instruments:# Set the default requirement leveldefault_requirement_level: required
属性可以单独配置,以便required
属性可以覆盖或禁用。例如,将http.response.status_code
单独设置以覆盖默认值:
telemetry:instrumentation:instruments:# Set the default requirement leveldefault_requirement_level: requiredrouter:# Standard metricshttp.server.request.body.size:attributes:# Standard attributeshttp.response.status_code: false# Custom attribute"acme.my_attribute":response_header: "x-my-header"# Standard metricshttp.server.active_requests:attributes:# Standard attributes, different than other ones provides in standard metrics, custom attributes are not available on this standard metrichttp.request.method: falseserver.address: trueserver.port: trueurl.scheme: true
ⓘ **注意**
OpenTelemetry规范定义的为opt-in
的属性必须单独配置。
路由器请求生命周期服务
路由器请求生命周期有三个主要服务:
- 路由器服务- 处理尚未解析的传入请求。在不可见字节的上下文中工作。
- Supergraph服务- 在请求被解析后、发送到subgraph之前处理请求。在GraphQL上下文中工作。
- Subgraph服务- 在请求发送到subgraph之后处理请求。在GraphQL上下文中工作。
此外,您可以为每个返回给客户端的JSON元素定义graphql
上的仪器。
要定义自定义仪器,请向router.yaml
中添加新的密钥,作为telemetry.instruments.<service>.<custom-instrument>
。例如,添加自定义仪器acme.request.duration
:
telemetry:instrumentation:instruments:router:acme.request.duration: # The name of your custom instrument/metricvalue: durationtype: counterunit: sdescription: "my description"
值
您在定义仪器时指定的服务确定其可能的值。
值 | 定义 | 可用服务 |
---|---|---|
| 管道服务的持续时间。 |
|
| 管道服务执行次数。 |
|
| 从管道服务中提取的自定义值。有关更多信息,请参阅选择器。 |
|
| 管道服务中事件持续时间。 |
|
| 管道服务中事件执行的次数。 |
|
| 从管道服务事件中提取的自定义值。有关更多信息,请参阅选择器。 |
|
ⓘ **注意**
event_*
在使用supergraph响应体(response_data
和response_errors
)上的选择器时为强制性的。
可以通过自定义属性从管道中提取自定义指标值。例如,要计算请求头的内容的总和,创建一个计数器,其值设置为请求头
telemetry:instrumentation:instruments:router:acme.metric:# ...type: countervalue:request_header: "x-my-header"
ⓘ **注意**
该值必须为仪器预期的类型。例如,计数器必须具有数值。
type
仪器有两种不同类型
counter
- 单调计数器。例如,已处理的请求、完成的任务或发生的错误。histogram
- 值直方图。例如,请求持续时间或响应体大小。
telemetry:instrumentation:instruments:router:acme.metric:# ...type: counter # counter, histogram
单位
在您的APM中显示的免费格式单位。
推荐使用unit
和来自统一测量单位代码的SI单位及其定义。
telemetry:instrumentation:instruments:router:acme.metric:# ...unit: s # seconds
description
将显示在您的APM中的仪器的免费格式描述。
telemetry:instrumentation:instruments:router:acme.metric:# ...description: "my description"
condition
您可能只希望在特定条件下修改仪器。例如,您可能只希望在响应状态码为200时增加计数器。
为此请使用条件
telemetry:instrumentation:instruments:router:acme.metric:# ...condition:eq:- 200- response_status: code
attributes
仪器可以附有来自router管道的属性。这些属性用于在您的APM中过滤和组合指标。
属性可能来自标准属性或选择器,但不是标准度量http.server.active_requests
。
可用的属性取决于管道的服务的类型。
telemetry:instrumentation:instruments:router:# Standard metricshttp.server.request.body.size:attributes:# Standard attributeshttp.response.status_code: false# Custom attribute"acme.my_attribute":response_header: "x-my-header"# Standard metricshttp.server.active_requests:attributes:# Standard attributes, different than other ones provides in standard metrics, custom attributes are not available on this standard metrichttp.request.method: falseserver.address: trueserver.port: trueurl.scheme: true# Custom metricacme.metric:value: durationtype: counterunit: sdescription: "my description"attributes:http.response.status_code: true"my_attribute":# ...response_header: "x-my-header"subgraph:requests.timeout:value: unittype: counterunit: requestdescription: "subgraph requests containing subgraph timeout"attributes:subgraph.name: truecondition:eq:- "request timed out"- error: reasongraphql:acme.graphql.list.lengths:value:list_length: valuetype: histogramunit: countdescription: "my description"attributes:graphql.type.name: true
仪器配置参考
选项 | 值 | 默认值 | 描述 |
---|---|---|---|
<attribute-name> | 自定义属性名称。 | ||
<instrument-name> | 自定义仪器名称。 | ||
attributes | 标准属性或选择器 | 自定义仪器的属性。 | |
condition | conditions | 变换仪器的条件。 | |
default_requirement_level | required |recommended | required | 默认属性需求级别。 |
type | counter |histogram | 自定义仪器名称。 | |
单位 | 一个单位名称,例如 By 或 {request} 。 | ||
description | 自定义仪器的描述。 | ||
值 | unit |duration |<custom> |event_unit |event_duration |event_custom | 仪器的值。 |