grok_exporter指标发布频率及Prometheus全量抓取指标问题咨询
问题核心解答
grok_exporter指标发布与Prometheus抓取机制的差异
- grok_exporter会实时逐行处理日志,每匹配到一行就更新内存中存储的指标值,但它本身不会主动推送指标,仅在收到Prometheus的拉取请求时返回当前内存中存储的最新指标状态。
- Prometheus按照你配置的
scrape_interval(抓取间隔)定时拉取指标,两次拉取间隔内grok_exporter更新的所有中间指标值默认会被覆盖,仅保留最后一次更新的值,这就是你示例中只能拿到5的核心原因。
实现捕获所有日志行对应指标的方案
首先需要明确:Prometheus本身是基于时间点采样的指标存储系统,原生不适合存储每一个离散日志事件的独立值,如果确实需要完整保留每一行日志的数值,更推荐使用Loki、Elasticsearch等日志存储系统。如果基于指标统计的需求,可以采用以下配置方案:
方案1:使用Histogram/Summary类型统计区间内所有值(推荐)
将grok_exporter的指标类型配置为Histogram或Summary,每一行日志的数值会作为观测值累加到统计结果中,不会被覆盖,Prometheus拉取后可以拿到区间内所有值的计数、总和、分位、分布等统计数据。
配置示例如下:
metrics: - type: histogram name: log_value_distribution help: 日志行提取数值的分布统计 match: '%{NUMBER:value}' value: '{{.value}}' # 可根据实际数值范围自定义桶 buckets: [1,2,3,4,5,10,20,50]
上述配置处理你示例中的5行日志后,Prometheus拉取到的结果会包含log_value_distribution_count=5、log_value_distribution_sum=15以及各个数值区间的桶计数,完整覆盖1-5所有值的统计信息。
方案2:附加唯一标签存储独立值(不推荐)
如果必须要存储每一行的独立数值,可以给gauge指标附加纳秒级时间戳、日志行号等唯一标签,保证每一行日志对应一个独立的时间序列:
metrics: - type: gauge name: log_line_value help: 单条日志行对应的数值 match: '%{NUMBER:value}' value: '{{.value}}' labels: # 用日志生成时间的纳秒级标识作为唯一标签 event_ts: '{{.timestamp.Format "20060102150405.000000000"}}'
注意:该方案会导致指标基数无限增长,很快耗尽Prometheus的内存和存储资源,仅建议在低流量、短周期的测试场景下使用。
内容的提问来源于stack exchange,提问作者JohnTheBeloved
相关产品推荐
相关产品推荐

