Grok-exporter is active running, but metrics don't show up [service error: Invalid configuration]

Grok-exporter is active running, but metrics don't show up [service error: Invalid configuration]

我的主要目的是在 prometheus 服务器中显示日志文件。为此,我正在使用 grok-exporter。

为此,我显示了我的日志文件路径并更改了指标类型和匹配项。如下图:

global:
  config_version: 3
input:
  type: file
  path: /tmp/model.log
  readall: true # Read from the beginning of the file? False means we start at>
  fail_on_missing_logfile: true
imports:
- type: grok_patterns
  dir: /opt/grok-exporter/patterns
grok_patterns:
- 'METRICS [a-zA-Z ]'
metrics:
- type: gauge
  name: model_log
  help: Average duration of model
  match: '%{DATE:date} %{TIME:time} %{METRICS:metrics} %{NUMBER:avg_hour}'
  value: '{{.avg_hour}}'
  labels:
    metrics: '{{.metrics}}'
server:
    protocol: http
    port: 9144


我的日志文件如下所示:

2021-11-09 15:18:17 avg_hour 0.9
2021-11-09 15:20:06 avg_hour 0.5
2021-11-09 15:20:06 avg_hour 0.4

当我在 9144 启动 grok-exporter.server 时,仅启动了默认指标。
其中之一是 'grok_exporter_line_processing_errors_total'。其中显示:

grok_exporter_line_processing_errors_total{metrics="model_log"} 0

这意味着我的错误为零。

但是,我在服务器中看不到我的指标 'model_log'。 也许我错了 grok 模式类型,或者 grok 无法访问“/tmp/”处的 model_log。但如果是这样,应该会出现错误。

更新: 当我在命令行上写的时候:

journalctl -eu grok-exporter

出现错误:

... status =255/EXCEPTION
grok-exporter.service failed with results 'exit-code'
...
Failed to load ~/config.yml: invalid configuration: yaml: line 21: could not find expected ':'
...

但是:

systemctl status grok-exporter.service

活跃运行。 可能是什么问题?我认为第 21 行中的 ':' 没有问题。

我认为问题在于您用来识别指标的模式 - github 页面 (http://github.com/fstab/grok_exporter/blob/master/CONFIG.md) 涉及到这一点,但似乎没有太多内容解释行为。

Grok 需要可识别的模式,如果您尝试为日志中的列定义模式,但该模式与尝试解析的数据不匹配,Grok 将不会对其进行操作。当您搜索 http://localhost:9145/metrics(或您托管目标的任何端口)并查找以下行时,这一点很明显:

  grok_exporter_lines_matching_total{metric="log_events_total_count"} 0

在该示例中,我将指标称为 'log_events_total_count',而 Grok 无法根据以下内容识别模式:

  grok_patterns:
  - 'METRIC [a-zA-Z ]'
  metrics:
    - type: gauge
      name: log_events_total_count
      help: Average duration of model
      match: '%{DATE:date} %{TIME:time} %{METRIC:event} %{NUMBER:num}'
      value: '{{.num}}'
      labels:
        Event: '{{.event}}'

如果您删除“%{NUMBER:num}”并将您的仪表更改为计数器,您应该会发现只有 'a' 会出现在事件标签中,类似于以下内容:

  CONFIG SNIPPET:
    grok_patterns:
    - 'METRIC [a-zA-Z ]'
    metrics:
      - type: counter
        name: log_events_total_count
        help: Average duration of model
        match: '%{DATE:date} %{TIME:time} %{METRIC:event}'
        labels:
          Event: '{{.event}}'

  METRICS RESULT:
    log_events_total_count{Event="a"} 3

对于您的日志,有两点需要特别考虑:

  1. 什么正则表达式标识事件列的模式
  2. 哪个正则表达式最能代表最后一列中的值

我强烈推荐使用 regexr 网站,它允许您输入一些示例文本,然后尝试不同的正则表达式 >> https://regexr.com/

要解决您的 METRIC 模式,请将其更改为包含 w+ 以便尝试匹配“词”:

   grok_patterns:
      - 'METRIC ([a-zA-Z])\w+'

对于您的数值,因为它是一个浮点数,您可以使用 NUMBER grok_pattern 并将其转换为表示小数点:

  %{NUMBER:num:float}

设置好后,仪表计数器应该会向您显示类似于此的内容:

  log_events_total_count{Event="avg_hour"} 0.4

希望这对您有所帮助!