Grafana中查询的日期计算

时间:2019-09-19 14:48:42

标签: grafana prometheus

(请参阅下面的更新的更清晰的解释:转到“ 2019年9月20日更新”)

我正在寻找一种Grafana来查询带有变量标签的Prometheus数据源的方法,这些变量标签是 YYYY-MM-DD 日期,而且是相对于当前日期的日期。< / s>

我想查看最近的4天,我可以创建一个带有4个带有正确标签的查询的Grafana图,如下所示,它可以工作,但是我需要每天更新我的图:

  • myapp_metric_foo{task_date="2019-09-16"}
  • myapp_metric_foo{task_date="2019-09-17"}
  • myapp_metric_foo{task_date="2019-09-18"}
  • myapp_metric_foo{task_date="2019-09-19"}

为避免这种情况,我正在寻找一些日期计算公式,例如:now - 1 day | format_date "YYYY-MM-DD"

所以我的Grafana图查询示例将是:

  • myapp_metric_foo{task_date="{{ now | format_date "YYYY-MM-DD" }}"}
  • myapp_metric_foo{task_date="{{ now - 1 day | format_date "YYYY-MM-DD" }}"}
  • myapp_metric_foo{task_date="{{ now - 2 day | format_date "YYYY-MM-DD" }}"}
  • myapp_metric_foo{task_date="{{ now - 3 day | format_date "YYYY-MM-DD" }}"}

在Grafana中我找不到任何允许这种事情的东西。

另一个想法是通过Grafana API从外部脚本更新现有图形...


2019年9月20日更新:

似乎我需要对该应用程序进行更多说明。

应用上下文

检测到的应用程序 myapp 运行任务/作业(假设它是计算作业,可能需要一些时间)。 每个任务都有一个task_date(提交时的编号。在任务创建时设置:它永远不会改变),并且可以处于以下三种状态/状态之一:

  • new
  • running
  • done

Prometheus 抓取 myapp 时, myapp 告诉 Prometheus 多少个任务:

  • 处于new状态,按task_date分组
  • 处于running状态,按task_date分组
  • 处于done状态,按task_date分组

应用程序删除7天之前的done个任务。

应用数据

假设该应用程序在2019-09-19 14h00的数据库中具有以下任务:

+----+------------+---------+---+
| ID | task_date  | status  | … |
+----+------------+---------+---+
| 42 | 2019-09-12 | done    | … |
| 43 | 2019-09-12 | done    | … |
| 44 | 2019-09-12 | done    | … |
| 45 | 2019-09-13 | done    | … |
| 46 | 2019-09-15 | done    | … |
| 47 | 2019-09-15 | done    | … |
| 48 | 2019-09-16 | done    | … |
| 49 | 2019-09-17 | running | … |
| 50 | 2019-09-17 | done    | … |
| 51 | 2019-09-17 | done    | … |
| 52 | 2019-09-18 | new     | … |
| 53 | 2019-09-18 | running | … |
| 54 | 2019-09-18 | running | … |
| 55 | 2019-09-18 | done    | … |
| 56 | 2019-09-18 | done    | … |
| 57 | 2019-09-19 | new     | … |
| 58 | 2019-09-19 | new     | … |
| 59 | 2019-09-19 | running | … |
+----+------------+---------+---+

myapp 在2019-09-19 18h00暴露给 Prometheus 的指标将是(基于文本的格式):

myapp_tasks_total{task_date="2019-09-12",status="done"} 3
myapp_tasks_total{task_date="2019-09-13",status="done"} 1
myapp_tasks_total{task_date="2019-09-15",status="done"} 2
myapp_tasks_total{task_date="2019-09-16",status="done"} 1
myapp_tasks_total{task_date="2019-09-17",status="running"} 1
myapp_tasks_total{task_date="2019-09-17",status="done"} 2
myapp_tasks_total{task_date="2019-09-18",status="new"} 1
myapp_tasks_total{task_date="2019-09-18",status="running"} 2
myapp_tasks_total{task_date="2019-09-18",status="done"} 2
myapp_tasks_total{task_date="2019-09-19",status="new"} 2
myapp_tasks_total{task_date="2019-09-19",status="running"} 1

假设随后在应用程序上发生以下情况:

  • 在2019-09-18日提交的任务开始(从new移至running
  • 在2019年9月19日提交的任务完成(从running移至done
  • task_date早于7天的任务将被删除(此处为2019-09-12的任务)
  • 新任务于2019-09-20 00h43m提交

几个小时后,在2019-09-20 02h,新的公开指标输出将是:

myapp_tasks_total{task_date="2019-09-12",status="done"} 3
myapp_tasks_total{task_date="2019-09-13",status="done"} 1
myapp_tasks_total{task_date="2019-09-15",status="done"} 2
myapp_tasks_total{task_date="2019-09-16",status="done"} 1
myapp_tasks_total{task_date="2019-09-17",status="running"} 1
myapp_tasks_total{task_date="2019-09-17",status="done"} 2
myapp_tasks_total{task_date="2019-09-18",status="running"} 3
myapp_tasks_total{task_date="2019-09-18",status="done"} 2
myapp_tasks_total{task_date="2019-09-19",status="new"} 2
myapp_tasks_total{task_date="2019-09-19",status="done"} 1
myapp_tasks_total{task_date="2019-09-20",status="done"} 1

我的 Grafana 图(可视化类型=图)将使用以下4个 PromQL 查询( 4 ),因为我只想查看最近 4 天):

  • 查询A
    • 指标:myapp_tasks_total{task_date="2019-09-17"}
    • 传奇:{{status}} tasks submitted 3 days ago
  • 查询B
    • 指标:myapp_tasks_total{task_date="2019-09-18"}
    • 传奇:{{status}} tasks submitted 2 days ago
  • 查询C
    • 指标:myapp_tasks_total{task_date="2019-09-19"}
    • 传奇:{{status}} tasks submitted yesterday
  • 查询D
    • 指标:myapp_tasks_total{task_date="2019-09-20"}
    • 传奇:{{status}} tasks submitted today

这将产生最多4 * 3 = 12条曲线(取决于每天存在多少个不同的状态),这将有助于我跟踪应用程序负载(任务数)和速度(完成时间) )。

问题

Prometheus 检测部分对我来说不是问题:我知道如何从数据库中获取数据,以及如何将数据公开给Prometheus 。

我的问题是Grafana需要的 PromQL 查询:我在上面给出的4个查询仅在访问Grafana 2019-09-20时才是相关的:我需要一种动态“更改”每个查询中的task_date=条条件。

我希望 Grafana 有一个自定义的DSL,可以让我告诉它:

  

嘿,请使用您的$__to变量,删除 x 天并将其格式化为“ YYYY-MM-DD”。

类似{{ $__to - x * 86400000 | format_date "YYYY-MM-DD" }}

(1天= 86400000毫秒)

另一种想法是手动创建图形并通过Grafana API从外部脚本中定期对其进行更新...

1 个答案:

答案 0 :(得分:0)

由于它们具有不同的标签值(“ task_date”),因此被视为不同的指标。您必须删除尺寸(标签)。

在请求时间删除标签

Replace the label,值为空。前提是它不会创建重复的指标。

label_replace(up{job="myapp_metric_foo, "task_date", "", "task_date", ".*")

aggregate the metrics

max(myapp_metric_foo) WITHOUT(task_date)

在摄取时删除标签

在Prometheus的配置中,您可以使用metric relabeling删除标签

metric_relabel_configs:
- regex: 'container_label_com_amazonaws_ecs_task_arn'
  action: labeldrop

我认为,最好在摄取时将其删除。每天贴上不同的标签根本没有意义;除非这是一项很长的预定工作。