
暂无个人介绍
能力说明:
了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明背景随着多云,多region业务部署越来越普遍,对于复杂的网络链路而言,延迟/丢包成为客户关注的一个重点。sls的logtail作为可观测性的组件,目前集成了icmping和tcping的功能,帮助业务快速发现网络侧的延迟和丢包问题,提升网络可观察性。以下操作需要先开通 阿里云日志服务SLSsls日志服务参考帮助文档:https://help.aliyun.com/document_detail/48869.html操作步骤Step1 确保logtail为较新的版本需要确保logtal的版本 >=1.0.31 (2022年4月02日发布)升级方法参考 https://help.aliyun.com/document_detail/28982.html#section-brd-r34-3wg如果已经是最新的版本,可以跳过这一步Step2 创建MetricStoreStep3 配置Netping选择自定义数据插件netping_config_json 样例{ "inputs": [ { "detail": { "tcp": [ { "port": 80, "src": "192.168.0.103", "count": 3, "target": "www.baidu.com" } ], "interval_seconds": 60, "icmp": [ { "src": "192.168.0.103", "count": 3, "target": "www.baidu.com" } ] }, "type": "metric_input_netping" } ]}其中 src要设置为要执行ping的ip地址,只有机器组里的机器,匹配到src是自己的ip的,才会执行对应的ping指令建议单个src的ping的数量不要超过200个Step 4 查询Metric使用promql查询ping的结果相关指标说明指标名称说明ping_success单次执行icmp ping的成功数ping_failed单次执行icmp ping的失败数ping_total单次执行icmp ping的总数(count)ping_rtt_avg_ms单次执行icmp ping的平均响应时间,单位毫秒ping_rtt_max_ms单次执行icmp ping的最大响应时间,单位毫秒ping_rtt_min_ms单次执行icmp ping的最小响应时间,单位毫秒ping_rtt_stddev_ms单次执行icmp ping的标准差时间,单位毫秒ping_rtt_total_ms单次执行icmp ping的总响应时间,单位毫秒tcp_success单次执行tcp ping的成功数tcp_failed单次执行tcp ping的失败数tcp_total单次执行tcp ping的总数(count)tcp_rtt_avg_ms单次执行tcp ping的平均响应时间,单位毫秒tcp_rtt_max_ms单次执行tcp ping的最大响应时间,单位毫秒tcp_rtt_min_ms单次执行tcp ping的最小响应时间,单位毫秒tcp_rtt_stddev_ms单次执行tcp ping的标准差时间,单位毫秒tcp_rtt_total_ms单次执行tcp ping的总响应时间,单位毫秒
(一)背景随着企业信息化的发展,面向云的IT基础设施越来越普遍,如何解决跑大的软件系统的监控问题,成为IT稳定性保障的关键环节。 本方案主要介绍如何使用SLS 对阿里云、专有IDC以及第三方云场景下,进行企业级的监控方案。(二)架构依托于MetricStore/Logstore存储能力,SLS提供了从底向上全栈的监控能力(三)前序工作在阿里云官网已经开通 SLS服务确保现有的网络环境,可以连通到阿里云网络。网络联通说明:本方案要求现有的需要采集指标或日志的设备能够联通阿里云的网络环境,目前SLS支持的Region 参考 链接对于IDC或者其他云厂商的场景,如果是进行POC的话可以优先使用SLS的公网地址进行日志收集;如果是生产使用建议搭建相应的专线接入阿里云网络,以保障数据传输的可靠性(四)步骤配置步骤汇总监控层次监控类型接入方式接入说明IAAS层k8s指标监控配置即可接入(Promethues Remote Write)支持Pod、Deployment、SatefulSet、k8s核心组件指标监控,具体配置方法 链接k8s事件监控配置即可接入(需部署k8s npd组件)容器的重启、Crash、OOM等监控,关键组件异常监控链接主机监控logtail采集支持CPU、Mem、Disk、Net、System等相关指标采集链接PAAS层MySQLlogtail采集配置方案见 链接MongoDBlogtail采集配置方案见 链接Redislogtail采集配置方案见 链接ClickHouselogtail采集配置方案见 链接Kafkalogtail采集配置方案见 链接Nginxlogtail采集配置方案见 链接ElasticSearchlogtail采集配置方案见 链接阿里云云产品配置即可接入支持常见的云产品(ecs、rds等)指标接入链接应用层应用Trace业务代码集成(部分支持无侵入)支持常见语言SDKJava Trace接入(支持无侵入接入)Golang Trace接入Python Trace接入NodeJS Trace接入C# Trace接入Rust Trace接入Ruby Trace接入现有Trace集成配置即可接入OpenCensus Trace 数据接入 参考 链接Zipkin Trace数据接入 参考 链接SkyWalking Trace数据接入 参考 链接Jaeger Trace数据接入 参考 链接JVM指标监控配置即可接入配置方式参考 链接自定义指标开发接入/SLS数据加工/SLS ScheduleSQL支持使用Python、Java、Go等语言,向SLS MetricStore写入自定义的监控数据。 参考 链接业务层业务接入层分析配置即可接入Nginx访问日志分析 链接ALB访问日志分析 链接SLB访问日志分析 链接Kubernetes Ingress日志分析 链接自定义指标开发接入/SLS数据加工/SLS ScheduleSQL业务日志中的日志,通过计算转换为指标使用SLS数据加工转换日志为指标 链接部分监控效果展示k8s 接入Prometheus后指标查询展示k8s 接入Prometheus后使用Grafana查询k8s事件中心Redis监控云产品 - ecs指标导入SLB日志中心应用JVM监控应用Trace接入
阿里云Flowlog简介阿里云VPC 为云上的用户提供了网络流日志的能力,基于这份数据用户可以分析vpc网络中流量(5元组)走向、分析流量的成分(比如nat出口流量大、vpc间)、网络安全分析(acl策略是否合理、是否异常ip访问等)。SLS Flowlog日志中心简介SLS App是为了特定业务场景定制的垂直功能,入口就在sls.console.aliyun.com 控制台首页。阿里云VPC Flowlog 提供了这份数据是一个金矿,而SLS Flowlog App则为小白用户提供了一个掘金的能力,可以帮助用户在几个鼠标点击的情况下,轻松地完成流日志的流量走向、成分分析、安全策略、网络威胁等分析场景。下面介绍如何开通Flowlog,以及一键启用SLS Flowlog App启用SLS Flowlog日志中心Step 1. 开通VPC Flowlog(流日志)巧妇难为无米之炊,要使用SLS Flowlog日志中心,首先要开通VPC Flowlog,下面是开通步骤。VPC控制台提供了一键投递VPC Flowlog 的功能,详细步骤参考 链接 。注意,目前VPC Flowlog 流日志处于公测阶段,开通需要加白名单。在成功开通VPC Flowlog 后,将在对应的SLS Project下生成一个对应流日志的logstore。我们来看一下这个logstore包含哪些信息。从日志字段来看,主要包含了网络流的5元组信息:源地址、目标地址、源端口、目标端口、协议(tcp/udp/其他), 以及对应的vpc采样的节点信息(如ecs&对应的vpc信息)、对应的流量&是否被accpet or reject。 基于这些信息,可以进行大量的流量分析。接下来我们介绍使用SLS的Flowlog应用,一键开启多种分析报表,降低流日志分析的时间成本。Step 2. 开通SLS Flowlog App进入SLS 控制台首页,找到 应用-> Flowlog日志中心,点击进入进入Flowlog日志中心好,点击“添加”,然后将刚才的在弹出框里,点击“添加”,将刚才创建出来的VPC Floglog添加到这里。创建完成后,点击实例,即可进入Flowlog 分析页面使用SLS Flowlog日志中心场景1 - 总览VPC流量和策略主要包括vpc 流日中中的ACL策略情况: Accept、Reject的时序曲线,IN和OUT方向的流量曲线,以及访问城市来源。场景2 - 网络策略统计通过策略统计,可以看到Accept、Reject时间曲线的情况,并且针对Accept和Reject的都支持查询Top 100的明细。场景3 - 特定ENI网卡的流量分析ENI流量分析,提供了指定ENI流量趋势和明细Top 100的展示。场景4 - ECS间流量分析ECS间流量分析,提供了源ECS到目标ECS的流量趋势和5元组明细场景5 - 网段间的流量分析针对NAT出口流量分析,需要针对源和目标网段进行打标,打标将使用SLS 数据加工的功能,针对ip网段进行标识。 Flowlog 流量日志分析App集成了数据加工的功能,只要在App中进行网段设置,即可开启网段打标的功能,并支持自定义添加网段信息。在开启了网段设置->"域间分析"之后,,左侧会有域间流量的Tab,打开标签,即可分析网段之间的流量场景6 - NAT流量高分析NAT流量高同样需要开启网段设置,开启步骤如场景5。 在开启后,点击ECS到区间流量。 目标网段选择“其他”,源ECS选择对应的IP地址,即可看到网络流量的趋势和具体流量走向的Top10场景7 - 威胁情报基于阿里云威胁情报服务提供最近30天出现的威胁情报信息, 对ip地址进行全面扫描。 如果有安全风险的ip,会显示在威胁情报里。总结阿里云SLS Flowlog日志中心提供了一站式的流日志分析功能,可以方便地一键启用,对网络流日志进行多场景的分析。 目前已于7月初全网上线,欢迎各位使用,如有问题或建议,可以随时通过如下渠道联系我们。
使用数据加工将Log转成Metric云原生时代的可观察性我们关注应用运行起来后的运行时数据,主要有Log、Trace和Metric 这3大类。Log是离散的事件,Trace可以认为是带请求追踪的事件,Metric是带统计量的事件。本质上Log、Trace、Metric都是事件,存储上满足事件存储的系统都可以用来存储这3类数据。阿里云SLS为运行时数据提供了两种存储:Logstore和Metricstore。Logstore:适合存储Log和TraceMetricstore:适合存储MetricSLS Metricstore针对时序场景做了大量优化,提供PromQL查询能力,支持Prometheus协议。SLS Metricstore 详细介绍请参考官方链接, PromQL查询语言请参考官方链接Log转Metric很多应用的Log数据往往比Metric全面。 经常存在这样的场景: 把Log中的数据转换为Metric。前面提到,Metric可以认为是特定格式的Log,因此在SLS里可以将Log转换为Metric。常见的Log转Metric的方法可以有两种:聚合日志产生指标,类似sql做group by以后产生对应的统计值. 对应SLS ScheduleSQL功能将日志格式做格式转换,使其符合Metric格式. 对应SLS数据加工e_to_metric场景本文主要介绍第二种的场景,即日志按行处理转化为Metric的格式阿里云SLS 数据加工简介数据加工服务是SLS推出的面向日志行处理的服务,主要为日志的规整、过滤、富化等场景设计SLS数据加工DSL是专门为日志实时行处理定制的一套语言(类Python)。目前支持200+的行处理函数,可以参考官网文档本文主要介绍Log转Metric的函数 e_to_metricLog转Metric实战Step1 – 创建Metricstore首先来建一个Metricstore用于接受指标数据创建Metricstore,界面操作Grafana配置访问Metricstore, 以便使用Grafana查询Metricstore数据, 进入Grafana首页Configuration -> Data Sources -> Add Data Source, 选择Prometheus -> URL的组成格式如下https://${Endpoint}/prometheus/${Project}/${Metricstore}/ # Endpoint、Project、 Metricstore分别做相应替换Auth -> Basic auth要enable起来,Basic Auth Details输入阿里云AccesskeyID和AccesskeySecretMetricstore创建好了,那么如何向Metricstore写入指标数据呢?可以看到下面的格式来写入, 见文档 Metricstore格式可以看到,Metricstore要求数据写入必须符合一定的格式,对于Log格式转Metric格式的场景,可以使用数据加工函数e_to_metric来实现.接下来以Nginx日志中的request_time等指标为例,演示如何将Log转换成Metricstore的格式Step2 - 第一个Log转Metric任务先来看一下用于演示的Nginx日志, 我们的目标是将建立Nginx的request_time指标点开Nginx日志的logstore,进入查询分析页面后,可以看到“数据加工”的入口,点击进入看到数据加工IDE界面后,在IDE里编写DSL语句实现生成request_time指标数据加工实现日志转Metric主要由 e_to_metric 来实现, 函数参数要求如下,完整帮助参考 链接e_to_metric(names=None, labels=None, time=None) # names字段用于指定指标名称字段,指定该字段后指标的值也会取Log中该字段名的值 # labels字段用于指定指标label字段 # time字段不填,自动使用logstore中的__time__时间我们只需要建立一个指标叫request_time,并且指标取值也是request_time的值,因此加工语句如下e_to_metric(names="request_time")点一下快速预览,看一下效果可以看到生成了request_time指标,并且没有Label(后面有更多样例演示如何增加Label,我们先走通最简单的)保存加工任务, 存储目标的目标库请选择刚才第一步创建的MetricstoreStep3 – 查询Metricstore加工任务保存后,等几分钟后数据会写入Metricstore,然后可以在Grafana里查询Metric。输入PromQL查询,直接输入metricname即可查询request_timeLog转Metric - 更多样例带上Labele_to_metric(names="request_time",labels="slbid")将Log中的多个值转化为指标e_to_metric(names=["request_time","upstream_response_time"],labels="slbid")多个Labele_to_metric(names=["request_time","upstream_response_time"],labels=["slbid","scheme"])Metric重命名e_to_metric(names=[("request_time","rt"),"upstream_response_time"],labels=["slbid","scheme"])Label重命名e_to_metric(names=[("request_time","rt"),"upstream_response_time"],labels=["slbid",("scheme","http_type")])小结本文通过数据加工的e_to_metric函数演示了如何将Log转化成Metric, 希望对看官的可观察性场景有帮助。SLS提供了可观察性的整体方案,积极跟进OpenTelemetry标准,有任何问题欢迎和我们交流。
概述 游戏行业的日志诉求 如果说今天的游戏是一个数据驱动的行业,一点也不会错。我们来看一下游戏公司不同的角色面对不同问题的时候,如何使用数据来解决问题。 可以看出数据是以上岗位运作的关键要素。 数据从哪里来? 日志类型 设备 主要场景 客户端操作日志 手机、PC、网页 运营、客服、决策 客户端运行日志和指标 手机、PC、网页 开发运维 服务端请求日志 服务器 运营、客服、决策 服务端运行日志 服务器 开发运维 可以看到,游戏数据的完整,需要全方位的日志采集(从客户端到服务器),随着规模、体量的挑战; 同时日志还需要面对今天数据仓库、数据湖的解决方案。让日志数据分析的整体方案复杂度较高。 随着游戏国际化的推进,日志往往存储在不同的地区,让游戏日志分析使用产生了更多的挑战。因为本身将基于SLS(阿里云日志服务)介绍游戏场景全球日志规划部署方案。 阿里云SLS的解决方案 阿里云SLS为日志场景提供整套的完整解决方案 游戏日志采集 基础概念 概念 说明 Project SLS里对资源的组织单位,类似mysql的db Logstore SLS里日志存储的单元,类似mysql的table iLogtail SLS提供的自主研发的高性能日志采集工具,支持Linux/Windows Loghub SLS服务端组件,提供日志存储和订阅能力,类似Kalfka 一般游戏Project Logstore规划 从业务属性来看有哪些日志 用户游戏过程中的行为日志用户注册、登陆、购买、退出的日志用户广告点击日志手机端的程序异常日志(崩溃、卡顿等日志) 从采集视角 Client端(iOS、Android、Web)服务端 Project建议:根据业务主题,建立相应的Project。例如 用户相关的建立一个Project开发运维相关的建立一个Project Logstore建议:根据不同的端+业务属性来建Logstore,例如 iOS端、Androind、网页端建不同的Logstore 游戏客户端采集 端SDK埋点 -> SLS 客户端直接SDK写入方法: 移动端:可以使用移动端 SDK IOS, Android 接入。ARM 设备:ARM 平台可以使用 Native C 交叉编译。H5网页端,直接使用Webtracking API 方式写入日志服务 参考链接 客户端埋点的方式是在游戏开发阶段需要介入,一旦使用SDK完成埋点,就可以方便地使用SLS服务 端->服务器日志- > SLS 如果游戏已经大量发行,并且已经有自定义API上传日志到服务器端。 这个情况下,适合直接使用 SLS的iLogtail采集服务端的文件然后再使用SLS服务,iLogtail介绍参考 链接 小结 方案比较 端SDK->SLS 端->服务器日志->SLS 开发量 客户端集成SLS SDK 需要开发采集程序客户端+服务端 成本 SLS使用费用 webserver机器成本+SLS使用费用 稳定性/性能 SLS服务能力保障 见说明1 需要保障端->服务器上传稳定性 综合推荐使用“端SDK->SLS”的方案,让游戏开发更专注关注业务本身。 说明1: 对于SDK端写入默认有QPS限制,针对海量高并发写入的场景,请提交工单联系我们 读写限制见 链接 游戏服务端采集 iLogtail 游戏服务端日志采集支持的文件格式 iLogtail支持任意文本文件的采集,并且能够很好适配以下场景 极简模式,支持任意格式 链接Json格式日志Java日志多行采集(设定好行首即可实现,适用Java堆栈、日志换行打印的情况)Apache、Nginx、iis访问日志可以完整正则匹配的日志 ECS云服务器、传统IDC以及其他云厂商主机(Windows、Linux) 如果是阿里云的ECS服务器,默认已经安装iLogtail了,可以直接使用。如果发现没有安装可以参考 链接 如果是自建IDC的服务器,可以参考我们iLogtail的安装方法进行安装 Linux主机 安装参考链接Windows主机 安装参考 链接 云原生K8S集群 随着云原生的浪潮,很多游戏服务端也可以尝试云原生的部署方式。 针对K8S的场景,SLS的iLogtail也有完整的云原生解决方案。 阿里云ACK 独享模式 参考 链接阿里云ACK Servless模式 SideCar方式 参考 链接自建K8S 安装iLogtail方式 链接 iLogtail在云原生场景下,除了支持采集普通文件外,还支持采集标准输出,只要做好相应配置即可 参考 链接 普通Docker容器的采集方式 如果我们的游戏服务端没有使用k8s等容器调度编排。iLogtail也可以直接采集容器日志 参考 链接 服务端SDK写入方式 SLS支持主流语言的SDK,使用SDK可以很方便地往SLS写入数据 Java SDKPython SDK.NET SDK.NET Core SDKNode.js SDKPHP SDKGo SDKC SDK 阿里云产品日志采集 如果游戏服务端使用了阿里云的产品,日志服务也可以直接采集阿里云服务的日志到自己的Project 阿里云OSS访问日志CDN访问日志阿里云NAS访问日志阿里云DDOS高防日志阿里云DDOS高防日志(新BGP)云安全中心日志WAF日志云防火墙日志风险识别日志数据库审计日志负载均衡7层访问日志VPC流日志弹性公网IP日志API网关访问日志ActionTrail日志操作平台日志PolorDB-x 1.0 SQL审计日志RDS SQL审计日志Redis日志MongoDB日志短信日志MNS操作日志IoT日志移动数据分析日志爬虫风险管理日志安骑士日志友盟日志CSB微服务网关 游戏日志中心化 日志中心化的挑战 游戏服务端往往按不同区域分布,从上图看到出海游戏的营收在增长,越来越多的游戏在走出国门。 而游戏对应的日志日志更加呈现出跨区域割裂的状态。真实的部署形态往往是这样的 而面对游戏数据分析的需求,往往是希望日志是中心化的。 日志中心化主要的挑战是网络传输的稳定性,国际带宽往往存在速度和稳定性的问题,因此游戏日志的中心化,需要传输在网络层面做诸多优化 方案1 iLogtail配置公网跨Region传输 iLogtail支持配置公网传输,并且在网络质量较差的情况下,进行重试。iLogtail配置公网传输存在的一个风险是当网络质量持续较差的情况下,iLogtail会持续重试传输日志,而这个过程中如果日志文件被rotate掉的话,那么这部分被rotate掉但未被iLogtail采集到服务端的日志就永远不会被采集到了。 方案2 使用SLS数据加工集中采集(推荐) 目前比较推荐的日志中心化的方案是通过数据加工来做跨Region的中心化采集,SLS数据加工简介 -> 链接 SLS数据加工提供了对日志数据进行行处理的强大能力,目前有200+的函数(函数总览 链接),数据加工除了提供了丰富的行处理函数,还支持跨Region的数据传输,并且对跨Reion网络质量较差的情况进行了优化 SLS数据加工跨Region传输日志配置方法参考 链接 方案对比 小结 目前日志中心化比较成熟的方式是使用 数据加工的跨Region传输方案,可以有效避免在网络质量较差的情况下日志轮转导致的损失。并且在跨Region传输前,进行日志加工处理。 游戏日志规整和加工处理 数据规整&加工处理 由于游戏开发阶段没有充分考虑到后续数据分析的需求,导致日志采集后要做相应的处理。举个例子,日志先从端手机到logstore,然后再做一些解析处理好复杂的结构,再根据字段判断做分发,到不同的logstore里。 一个实际的场景,我们采集上来的日志是一串json格式的字符串 使用加工语句 e_json("data", fmt="parent") # 丢弃原字段 e_drop_fields("data", regex=False) 输出结果,可以看到经过json抽取,字段已经抽取到第一级 数据加工功能提供了编程级的支持,在日志行处理方面非常方便,有200+的算子支持 函数概览流程控制函数事件操作函数字段操作函数字段赋值函数字段值提取函数映射富化函数任务配置函数函数概览事件检查函数操作符函数转换函数算术函数字符串函数日期时间函数正则表达式函数GROK函数特定结构函数编码解码函数解析函数列表函数字典函数表格函数资源函数 游戏数据分析与可视化 索引查询&SQL分析 SLS除了提供日志存储外,还提供强大的索引和SQL查询能力。 举个例子,客服场景,需要通过日志查询某个用户的操作 以用户在游戏里的动作为例,前面通过e_json抽取已经把日志抽取出来了。我们可以对数据加工输出的logstore建立字段索引,方便进行查询 通过指定 key: value的方式,快速查询某个用户uid的操作记录 * and data.userId: 1049 通过使用管道符|,在索引查询之后可以使用sql进行进一步的过滤查询 * and data.userId: 1049 | select "data.map_x","data.mapY","data.action" from log limit 10 SLS除了提供基础的功能外,还支持使用SQL来查询分析日志,参考 通用聚合函数安全检测函数Map映射函数估算函数数学统计函数数学计算函数字符串函数日期和时间函数URL函数正则式函数JSON函数类型转换函数IP地理函数GROUP BY语法窗口函数HAVING语法ORDER BY语法LIMIT语法CASE WHEN和IF嵌套子查询数组二进制函数位运算同比和环比函数比较运算符Lambda函数逻辑函数列的别名MySQL外表关联空间几何函数地理函数Join语法unnest语法insert语法电话号码函数 可视化报表 SLS 同样支持丰富的可视化图表通过使用这些图表,可以一站式地完整分析+报表展示的功能 继续上面的例子,我们想统计指定UserId一段时间的操作次数,形成饼图,可以这样写 * and data.userId: 1089 | select "data.action", count(*) as c from log group by "data.action" 除了提供了饼图以外,还有更多的组件可以帮助做可视化。 表格线图柱状图条形图饼图变更图气泡图时间轴地图流图桑基图词云中国行政区地图 游戏日志实时消费与投递(数据湖) 实时消费 目前日志消费支持主流的计算引擎(Flink、Spark、Strorm、阿里云流计算等), 同时对于轻量级的场景,也直接使用sdk来进行数据实时消费。 投递到传统数据仓库、数据湖 投递到MaxCompute数据仓库 参考 链接投递到AnalyticDB 参考 链接投递到OSS数据湖 格式 参考链接 JSON格式 https://help.aliyun.com/document_detail/52797.html CSV格式 https://help.aliyun.com/document_detail/55404.html Parquet格式 https://help.aliyun.com/document_detail/52798.html 总结 本文主要围绕游戏场景,介绍了SLS(日志服务)整体的游戏日志采集、规整、分析、可视化以及数据仓库建设的整体解决方案,希望对看官有帮助。如果对SLS有疑问欢迎加钉钉群或者提工单咨询。
数据加工简介 数据加工是阿里云SLS推出的一项Serverless的功能,主要解决日志行实时处理的场景,目前提供了200+的DSL算子。 详细的加工介绍请参考https://help.aliyun.com/document_detail/125384.html Logstore日志流转常见的场景 日志流转案例 - logstore日志字段过滤复制 案例 A部门有一份敏感日志,由于业务需要, B部门需要访问A部门的日志中的部分字段。为了安全起见,A部门可以使用数据加工实现Logstore对拷, 并过滤掉敏感字段,并且使用RAM授权的方式,给B部门授权 解决方案 使用数据加工 一对一拷贝的功能,并且使用DSL语句进行一定字段的过滤 加工语句范例 e_keep_fields("filed1","field2",regex=False) 日志流转案例 - 多种格式揉杂的logstore,日志拆分 案例 服务A有一份日志,应用程序打的日志格式并不统一。当有关键词xx的时候,具备格式 x当有关键词yy的时候,具备格式 y由于格式差异较大,冗杂在一个logstore里不利于搜索查询; 比如最后需要投递到oss数据湖进行进一步查询分析 解决方案 使用数据加工一对多的分发能力可以解决以上问题 加工语句范例 e_if(e_match("http_code", "500"), e_output(name="logstore1")) e_if(e_match("http_code", "200"), e_output(name="logstore2")) e_drop() 日志流转案例 - 跨Region复制 案例 公司的业务在各个Region都有部署,查询logstore的时候,需要到不同Project下进行查询,给开发运维带来不便。使用数据加工将logstore 跨Region写出到中心化的logstore 解决方案 使用数据加工跨Region传输的能力,进行多对一的logstore复制 加工语句范例 加工语句直接为空,配置时设定好目标logstore即可 小结 使用数据加工对logstore进行数据流转,具备以下几点能力(可根据业务场景进行任意组合) 支持流转时数据处理(转化、过滤、富化等,200+DSL函数) 支持一对一、一对多、多对一进行流转 支持同一个账号、跨账号的场景 支持同Region、跨Region的场景 支持一次性 数据服务, 也支持流式持续复制 参考 sls数据加工 http://help.aliyun.com/document_detail/125384.html
数据加工 数据加工是SLS(日志服务)推出的一项功能,面向日志实时行处理,目前提供了200+的DSL算子 链接今天给大家介绍的功能是数据加工-跨Region传输的功能 使用场景 当我们的业务分布在不同的Region,日志会分布在不同的Region,当需要对不同Region的日志进行集中管理就会遇到一定的麻烦。那么通过SLS数据加工-跨Region传输的功能,可以很好地解决这样的问题。 跨Region传输使用方法 Step1. 打开logstore的数据加工 Step2. 编写DSL(如果是复制的话,DSL语句为空),编写完后,点击 预览数据进入下一步 Step3. 保存数据加工 Step4. 填写Output 表单, 填写目标Region Step 5. 点击“确定” 按钮完成数据加工任务配置 Step 6. 检查对端logstore能否收到数据 FAQ 如何收费? 1.按照传输的压缩流量计费。比如10MB的数据,如果按照1:10的压缩比,那么会产生1MB的传输流量(按这个计费) 。具体计费参考 链接 如何提高传输压缩率? 1.对于webtracking的场景,建议对__topic__、__tag__: 、__source__进行处理,减少传输发送次数,提升压缩率, 原因是发送日志数据的时候,组织的单位是一个Loggroup,如果有多种__source__、__topic__、__tag__:组合的话,会产生多个LogGroup从而降低压缩率 网络不稳定怎么办? 1.跨Region传输依赖公网网络环境,如果是跨境传输的话,网络稳定性不一定保证,加工作业会自动做重试2.如果想提升传输的网络质量,可以启用DCDN加速方案 DCDN启用帮助文档:https://help.aliyun.com/document_detail/86819.htmlDCDN配置完成后,在创建加工任务里可以勾选“DCDN”,即可使用DCDN网络进行加速
数据加工服务简介 数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。 接下来,我们以nginx日志解析为例, 帮助大家快速入门阿里云日志服务的数据加工。 用于实验的Nginx日志 假设我们通过极简模式采集了Nginx默认日志。默认的nginx 日志format如下 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 通过使用极简模式采集Nginx日志,样例如下: 数据加工交互界面 点击 准备数据加工的Logstore,在查询栏的上方,有一个“数据加工”的开关,打开 数据加工的代码编辑、预览、发布相关界面如下图: 一般情况下,我们都可以使用快速预览模式,如果我们的数据加工涉及到使用mysql、oss等维表,可以使用高级预览做实际预览测试。 对Nginx日志进行数据加工 (Step by Step) Step1. 使用正则抽取基础字段 对于极简模式采集的日志,内容都在一个字段叫content的字段里,不利于我们做分析。可以通过数据加工正则函数,抽取nginx日志里的字段,使用到的加工函数如下: # 用于将源字段里的内容,通过正则捕获组抽取出对应的字段 e_regex("源字段", "正则或有命名捕获正则", "目标字段名或数组(可选)") 针对Nginx日志,使用以下语句进行正则抽取 # 通用字段抽取 e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-\+]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"') 通过正则抽取以后,可以看到日志的字段增加了refer、remote_addr、remote_user、request等字段。 Step2. 处理时间字段 当前提取到的localtime不易读,我们把它解析成易读的格式,会用到的以下数据加工函数: # 用于设置字段值 e_set("字段名", "固定值或表达式函数") # 将时间字符串解析为日期时间对象 dt_strptime('值如v("字段名")', "格式化字符串") # 将日期时间对象按照指定格式转换为字符串 dt_strftime(日期时间表达式, "格式化字符串") 实现思路,先通过 dt_strptime 将local_time的时间转化为日期时间对象,然后再通过dt_strftime将日期时间对象转化为标准的日期时间字符串。 针对Nginx local_time的转化,使用如下数据加工语句: e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S %z"),"%Y-%m-%d %H:%M:%S")) 实现效果如下: Step3. 解析request uri 可以看到request字段由 METHOD URI VERSION组成,我们希望对 requst字段进行抽取,获取到请求的METHOD、URI以及VERSION,并且将请求URI中的请求的参数变成字段,方便后续进行查询。可以用以下函数来做实现 # 使用正则将request uri抽取 e_regex("源字段名", "正则或有命名捕获正则", "目标字段名或数组(可选)", mode="fill-auto") # 进行urldecode url_decoding('值如v("字段名")’) # 设置字段值 e_set("字段名", "固定值或表达式函数", ..., mode="overwrite") # 将request_uri中的key=value的组合抽取成字段 值的模式 e_kv("源字段正则或列表", sep="=", prefix="") 实现语句 e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)") e_set("request_uri", url_decoding(v("request_uri"))) e_kv("request_uri", prefix="uri_") 实现效果 Step4. http code状态码映射 每一个http状态码都代表了不同的含义,下面是一份http状态码的映射表, 我们可以通过e_table_map 函数来将状态码的信息扩展到我们的日志字段中,方便后续做统计分析。 涉及到的数据加工函数如下: # 用来做字段富化,类似sql里join的功能 e_table_map("表格如通过tab_parse_csv(...)解析得到的", "源字段列表或映射列表如[('f1', 'f1_new'), ('f2', 'f2_new')]", "目标字段列表") # 用来把csv文件解析成table对象 tab_parse_csv(CSV文本数据, sep=',', quote='"') # code的映射关系维度表是一个csv文件,存在oss上,使用res_oss_file res_oss_file(endpoint="OSS的endpoint", ak_id="OSS的AK_ID", ak_key="OSS的AK_KEY", bucket="OSS的bucket", file="在OSS中存的文件地址", change_detect_interval="定时更新时间,默认为0") 实际使用到的DSL语句如下 # http状态码映射 e_table_map( tab_parse_csv( res_oss_file(endpoint="oss-cn-shanghai.aliyuncs.com", ak_id='',ak_key='', bucket="etl-test", file="http_code.csv", format='text')), [("status","code")], [("alias","http_code_alias"), ("description","http_code_desc"), ("category","http_code_category")]) 看一下映射后的效果 Step5. 通过UserAgent判断客户端操作系统 我们想了解客户用的是什么os版本,可以通过user agent里的字段用正则匹配来判断,用到dsl语句 # 取某个字段的值 v("字段名") # 获取ua相关信息 ua_parse_all("带useragent信息的内容") # 展开json字段, 因为ua_parse_all得到的是一个json对象,为了展开到一级字段使用e_json做展开 # 模式有 simple、full、parent、root 参考https://help.aliyun.com/document_detail/125488.html#section-o7x-7rl-2qh e_json("源字段名", fmt="模式", sep="字段分隔符") # 丢弃临时产生的字段 e_drop_fields("字段1", "字段2") 用到的dsl语句 # 通过User Agent解析获得客户端信息 e_set("ua",ua_parse_all(v("http_user_agent"))) e_json("ua", fmt='full',sep='_') e_drop_fields("ua",regex=False) 加工效果 Step6. 非200的日志投递到指定logstore 可以使用e_output函数来做日志投递,用regex_match做字段匹配 # 条件判断if e_if("条件1如e_match(...)", "操作1如e_regex(...)", "条件2", "操作2", ....) # 判断是否相等 op_ne(v("字段名1"), v("字段名2")) # output发送到目标名称,目标名称在数据加工保存任务的时候配置对应的logstore信息 e_output(name="指定的目标名称") 实际的dsl语句 # 分发非200的日志 e_if(op_ne(v("http_code_alias"),"2xx"), e_output(name="nginx-log-bad")) 在预览里看到这个效果。(保存加工的时候,需要设置好对应project、logstore的ak信息) 完整的DSL代码以及上线流程 好了,通过一步一步的开发调试,现得到完整的DSL代码如下 # 通用字段抽取 e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"') # 设置localttime e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S"),"%Y-%m-%d %H:%M:%S")) # uri字段抽取 e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)") e_set("request_uri", url_decoding(v("request_uri"))) e_kv("request_uri", prefix="uri_") # http状态码映射 e_table_map( tab_parse_csv( res_oss_file(endpoint="oss-cn-shanghai.aliyuncs.com", ak_id='',ak_key='', bucket="etl-test", file="http_code.csv", format='text')), [("status","code")], [("alias","http_code_alias"), ("description","http_code_desc"), ("category","http_code_category")]) # 通过User Agent解析获得客户端信息 e_set("ua",ua_parse_all(v("http_user_agent"))) e_json("ua", fmt='full',sep='_') e_drop_fields("ua",regex=False) # 分发非200的日志 e_if(op_ne(v("http_code_alias"),"2xx"), e_coutput(name="nginx-log-bad")) 在页面提交代码以后,保存数据加工 配置目标logstore信息,默认走完加工逻辑的日志都会发送到第一个目标logstore,我们在代码里指定了e_output到指定logstore,因此还需要第二个目标,并且目标的名字和e_output里指定的目标名称一致。 保存完即完成上线,可以在数据处理-加工下看到该任务,点击进去可以看到加工延迟等信息。 Nginx日志查询、可视化、报警 查询 假设,我们想对nginx异常的日志进行查询,以便做问题定位。我们可以针对需要查询的字段开启索引 开启索引可以使用“自动生成索引”来自动帮助生成字段索引列表(否则需要手工填写字段) 点击确定后,即完成索引配置。比如我们要查询 uri_item_name参数值为“测试商品_89”的错误情况,可以使用这样的query * and uri_item_name : 测试商品_89 可视化 我们关心每个请求的http请求是否成功,对于异常状态码,想做相应的统计,以方便我们做问题发现。 可以使用如下query统计 nginx-log-bad(非2xx类请求的logstore)状态码分布 * | select http_code_alias,count(*) as c from log where http_code_alias is not null group by http_code_alias order by c 使用饼图做可视化 点击,“添加到仪表盘”,即可完成仪表盘的创建 添加完成后,在左侧仪表盘就 报警 针对非2xx的状态码,我们不仅要做可视化,还需要对它进行报警。 可以在刚才创建的仪表盘里,点击“告警->创建”,根据提示创建相应的告警规则。 总结 本次训练营,以最常见的Nginx日志作为例,介绍数据加工在日志的转化、处理、富化、转发等场景下相关的算子使用,帮助大家入门SLS的数据加工。除了文中提到的算子,数据加工还有200+的算子以支持更多的日志处理的场景,相关内容可以参考如下: a) SLS数据加工整体简介:https://help.aliyun.com/document_detail/125384.html b) SLS数据加工函数总览:https://help.aliyun.com/document_detail/159702.html 在数据加工之后,针对相关字段建立索引,可以方便地对日志内容进行各种场景的分析,并且针对有需要的场景设置对应的报警,提升系统的稳定性。
数据加工介绍 数据加工是阿里云日志服务推出的一项功能,用于对结构化或非结构化日志进行实时ETL行处理。目前该功能包含了200+的算子,本文从富化场景出发,介绍如何在数据加工过程中使用富化函数。PS: 我们这里讲的富化,对应的是SQL ETL场景的join 数据加工的入口:打开sls日志服务,选择相关logstore的查询页面后,可以看到有一个 “数据加工”的开关,打开这个开关就可以写数据加工的代码了。数据加工函数总览:http://help.aliyun.com/document_detail/159702.html 场景设定 本文以Nginx日志 http code富化为例抛砖引玉,帮助大家熟悉数据加工中的日志富化方法http返回码在访问日志中比较常见,将返回码富化,可以让我们更直观地看到每个请求的状态,做更多统计工作。 下面是常见的http code码含义的映射表 使用数据加工 进行日志富化 方式1 - 使用res_local 高级参数 假设,我们富化的数据是一个csv 保存了code的映射关系 code,alias,category,description 100,1xx,Informational,Continue 101,1xx,Informational,Switching Protocols ... 将code的映射关系保存为数据加工的高级参数,key为 http_code, 值为csv文件内容 e_table_map(tab_parse_csv("code,alias,category,description\n100,1xx,Informational,Continue\n101,1xx,Informational,Switching Protocols\n102,1xx,Informational,Processing (WebDAV)\n200,2xx,Success,OK\n201,2xx,Success,Created\n202,2xx,Success,Accepted\n203,2xx,Success,Non-Authoritative Information\n204,2xx,Success,No Content\n205,2xx,Success,Reset Content\n206,2xx,Success,Partial Content\n207,2xx,Success,Multi-Status (WebDAV)\n208,2xx,Success,Already Reported (WebDAV)\n226,2xx,Success,IM Used\n300,3xx,Redirection,Multiple Choices\n301,3xx,Redirection,Moved Permanently\n302,3xx,Redirection,Found\n303,3xx,Redirection,See Other\n304,3xx,Redirection,Not Modified\n305,3xx,Redirection,Use Proxy\n306,3xx,Redirection,(Unused)\n307,3xx,Redirection,Temporary Redirect\n308,3xx,Redirection,Permanent Redirect (experimental)\n400,4xx,Client Error,Bad Request\n401,4xx,Client Error,Unauthorized\n402,4xx,Client Error,Payment Required\n403,4xx,Client Error,Forbidden\n404,4xx,Client Error,Not Found\n405,4xx,Client Error,Method Not Allowed\n406,4xx,Client Error,Not Acceptable\n407,4xx,Client Error,Proxy Authentication Required\n408,4xx,Client Error,Request Timeout\n409,4xx,Client Error,Conflict\n410,4xx,Client Error,Gone\n411,4xx,Client Error,Length Required\n412,4xx,Client Error,Precondition Failed\n413,4xx,Client Error,Request Entity Too Large\n414,4xx,Client Error,Request-URI Too Long\n415,4xx,Client Error,Unsupported Media Type\n416,4xx,Client Error,Requested Range Not Satisfiable\n417,4xx,Client Error,Expectation Failed\n418,4xx,Client Error,I'm a teapot (RFC 2324)\n420,4xx,Client Error,Enhance Your Calm (Twitter)\n422,4xx,Client Error,Unprocessable Entity (WebDAV)\n423,4xx,Client Error,Locked (WebDAV)\n424,4xx,Client Error,Failed Dependency (WebDAV)\n425,4xx,Client Error,Reserved for WebDAV\n426,4xx,Client Error,Upgrade Required\n428,4xx,Client Error,Precondition Required\n429,4xx,Client Error,Too Many Requests\n431,4xx,Client Error,Request Header Fields Too Large\n444,4xx,Client Error,No Response (Nginx)\n449,4xx,Client Error,Retry With (Microsoft)\n450,4xx,Client Error,Blocked by Windows Parental Controls (Microsoft)\n451,4xx,Client Error,Unavailable For Legal Reasons\n499,4xx,Client Error,Client Closed Request (Nginx)\n500,5xx,Server Error,Internal Server Error\n501,5xx,Server Error,Not Implemented\n502,5xx,Server Error,Bad Gateway\n503,5xx,Server Error,Service Unavailable\n504,5xx,Server Error,Gateway Timeout\n505,5xx,Server Error,HTTP Version Not Supported\n506,5xx,Server Error,Variant Also Negotiates (Experimental)\n507,5xx,Server Error,Insufficient Storage (WebDAV)\n508,5xx,Server Error,Loop Detected (WebDAV)\n509,5xx,Server Error,Bandwidth Limit Exceeded (Apache)\n510,5xx,Server Error,Not Extended\n511,5xx,Server Error,Network Authentication Required\n598,5xx,Server Error,Network read timeout error\n599,5xx,Server Error,Network connect timeout error\n"), [("http_code","code")], [("alias","http_code_alias"), ("description","http_code_desc"), ("category","http_code_category")]) 效果: 方式2 - 通过使用OSS文件实现富化 假设,我们的http code映射关系存在一个文件里。格式如下: code,alias,category,description 100,1xx,Informational,Continue 101,1xx,Informational,Switching Protocols ... 上传 http_code.csv文件到oss打开OSS控制台 http://oss.console.aliyun.com 找到已有的bucket或者新建一个bucket,根据控制台指引上传文件 使用加工,富化 e_table_map( tab_parse_csv( res_oss_file(endpoint="oss-cn-shanghai-internal.aliyuncs.com", ak_id=res_local("AK_ID"), ak_key=res_local("AK_KEY"), bucket="ali-sls-etl-test", file="http_code.csv", format='text')), [("http_code","code")], [("alias","http_code_alias"), ("description","http_code_desc"), ("category","http_code_category")]) res_local 引用的值需要在高级参数里定义。 效果: 方式3 - 通过MySQL 表实现富化 假设,我们的http_code映射关系存在一个mysql表里 使用加工,富化 e_table_map(res_rds_mysql(address="MySQL主机地址", username="用户名", password="密码", database="数据库",table="表名", refresh_interval=300), [("http_code","code")], [("alias","http_code_alias"), ("description","http_code_desc"), ("category","http_code_category")]) 注意: 数据加工支持vpc方法方式rds,配置vpc打通可以参考:https://help.aliyun.com/document_detail/162753.html效果: 总结 整体流程 方法比较 限制:所有维表限制在2G 参考材料 https://help.aliyun.com/document_detail/125489.html 富化函数https://help.aliyun.com/document_detail/129401.html 资源函数https://www.restapitutorial.com/httpstatuscodes.html http code码
数据加工服务简介 数据加工服务是阿里云日志服务推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。 数据加工服务集成在日志服务里。数据加工支持的常见场景: 数据分发场景 数据规整(一对一) 数据分派(一对多) 接下来,我们以nginx日志解析为例,抛砖引玉,帮助大家快速入门阿里云日志服务的数据加工。 用于解析的Nginx日志 假设我们通过极简模式采集了Nginx默认日志。默认的nginx 日志format如下 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 机器上看到日志是这样的 使用阿里云日志服务采集极简日志如下 控制台启用数据加工 控制台打开“数据加工”按钮,然后在输入框里输入DSL语句,点击预览数据即可看到数据加工的效果。 字段正则抽取 通过正则,抽取nginx日志里的字段,这里可以用到正则的捕获组名称设置变量名称 e_regex("源字段名", "正则或有命名捕获正则", "目标字段名或数组(可选)", mode="fill-auto") 推荐一个正则编写辅助工具: https://regex101.com/ 实际使用DSL语句 e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"') 时间字段处理 默认格式的localtime不易读,我们把它解析成易读的格式 用到的dsl语句,通过dsl e_set("字段名", "固定值或表达式函数", ..., mode="overwrite") dt_strftime(日期时间表达式, "格式化字符串") dt_strptime('值如v("字段名")', "格式化字符串") 实际使用的dsl语句 e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S %z"),"%Y-%m-%d %H:%M:%S")) Request URI解析 接下来,我们希望对 requst字段进行抽取,我们看到request 字段是由 HTTP_METHOD URI HTTP版本组成的。我们可以用以下函数来做实现 e_regex("源字段名", "正则或有命名捕获正则", "目标字段名或数组(可选)", mode="fill-auto") # 进行urldecode url_decoding('值如v("字段名")’) # 设置字段值 e_set("字段名", "固定值或表达式函数", ..., mode="overwrite") e_kv 将request url中的key value键值对进行抽取 实现语句 e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)") e_set("request_uri", url_decoding(v("request_uri"))) e_kv("request_uri") 实现效果 HTTP Code状态码映射 如果我们想把http code映射出具体的code描述信息,比如我想把404 映射为not found,可以用e_dict_map函数 e_dict_map(“字典如{‘k1’:‘v1’, ‘k2’:‘v2’}”, “源字段正则或列表”, “目标字段名”) 用到的DSL,如果有key match不到,就会使用*这个key对应的值 e_dict_map({'200':'OK', '304' : '304 Not Modified', '400':'Bad Request', '401':'Unauthorized', '403':'Forbidden', '404':'Not Found', '500':'Internal Server Error', '*':'unknown'}, "status", "status_desc") 效果 通过User Agent判断客户端操作系统 如果我们想了解客户用的是什么os版本,可以通过user agent里的字段用正则匹配来判断,用到dsl语句 e_switch("条件1e_match(...)", "操作1如e_regex(...)", "条件2", "操作2", ..., default="可选无匹配时的操作") regex_match('值如v("字段名")', r"正则表达式", full=False) e_set("字段名", "固定值或表达式函数", ..., mode="overwrite") 用到的dsl语句 e_switch(regex_match(v("content"), "Mac"), e_set("os", "osx"), regex_match(v("content"), "Linux"), e_set("os", "linux"), regex_match(v("content"), "Windows"), e_set("os", "windows"), default=e_set("os", "unknown") ) 效果 4xx的日志单独投递到指定logstore 可以使用e_output函数来做日志投递,用regex_match做字段匹配 regex_match('值如v("字段名")', r"正则表达式", full=False) e_output(name=None, project=None, logstore=None, topic=None, source=None, tags=None) e_if("条件1如e_match(...)", "操作1如e_regex(...)", "条件2", "操作2", ....) 实际的dsl语句 e_if(regex_match(v("status"),"^4.*"), e_output(name="logstore_4xx", project="dashboard-demo", logstore="dsl-nginx-out-4xx")) 在预览里看到这个效果。(保存加工的时候,需要设置好对应project、logstore的ak信息) 完整的DSL代码以及上线流程 完整的DSL代码 # 通用字段抽取 e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"') # 设置localttime e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S %z"),"%Y-%m-%d %H:%M:%S")) # uri字段抽取 e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)") e_set("request_uri", url_decoding(v("request_uri"))) e_kv("request_uri") # http code映射 e_dict_map({'200':'OK', '304':'304 Not Modified', '400':'Bad Request', '401':'Unauthorized', '403':'Forbidden', '404':'Not Found', '500':'Internal Server Error', '*':'unknown'}, "status", "status_desc") # user agent 字段判断 e_switch(regex_match(v("content"), "Mac"), e_set("os", "osx"), regex_match(v("content"), "Linux"), e_set("os", "linux"), regex_match(v("content"), "Windows"), e_set("os", "windows"), default=e_set("os", "unknown") ) # logstore单独投递 e_if(regex_match(v("status"),"^4.*"), e_output(name="logstore_4xx", project="dashboard-demo", logstore="dsl-nginx-out-4xx")) 在页面提交代码以后,保存数据加工 配置目标logstore信息。如果有e_output的话,需要设置对应额外的存储目标名称、project、logstore需要和代码里一致 保存完即完成上线,可以在数据处理-加工下看到该任务,点击进去可以看到加工延迟等信息。如果需要进行修改,也可以通过该入口进入修改。 参考 https://help.aliyun.com/document_detail/125384.html 【阿里云日志服务- 数据加工简介】 https://help.aliyun.com/document_detail/159702.html 【阿里云日志服务-数据加工函数总览】
2022年05月
2021年08月
2020年10月
2020年09月
2020年08月
2020年07月