人工智能AI AgentAgent 沙箱云原生容器运行时零信任【免费下载链接】substrateAgent Substrate: the core system项目地址https://gitcode.com/GitHub_Trending/substrate7/substrate点击查看免费下载导读本文以 substrate 仓库中随 vendored 依赖引入的 opentelemetry-operations-go/exporter/metric 文档为主体讲解如何在 Go 应用中把 OpenTelemetry 采集的指标Metrics导出到 Google Cloud MonitoringGCM。读完本文你将掌握Google Cloud Monitoring 的前置 Workspace 设置、基于应用默认凭据ADC的认证机制、WithProjectID等核心配置项的用法以及该 exporter 在底层如何完成 MetricDescriptor 创建、TimeSeries 批量上传与指标类型映射。文末还会结合仓库源码给出全部可用的Option配置项说明与真实调用链。一、Exporter 是什么把 OTel 指标送达 Google Cloud Monitoring本小节内容基于 exporter/metric/README.md 的开篇描述。OpenTelemetry Google Cloud Monitoring Exporter是一个标准的 OpenTelemetry Metric Exporter它允许用户把程序内采集并聚合好的指标数据发送到 Google Cloud即 Google Cloud Monitoring 服务。在 substrate 仓库中该模块以 vendored 形式存在于 vendor/github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric/ 目录下包含以下源文件cloudmonitoring.go导出器入口构造函数New()负责默认凭据探测与metricExporter初始化option.go定义Option函数类型与全部可配置项metric.go核心实现完成指标描述符创建、时间序列转换与批量上传constants.go历史遗留的资源标签键与受监控资源类型常量多数已标记 Deprecatederror.go导出器相关错误定义version.go当前版本号0.55.0。在 Go 模块层面该包以间接依赖的形式被仓库引用见 go.modgithub.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect其中internal/resourcemapping被 metric.go 用来完成 OTel Resource 到 Cloud Monitoring MonitoredResource 的自动映射这将在后文详述。Google Cloud Monitoring 本身是一个托管服务它收集来自 Google Cloud、AWS、托管可用性探测、应用埋点以及 Cassandra、Nginx、Apache、Elasticsearch 等常见中间件的指标、事件和元数据并通过仪表盘、图表和告警可对接 Slack、PagerDuty 等把数据转化为可操作的洞察。二、前置准备先创建 Monitoring Workspace对应 README 的 Setup 一节。Google Cloud Monitoring 是 GCP 提供的托管服务使用前必须预先创建 Workspace。Workspace 是 Cloud Monitoring 中的数据组织单元指标、仪表盘与告警策略都归属于某个 Workspace。官方要求在使用该 exporter 前完成 Workspace 的创建创建入口位于 Google Cloud 控制台的 Monitoring 页面Create Workspace 流程。提示本文档仅确认必须预先创建 Workspace这一事实。创建 Workspace 的具体操作步骤属于 GCP 控制台交互流程需以 Google Cloud 官方文档为准本仓库并未包含该流程的实现代码。三、认证机制应用默认凭据ADC的自动探测对应 README 的 Authentication 一节。该 exporter 的认证完全依赖 Go 生态的google.FindDefaultCredentialsgolang.org/x/oauth2/google包。也就是说默认情况下服务账号会自动被探测到无需手工传凭据。README 引用其官方说明ADC 的探测顺序如下读取环境变量GOOGLE_APPLICATION_CREDENTIALS指定的 JSON 文件路径即通常所说的service_account_key.json服务账号密钥文件读取 gcloud 命令行工具已知位置的 JSON 文件Windows%APPDATA%/gcloud/application_default_credentials.json其他系统$HOME/.config/gcloud/application_default_credentials.json源码层面这一探测逻辑体现在 cloudmonitoring.go 的New()中func New(opts ...Option) (sdkmetric.Exporter, error) { o : options{ context: context.Background(), resourceAttributeFilter: DefaultResourceAttributesFilter, } for _, opt : range opts { opt(o) } if o.projectID { creds, err : google.FindDefaultCredentials(o.context, monitoring.DefaultAuthScopes()...) if err ! nil { return nil, fmt.Errorf(failed to find Google Cloud credentials: %v, err) } if creds.ProjectID { return nil, errors.New(google cloud monitoring: no project found with application default credentials) } o.projectID creds.ProjectID } return newMetricExporter(o) }两个值得注意的实现细节只有当用户没有通过WithProjectID显式指定项目时才会触发google.FindDefaultCredentials探测探测成功后项目 ID 会直接取自凭据中的ProjectID字段如果凭据探测失败或凭据中不包含项目 IDNew()会分别返回 failed to find Google Cloud credentials 与 no project found with application default credentials 两类错误而非静默使用空项目。本地运行时需要额外指定项目 IDREADME 特别指出在本地开发环境运行时仅有GOOGLE_APPLICATION_CREDENTIALS往往还不够还需要显式指定 Google Project ID。最佳实践是借助环境变量例如GOOGLE_CLOUD_PROJECT配合metric.WithProjectID方法完成projectID : os.Getenv(GOOGLE_CLOUD_PROJECT) opts : []mexporter.Option{ mexporter.WithProjectID(projectID), }这样构造出的opts后续可传给mexporter.New(opts...)确保导出目标项目与凭据归属项目一致。四、核心配置项全景Option 与默认行为本小节基于 option.go 的完整实现展开。Option是一个函数类型func(*options)所有配置都以函数式选项的方式传入New()。options结构体option.go#L42-L94完整定义如下配置项类型默认行为对应 Option 函数contextcontext.Contextcontext.Background()无仅内部字段见New()初始化projectIDstring从 ADC 凭据自动探测WithProjectID(id)metricDescriptorTypeFormatterfunc(metricdata.Metrics) stringworkload.googleapis.com/[metric name]WithMetricDescriptorTypeFormatter(f)resourceAttributeFilterattribute.Filter仅保留service.name、service.namespace、service.instance.idWithFilteredResourceAttributes(filter)monitoredResourceDescriptionMonitoredResourceDescription关闭走通用 resourcemappingWithMonitoredResourceDescription(mrType, mrLabels)compressionstring不压缩WithCompression(c)monitoringClient*monitoring.MetricClient自动创建WithMonitoringClient(cl)monitoringClientOptions[]apioption.ClientOption空WithMonitoringClientOptions(opts...)destinationProjectQuotabool关闭WithDestinationProjectQuota()disableCreateMetricDescriptorsbool关闭自动创建描述符WithDisableCreateMetricDescriptors()enableSumOfSquaredDeviationbool关闭WithSumOfSquaredDeviation()createServiceTimeSeriesbool关闭WithCreateServiceTimeSeries()逐一说明各配置项的实际影响1.WithProjectID(id)— 指定目标项目设置指标上传的目标 GCP 项目。若不调用此选项项目 ID 会从默认凭据探测流程中自动获取见上一节。在metricExporter内部该值被拼进三类请求的资源名指标描述符查询/创建projects/{projectID}/metricDescriptors/...与projects/{projectID}metric.go#L216-L233时间序列上传projects/{projectID}metric.go#L244直方图 Exemplar 中的 Span 关联projects/{projectID}/traces/{traceID}/spans/{spanID}metric.go#L785-L795。同时该 projectID 会被用于 GCM 受监控资源的project_id标签——当资源本身不属于某个特定项目时例如本地/自建环境下的k8s_container或generic_task这一标签尤为关键。2.WithMetricDescriptorTypeFormatter(f)— 自定义指标类型命名控制 MetricDescriptor 的Type字段格式。默认格式串为workload.googleapis.com/[metric name]定义于 metric.go#L61cloudMonitoringMetricDescriptorNameFormat workload.googleapis.com/%s自定义 formatter 的签名是func(metricdata.Metrics) string实际生效逻辑见 metric.go#L276-L281。注意自定义格式必须遵守 GCM 自定义指标命名约定官方要求形如workload.googleapis.com/xxx、custom.googleapis.com/xxx等域前缀格式否则 GCM API 会拒绝创建。3.WithFilteredResourceAttributes(filter)— 控制资源属性是否下沉为指标标签决定 OTel Resource 的哪些属性会作为额外的 metric label 附加到指标上。默认过滤器是DefaultResourceAttributesFilteroption.go#L157-L161仅保留三个语义化约定属性且要求值非空func DefaultResourceAttributesFilter(kv attribute.KeyValue) bool { return (kv.Key semconv.ServiceNameKey || kv.Key semconv.ServiceNamespaceKey || kv.Key semconv.ServiceInstanceIDKey) len(kv.Value.AsString()) 0 }这样做是为了避免针对同一受监控资源写入重复的时间序列。若想完全关闭资源属性下沉可传入NoAttributes()mexporter.WithFilteredResourceAttributes(mexporter.NoAttributes())4.WithDisableCreateMetricDescriptors()— 关闭自动描述符创建默认情况下导出器在遇到尚未注册的指标时会自动调用 GCM 的CreateMetricDescriptor。调用此选项可关闭该行为——适用于预先手工创建好 MetricDescriptor 的场景例如为控制权限或严格管控指标 schema。5.WithCreateServiceTimeSeries()— 使用服务时间序列接口配置导出器使用CreateServiceTimeSeries而非CreateTimeSeries写入时间序列。该接口适用于服务拥有者写入自身服务的时序数据。注意使用该选项会隐式将disableCreateMetricDescriptors置为 trueoption.go#L192-L199即不再导出指标描述符。6.WithCompression(gzip)— 开启 gRPC 压缩对 gRPC 请求启用 gzip 压缩。在 metric.go#L122-L131 中压缩器会被附加到GetMetricDescriptor、CreateMetricDescriptor、CreateTimeSeries、CreateServiceTimeSeries四个调用的 gRPC CallOptions 上。7.WithMonitoringClient(cl)/WithMonitoringClientOptions(opts...)— 定制底层客户端前者直接注入一个现成的monitoring.MetricClient后者追加apioption.ClientOption如自定义 endpoint、超时、拦截器等供内部创建客户端时使用。两者互斥若同时提供WithMonitoringClient优先生效option.go#L115-L131。未注入客户端时导出器会使用带opentelemetry-go ver; google-cloud-metric-exporter verUser-Agent 的 gRPC 客户端option.go#L30。8.WithDestinationProjectQuota()— 使用目标项目配额启用后每次请求都会携带x-goog-user-project元数据头值为projectID去掉projects/前缀从而使用目标项目的配额而非调用方项目的配额metric.go#L154-L156。典型场景是给指标设置gcp.project.id资源属性将时序写入其他项目。9.WithSumOfSquaredDeviation()— 直方图平方偏差估算为直方图启用 SumOfSquaredDeviation 字段的计算。源码注释明确指出该值是估算值而非真实平方偏差——它假设每个桶内的数据点都落在桶区间的中点见 metric.go#L834-L849 的setSumOfSquaredDeviation因此默认不发送。10.WithMonitoredResourceDescription(mrType, mrLabels)— 指定受监控资源映射配置导出器尝试把 OTel Resource 映射为指定的 GCM MonitoredResource。使用时需满足两个条件OTel Resource 中存在gcp.resource_type属性且其值等于mrTypeResource 属性中包含mrLabels中列出的标签键。命中后这些标签会被组装进 MonitoredResource 的 Labelsmetric.go#L374-L391未配置或未命中时则回落到resourcemapping.ResourceAttributesToMonitoringMonitoredResource的通用映射逻辑metric.go#L393-L404。五、完整接入示例从埋点到导出综合 README 给出的WithProjectID示例与 OTel SDK 标准用法一个最小可用的接入流程如下import ( context os mexporter github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric go.opentelemetry.io/otel/sdk/metric ) func main() { ctx : context.Background() // 1. 构造 exporter本地运行时显式指定项目 ID projectID : os.Getenv(GOOGLE_CLOUD_PROJECT) exporter, err : mexporter.New( mexporter.WithProjectID(projectID), // mexporter.WithCompression(gzip), // 可选开启 gRPC gzip 压缩 // mexporter.WithFilteredResourceAttributes(mexporter.NoAttributes()), // 可选禁止资源属性下沉 // mexporter.WithDisableCreateMetricDescriptors(), // 可选关闭自动创建描述符 ) if err ! nil { panic(err) // 常见于凭据探测失败或项目为空 } // 2. 注册到 OTel metric SDK默认周期导出 provider : metric.NewMeterProvider( metric.WithReader(metric.NewPeriodicReader(exporter)), ) defer func() { _ provider.Shutdown(ctx) }() }在此之后程序中通过 Meter 创建的任何 Counter、UpDownCounter、Histogram、ObservableGauge 等指标都会在 SDK 周期导出时经过该 exporter 上传到 Google Cloud Monitoring。需要说明的版本前提本仓库 vendored 的 exporter 版本为0.55.0见 version.go其面向的 OTel Go SDK 为go.opentelemetry.io/otel/sdk/metric的 metricdata 模型直接使用于 substrate 仓库的 Go 工具链见 go.mod。如需在其他项目中复用请以对应 Go module 版本的 API 为准。六、底层导出流程描述符缓存、批量上传与类型映射本小节深入 metric.go 的核心实现回答导出器内部到底做了什么。6.1 导出入口两阶段处理每次导出周期Export依次执行两个阶段metric.go#L147-L161func (me *metricExporter) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error { // 若已 Shutdown 则直接返回错误 ... if me.o.destinationProjectQuota { ctx metadata.NewOutgoingContext(ctx, metadata.New(map[string]string{x-goog-user-project: strings.TrimPrefix(me.o.projectID, projects/)})) } return errors.Join( me.exportMetricDescriptor(ctx, rm), // 阶段一确保 MetricDescriptor 存在 me.exportTimeSeries(ctx, rm), // 阶段二上传 TimeSeries ) }6.2 阶段一MetricDescriptor 的创建与缓存exportMetricDescriptormetric.go#L175-L214以(指标名, instrumentation scope 名)为键维护一个进程内缓存mdCache。对每个新出现的指标先调用GetMetricDescriptor查询该类型是否已存在于 GCM若已存在则跳过创建GCM 的描述符一旦创建便无法原地修改只能删除重建因此跳过是唯一合理路径若不存在则调用CreateMetricDescriptor创建成功后写入缓存。描述符内容由recordToMdpb组装metric.go#L293-L312包括Type默认workload.googleapis.com/名称、DisplayName去掉域前缀后的路径、MetricKind、ValueType、Unit、Description以及从资源属性与数据点属性收集的Labels。6.3 阶段二TimeSeries 转换与 200 条批量上传exportTimeSeriesmetric.go#L238-L267把聚合数据逐点转换为 GCM 的TimeSeries然后按每批最多 200 条分组发送const sendBatchSize 200 // GCM API 硬性上限绝不超发这个 200 是 Cloud Monitoring API 的硬性限制metric.go#L56-L59因此导出器永远不会在一次请求中超过该值。6.4 OTel 聚合类型 → GCM 指标类型映射recordToMdpbKindTypemetric.go#L409-L430定义了完整映射关系OTel 聚合类型MetricKindValueTypeGauge[int64]GAUGEINT64Gauge[float64]GAUGEDOUBLESum[int64]单调CUMULATIVEINT64Sum[int64]非单调GAUGEINT64Sum[float64]单调CUMULATIVEDOUBLESum[float64]非单调GAUGEDOUBLEHistogram[int64]/Histogram[float64]CUMULATIVEDISTRIBUTION未知类型返回 UNSPECIFIED并由errUnexpectedAggregationKinderror.go报告错误关键设计点非单调 Sum 会被当作 GAUGE 上传metric.go#L494-L497因为 GCM 的 CUMULATIVE 语义要求单调递增直方图则映射为DISTRIBUTION并支持把 Exemplar 中的 span 上下文编码为projects/{projectID}/traces/{traceID}/spans/{spanID}形式的附件实现指标与链路关联。6.5 时间间隔与标签规范化时间间隔toNonemptyTimeIntervalpbmetric.go#L684-L705保证所有非 GAUGE 类型的时间间隔结束时间至少比开始时间晚 1 毫秒——若采样间隔过短会自动把结束时间推进 1ms满足 GCM API 约束标签规范化normalizeLabelKeymetric.go#L880-L889将标签键中所有非字母数字字符替换为下划线且当键以数字开头时自动加key_前缀以符合 GCM 仅允许字母、数字、下划线且以字母或数字开头的标签命名约束UTF-8 清洗所有标签值经sanitizeUTF8处理无效字节替换为替换符。6.6 生命周期管理metricExporter提供ForceFlush无状态直接返回 ctx 错误与Shutdownsync.Once保证只关闭一次并关闭底层 gRPC 客户端连接见 metric.go#L90-L101。接入 SDK 后MeterProvider.Shutdown会顺带触发 exporter 的关闭。七、版本与集成现状小结当前 vendored 版本v0.55.0其Version()返回值与 go.mod 中的间接依赖版本完全一致可作为仓库中实际使用的 exporter 版本的可验证事实该包为间接依赖说明 substrate 仓库并未直接在业务代码中 import 此 exporter而是经由其他依赖如 OTel 相关工具链带入真正面向 GCP 观测的集成入口以仓库内 docs/observability.md 及 internal/otlprelay 等模块为准相关资源标签常量的历史定义k8s_container、gce_instance、aws_ec2_instance、generic_task等仍保留在 constants.go 中但均已标记 Deprecated新代码应优先使用 OpenTelemetry Semantic Conventionssemconv中的对应键。八、快速参考接入清单要在自己的 Go 服务中通过该 exporter 向 Google Cloud Monitoring 上报指标按以下清单核对即可创建 Workspace在 Google Cloud 控制台 Monitoring 中预先创建 Workspace准备凭据本地开发设置GOOGLE_APPLICATION_CREDENTIALS指向服务账号 JSON生产环境使用默认服务账号或 Workload Identity指定项目设置GOOGLE_CLOUD_PROJECT环境变量并调用mexporter.WithProjectID(projectID)本地运行时必需选择可选配置按需启用 gzip 压缩、关闭自动描述符创建、自定义指标类型前缀、指定受监控资源映射等注册 SDK将 exporter 挂入metric.NewPeriodicReader构造MeterProvider验证在 GCM 控制台的 Metrics Explorer 中检索workload.googleapis.com/前缀下对应指标名确认数据已落库。赞分享人工智能AI AgentAgent 沙箱云原生容器运行时零信任【免费下载链接】substrateAgent Substrate: the core system项目地址https://gitcode.com/GitHub_Trending/substrate7/substrate点击查看免费下载相关推荐kOps 仓库中的 OpenTelemetry Google Cloud Monitoring Exporter将 Go 指标接入 Cloud Monitoring 的完整指南kOps 仓库中的 OpenTelemetry Google Cloud Monitoring Exporter将 Go 指标接入 Cloud Monitor云原生集群管理运维IaC思源笔记插件开发入门指南从搭好环境到发布第一个插件的完整路径思源笔记插件开发入门指南从搭好环境到发布第一个插件的完整路径 思源笔记SiYuan是一个开源、隐私优先、可自托管的知识工作空间你可以通过插件系统pet知识管理知识库使用 Telegraf Yandex Cloud Monitoring 输出插件将自定义指标写入 Yandex Cloud Monitoring使用 Telegraf Yandex Cloud Monitoring 输出插件将自定义指标写入 Yandex Cloud Monitoring 本文以 plu可观测性指标监控运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
