管道
详细介绍如何设置Promtail来处理日志行,包括提取指标和标签。
管道
管道用于转换单个日志行、其标签和时间戳。管道由一组阶段.有4种类型的阶段:
- 解析阶段解析当前日志行并从中提取数据。然后,提取的数据可供其他阶段使用。
- 转换阶段转换前一阶段提取的数据。
- 行动阶段从前一阶段提取数据并对其进行处理。行动可以:
- 在日志行中添加或修改已有的标签
- 修改日志行的时间戳
- 修改日志行内容
- 基于提取的数据创建一个度量
- 过滤阶段可选地应用阶段的子集或根据某些条件删除条目。
典型的管道将从解析阶段开始(例如正则表达式或json阶段)从日志行中提取数据。然后,将呈现一系列操作阶段,以对提取的数据进行处理。最常见的动作阶段是标签阶段将提取的数据转换为标签。
一个共同的阶段也将是匹配属性可选择性地应用阶段或删除项LogQL流选择器和筛选器表达式.
注意,管道目前不能用于重复删除日志;Grafana Loki将收到相同的日志行多次,如果,例如:
- 两个抓取配置从同一个文件中读取
- 文件中的重复日志行通过管道发送。重复数据删除未完成。
但是,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
各阶段可访问的数据
以下部分进一步描述了每个阶段可访问的类型(尽管不是所有类型都可以使用):
标签设置
日志行的当前标签集。初始化为与日志行一起刮取的标签集。标签集仅由操作阶段修改,但过滤阶段从中读取。
最后的标签集将由Loki索引,并可用于查询。
在解析阶段提取的键-值对的集合。后续阶段对提取的映射进行操作,要么对它们进行转换,要么对它们采取操作。在管道的末端,提取的映射被丢弃;要使解析阶段有用,它必须始终与至少一个操作阶段配对。
提取的映射使用与日志行一起提取的相同的初始标签集进行初始化。这些初始数据允许对管道阶段内的标签值采取操作,这些标签值只操作提取的映射。例如,从文件结尾的日志条目有标签文件名
它的值是被跟踪的文件路径。当为该日志项执行管道时,初始提取的映射将包含文件名
使用与标签相同的值。
日志时间戳
日志行的当前时间戳。操作阶段可以修改此值。如果不设置,它默认为日志被抓取的时间。
时间戳的最终值被发送给洛基。
量测线
当前日志行,表示为文本。初始化为Promtail抓取的文本。操作阶段可以修改此值。
日志行的最终值作为给定日志条目的文本内容发送给Loki。
阶段
解析阶段:
变换阶段:
- 多行:将多行(如堆栈跟踪)合并为多行块。
- 模板:使用Go模板修改提取的数据。
行动阶段:
- 时间戳:设置日志项的时间戳值。
- 输出:设置日志行文本。
- 标签:更新日志表项的标签集。
- 指标:根据提取的数据计算指标。
- 租户:设置日志项的租户ID值。
过滤阶段:
- 匹配:根据标签集有条件地运行阶段。
- 下降:根据多个选项有条件地删除日志行。
- 限制:基于多个选项有条件地限制日志行速率。