新版数据加工支持将处理结果分发到多个目标Logstore,实现灵活的数据路由和分发策略。
限制和注意事项
功能限制
目标数量:单个数据加工任务最多支持20个输出目标。
跨地域:支持跨地域分发,但需考虑网络延迟。
数据量:大量数据分发可能影响处理性能。
配置注意事项
字段命名:动态输出字段必须使用准确的保留字段名。
数据类型:目标Project和Logstore名称必须是字符串类型。
权限验证:配置前需验证目标库的写入权限。
性能考虑
网络开销:跨地域分发会增加网络传输时间。
处理延迟:多目标分发可能增加整体处理延迟。
资源消耗:复杂的分发逻辑会消耗更多的计算资源。
目标输出配置
该文档基于创建数据加工任务(新版),主要介绍存储目标的内容设置。此处仅介绍数据集和写入数据集,其他输出配置请参见。
本文档基于创建数据加工任务(新版),重点介绍多目标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';
常见问题
分发失败
检查目标Project和Logstore是否存在。
验证权限配置是否正确。
确认网络连接是否正常。
数据丢失
检查SPL语句的逻辑是否正确。
验证数据集定义是否完整。
确认过滤条件是否过于严格。
性能问题
优化SPL语句的执行效率。
减少不必要的数据处理步骤。
考虑调整并发度和批处理大小。