×

日志记录 6.1 启用使用 OpenTelemetry 协议 (OTLP) 的 API 端点。由于 OTLP 是一种标准化格式,并非专门为 Loki 设计,因此需要在 Loki 端进行额外配置才能将 OpenTelemetry 的数据格式映射到 Loki 的数据模型。OTLP 缺少诸如 *流标签* 或 *结构化元数据* 等概念。相反,OTLP 将日志条目的元数据作为 **属性** 提供,分为三类

  • 资源

  • 范围

  • 日志

这允许根据需要同时或单独为多个条目设置元数据。

为 OTLP 数据摄取配置 LokiStack

OpenTelemetry 协议 (OTLP) 输出日志转发器只是一个技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围

要为 OTLP 摄取配置 LokiStack 自定义资源 (CR),请按照以下步骤操作

先决条件
  • 确保您的 Loki 设置支持在架构版本 13 中引入的结构化元数据,以启用 OTLP 日志摄取。

步骤
  1. 设置架构版本

    • 创建新的 LokiStack CR 时,在存储架构配置中设置 version: v13

      对于现有配置,添加一个新的架构条目,其中包含 version: v13 和未来的 effectiveDate。有关更新架构版本的更多信息,请参阅 升级架构(Grafana 文档)。

  2. 按如下所示配置存储架构

    示例配置存储架构
    # ...
    spec:
      storage:
        schemas:
        - version: v13
          effectiveDate: 2024-10-25

    effectiveDate 过期后,v13 架构生效,使您的 LokiStack 能够存储结构化元数据。

属性映射

当 Loki 运算符设置为 openshift-logging 模式时,它会自动应用一组默认的属性映射。这些映射将特定的 OTLP 属性与 Loki 的流标签和结构化元数据对齐。

对于典型的设置,这些默认映射应该足够了。但是,在以下情况下,您可能需要自定义属性映射

  • 使用自定义收集器:如果您的设置包含生成附加属性的自定义收集器,请考虑自定义映射以确保这些属性保留在 Loki 中。

  • 调整属性详细级别:如果默认属性集比必要更详细,您可以将其减少到仅包含基本属性。这可以避免过度的数据存储并简化日志记录过程。

未映射到流标签或结构化元数据的属性不会存储在 Loki 中。

OpenShift 的自定义属性映射

openshift-logging 模式下使用 Loki 运算符时,属性映射遵循 OpenShift 默认值,但可以配置自定义映射以调整这些值。自定义映射允许进一步配置以满足特定需求。

openshift-logging 模式下,可以为所有租户或根据需要为各个租户全局配置自定义属性映射。定义自定义映射后,它们将附加到 OpenShift 默认值。如果不需要默认推荐标签,则可以在租户配置中禁用它们。

Loki 运算符和 Loki 本身之间的一个主要区别在于继承处理。Loki 默认情况下仅将 default_resource_attributes_as_index_labels 复制到租户,而 Loki 运算符在 openshift-logging 模式下将整个全局配置应用于每个租户。

LokiStack 中,属性映射配置通过 limits 设置进行管理

# ...
spec:
  limits:
    global:
      otlp: {} (1)
    tenants:
      application:
        otlp: {} (2)
1 全局 OTLP 属性配置。
2 openshift-logging模式下,application租户的OTLP属性配置。

全局和每个租户的OTLP配置都可以将属性映射到流标签或结构化元数据。至少需要一个流标签才能将日志条目保存到Loki存储中,因此请确保此配置满足此要求。

流标签仅源自资源级属性,LokiStack资源结构反映了这一点。

spec:
  limits:
    global:
      otlp:
        streamLabels:
          resourceAttributes:
          - name: "k8s.namespace.name"
          - name: "k8s.pod.name"
          - name: "k8s.container.name"

相反,结构化元数据可以从资源、范围或日志级别属性生成。

# ...
spec:
  limits:
    global:
      otlp:
        streamLabels:
          # ...
        structuredMetadata:
          resourceAttributes:
          - name: "process.command_line"
          - name: "k8s\\.pod\\.labels\\..+"
            regex: true
          scopeAttributes:
          - name: "service.name"
          logAttributes:
          - name: "http.route"

在Loki中映射类似属性时,通过设置regex: true来使用正则表达式。

避免对流标签使用正则表达式,因为这会增加数据量。

自定义OpenShift默认值

openshift-logging模式下,某些属性是必需的,由于它们在OpenShift功能中的作用,不能从配置中删除。其他标记为**推荐**的属性,如果性能受到影响,可能会被禁用。

在不使用自定义属性的情况下使用openshift-logging模式,可以立即与OpenShift工具兼容。如果需要额外的属性作为流标签或结构化元数据,请使用自定义配置。自定义配置可以与默认配置合并。

要减少openshift-logging模式下的默认属性,请禁用推荐属性。

# ...
spec:
  tenants:
    mode: openshift-logging
    openshift:
      otlp:
        disableRecommendedAttributes: true (1)
1 设置disableRecommendedAttributes: true以删除推荐属性,这会将默认属性限制为**必需属性**。

如果默认属性导致性能或存储问题,此选项很有用。此设置可能会对查询性能产生负面影响,因为它会删除默认流标签。应将此选项与自定义属性配置配对,以保留查询所需的属性。