news 2026/9/13 21:39:22

Vector 的 gcp_stackdriver_metrics 组件:将指标数据批量写入 GCP Cloud Monitoring 的完整配置与实现剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vector 的 gcp_stackdriver_metrics 组件:将指标数据批量写入 GCP Cloud Monitoring 的完整配置与实现剖析

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
支持的指标 kindcountergaugedistributionhistogramsetsummary均不支持
投递语义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,且标注其同时适用于healthcheckoperation两种场景——也就是说,写入时使用的服务账号必须具备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(必填):受监控资源类型,例如globalgce_instance(Compute Engine VM 实例);
  • 其余键:该资源类型对应的 descriptor 中列出的所有 label 值,例如 Compute Engine VM 使用projectIdinstanceIdzone

CUE 中给出的一个示例对象为:

resource: type: "global" instanceId: "Twilight" projectId: "vector-123456" zone: "us-central1-a"

在源码中,resource对应 GcpTypedResource 结构体,它携带typelabels两个字段。

认证字段

api_key(可选,string):GCP API 密钥。credentials_path(可选,string):服务账号凭证 JSON 文件的路径。

两者的取值逻辑(与文档描述一致):

  1. 二选一配置api_keycredentials_path
  2. 若都未设置,检查环境变量GOOGLE_APPLICATION_CREDENTIALS中指定的文件名;
  3. 若环境变量也未设置,则尝试获取当前运行实例(GCE 实例)的实例服务账号;
  4. 如果程序不在 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_events1
max_bytes无限制(None
timeout_secs1.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 中实现,管道依次为:

  1. 过滤filter_map只放行CounterGauge两种指标值,其他类型会打印warn!("Unsupported metric type: ...")日志后被丢弃;
  2. 归一化:通过normalized_with_default::<StackdriverMetricsNormalize>()将 counter/gauge 转为绝对值(make_absolute),避免增量值在 at-least-once 重试场景下重复累加造成失真;
  3. 批处理:按字节大小配置分批次;
  4. 请求构建:交给 StackdriverMetricsRequestBuilder 编码并封装为 HTTP 请求;
  5. 驱动发送into_driver(self.service).run(),底层服务是带http_response_retry_logicHttpService,出站请求以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配置值;
  • Countermetric_kindCumulative,区间的start_time为 Sink 启动时刻(started),end_time为指标时间戳(缺省为当前时间);
  • Gaugemetric_kindGauge,区间start_timeNone,只有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 输入,且只有countergauge两类会被真正发送,其余类型会被静默丢弃(伴随警告日志);
  • 数值以 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 21:35:16

Windows 隐藏导航窗格【主文件夹】、【图库】、【OneDrive】

目录Win11隐藏导航窗格【主文件夹】、【图库】CLSID对照表完整一键 reg&#xff08;全部隐藏&#xff1a;主文件夹图库OneDrive&#xff09;恢复显示全部的reg生效操作手动一步步操作&#xff08;不用reg文件&#xff09;Win11隐藏导航窗格【主文件夹】、【图库】 ⚠️注意&…

作者头像 李华
网站建设 2026/9/13 21:33:44

Shell 脚本语法规则速查手册

Shell 脚本语法规则速查手册适用于 Bash / Shell 脚本编写&#xff08;Linux 环境&#xff09;一、文件基础规则 1.1 文件扩展名与权限 # 推荐扩展名&#xff1a; .sh &#xff08;不是必须&#xff0c;但便于识别&#xff09; myscript.sh# 给脚本加执行权限&#xff08;只需一…

作者头像 李华
网站建设 2026/9/13 21:31:19

蜂鸟M 1.2V_CORE供电设计:从伪命题到三级滤波实战

1. 这不是一道选择题&#xff1a;1.2V在蜂鸟M原理图里根本不能简单问“输入还是输出”刚拿到蜂鸟M裸芯的原理图&#xff0c;第一眼看到电源网络标着“1.2V_CORE”&#xff0c;旁边还跟着一堆去耦电容、磁珠和LDO芯片&#xff0c;很多工程师下意识就去翻手册找“这个1.2V是给谁供…

作者头像 李华
网站建设 2026/9/13 21:30:39

Sample Inputs

Sample Inputs 【免费下载链接】adk-python An open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control. 项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python Hello World …

作者头像 李华
网站建设 2026/9/13 21:30:16

休闲游戏出海:全生命周期AI本地化投放实战指南

1. 为什么“休闲游戏出海”不是发版就完事&#xff0c;而是从立项第一天起就要算清的账 “休闲游戏出海”这六个字&#xff0c;听上去轻松——消消乐、合成类、放置挂机&#xff0c;美术成本低、开发周期短、上线快。但过去三年我带团队操盘过17款休闲游戏海外发行&#xff0c;…

作者头像 李华
网站建设 2026/9/13 21:28:25

R语言日期时间转换全攻略:as.POSIXct与as.POSIXlt从原理到实战

处理数据的时候&#xff0c;我最怕的不是模型跑不出来&#xff0c;而是拿到一张表&#xff0c;里面的日期时间五花八门&#xff1a;有的是"2024-03-15"&#xff0c;有的是"03/15/2024 14:30"&#xff0c;还有的是Excel里那种一串数字序列。R语言里处理日期…

作者头像 李华