利用阿里云Eventbridge在CDN边缘应用程序中访问日志服务SLS

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在Web前端领域,追求极致性能是个永恒的话题。这些年的一些新兴理念都是为了提升站点访问性能而提出,无论是Jamstack技术理念或者或者 ESR (边缘渲染),都是Client侧进行性能优化的基础上,进一步拓展到了网络Infra层面,就是我们现在经常讨论的边缘计算。而阿里云的CDN EdgeRoutine 就是为广大客户提供可自由编程的边缘计算能力,我们可以用他来构建边缘节点的网关应用,来访问静态资源或者后端服务。当这个边缘网关在业务上承担的角色越来越重要的时候,我们就对他内部的业务逻辑产生了可观测的诉求,希望能够记录日志到日志服务上,然而日志服务提供的SDK,在ER的环境中暂时不被支持,这个

相关概念

EdgeRoutine (以下简称er)阿里云边缘程序,是阿里云CDN推出的边缘Serverless计算环境。针对CDN场景,通过ER可在CDN边缘节点执行您自行编写的JavaScript代码。您无需关心代码部署的机器硬件配置、部署region、调度和弹性扩容。ER代码一经上传,即可完成全球阿里云CDN节点的部署,在全球边缘执行,根据您的代码逻辑个性化处理全球各地的请求。

事件总线 EventBridge (以下简称eb)是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS应用以标准化、中心化的方式接入,并能够以标准化的 CloudEvents 1.0 协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。

日志服务SLS(以下简称sls) 是云原生观测分析平台,为Log/Metric/Trace等数据提供大规模、低成本、实时平台化服务。一站式提供数据采集、加工、分析、告警可视化与投递功能,全面提升研发、运维、运营和安全等场景数字化能力。

一图说明

简单来说,我们只需要在eb程序中用原生fetch方法, 向由eb创建的endpoint发起请求即可,其余的都交给eb转发给sls。

操作步骤

  1. 开通EB并且创建一条自定义总线
  2. 在自定义总线中创建 HTTP/HTTPS触发的事件源
  3. 创建一个可以处理这个http事件源的事件规则
  4. 选择“日志服务”的事件目标,(需要提前准备好相同region 下的sls project 和logstore)

需要特别注意的是,刚eb需要你提供一个授权角色来对sls进行操作,这里可以点击“授权创建新角色”进入阿里云RAM界面创建Eventbridge的授信角色,RAM创建授信角色的教程放到附录。之后点击角色配置右边的刷新按钮,就可以看到创建好的角色,选中即可

5.查看事件源中的 HTTP/HTTPS触发信息,复制公网请求URL

6.在ER应用程序中增加访问eb的代码(下方代码59行)

constinit= {
headers: {
"content-type": "text/html;charset=UTF-8",
    },
}
constAPI_ROUTER_REG=/^\/(prod-api|api)/g;
constUPLOAD_ROUTER_REG=/^\/(uploads)\/?/g;
constADMIN_OR_PORTAL_ROUTER_REG=/^\/(admin|portal)\/?/g;
constAPI_PATH='/api';
constGET_TYPE= { type: "text" };
asyncfunctiongatherResponse(response) {
constheaders=response.headersconstcontentType=headers.get("content-type") ||""if (contentType.includes("application/json")) {
returnJSON.stringify(awaitresponse.json())
    } elseif (contentType.includes("application/text")) {
returnresponse.text()
    } elseif (contentType.includes("text/html;charset=UTF-8")) {
returnresponse.text()
    } else {
returnresponse.blob()
    }
}
asyncfunctionhandleRequest(request) {
try {
constrequestHeaders=request.headers||init;
constedgeKv=newEdgeKV({ namespace: "myweb"});
conststaticUrl=awaitedgeKv.get('staticUrl', GET_TYPE);
constapiUrl=awaitedgeKv.get('apiUrl', GET_TYPE);
constportalUrl=awaitedgeKv.get('portalUrl', GET_TYPE);
constebUrl=awaitedgeKv.get('ebUrl', GET_TYPE);
constbody=request.body;
constmethod=request.method;
consturl=newURL(request.url)
const { pathname, search } =url;
letresponse= {};
if (pathname.match(API_ROUTER_REG)) {
constmatchedData=pathname.match(API_ROUTER_REG)[0];
letfinalurl= (apiUrl+pathname+search).replace(matchedData, API_PATH);
response=awaitfetch(finalurl, { headers: requestHeaders, method,body });
        } elseif (pathname.match(UPLOAD_ROUTER_REG)) {
letfinalurl=apiUrl+pathname+search;
response=awaitfetch(finalurl, { headers: requestHeaders, method ,body})
        }  elseif(pathname.match(ADMIN_OR_PORTAL_ROUTER_REG)){
letfinalurl=staticUrl+pathname+search;
response=awaitfetch(finalurl, { headers: requestHeaders, method });
        } else {
letfinalurl=portalUrl+pathname+search;
response=awaitfetch(finalurl, init);
        }
constresults=awaitgatherResponse(response)
constfinalResponse=newResponse(results, response.headers);
try { // 这里开始插入访问eb的代码awaitfetch(ebUrl, {method,body:JSON.stringify({path: pathname}) });
        }catch(e){}
returnfinalResponse;
    } catch (e) {
returnnewResponse(JSON.stringify({ message: e.message }), {
headers: {
"content-type": "application/json;charset=UTF-8"            }
        })
    }
}
addEventListener("fetch", event=> {
returnevent.respondWith(handleRequest(event.request))
})

上面实例代码没有明文显示请求地址,而是将eb的请求地址存放到了边缘存储,这样做好处是,将配置部分跟逻辑代码分离,方便做替换变更。同时避免重要信息在源代码中泄露

数据测试

可以在两个地方查看数据信息

第一个地方在eventbridge的事件追踪部分,导航目录是自定义事件->事件追踪,你可以在这里查看所有发送过来的事件信息,以及投递情况

你可以访问一下使用ER的站点,然后查询最近5分钟访问事件

可以看到事件已经投递过来,查看一下啊事件轨迹,目标投递到sls已经ready,再查看一下事件体的内容,body部分有我们传入的path属性。接下来去sls日志的控制台查看一下

第二个地方查看sls日志控制台

同样的,你得到了相关的日志信息。

更多处理

eventbridge 也可以以sls日志写入作为触发的事件源,这就意味着我们可以处理这样的场景。我们对自己关注的日志数据,比如错误访问信息,或者重要商机功能访问信息做“精确的”事件通知,所谓精确就是将事件目标用函数计算处理,可以做到@钉群的具体人员,他的访问架构如下

更多的能力集成等你发掘


附录  

创建Eventbridge授信服务角色,并给其授权操作日志服务的策略

1.访问阿里云RAM控制台 ,进入角色页面,点击“创建角色”

2.选择 “阿里云服务”

输入角色名称, 选择授信服务选中“事件总线”

4 为角色授权,如果你不清楚具体应该选择哪种权限策略可以先选择“AdminstratorAccess”进行测试,之后确认操作权限后以最小权限为原则替换 AdminstratorAccess确保安全

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
12天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
87 3
|
2月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
110 3
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1576 12
|
18天前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
2765 8
|
6天前
|
缓存 网络安全 数据安全/隐私保护
使用阿里云国际CDN加速后网站无法访问的排查步骤
使用阿里云国际CDN加速后网站无法访问的排查步骤
|
8天前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
15 0
|
10天前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
44 0
|
13天前
|
存储 分布式计算 NoSQL
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
20 0
|
13天前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
32 0
|
1月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。