(请参阅下面的更新的更清晰的解释:转到“ 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
假设随后在应用程序上发生以下情况:
new
移至running
)running
移至done
)task_date
早于7天的任务将被删除(此处为2019-09-12的任务)几个小时后,在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 天):
myapp_tasks_total{task_date="2019-09-17"}
{{status}} tasks submitted 3 days ago
myapp_tasks_total{task_date="2019-09-18"}
{{status}} tasks submitted 2 days ago
myapp_tasks_total{task_date="2019-09-19"}
{{status}} tasks submitted yesterday
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从外部脚本中定期对其进行更新...
答案 0 :(得分:0)
由于它们具有不同的标签值(“ task_date”),因此被视为不同的指标。您必须删除尺寸(标签)。
在请求时间删除标签
Replace the label,值为空。前提是它不会创建重复的指标。
label_replace(up{job="myapp_metric_foo, "task_date", "", "task_date", ".*")
max(myapp_metric_foo) WITHOUT(task_date)
在摄取时删除标签
在Prometheus的配置中,您可以使用metric relabeling删除标签
metric_relabel_configs:
- regex: 'container_label_com_amazonaws_ecs_task_arn'
action: labeldrop
我认为,最好在摄取时将其删除。每天贴上不同的标签根本没有意义;除非这是一项很长的预定工作。