多目标Logstore数据分发

新版数据加工支持将处理结果分发到多个目标Logstore,实现灵活的数据路由和分发策略。

限制和注意事项

功能限制

  • 目标数量:单个数据加工任务最多支持20个输出目标。

  • 跨地域:支持跨地域分发,但需考虑网络延迟。

  • 数据量:大量数据分发可能影响处理性能。

配置注意事项

  • 字段命名:动态输出字段必须使用准确的保留字段名。

  • 数据类型:目标ProjectLogstore名称必须是字符串类型。

  • 权限验证:配置前需验证目标库的写入权限。

性能考虑

  • 网络开销:跨地域分发会增加网络传输时间。

  • 处理延迟:多目标分发可能增加整体处理延迟。

  • 资源消耗:复杂的分发逻辑会消耗更多的计算资源。

目标输出配置

该文档基于创建数据加工任务(新版),主要介绍存储目标的内容设置。此处仅介绍数据集和写入数据集,其他输出配置请参见。

本文档基于创建数据加工任务(新版),重点介绍多目标Logstore数据分发中的存储目标设置,主要包括数据集的配置及数据写入操作,其他输出配置可参考存储目标

数据集

在新版数据加工中,数据集是SPL处理的基本单元。主要分为命名数据集和非命名数据集。关于数据集的示例请参见SPL数据集

命名数据集

使用.let指令定义,作为后续SPL表达式的输入,通过$符号引用。

非命名数据集

未使用.let指令的SPL表达式的处理结果均为非命名数据集,结果直接输出。

写入结果集

基本概念

写入结果集指需要写入至当前目标Logstore数据集

  • 一个输出目标可配置多个数据集。

  • 单个数据集也可被多个目标选中。

配置灵活性

  • 支持一对一:一个数据集写入一个目标。

  • 支持一对多:一个数据集写入多个目标。

  • 支持多对一:多个数据集写入一个目标。

  • 支持多对多:多个数据集写入多个目标。

动态目标输出

新版数据加工支持通过特殊字段动态指定输出目标。

动态Project指定

保留字段定义为:__tag__:__sls_etl_output_project__字段表示动态输出目标Project。

示例:指定加工结果的目标Project为字段dst_project对应的值。

| extend "__tag__:__sls_etl_output_project__"=dst_project

动态Logstore指定

保留字段定义为:__tag__:__sls_etl_output_logstore__字段表示动态输出目标Logstore。

示例:指定加工结果的目标Logstore为字符串拼接结果。

| extend "__tag__:__sls_etl_output_logstore__"=concat('log-', cast(status as VARCHAR))

组合示例

* | extend "__tag__:__sls_etl_output_project__" = if(level = 'ERROR', 'error-project', 'normal-project')
 | extend "__tag__:__sls_etl_output_logstore__" = concat('logs-', date_format(__time__, 'yyyy-MM-dd'));

数据分发指引

1. 合理规划数据集

  • 单一职责:每个数据集应有明确的业务含义。

  • 避免重复:减少不必要的数据重复处理。

  • 性能考虑:复杂的数据集定义会影响处理性能。

2. 目标库命名规范

推荐的命名规范:

* | extend "__tag__:__sls_etl_output_logstore__" = concat(
    service_name,        # 服务名
    '-',
    log_level,          # 日志级别
    '-',
    date_format(__time__, 'yyyy-MM-dd')  # 日期
  )

3. 权限管理

  • 确保数据加工角色具有所有目标Project的写入权限。

  • 跨账号分发时需要配置跨账号授权。

  • 定期审查和更新权限配置。

4. 监控和告警

  • 监控各个目标库的写入情况。

  • 设置分发失败的告警机制。

  • 定期检查数据分发的准确性。

应用场景

按日志级别分发

定时不同级别的日志数据集:

.let error_logs = * | where level = 'ERROR';
.let warning_logs = * | where level = 'WARNING';
.let info_logs = * | where level = 'INFO';
  • 错误日志写入错误库

    $error_logs | extend "__tag__:__sls_etl_output_logstore__" = 'error-logs';
  • 警告日志写入警告库

    $warning_logs | extend "__tag__:__sls_etl_output_logstore__" = 'warning-logs';
  • 信息日志写入普通日志库

    $info_logs | extend "__tag__:__sls_etl_output_logstore__" = 'info-logs';

按时间分发

按小时分发日志到不同的Logstore。

* | extend hour_suffix = date_format(__time__, 'HH')
  | extend "__tag__:__sls_etl_output_logstore__" = concat('hourly-logs-', hour_suffix)

按业务模块分发

根据请求路径分发到不同的业务模块日志库。

* | extend module = CASE    WHEN strpos(uri, '/api/user') > 0 THEN 'user-service'    WHEN strpos(uri, '/api/order') > 0 THEN 'order-service'    ELSE 'general-service'END
  | extend "__tag__:__sls_etl_output_logstore__" = concat(module, '-logs')

配置示例

基础配置示例

将访问日志按状态码分发到不同的Logstore。

定义成功请求数据集

.let success_requests = *
  | where cast(status as int) >= 200 and cast(status as int) < 400
  | project timestamp, method, uri, status, response_time;

定义客户端错误数据集

.let client_errors = *
  | where cast(status as int) >= 400 and cast(status as int) < 500
  | project timestamp, method, uri, status, error_message;

定义服务端错误数据集

.let server_errors = *
  | where cast(status as int) >= 500
  | project timestamp, method, uri, status, error_message, stack_trace;

输出配置

$success_requests; $client_errors; $server_errors;

输出目标配置

  • 存储目标1

    • 目标库:success-logs

    • 写入数据集:success_requests

  • 存储目标2

    • 目标库:client-error-logs

    • 写入数据集:client_errors

  • 存储目标3

    • 目标库:server-error-logs

    • 写入数据集:server_errors

高级配置示例

  • 基础数据处理

    .let processed_logs = *
      | parse-json content
      | extend clean_message = trim(message)
      | extend hour_time = date_trunc('hour', __time__);
  • 重要错误同时写入告警库

    $processed_logs
    | where level = 'ERROR' and strpos(clean_message, 'CRITICAL') > 0
    | extend "__tag__:__sls_etl_output_project__" = 'alert-project'
    | extend "__tag__:__sls_etl_output_logstore__" = 'critical-alerts';

常见问题

分发失败

  • 检查目标ProjectLogstore是否存在。

  • 验证权限配置是否正确。

  • 确认网络连接是否正常。

数据丢失

  • 检查SPL语句的逻辑是否正确。

  • 验证数据集定义是否完整。

  • 确认过滤条件是否过于严格。

性能问题

  • 优化SPL语句的执行效率。

  • 减少不必要的数据处理步骤。

  • 考虑调整并发度和批处理大小。