4. 医疗SaaS平台可观测性体系构建

医疗SaaS平台的可观测性不是“装几个监控面板”,而是围绕患者服务链路建立一套可回答问题的证据体系:当前是否可用、慢在哪一段、影响哪些租户与业务、是否触及合规与数据安全边界、以及是否已经违反对医院客户承诺的服务水平。医疗场景的特殊性在于:挂号、缴费、报告查询、影像调阅、处方流转等链路往往跨多个服务与外部接口,且对时延、可用性和数据完整性要求高;一旦出现故障,既要快速恢复,也要能追溯“谁在什么时间访问了什么数据”。因此,可观测性体系需要把指标、日志、链路追踪、告警、健康检查与SLO/SLI设计串成一条闭环。

一、四类信号的定位与医疗场景下的采集重点

指标(Metrics)适合回答“整体趋势与阈值”:如接口QPS、P95/P99时延、错误率、数据库连接池使用率、消息积压量、缓存命中率。医疗SaaS中建议按“租户+业务域+接口”三个维度打标签,例如tenant_id、domain=registration|payment|report|imaging、endpoint,否则只能看到平台整体,无法判断是某一家医院还是全部医院受影响。

日志(Logs)适合回答“具体发生了什么”:应用异常栈、外部接口返回码、审计事件、数据变更记录。医疗场景必须区分运行日志与审计日志:运行日志用于排障,审计日志用于合规追溯,二者保留周期、访问权限和脱敏策略不同。运行日志中的患者姓名、身份证号、手机号必须脱敏,例如只保留patient_id哈希值与masked_phone。

链路追踪(Traces)适合回答“慢在哪一跳”:一次挂号请求经过网关、鉴权、挂号服务、排班服务、支付网关、短信服务,TraceID贯穿全链路。医疗SaaS中外部接口(医保、支付、短信、LIS/PACS)往往是时延大头,需要在Span中标记peer.service与external=true,便于区分内部耗时与外部依赖耗时。

健康检查(Health Check)适合回答“实例能不能接流量”:分为存活探针(liveness)与就绪探针(readiness)。医疗SaaS的就绪检查不能只返回进程存活,还应检查数据库连接、Redis、关键外部依赖的轻量探测;但外部依赖探测要设置短超时与降级策略,避免依赖抖动导致全部实例被摘除。

医疗SaaS可观测性闭环:从信号采集到SLO判定 患者服务链路 挂号 / 预约 缴费 / 退费 报告查询 影像调阅 处方流转 医保结算 外部依赖接口 可观测性信号层 指标 Metrics QPS / P95 / 错误率 连接池 / 积压 / 命中率 日志 Logs 运行日志(脱敏) 审计日志(合规留存) 链路追踪 Traces TraceID 贯穿全链路 标记外部依赖 Span 健康检查 Health liveness / readiness 依赖探测 + 降级 告警 Alerting 分级:P1 业务中断 / P2 性能劣化 / P3 容量预警 抑制、静默、值班路由、租户维度聚合 SLO / SLI 判定 SLI:可用性、时延、成功率、数据新鲜度 SLO:99.9% / P95≤800ms / 错误预算 运维与合规动作 故障定位与止损 按租户/接口下钻 容量与成本优化 资源画像 / 弹性策略 审计追溯 谁在何时访问何数据 SLO 复盘与改进 错误预算消耗分析 告警治理 降噪 / 分级 / 闭环 健康检查与发布门禁 反馈:告警与SLO复盘驱动采集项、阈值与链路埋点持续调整

二、SLI/SLO设计:把“医院能感知的质量”翻译成可计算指标

SLI是测量值,SLO是目标值。医疗SaaS建议从四个维度定义SLI:可用性(成功请求数/总请求数)、时延(P95或P99响应时间)、成功率(业务成功而非仅HTTP 200,例如挂号是否真正占号成功)、数据新鲜度(报告、影像、检验结果从产生到可查询的延迟)。

以“报告查询”为例,可定义SLI为:report_query_success_ratio = 成功返回报告数 / 报告查询请求数,SLO设为月度99.9%;时延SLI为P95(report_query_duration_seconds),SLO设为P95≤800ms。错误预算=1-99.9%=0.1%,即每月约43分钟不可用。当错误预算消耗超过50%时触发预警,超过80%时冻结非必要发布。

医疗场景还要增加“租户维度SLO”:平台整体99.9%不代表每家医院都达标。建议按tenant_id计算SLI,对重点三甲医院单独设置SLO,避免被长尾租户平均掉。

三、告警设计:从“有告警”到“告警可行动”

告警必须可行动、可分级、可抑制。建议分三级:P1为业务中断(如挂号成功率低于95%持续5分钟、支付回调积压超过1000条),立即电话通知;P2为性能劣化(P95超过1.5倍SLO持续10分钟),企业微信/钉钉通知;P3为容量预警(磁盘使用率>80%、连接池>85%),工单跟进。

医疗SaaS告警要避免“一个租户抖动,全平台告警”。做法是按租户聚合,设置for持续时间,并配置抑制规则:当P1已触发时,抑制同链路的P2/P3。告警内容应包含:影响租户、影响接口、当前值、SLO阈值、最近一次变更、TraceID样例,便于值班人员直接下钻。

四、健康检查与发布门禁

健康检查要与发布流程结合。就绪探针通过后才接入流量;发布过程中若新实例就绪失败,自动回滚。医疗SaaS的就绪检查建议包含:数据库连接可用、Redis可用、关键配置加载成功、外部依赖探测(超时200ms,失败不直接判定实例不可用,而是标记降级)。

readinessProbe:
  httpGet:
    path: /health/ready
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 5
  timeoutSeconds: 2
  failureThreshold: 3
livenessProbe:
  httpGet:
    path: /health/live
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10
  failureThreshold: 5

五、落地检查清单(可直接用于评审)

维度检查项医疗场景要求
指标是否按租户/业务域/接口打标签能定位到具体医院与具体业务
日志运行日志是否脱敏、审计日志是否独立留存满足合规追溯与最小权限访问
链路TraceID是否贯穿网关到外部依赖能区分内部耗时与医保/支付外部耗时
告警是否分级、抑制、包含TraceID与租户信息P1可电话触达,避免租户抖动放大
健康检查就绪探针是否检查关键依赖并支持降级发布门禁与自动回滚可用
SLO是否按租户定义SLI与错误预算重点医院单独SLO,预算消耗驱动发布冻结
建议先从一个核心链路(如挂号或报告查询)打通“指标+日志+TraceID+告警+SLO”,再复制到其他业务域。医疗SaaS的可观测性建设最忌一开始就追求全量覆盖,导致标签爆炸、告警泛滥、成本失控。
审计日志与运行日志必须分离存储与授权。运行日志可采样、可短期保留;审计日志不可采样、需长期留存,并记录操作者、时间、患者标识、数据范围与结果。任何将患者敏感信息写入普通运行日志的做法,都应视为高风险问题。