
在360分布式Web服务中,通过设计分层指标(业务层、服务层、系统层)并关联跨服务调用链,结合实时采集与根因分析(日志+追踪工具),构建性能监控闭环,实时发现潜在问题。
监控指标设计需遵循“分层覆盖、关联调用链、根因可追溯”原则:
| 指标类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| QPS(计数器) | 每秒成功请求数 | 累积值,无过期 | 吞吐量监控(如API流量) | 需区分业务模块(如不同API的QPS分开统计) |
| 错误率(比率) | 错误请求数/总请求数 | 累积比率,无过期 | 稳定性监控(如错误类型占比) | 需区分错误类型(如500/404) |
| 响应时间(直方图) | 请求处理耗时分布 | 记录所有值,分位值(如P99) | 用户体验监控(如响应速度) | 需采样(避免全量记录影响性能) |
| 跨服务调用成功率 | 服务A调用服务B的成功率 | 累积比率,无过期 | 服务间调用链稳定性监控 | 需关联调用方(A)和被调用方(B) |
| 跨服务调用延迟 | 服务A调用服务B的耗时 | 记录分布,分位值(如P99) | 服务间调用链性能监控 | 需采样(避免全量记录影响性能) |
假设服务A(API Gateway)调用服务B(业务服务),伪代码展示跨服务调用链指标关联:
from prometheus_client import Counter, Histogram
import time
# 服务A(调用方)指标
A_TO_B_CALLS = Counter('service_a_to_b_calls_total', 'Total calls from service A to B')
A_TO_B_SUCCESS = Counter('service_a_to_b_success_total', 'Total successful calls from service A to B', labelnames=['service_b_name'])
A_TO_B_LATENCY = Histogram('service_a_to_b_latency_seconds', 'Latency of calls from service A to B')
# 服务B(被调用方)指标
SERVICE_B_RESPONSE_TIME = Histogram('service_b_response_time_seconds', 'Response time of service B')
def service_a_handle_request(request):
start_time = time.time()
# 调用服务B
b_response = call_service_b(request)
duration = time.time() - start_time
# 记录服务A到B的指标
A_TO_B_CALLS.inc()
if b_response.status_code == 200:
A_TO_B_SUCCESS.labels(service_b_name='service_b').inc()
A_TO_B_LATENCY.observe(duration)
else:
# 记录错误
A_TO_B_SUCCESS.labels(service_b_name='service_b').inc()
raise Exception(f"Service B error: {b_response.status_code}")
def call_service_b(request):
# 模拟调用服务B
time.sleep(0.1) # 模拟延迟
return {"status_code": 200, "data": "success"}
# 示例调用
service_a_handle_request({'path': '/api/v1/data', 'method': 'GET'})
面试官您好,在360的分布式Web服务中,我们通过设计分层指标并关联跨服务调用链来监控性能。首先,核心指标包括QPS(每秒成功请求数)、错误率(错误请求占比)、响应时间(P99分位值),这些指标覆盖吞吐量、稳定性和用户体验。同时,我们设计跨服务调用链指标,比如服务A调用服务B时,A记录对B的调用成功率,B记录自身响应时间,通过这些关联指标能快速定位服务间的性能瓶颈。当指标异常时,比如QPS下降或响应时间P99超过阈值,会触发告警。比如QPS下降可能意味着流量异常或后端资源不足,错误率上升可能表示业务逻辑错误,响应时间变长可能说明处理逻辑复杂。通过结合日志(ELK)和追踪工具(Jaeger),我们能进一步定位问题根源,比如通过错误率指标发现某个API的500错误率升高,结合响应时间分析,可能是因为数据库查询慢,进而排查数据库连接池问题。总结来说,我们通过分层指标、跨服务关联、实时采集和根因分析,构建了性能监控闭环,及时识别潜在问题。