启用多租户支持

Tempo是一个支持多租户的分布式追踪系统。它通过使用一个名为X-Scope-OrgID的header来实现多租户支持。

前面我们部署了Tempo,但使用OTEL Collector向其中推送追踪数据时并没有启用多租户支持,通过查看我们的MinIO存储中的数据也能确认。

1mc ls minio/tempo-traces/
2
3STANDARD tempo_cluster_seed.json
4single-tenant/

可以看到数据时存在在single-tenant下的,即单一租户,说明还没有启用多租户支持。

如果你想设置多租户环境,可以按照下面的步骤进行。

  1. 在Tempo后端启用多租户,在所有Tempo组件上设置以下配置值:

    1multitenancy_enabled: true
    

    或者可以在命令行中使用:

    1--multitenancy.enabled=true
    

    对于我们前使用tempo-distributed这个helm chart部署的Tempo,通过定制values.yaml值文件,加入下面的配置值进行设置:

    1multitenancyEnabled: true
    

    这个配置将要求所有Tempo组件都必须包含X-Scope-OrgID Header。

  2. 配置OTEL Collector在推送数据时支持多租户

    注意:目前Tempo仅支持使用gRPC进行多租户数据接收,而且这可能永远不会改变。强烈建议使用OpenTelemetry Collector来支持多租户。

    配置OTEL Collector以在数据推送时附加X-Scope-OrgID头部:

    1exporters:
    2  otlp:
    3    headers:
    4      x-scope-orgid: foo-bar-baz
    
  3. 在Grafana中的Tempo数据源配置中,使用相同的头部参数传递租户信息:

    1- name: Tempo-Multitenant
    2  jsonData:
    3    httpHeaderName1: 'X-Scope-OrgID'
    4  secureJsonData:
    5    httpHeaderValue1: 'foo-bar-baz'
    

数据保留策略

Tempo使用对象存储作为后端,数据以块(blocks)的形式保存在对象存储中。

可以通过考虑存入存入数据的字节数和保留时间来估计所需的存储空间。例如,每天的存入字节数乘以保留天数等于存储的字节数。

Tempo数据的保留策略在Compactor组件上配置:

 1compactor:
 2  # 可选。禁用后端压缩。默认值为false。
 3  # 注意:这仅应在非生产环境中用于调试目的。
 4  # 如果需要,这将允许块留在后端以进行进一步调查。
 5  disabled: <bool>
 6
 7  ring:
 8    kvstore:
 9      # 在高流量环境中,多个压缩器需要协同工作以跟上传入的块。
10      # 这告诉压缩器使用存储在memberlist中的环来进行协调。
11      # 示例:"store: memberlist"
12      store: <string>
13
14  compaction:
15    # 可选。保留块的持续时间。默认值为14天(336小时)。
16    block_retention: <duration>
17
18    # 可选。保留已在其他位置压缩的块的持续时间。默认值为1小时。
19    compacted_block_retention: <duration>
20
21    # 可选。在此时间窗口中的块将被一起压缩。默认值为1小时。
22    compaction_window: <duration>
23
24    # 可选。压缩块中的最大跟踪数。默认值为600万。
25    # 警告:已弃用。请改用max_block_bytes。
26    max_compaction_objects: <int>
27
28    # 可选。压缩块的最大大小(以字节为单位)。默认值为100 GB。
29    max_block_bytes: <int>
30
31    # 可选。在保留期间并行处理的租户数。默认值为10。
32    retention_concurrency: <int>
33
34    # 可选。在切换到下一个租户之前,单个租户压缩的最长时间。默认值为5分钟。
35    max_time_per_tenant: <duration>
36
37    # 可选。压缩周期之间的时间间隔。默认值为30秒。
38    # 注意:如果值设置为0,则将使用默认值。
39    compaction_cycle: <duration>
40
41    # 可选。从输入块缓冲的数据量。默认值为5 MiB。
42    v2_in_buffer_bytes: <int>
43
44    # 可选。当缓冲区达到此大小时,将数据刷新到后端。默认值为20 MB。
45    v2_out_buffer_bytes: <int>
46
47    # 可选。在压缩过程中在内存中缓冲的跟踪数。
48    # 增加此值可能会提高性能,但也会增加内存使用量。默认值为1000。
49    v2_prefetch_traces_count: <int>

注意保留时间compactor.compaction.block_retention默认为336h,也就是14天。

对于我们前使用tempo-distributed这个helm chart部署的Tempo中,默认值被改成了48h,这个需要根据我们的需求定制部署时的values.yaml,例如:

1compactor:
2  config:
3    compaction:
4      block_retention: 336h

每租户特定的配置

Tempo启用多租户后,可以针对每个租户定制配置。

可以在单独的文件中设置租户特定的覆盖设置,并将per_tenant_override_config指向该文件。这个覆盖文件会动态加载。可以在运行时更改并由Tempo重新加载,而无需重新启动应用程序。这些覆盖设置可以按租户设置。

 1# /conf/tempo.yaml
 2# Overrides configuration block
 3overrides:
 4   per_tenant_override_config: /conf/overrides.yaml
 5
 6---
 7# /conf/overrides.yaml
 8# Tenant-specific overrides configuration
 9overrides:
10
11    "<tenant id>":
12        [ingestion_burst_size_bytes: <int>]
13        [ingestion_rate_limit_bytes: <int>]
14        [max_bytes_per_trace: <int>]
15        [max_traces_per_user: <int>]
16
17    # A "wildcard" override can be used 
18    # that will apply to all tenants if a match is not found otherwise.
19    "*":
20        [ingestion_burst_size_bytes: <int>]
21        [ingestion_rate_limit_bytes: <int>]
22        [max_bytes_per_trace: <int>]
23        [max_traces_per_user: <int>]

参考