3. 可观测性数据采集策略设计

在 AWS 数据平台上,可观测性数据采集不是“把所有能开的日志都打开”,而是围绕数据平台的五层结构——存储、计算、编排、消息、查询——分别回答三个问题:这一层会产生什么信号?这些信号用什么工具采集最合适?采集后如何与其它层关联?只有把采集策略按层设计,才能避免日志泛滥、指标缺失、链路断裂三类常见问题。

按层拆解:每层该采什么、用什么采

存储层以 Amazon S3 为核心,关键信号是访问模式、请求延迟、错误码和存储量。S3 本身不产生细粒度请求日志,需要开启 S3 Server Access Logging 或 CloudTrail 数据事件,前者记录每个请求的桶、操作、来源 IP、HTTP 状态码,后者记录对象级读写。指标侧依赖 CloudWatch 的 BucketSizeBytes、NumberOfObjects、5xxErrors、FirstByteLatency。采集原则是:访问日志走 S3 目标桶 + Athena 查询,指标走 CloudWatch Metrics,二者通过请求 ID 和桶名关联。

计算层包括 AWS Glue、Amazon EMR、Lambda 和 Athena 引擎。Glue 作业的 glue.driver.aggregate.numFailedTasks、glue.driver.aggregate.elapsedTime 通过 CloudWatch Metrics 采集;EMR 的 YARN 队列、Container 状态通过 EMR Metrics 和 Prometheus Exporter 采集;Lambda 的冷启动、并发、错误率走 CloudWatch Logs 和 Lambda Insights。计算层最需要的是“作业级”指标,而不是单机指标,因此采集时要按 jobName、runId 打标签。

编排层以 AWS Step Functions 和 Amazon MWAA 为主。Step Functions 的执行历史本身就是结构化事件,可通过 CloudWatch Logs 的 ExecutionFailed、ExecutionSucceeded 事件采集,也可用 X-Ray 追踪状态机内各任务的耗时。MWAA 的 Airflow 任务日志默认写入 CloudWatch Logs,DAG 运行状态通过 airflow.task.duration 等指标暴露。编排层的采集重点是“任务依赖关系”和“重试次数”,这决定了故障定位能否快速收敛。

消息层包括 Amazon Kinesis、MSK、SQS 和 SNS。Kinesis 的 IncomingRecords、IteratorAge、ReadProvisionedThroughputExceeded 是判断消费滞后的核心指标;MSK 需要开启 Prometheus JMX Exporter 采集 Broker 的 UnderReplicatedPartitions、RequestHandlerAvgIdlePercent;SQS 的 ApproximateNumberOfMessagesVisible 和 ApproximateAgeOfOldestMessage 直接反映积压。消息层采集原则是:指标优先,日志按需,因为消息量极大,全量日志成本不可控。

查询层以 Amazon Athena、Redshift、OpenSearch 为主。Athena 的 ProcessedBytes、QueryQueueTime、TotalExecutionTime 通过 CloudWatch Metrics 采集;Redshift 的 QueryDuration、WLMQueueLength、DiskSpaceUsed 走 Redshift 系统表和 CloudWatch;OpenSearch 的慢查询日志、JVM 堆使用率通过 OpenSearch 插件和 CloudWatch 采集。查询层要特别关注“扫描量”和“排队时间”,因为它们直接对应成本和用户体验。

AWS 数据平台五层采集策略与工具映射 每层:信号类型 → 采集工具 → 关联键 存储层 Amazon S3 信号 访问日志 / 5xx / 延迟 BucketSize / 对象数 工具 S3 Access Logging CloudTrail / CloudWatch 关联键 请求ID · 桶名 计算层 Glue · EMR · Lambda 信号 失败任务 / 耗时 / 冷启动 并发 / 错误率 工具 CloudWatch Metrics Prometheus / Lambda Insights 关联键 jobName · runId 编排层 Step Functions · MWAA 信号 执行状态 / 任务耗时 重试次数 / 依赖关系 工具 CloudWatch Logs AWS X-Ray 关联键 executionId · DAG run 消息层 Kinesis · MSK · SQS 信号 IteratorAge / 积压量 吞吐 / 分区副本 工具 CloudWatch Metrics Prometheus JMX Exporter 关联键 streamName · queueUrl 查询层 Athena · Redshift 信号 扫描量 / 排队时间 执行时长 / 慢查询 工具 CloudWatch Metrics 系统表 / 慢日志 关联键 queryId · 工作负载 统一采集管道与工具集成原则 Fluent Bit 日志采集 · 过滤 · 路由 OpenTelemetry Trace · Metric · Log 统一 Prometheus 拉取指标 · 告警规则 AWS X-Ray 跨服务链路追踪 CloudWatch Metrics · Logs · Alarms 采集原则:指标优先、日志按需、链路关联;所有信号统一打上 layer / service / env 标签 存储层与查询层侧重成本与延迟,计算层与编排层侧重作业级状态,消息层侧重积压与吞吐

工具选型与集成原则

工具选型不是“哪个流行用哪个”,而是按信号类型和采集成本决定。以下四条原则可以直接用于方案评审。

  • 指标优先用 CloudWatch Metrics,自定义指标用 Prometheus。 AWS 托管服务默认把指标推送到 CloudWatch,直接读取即可;EMR、MSK 等需要 JMX 暴露的指标,用 Prometheus Exporter 拉取后写入 Amazon Managed Prometheus,再用 Grafana 统一展示。
  • 日志采集统一走 Fluent Bit,不要在每个服务里各写一套。 Fluent Bit 以 DaemonSet 或 Sidecar 方式部署,输入源包括文件、系统日志、容器日志,经过 grep、record_modifier 过滤后输出到 CloudWatch Logs 或 S3。这样日志格式、标签、采样率可以集中控制。
  • 链路追踪用 OpenTelemetry 做统一埋点,X-Ray 做 AWS 原生集成。 自研服务用 OTel SDK 生成 Trace,通过 OTel Collector 导出到 X-Ray 或 Jaeger;Lambda、API Gateway、Step Functions 等托管服务直接开启 X-Ray 主动追踪。两者通过 trace_id 关联。
  • 所有采集信号必须带统一标签。 至少包含 layer(storage/compute/orchestration/messaging/query)、service、env、jobName 或 streamName。没有标签的指标和日志在排障时无法快速过滤,等于没有采集。

一个可落地的采集配置示例

以 Glue 作业为例,下面是一段 Fluent Bit 配置片段,用于把 Glue 作业日志按标签路由到不同 CloudWatch Log Group,并附加作业名和运行 ID。示例参数为教学假设,实际使用时需替换为真实值。

[INPUT]
    Name              tail
    Path              /aws/glue/jobs/*/output.log
    Tag               glue.job
    DB                /var/lib/fluent-bit/glue.db

[FILTER]
    Name              record_modifier
    Match             glue.job
    Record            layer compute
    Record            service glue
    Record            env prod

[FILTER]
    Name              grep
    Match             glue.job
    Regex             log (ERROR|WARN|Exception)

[OUTPUT]
    Name              cloudwatch_logs
    Match             glue.job
    region            us-east-1
    log_group_name    /aws/glue/jobs/errors
    log_stream_prefix glue-
    auto_create_group true

这段配置做了三件事:给每条日志打上 layer=compute、service=glue、env=prod 标签;只保留包含 ERROR、WARN 或 Exception 的日志行,降低存储成本;把过滤后的日志写入 /aws/glue/jobs/errors 日志组。运行后可以在 CloudWatch Logs Insights 中用 fields @timestamp, jobName, runId | filter layer = "compute" | sort @timestamp desc 快速定位最近失败作业。

采集策略设计完成后,建议用一张“层—信号—工具—标签—保留周期”的对照表做评审。保留周期按信号价值区分:错误日志 30 天,访问日志 90 天,指标 15 个月(CloudWatch 默认),Trace 采样后保留 7 天。这样既满足排障需求,又不会让可观测性成本失控。

采集策略的验证与迭代

采集方案上线后,需要验证三件事:第一,关键指标是否齐全,例如 Glue 作业失败时能否在 1 分钟内看到 numFailedTasks 上升;第二,日志能否按 jobName 和 runId 过滤到具体一次运行;第三,Trace 能否从 Step Functions 一路串到 Glue 和 S3。验证方法是用一次故意失败的作业触发告警,检查告警内容是否包含层、服务、作业名和运行 ID。如果缺少任何一项,就回到采集配置中补标签或补字段。采集策略不是一次性的,随着数据平台新增服务,标签体系和工具集成方式需要同步更新。