Vector 的 gcp_stackdriver_metrics 组件:将指标数据批量写入 GCP Cloud Monitoring 的完整配置与实现剖析
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
导读
gcp_stackdriver_metrics是 Vector 的一个指标专用 Sink(原 Stackdriver,现已更名为 GCP Cloud Monitoring),用于把 Vector 管道中的 metrics 通过 REST 接口批量投递到 Google Cloud Monitoring 的v3/projects/{project}/timeSeries端点。读完本文,你将掌握该组件的完整配置字段(含认证、资源、批处理、TLS 与重试)、它支持哪些指标类型及其底层编码逻辑,并能从源码层面理解 Vector 如何构造请求、控制速率与处理确认。
组件定位与能力概览
根据组件元数据定义 gcp_stackdriver_metrics.cue,该组件的关键属性如下:
| 属性 | 值 | 说明 |
|---|---|---|
| 组件类型 | sink | 只作为数据出口使用 |
| 输入类型 | 仅 metrics | 不支持 logs 和 traces |
| 支持的指标 kind | counter、gauge | distribution、histogram、set、summary均不支持 |
| 投递语义 | at_least_once | 至多一次之外的 at-least-once 保证 |
| 退出方式 | batch | 以批为单位发送 |
| 健康检查 | 禁用(healthcheck: enabled: false) | |
| 有状态 | 否(stateful: false) | |
| 服务提供方 | GCP | |
| 协议 | HTTPS(SSL required),REST 接口 |
认证与权限方面,从 CUE 中的permissions.iam段可以看到,该组件要求 GCP IAM 策略monitoring: timeSeries.create,且标注其同时适用于healthcheck与operation两种场景——也就是说,写入时使用的服务账号必须具备timeSeries.create权限。
完整配置说明
下面按照配置字段逐一展开。所有字段的描述文案与仓库 生成的 CUE 配置数据 保持一致。
基础字段
type(必填):固定为gcp_stackdriver_metrics。
project_id(必填,string):要发布指标的目标 GCP 项目 ID。例如my-project。它决定了最终请求 URI 中v3/projects/{project_id}/timeSeries里的项目段。
resource(必填,object):受监控资源(monitored resource),指标会与这个资源关联上报。结构包含:
type(必填):受监控资源类型,例如global、gce_instance(Compute Engine VM 实例);- 其余键:该资源类型对应的 descriptor 中列出的所有 label 值,例如 Compute Engine VM 使用
projectId、instanceId、zone。
CUE 中给出的一个示例对象为:
resource: type: "global" instanceId: "Twilight" projectId: "vector-123456" zone: "us-central1-a"在源码中,resource对应 GcpTypedResource 结构体,它携带type和labels两个字段。
认证字段
api_key(可选,string):GCP API 密钥。credentials_path(可选,string):服务账号凭证 JSON 文件的路径。
两者的取值逻辑(与文档描述一致):
- 二选一配置
api_key或credentials_path; - 若都未设置,检查环境变量
GOOGLE_APPLICATION_CREDENTIALS中指定的文件名; - 若环境变量也未设置,则尝试获取当前运行实例(GCE 实例)的实例服务账号;
- 如果程序不在 GCE 上运行且上述都未配置,则必须显式提供 API key 或服务账号凭证文件。
在 build 方法 中可以看到,认证通过self.auth.build(Scope::MonitoringWrite)构建,即请求会附带monitoring写入作用域,并在启动后通过auth.spawn_regenerate_token()启动后台令牌刷新。
default_namespace(可选,string,默认"namespace")
用于没有命名空间的指标的默认 namespace。因为 Cloud Monitoring 中同名的指标只能靠 namespace 区分,而并非所有指标都自带 namespace。默认值由 default_metric_namespace_value 返回,即字符串namespace。
batch(可选)
批处理行为。针对该组件的默认批处理设置见 StackdriverMetricsDefaultBatchSettings:
| 参数 | 默认值 |
|---|---|
max_events | 1 |
max_bytes | 无限制(None) |
timeout_secs | 1.0 |
request(可选)
出站请求的中间件设置,可配置并发/速率限制、超时与重试行为。两点值得注意:
- 该组件默认速率限制为每秒 1000 个请求,由 StackdriverMetricsTowerRequestConfigDefaults 中
RATE_LIMIT_NUM = 1_000指定; - 文档提示:重试退避策略遵循斐波那契数列。
此外还支持proxy(代理)与tls配置;tls默认启用、可验证证书与主机名。压缩(compression)默认关闭——在请求构建器中 compression() 直接返回Compression::None。
acknowledgements(可选)与retry_strategy(可选)
acknowledgements:控制端到端确认(End-to-End Acknowledgements)如何处理,组件元数据中标记acknowledgements: true;retry_strategy:HTTP 类 Sink 的可配置重试策略,作用于客户端错误响应(如 4xx/5xx 的分类处理)。
一个可用的完整配置示例
sinks: stackdriver_metrics: type: gcp_stackdriver_metrics project_id: "vector-123456" resource: type: "gce_instance" projectId: "vector-123456" instanceId: "Twilight" zone: "us-central1-a" credentials_path: "/path/to/service-account.json" default_namespace: "vector" batch: max_events: 100 timeout_secs: 5 request: concurrency: 10 acknowledgements: enabled: true inputs: - my_metrics_source注意:CUE 元数据显示该组件的编码不依赖通用 codec(
encoding: codec: enabled: false),因为编码逻辑完全内置于 Stackdriver 编码器中,见下文。
工作流程与底层实现
请求端点的构造
endpoint字段被标记为serde(skip),即对配置者不可见,其默认值固定为https://monitoring.googleapis.com(见 default_endpoint)。验证阶段会在该基础 URI 上拼接v3/projects/{project_id}/timeSeries,这一拼接逻辑见 validate 方法,并有单元测试 validate_produces_usable_values 断言最终 URI 为https://monitoring.googleapis.com/v3/projects/test-project/timeSeries。
指标过滤:只接受 Counter 与 Gauge
Sink 的主循环在 StackdriverMetricsSink::run_inner 中实现,管道依次为:
- 过滤:
filter_map只放行Counter与Gauge两种指标值,其他类型会打印warn!("Unsupported metric type: ...")日志后被丢弃; - 归一化:通过
normalized_with_default::<StackdriverMetricsNormalize>()将 counter/gauge 转为绝对值(make_absolute),避免增量值在 at-least-once 重试场景下重复累加造成失真; - 批处理:按字节大小配置分批次;
- 请求构建:交给 StackdriverMetricsRequestBuilder 编码并封装为 HTTP 请求;
- 驱动发送:
into_driver(self.service).run(),底层服务是带http_response_retry_logic的HttpService,出站请求以POST+Content-Type: application/json发出,并由GcpAuthenticator附加Authorization头(见 StackdriverMetricsServiceRequestBuilder::build)。
编码逻辑:指标如何映射为 Cloud Monitoring 的 TimeSeries
StackdriverMetricsEncoder::encode_input 将一批Vec<Metric>编码为 Cloud Monitoring REST v3 的timeSeries创建请求体,核心映射规则为:
- 指标类型名:
custom.googleapis.com/{namespace}/metrics/{metric_name}。这里的 namespace 优先取指标自身的 namespace,否则回退到default_namespace配置值; - Counter:
metric_kind为Cumulative,区间的start_time为 Sink 启动时刻(started),end_time为指标时间戳(缺省为当前时间); - Gauge:
metric_kind为Gauge,区间start_time为None,只有end_time; - 数值类型:统一以
int64_value上报(value_type: Int64),即浮点数值会被截断为 i64; - 标签处理:指标 tags 通过
into_iter_single收集为 HashMap 作为metric.labels。这里有一个重要行为,与文档how_it_works中"Duplicate tag names"一节一致:多个同名 tag 无法发送到 GCP,Vector 只会发送每个 tag 名的最后一个值(HashMap 的收集行为天然实现“后者覆盖前者”); - 资源关联:每条 timeSeries 都携带配置中的
resource(type + labels)。
使用限制与注意事项
- 该组件仅接受 metrics 输入,且只有
counter与gauge两类会被真正发送,其余类型会被静默丢弃(伴随警告日志); - 数值以 int64 上报,对小数精度敏感的场景需要留意;
- 默认批大小为 1 事件 / 1 秒超时,高吞吐场景建议按目标服务容量调大
batch.max_events/batch.timeout_secs; - 默认每秒 1000 请求的速率上限通常足够,但若调大
request.concurrency时需注意该限制; - 健康检查被禁用,无法通过
vector validate之外的运行时健康接口探测到该 Sink 的连通性; - IAM 上必须授予服务账号
monitoring: timeSeries.create权限。
参考路径汇总
| 内容 | 路径 |
|---|---|
| 组件文档页 | gcp_stackdriver_metrics.md |
| 组件元数据(CUE) | gcp_stackdriver_metrics.cue |
| 配置结构体与验证逻辑 | config.rs |
| 指标过滤与主循环 | sink.rs |
| 请求构建与编码器 | request_builder.rs |
| GcpTypedResource 定义 | gcp/mod.rs |
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考