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。理解这一环节的关键在于整条写入链路:
- ingester 组件负责接收并处理剖析数据。数据先以"head block"的形式组织在内存中,当 head block 大小超过阈值、或超过
-pyroscopedb.max-block-duration(默认 1 小时)时,ingester 会将 block 写入本地持久化磁盘(详见 configure-disk-storage.md)。 - 每个 block 由 ULID 唯一标识,存放在数据路径
-pyroscopedb.data-path=(默认./data)下,按租户组织为./<tenant-id>/head/<block-id>(正在写入的数据)与./<tenant-id>/local/<block-id>(已完成的 block)。 - 当对象存储配置完成后,已完成(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字段决定使用哪个对象存储后端,可选值为s3、gcs、azure、swift、filesystem、cos,默认是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_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION等)提供凭据。
最小必需配置:bucket_name、endpoint、access_key_id、secret_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_FILE、AWS_ROLE_ARN、AWS_DEFAULT_REGION等环境变量。
S3 高级参数
除最小配置外,参考配置还提供了以下常用高级参数(每个参数都对应一个-storage.s3.*命令行 flag):
| 参数 | 默认值 | 说明 |
|---|---|---|
region | "" | 区域;留空时客户端会自动调用 S3 GetBucketLocation API 自动探测 |
signature_version | v4 | 签名版本,可选v4、v2 |
bucket_lookup_type | auto | bucket 查找方式:path-style、virtual-hosted-style、auto |
force_path_style | false | 已废弃,请改用bucket_lookup_type |
sse.type | "" | 服务端加密,可选SSE-KMS、SSE-S3 |
sse.kms_key_id | "" | KMS 加密使用的 Key ID |
sse.kms_encryption_context | "" | KMS 加密上下文,需为 JSON 格式字符串 |
http.idle_conn_timeout | 10m | 空闲连接保持时间 |
http.response_header_timeout | 2m | 等待响应头的超时时间 |
http.insecure_skip_verify | false | 跳过 HTTPS 证书与主机名校验 |
http.tls_handshake_timeout | 10s | TLS 握手超时,0 表示无限制 |
http.max_idle_connections_per_host | 1000 | 每主机最大空闲连接数,0 时用内置默认值 |
这些参数在 s3/config.go 中定义,其中signature_version、bucket_lookup_type、SSE 类型等均有严格校验:非法值会在配置校验阶段直接报错(s3/config.go)。例如force_path_style: true与bucket_lookup_type: virtual-hosted-style同时设置会返回冲突错误;SSE 类型仅支持SSE-KMS与SSE-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 会将Bucket、ServiceAccount与 HTTP 配置序列化后传给gcs.NewBucket。GCS 同样支持http.insecure_skip_verify、TLS 超时等 HTTP 调优参数,用于自定义传输层行为。
Azure Blob Storage
Azure 后端的配置参数见 azure_storage_backend。关键字段包括:
| 参数 | 说明 |
|---|---|
account_name | Azure 存储账号名 |
account_key | 存储账号密钥;留空则改用 Azure 托管身份(managed identity)认证 |
connection_string | 连接字符串;设置后endpoint_suffix将不再生效。比account_key更适合通过 SAS token 认证或使用 Azurite 模拟器 |
container_name | Azure 存储容器名 |
endpoint_suffix | 不含 schema 的 endpoint 后缀,账号名会拼接到其前面组成 FQDN;留空使用默认后缀 |
az_tenant_id/client_id/client_secret | Azure 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_SECRETSwift(OpenStack Object Storage)
Swift 后端的配置参数见 swift_storage_backend。核心字段如下:
| 参数 | 说明 |
|---|---|
auth_version | OpenStack 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.backendstorage.s3.bucket_name↔-storage.s3.bucket-namestorage.gcs.service_account↔-storage.gcs.service-accountstorage.azure.user_assigned_id↔-storage.azure.user-assigned-idstorage.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):
- 剖析数据到达 ingester,先驻留在内存 head block;
- head block 超过阈值或超过
-pyroscopedb.max-block-duration(默认 1 小时)后被刷写到本地磁盘./data/<tenant-id>/local/<block-id>; - 配置对象存储后,完成的 block 被上传到对象存储 bucket;
- 当本地磁盘即将写满时(可用空间低于
-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);s3与cos后端还会进一步执行各自的子配置校验。 - 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),仅供参考