菜单

管道

详细介绍如何设置Promtail来处理日志行,包括提取指标和标签。

管道

管道用于转换单个日志行、其标签和时间戳。管道由一组阶段.有4种类型的阶段:

  1. 解析阶段解析当前日志行并从中提取数据。然后,提取的数据可供其他阶段使用。
  2. 转换阶段转换前一阶段提取的数据。
  3. 行动阶段从前一阶段提取数据并对其进行处理。行动可以:
    1. 在日志行中添加或修改已有的标签
    2. 修改日志行的时间戳
    3. 修改日志行内容
    4. 基于提取的数据创建一个度量
  4. 过滤阶段可选地应用阶段的子集或根据某些条件删除条目。

典型的管道将从解析阶段开始(例如正则表达式json阶段)从日志行中提取数据。然后,将呈现一系列操作阶段,以对提取的数据进行处理。最常见的动作阶段是标签阶段将提取的数据转换为标签。

一个共同的阶段也将是匹配属性可选择性地应用阶段或删除项LogQL流选择器和筛选器表达式

注意,管道目前不能用于重复删除日志;Grafana Loki将收到相同的日志行多次,如果,例如:

  1. 两个抓取配置从同一个文件中读取
  2. 文件中的重复日志行通过管道发送。重复数据删除未完成。

但是,Loki将在查询时对具有完全相同的纳秒时间戳、标签和日志内容的日志执行重复数据删除。

这个文档示例让你很好地了解了你可以用管道实现什么:

Scrape_configs:—job_name: kubernetes-pods-name kubernetes_sd_configs: ....这个阶段只会在被抓取的目标有一个标签#“name”和值“promtail”时运行。- match: selector: '{name="promtail"}'阶段:# regex阶段解析出关卡、时间戳和组件。在阶段的最后,级别、时间戳和组件的值仅在管道内部设置。未来阶段可以使用这些值并决定如何使用它们。- regex: expression: '.*level=(?P[a- za -z]+).*ts=(?P[T\d-:. z]*).*component=(?P[a- za -z]+)' #标签阶段将之前# regex阶段的关卡和组件项提升为标签。例如,level=error #可能是这个阶段添加的标签。最后,时间戳阶段从# regex阶段提取时间戳,并将其提升为日志条目的新时间戳,#解析为rfc3339nano格式的值。只有当被抓取的目标有一个标签为# "name",值为"nginx",并且日志行中包含单词"GET"时,这个阶段才会运行- match: selector: '{name="nginx"} |= "GET"'阶段:#这个regex阶段通过匹配一些#值来提取一个新的输出,并捕获其余的。- regex: expression: \w{1,3}.\w{1,3}.\w{1,3}.\w{1,3} . (?P.*) #输出阶段通过将其设置为regex阶段输出的值来更改捕获的日志行内容。 - output: source: output # This stage is only going to run if the scraped target has a label of # "name" with a value of "jaeger-agent". - match: selector: '{name="jaeger-agent"}' stages: # The JSON stage reads the log line as a JSON string and extracts # the "level" field from the object for use in further stages. - json: expressions: level: level # The labels stage pulls the value from "level" that was extracted # from the previous stage and promotes it to a label. - labels: level: - job_name: kubernetes-pods-app kubernetes_sd_configs: .... pipeline_stages: # This stage will only run if the scraped target has a label of "app" # with a name of *either* grafana or prometheus. - match: selector: '{app=~"grafana|prometheus"}' stages: # The regex stage will extract a level and component for use in further # stages, allowing the level to be defined as either lvl= or # level= and the component to be defined as either # logger= or component= - regex: expression: ".*(lvl|level)=(?P[a-zA-Z]+).*(logger|component)=(?P[a-zA-Z]+)" # The labels stage then promotes the level and component extracted from # the regex stage to labels. - labels: level: component: # This stage will only run if the scraped target has a label "app" # with a value of "some-app" and the log line doesn't contain the word "info" - match: selector: '{app="some-app"} != "info"' stages: # The regex stage tries to extract a Go panic by looking for panic: # in the log message. - regex: expression: ".*(?Ppanic: .*)" # The metrics stage is going to increment a panic_total metric counter # which Promtail exposes. The counter is only incremented when panic # was extracted from the regex stage. - metrics: panic_total: type: Counter description: "total count of panic" source: panic config: action: inc

各阶段可访问的数据

以下部分进一步描述了每个阶段可访问的类型(尽管不是所有类型都可以使用):

标签设置

日志行的当前标签集。初始化为与日志行一起刮取的标签集。标签集仅由操作阶段修改,但过滤阶段从中读取。

最后的标签集将由Loki索引,并可用于查询。

提取的地图

在解析阶段提取的键-值对的集合。后续阶段对提取的映射进行操作,要么对它们进行转换,要么对它们采取操作。在管道的末端,提取的映射被丢弃;要使解析阶段有用,它必须始终与至少一个操作阶段配对。

提取的映射使用与日志行一起提取的相同的初始标签集进行初始化。这些初始数据允许对管道阶段内的标签值采取操作,这些标签值只操作提取的映射。例如,从文件结尾的日志条目有标签文件名它的值是被跟踪的文件路径。当为该日志项执行管道时,初始提取的映射将包含文件名使用与标签相同的值。

日志时间戳

日志行的当前时间戳。操作阶段可以修改此值。如果不设置,它默认为日志被抓取的时间。

时间戳的最终值被发送给洛基。

量测线

当前日志行,表示为文本。初始化为Promtail抓取的文本。操作阶段可以修改此值。

日志行的最终值作为给定日志条目的文本内容发送给Loki。

阶段

解析阶段:

变换阶段:

  • 多行:将多行(如堆栈跟踪)合并为多行块。
  • 模板:使用Go模板修改提取的数据。

行动阶段:

  • 时间戳:设置日志项的时间戳值。
  • 输出:设置日志行文本。
  • 标签:更新日志表项的标签集。
  • 指标:根据提取的数据计算指标。
  • 租户:设置日志项的租户ID值。

过滤阶段:

  • 匹配:根据标签集有条件地运行阶段。
  • 下降:根据多个选项有条件地删除日志行。
  • 限制:基于多个选项有条件地限制日志行速率。