news 2026/9/15 16:57:28

Grafana Pyroscope 对象存储后端配置完全指南:S3 / GCS / Azure / Swift 接入实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Grafana Pyroscope 对象存储后端配置完全指南:S3 / GCS / Azure / Swift 接入实战

Grafana Pyroscope 对象存储后端配置完全指南:S3 / GCS / Azure / Swift 接入实战

【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope

本指南以 Grafana Pyroscope(Continuous Profiling Platform)官方文档《Configure object storage backend》为骨架,完整讲解对象存储在 Pyroscope 存储体系中的角色、四种受支持后端(Amazon S3、Google Cloud Storage、Azure Blob Storage、OpenStack Swift)的配置方式与认证方案,并结合仓库中的参考配置参数、示例配置和 objstore 客户端源码,深入说明每个参数的实际作用、默认值与底层实现,帮助你为生产环境正确选择并配置对象存储。

对象存储与 Pyroscope 存储体系

Pyroscope 使用对象存储来持久化保存包含性能剖析数据(profiles data)的 block。理解这一环节的关键在于整条写入链路:

  1. ingester 组件负责接收并处理剖析数据。数据先以"head block"的形式组织在内存中,当 head block 大小超过阈值、或超过-pyroscopedb.max-block-duration(默认 1 小时)时,ingester 会将 block 写入本地持久化磁盘(详见 configure-disk-storage.md)。
  2. 每个 block 由 ULID 唯一标识,存放在数据路径-pyroscopedb.data-path=(默认./data)下,按租户组织为./<tenant-id>/head/<block-id>(正在写入的数据)与./<tenant-id>/local/<block-id>(已完成的 block)。
  3. 当对象存储配置完成后,已完成(finished)的 block 会被上传到对象存储 bucket 中,实现长期、跨实例共享的持久化存储。

内部实现上,Pyroscope 使用 Thanos 的 object store client 库,因此 Thanos 官方声明的各存储后端限制同样适用。

Pyroscope 支持的后端包括:

  • Amazon S3,以及 MinIO 等 S3 兼容实现
  • Google Cloud Storage(GCS)
  • Azure Blob Storage
  • Swift(OpenStack Object Storage)

此外,从仓库源码看,pkg/objstore/client/config.go中定义的SupportedBackends还包含filesystem与腾讯云cos(config.go),其中filesystem是默认后端,可用作本地对象存储目录进行开发调试。

配置总览:storage 配置块

所有对象存储后端都在配置文件的storage块下配置。仓库自带的完整示例配置位于 cmd/pyroscope/pyroscope.yaml,其结构如下:

storage: # Backend storage to use. Supported backends are: s3, gcs, azure, swift, # filesystem, cos. # backend: "filesystem" s3: { ... } gcs: { ... } azure: { ... } swift: { ... } cos: { ... } filesystem: # Local filesystem storage directory. # dir: "./data/v2/shared" # Prefix for all objects stored in the backend storage. For simplicity, it may # only contain digits and English alphabet characters, hyphens, underscores, # dots and forward slashes. # prefix: ""

选择后端:storage.backend

backend字段决定使用哪个对象存储后端,可选值为s3gcsazureswiftfilesystemcos,默认是filesystem。从源码看,每个后端都对应一个独立的 provider 包,由工厂函数 NewBucket 根据cfg.Backend的分支创建对应的 bucket 客户端。所有后端创建的客户端都会被统一包装上 Prometheus 指标采集与 OpenTelemetry 追踪(WrapWithMetrics/WrapWithTraces),这也是对象存储的访问延迟、请求量等指标数据的来源。

全局前缀:storage.prefix

storage.prefix为所有写入对象存储的对象加上统一前缀,适合多环境(如 dev/staging/prod)共用同一 bucket 的场景。其合法性校验在 config.go 中实现:前缀只能包含数字、英文字母、连字符、下划线、点与正斜杠,不能以/开头,也不能包含...路径段;旧字段storage_prefix已废弃,若同时设置两者会返回错误ErrStoragePrefixBothFlagsSet

Amazon S3 与 S3 兼容存储

Pyroscope 可以使用 AWS S3 或任意 S3 兼容的 bucket 作为长期存储。配置参数可参考 reference-configuration-parameters 中的 s3_storage_backend。除这些参数外,还可以通过 AWS SDK 的标准环境变量(如AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION等)提供凭据。

最小必需配置bucket_nameendpointaccess_key_idsecret_access_key四个键。

使用 AWS Bucket 的示例

以下配置使用 AWS 区域eu-west-2的 bucket:

storage: backend: s3 s3: bucket_name: #REPLACE_WITH_BUCKET_NAME region: eu-west-2 endpoint: s3.eu-west-2.amazonaws.com access_key_id: #REPLACE_WITH_ACCESS_KEY secret_access_key: #REPLACE_WITH_SECRET_KEY

使用 S3 兼容 Bucket(MinIO)的示例

以下配置连接本机运行的 MinIO 实例(开发/测试环境):

storage: backend: s3 s3: bucket_name: grafana-pyroscope-data endpoint: localhost:9000 insecure: true access_key_id: grafana-pyroscope-data secret_access_key: grafana-pyroscope-data

注意insecure: true:源码注释指出它会强制使用http://而非https://访问 endpoint,这对本地 MinIO 这类无 TLS 的环境是必需的(s3/config.go)。

使用 AWS SDK 原生认证

native_aws_auth_enabled: true即可启用 AWS SDK 的默认凭据链,适用于使用 IAM 角色、环境变量凭据等场景,无需在配置中写死密钥:

storage: backend: s3 s3: bucket_name: your-bucket region: eu-west-2 endpoint: s3.eu-west-2.amazonaws.com native_aws_auth_enabled: true

该参数在 s3/config.go 注册为-storage.s3.native-aws-auth-enabled,标记为 experimental;在 bucket_client.go 中它会直接映射为 Thanos S3 客户端的AWSSDKAuth选项。对应的测试 config_test.go 也验证了该模式下会读取AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARNAWS_DEFAULT_REGION等环境变量。

S3 高级参数

除最小配置外,参考配置还提供了以下常用高级参数(每个参数都对应一个-storage.s3.*命令行 flag):

参数默认值说明
region""区域;留空时客户端会自动调用 S3 GetBucketLocation API 自动探测
signature_versionv4签名版本,可选v4v2
bucket_lookup_typeautobucket 查找方式:path-stylevirtual-hosted-styleauto
force_path_stylefalse已废弃,请改用bucket_lookup_type
sse.type""服务端加密,可选SSE-KMSSSE-S3
sse.kms_key_id""KMS 加密使用的 Key ID
sse.kms_encryption_context""KMS 加密上下文,需为 JSON 格式字符串
http.idle_conn_timeout10m空闲连接保持时间
http.response_header_timeout2m等待响应头的超时时间
http.insecure_skip_verifyfalse跳过 HTTPS 证书与主机名校验
http.tls_handshake_timeout10sTLS 握手超时,0 表示无限制
http.max_idle_connections_per_host1000每主机最大空闲连接数,0 时用内置默认值

这些参数在 s3/config.go 中定义,其中signature_versionbucket_lookup_type、SSE 类型等均有严格校验:非法值会在配置校验阶段直接报错(s3/config.go)。例如force_path_style: truebucket_lookup_type: virtual-hosted-style同时设置会返回冲突错误;SSE 类型仅支持SSE-KMSSSE-S3。设置force_path_style时还会输出一条建议改用bucket_lookup_type的废弃警告日志(bucket_client.go)。

Google Cloud Storage(GCS)

GCS bucket 的配置参数见 gcs_storage_backend。最小配置需要提供bucket_name以及服务账号(service account),服务账号有两种提供方式:

  • 通过GOOGLE_APPLICATION_CREDENTIALS环境变量指定应用凭据文件路径;
  • 将服务账号密钥的 JSON 内容直接填入service_account参数。

使用 service_account 参数配置 GCS

storage: backend: gcs gcs: bucket_name: grafana-pyroscope-data service_account: | { "type": "service_account", "project_id": "PROJECT_ID", "private_key_id": "KEY_ID", "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n", "client_email": "SERVICE_ACCOUNT_EMAIL", "client_id": "CLIENT_ID", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL" }

注意:service_account必须是合法的 JSON 内容本身,而不是文件路径。若留空,则按 Google 默认逻辑依次回退:GOOGLE_APPLICATION_CREDENTIALS环境变量指定的 JSON 文件(Workload Identity Federation 场景同样适用)→gcloud~/.config/gcloud/application_default_credentials.json→ 在 Google Compute Engine 上从 metadata server 获取凭据(见 cmd/pyroscope/pyroscope.yaml)。

从源码看,GCS 客户端在 gcs/bucket_client.go 中创建:由于 Thanos 客户端要求 YAML 配置,Pyroscope 会将BucketServiceAccount与 HTTP 配置序列化后传给gcs.NewBucket。GCS 同样支持http.insecure_skip_verify、TLS 超时等 HTTP 调优参数,用于自定义传输层行为。

Azure Blob Storage

Azure 后端的配置参数见 azure_storage_backend。关键字段包括:

参数说明
account_nameAzure 存储账号名
account_key存储账号密钥;留空则改用 Azure 托管身份(managed identity)认证
connection_string连接字符串;设置后endpoint_suffix将不再生效。比account_key更适合通过 SAS token 认证或使用 Azurite 模拟器
container_nameAzure 存储容器名
endpoint_suffix不含 schema 的 endpoint 后缀,账号名会拼接到其前面组成 FQDN;留空使用默认后缀
az_tenant_id/client_id/client_secretAzure AD 租户 ID、客户端 ID 与客户端密钥,三者同时设置时使用 client secret 凭据认证
user_assigned_id用户分配的托管身份;留空则使用系统分配的托管身份
max_retries可恢复错误的重试次数,默认 3

文档明确指出:如果使用user_assigned_id,认证将通过用户分配的托管身份完成。在实现上,azure/bucket_client.go 会先以azure.DefaultConfig为基础填充全部默认值,再覆盖用户显式设置的字段,其中就包括UserAssignedID = cfg.UserAssignedID;若用户未指定 endpoint,则保留 Azure SDK 的默认 endpoint。

典型的 Azure 配置骨架如下(凭据按部署环境选用其中一种认证方式):

storage: backend: azure azure: account_name: YOUR_STORAGE_ACCOUNT account_key: YOUR_ACCOUNT_KEY # 或使用 managed identity / client secret container_name: pyroscope-data # 使用用户分配的托管身份时: # user_assigned_id: YOUR_USER_ASSIGNED_IDENTITY_ID # 使用 client secret 凭据时: # az_tenant_id: YOUR_TENANT_ID # client_id: YOUR_CLIENT_ID # client_secret: YOUR_CLIENT_SECRET

Swift(OpenStack Object Storage)

Swift 后端的配置参数见 swift_storage_backend。核心字段如下:

参数说明
auth_versionOpenStack Swift 认证 API 版本,0表示自动探测
auth_url认证 URL
username/password用户名与 API 密钥
user_id/user_domain_name/user_domain_id用户 ID 与用户所属 domain
domain_id/domain_name用户 domain 的 ID 与名称
project_id/project_name项目 ID 与名称(仅 v2、v3 认证)
project_domain_id/project_domain_name项目 domain(仅 v3 认证,且与用户 domain 不同时才需要)
region_name区域(仅 v2、v3 认证)
container_name存放数据的 Swift 容器名
max_retries请求错误最大重试次数,默认 3
connect_timeout连接尝试中止时间,默认 10s
request_timeout空闲请求中止时间,默认 5s

重要提示:如果使用 user、project 或 tenant 的名称进行认证,则必须同时通过 ID 或名称指定其所属 domain。OpenStack 各种认证方式的示例可参考官方 Identity API v3 文档。

从实现看,swift/bucket_client.go 将上述字段映射为 Thanos Swift 配置并序列化为 YAML 后调用swift.NewContainer创建客户端;其中ChunkSize沿用 Thanos 默认值,UseDynamicLargeObjects被硬编码为false

配置文件与 CLI 参数对照

配置文件中storage块下的每个 YAML 参数都对应一个命令行 flag(前缀-storage.),二者可以互换使用。例如:

  • storage.backend-storage.backend
  • storage.s3.bucket_name-storage.s3.bucket-name
  • storage.gcs.service_account-storage.gcs.service-account
  • storage.azure.user_assigned_id-storage.azure.user-assigned-id
  • storage.swift.auth_url-storage.swift.auth-url

flag 注册集中在各 provider 包的RegisterFlagsWithPrefix方法中(如 s3/config.go、azure/config.go),统一由 client/config.go 的RegisterFlagsWithPrefixAndDefaultDirectory汇总,前缀默认即为storage.

从磁盘存储到对象存储:完整写入链路验证

为了让对象存储配置生效并形成完整闭环,可以结合磁盘存储文档理解整条链路(configure-disk-storage.md):

  1. 剖析数据到达 ingester,先驻留在内存 head block;
  2. head block 超过阈值或超过-pyroscopedb.max-block-duration(默认 1 小时)后被刷写到本地磁盘./data/<tenant-id>/local/<block-id>
  3. 配置对象存储后,完成的 block 被上传到对象存储 bucket;
  4. 当本地磁盘即将写满时(可用空间低于-pyroscopedb.retention-policy-min-disk-available-percentage=0.05且剩余空间小于-pyroscopedb.retention-policy-min-free-disk-gb=10),Pyroscope 会按-pyroscopedb.retention-policy-enforcement-interval周期删除最旧的本地 block,并在日志中记录,例如:
level=warn caller=pyroscopedb.go:231 ts=2022-10-05T13:19:09.770693308Z msg="disk utilization is high, deleted oldest block" path=data/anonymous/local/01GDZYHKKKY2ANY6PCJJZGT1N8

这一机制保证了本地磁盘只作为临时缓冲,对象存储才是长期、可靠的剖析数据持久层。

配置验证与排障建议

  • 后端值校验storage.backend必须是SupportedBackends中的合法值,否则Validate()会返回ErrUnsupportedStorageBackend(config.go);s3cos后端还会进一步执行各自的子配置校验。
  • S3 区域探测region留空时客户端会发起 GetBucketLocation 请求自动探测,公网可达且 IAM 权限足够的 bucket 可以省略该参数。
  • 本地开发首选:开发环境建议直接使用默认的filesystem后端(目录默认./data/v2/shared),或用insecure: true的 MinIO 快速验证 S3 兼容路径,避免暴露真实云凭据。
  • 指标与追踪:所有后端客户端都被统一包装了 Prometheus 指标与 OpenTelemetry 追踪(factory.go),生产环境可通过这些指标观测对象存储的请求量、错误率与延迟,辅助判断配置是否正确。

相关文档与源码索引

  • 配置对象存储官方指南:configure-object-storage-backend.md
  • 配置磁盘存储与写入链路:configure-disk-storage.md
  • 完整参考配置参数(含全部后端块):reference-configuration-parameters/index.md
  • 开箱即用的注释示例配置:cmd/pyroscope/pyroscope.yaml
  • 后端分发与桶创建工厂:pkg/objstore/client/factory.go
  • 后端配置定义与校验:pkg/objstore/client/config.go
  • S3 提供方实现:pkg/objstore/providers/s3
  • GCS 提供方实现:pkg/objstore/providers/gcs
  • Azure 提供方实现:pkg/objstore/providers/azure
  • Swift 提供方实现:pkg/objstore/providers/swift

【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

微信小程序睡眠检测实战:从加速度计到状态机的完整拆解

简介&#xff1a;压缩包内是一款面向普通用户与轻度失眠人群的睡眠检测微信小程序&#xff0c;基于微信小程序原生框架开发&#xff0c;通过睡眠时长、深度、翻身次数等数据完成智能分析与可视化展示。资源共110个文件&#xff0c;主要包括53个png图标与界面素材、14个js逻辑脚…

作者头像 李华
网站建设 2026/9/15 16:57:15

DL/T 645与DL/T 698.45对比:电力抄表协议选型与现场排障指南

先说句大实话&#xff1a;做电力抄表好些年的人&#xff0c;听到 DL/T 645 就像看到老邻居&#xff0c;听到 DL/T 698.45 则是一副“听说过但没深交”的表情。这两套协议说到底都是电表和数据采集系统之间的“对话规则”&#xff0c;但一个是串口时代的“账本式”抄表&#xff…

作者头像 李华