如何在New Relic中计算所有进程的平均总处理时间?
问题描述
我的New Relic表中有如下数据:
| id | timestamp | status |
|---|---|---|
| A | 2024-12-01 11:36:00 | 开始处理步骤1 |
| B | 2024-12-01 11:37:00 | 开始处理步骤1 |
| B | 2024-12-01 11:38:00 | 开始处理步骤2 |
| A | 2024-12-01 12:01:00 | 开始处理步骤2 |
| C | 2024-12-01 12:36:00 | 开始处理步骤1 |
| C | 2024-12-01 12:41:00 | 开始处理步骤2 |
| B | 2024-12-01 13:36:00 | 开始处理步骤3 |
| A | 2024-12-01 13:46:00 | 开始处理步骤3 |
| C | 2024-12-01 13:56:00 | 开始处理步骤3 |
处理时间定义为从第一步(步骤1)到最后一步(步骤3)的耗时,例如进程A的耗时为2024-12-01 13:46:00 - 2024-12-01 11:36:00 = 2小时10分钟。我需要计算所有进程ID的平均处理时间,请问如何在New Relic中实现?
实现方案
可以通过New Relic的NRQL查询完成需求,核心逻辑是按进程ID分组,提取每个ID对应的步骤1最早启动时间、步骤3启动时间,计算单进程耗时后再求平均值。
完整NRQL查询语句
FROM YourTableName SELECT latest(timestamp) FILTER (WHERE status = '开始处理步骤3') AS step3_time, earliest(timestamp) FILTER (WHERE status = '开始处理步骤1') AS step1_time, (latest(timestamp) FILTER (WHERE status = '开始处理步骤3') - earliest(timestamp) FILTER (WHERE status = '开始处理步骤1')) AS process_duration FACET id LIMIT MAX | SELECT average(process_duration) AS average_process_time
语句说明
- 数据分组与基础筛选
FROM YourTableName:替换为你实际的表名FACET id:按进程ID分组,确保每个ID的时间数据被单独计算
- 提取关键时间点
earliest(timestamp) FILTER (WHERE status = '开始处理步骤1'):获取每个进程ID的步骤1最早启动时间latest(timestamp) FILTER (WHERE status = '开始处理步骤3'):获取每个进程ID的步骤3启动时间(若每个ID仅执行一次步骤3,用earliest结果一致)
- 计算单进程耗时
- NRQL支持时间类型直接做减法,
step3_time - step1_time会自动返回带单位的时长结果(如2h10m)
- NRQL支持时间类型直接做减法,
- 计算平均耗时
- 嵌套查询
| SELECT average(process_duration)对所有有效进程的耗时求平均值,自动忽略缺少步骤1或步骤3的进程(这类进程的耗时会返回null,average函数会排除null值)
- 嵌套查询
额外优化
如果需要将结果统一转换为特定时间单位(比如分钟),可以用duration()函数调整,例如把process_duration替换为duration(process_duration, 'minutes')。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

