阿里云 SAE 应用引擎可观测性最佳实践

SAE 简介

Serverless 应用引擎 SAE(Serverless App Engine)是一款零代码改造、极简易用、自适应弹性的应用全托管平台。SAE 能够让用户免运维 IaaS 和 Kubernetes,秒级完成从源代码、代码包、Docker 镜像部署任意语言的在线应用(例如 Web、微服务、Job 任务)到 SAE,并自动伸缩实例按使用量计费,开箱即用日志、监控、负载均衡等配套能力。

SAE 基于容器标准构建,核心能力开源,无厂商锁定,拥有丰富的平台工程能力,例如 CLI、S2A(Source to Application)等,助力研发运维提效。

可观测性

观测云可以收集来自 SAE 上部署应用的可观测性数据。具体流程如下:

  • 应用通过接入 APM 上报 trace 数据到 DataKit
  • 应用的日志数据可以通过 KafkaMQ 收集后,通过 DataKit 进行消费
  • 应用容器的指标数据利用阿里云的监控 API 并通过 Function 平台(DataFlux.f(x))进行采集后上报到观测云
  • DataKit 收集到对应的数据后统一处理并上报到观测云上

NAT 网关配置

DataKit 获取到数据后需要上报到观测云,就需要 SAE 出外网的能力,SAE 应用出外网主要是需要配置 NAT 网关。

参考文档步骤:SAE应用如何从VPC内网环境访问公网

创建 Kafka 服务

请访问阿里云消息队列 Kafka 版控制台,根据需求创建实例,在实例部署前,请了解文档《设置日志收集至 Kafka》中“前提条件”章节中关于 VPC 和 vSwitch 的限制。部署成功后在“Topic 管理”页面创建 Topic:springboot-server_log ,建议与 SAE 应用同名,Group 无需创建。

DataKit

注册观测云账号:Guance

登陆后,在集成里面找到 DataKit,并复制 DK_DATAWAY,后面需要用到。

创建 DataKit

  • 进入 SAE,点击应用列表 - 创建应用。
  • 填写应用信息
    • 应用名称
    • 选择命名空间,如果没有,则创建一个
    • 选择vpc,如果没有,则创建一个
    • 选择安全组: vswitch 要与 NAT 的交换机匹配
    • 实例数按需调整
    • CPU 1 core、内存1G
    • 完成后点击下一步
  • 添加镜像:pubrepo.guance.com/datakit/datakit:1.31.0
  • 添加环境变量

建议采用配置项方式,方便管理维护配置,具体参考下面的配置项内容。

  • 添加配置

创建 kafkamq 采集器配置

  • 保存

创建成功后,可以进入应用详情,查看基础信息。

创建配置项

在 SAE 的命名空间里面配置。

配置项内容如下:

{"ENV_DATAWAY": "https://openway.guance.com?token=tkn_xxx","KAFKAMQ": "# {\"version\": \"1.22.7-1510\", \"desc\": \"do NOT edit this line\"}\n\n[[inputs.kafkamq]]\n  # addrs = [\"alikafka-serverless-cn-8ex3y7ciq02-1000.alikafka.aliyuncs.com:9093\",\"alikafka-serverless-cn-8ex3y7ciq02-2000.alikafka.aliyuncs.com:9093\",\"alikafka-serverless-cn-8ex3y7ciq02-3000.alikafka.aliyuncs.com:9093\"]\n  addrs = [\"alikafka-serverless-cn-8ex3y7ciq02-1000-vpc.alikafka.aliyuncs.com:9092\",\"alikafka-serverless-cn-8ex3y7ciq02-2000-vpc.alikafka.aliyuncs.com:9092\",\"alikafka-serverless-cn-8ex3y7ciq02-3000-vpc.alikafka.aliyuncs.com:9092\"]\n  # your kafka version:0.8.2 ~ 3.2.0\n  kafka_version = \"3.3.1\"\n  group_id = \"datakit-group\"\n  # consumer group partition assignment strategy (range, roundrobin, sticky)\n  assignor = \"roundrobin\"\n\n  ## kafka tls config\n   tls_enable = false\n\n  ## -1:Offset Newest, -2:Offset Oldest\n  offsets=-1\n\n\n  ## user custom message with PL script.\n  [inputs.kafkamq.custom]\n    #spilt_json_body = true\n    ## spilt_topic_map determines whether to enable log splitting for specific topic based on the values in the spilt_topic_map[topic].\n    #[inputs.kafkamq.custom.spilt_topic_map]\n     # \"log_topic\"=true\n     # \"log01\"=false\n    [inputs.kafkamq.custom.log_topic_map]\n      \"springboot-server_log\"=\"springboot_log.p\"\n    #[inputs.kafkamq.custom.metric_topic_map]\n    #  \"metric_topic\"=\"metric.p\"\n    #  \"metric01\"=\"rum_apm.p\"\n    #[inputs.kafkamq.custom.rum_topic_map]\n    #  \"rum_topic\"=\"rum_01.p\"\n    #  \"rum_02\"=\"rum_02.p\"\n","SPRINGBOOT_LOG_P": "abc = load_json(_)\n\nadd_key(file, abc[\"file\"])\n\nadd_key(message, abc[\"message\"])\nadd_key(host, abc[\"host\"])\nmsg = abc[\"message\"]\ngrok(msg, \"%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\\\[%{NOTSPACE:method_name},%{NUMBER:line}\\\\] %{DATA:service_name} %{DATA:trace_id} %{DATA:span_id} - %{GREEDYDATA:msg}\")\n\nadd_key(topic, abc[\"topic\"])\n\ndefault_time(time,\"Asia/Shanghai\")","ENV_GLOBAL_HOST_TAGS": "host=__datakit_hostname,host_ip=__datakit_ip","ENV_HTTP_LISTEN": "0.0.0.0:9529","ENV_DEFAULT_ENABLED_INPUTS": "dk,cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,ddtrace,statsd,profile"
}

配置项说明:

  • ENV_DATAWAY:上报观测云的网关地址
  • KAFKAMQ: kafkamq 采集器配置,具体内容参考:Kafka 采集器配置文件介绍
  • SPRINGBOOT_LOG_P:日志 pipeline 脚本,用于切割来自 kafka 的日志数据
  • ENV_GLOBAL_HOST_TAGS: 采集器全局 tag
  • ENV_HTTP_LISTEN:Datakit 端口,ip必须是 0.0.0.0 否则其他 pod 会访问不到
  • ENV_DEFAULT_ENABLED_INPUTS: 默认开启的采集器

Kafka 采集器配置文件介绍

# {"version": "1.22.7-1510", "desc": "do NOT edit this line"}[[inputs.kafkamq]]# addrs = ["alikafka-serverless-cn-8ex3y7ciq02-1000.alikafka.aliyuncs.com:9093","alikafka-serverless-cn-8ex3y7ciq02-2000.alikafka.aliyuncs.com:9093","alikafka-serverless-cn-8ex3y7ciq02-3000.alikafka.aliyuncs.com:9093"]addrs = ["alikafka-serverless-cn-8ex3y7ciq02-1000-vpc.alikafka.aliyuncs.com:9092","alikafka-serverless-cn-8ex3y7ciq02-2000-vpc.alikafka.aliyuncs.com:9092","alikafka-serverless-cn-8ex3y7ciq02-3000-vpc.alikafka.aliyuncs.com:9092"]# your kafka version:0.8.2 ~ 3.2.0kafka_version = "3.3.1"group_id = "datakit-group"# consumer group partition assignment strategy (range, roundrobin, sticky)assignor = "roundrobin"## kafka tls configtls_enable = false## -1:Offset Newest, -2:Offset Oldestoffsets=-1## user custom message with PL script.[inputs.kafkamq.custom]#spilt_json_body = true## spilt_topic_map determines whether to enable log splitting for specific topic based on the values in the spilt_topic_map[topic].#[inputs.kafkamq.custom.spilt_topic_map]# "log_topic"=true# "log01"=false[inputs.kafkamq.custom.log_topic_map]"springboot-server_log"="springboot_log.p"#[inputs.kafkamq.custom.metric_topic_map]#  "metric_topic"="metric.p"#  "metric01"="rum_apm.p"#[inputs.kafkamq.custom.rum_topic_map]#  "rum_topic"="rum_01.p"#  "rum_02"="rum_02.p"
  • addrs :kafka 队列消费地址
  • group_id :消费组,DataKit 会调用 kafka 自动创建
  • [inputs.kafkamq.custom.log_topic_map] :是 kafkamq 日志类型数据消费 Topic 配置集合,可以配置多组,key-value 形式。key 为 Topic ,value 可以为空,为空用""表示,如果需要做日志切割,则需要填写对应的 pipeline 名称。

网络配置

按需开启网络,公网或者私网,一般建议私网即可。

主要开放两个端口 9529 和 8125 ,有其他端口需求的可以按需添加。开启后会生成 ip 和端口,后面会用到。

应用

示例为 Java 应用,采用 ddtrace 作为 APM 进行接入。Demo 源码地址:https://github.com/lrwh/observable-demo/tree/main/springboot-server。

可以自己构建镜像,也可以使用阿里镜像 registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:ddtrace_1_34

下载 ddtrace

wget https://static.guance.com/dd-image/dd-java-agent.jar

docker 镜像

FROM openjdk:8-jdk-alpine# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmpWORKDIR /data
RUN mkdir logs
# 这个目录自行修改
ADD springboot-server.jar app.jar
ADD dd-java-agent-v1.34.0-guance.jar /dd-java-agent.jar
# 修改时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 解决中文乱码
ENV LANG en_US.UTF-8
ENV jar app.jarENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar} ${PARAMS} 2>&1"]

构建:

docker build -f Dockerfile_ddtrace -t registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:ddtrace_1_34 .

推送到仓库:

docker push registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:ddtrace_1_34

创建应用

基本步骤与创建 DataKit 一样。

  • 调整镜像名称
  • 镜像地址:registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:ddtrace_1_34
  • Java 环境选择 openjdk8
  • 启动命令设置:选择 Shell 脚本方式
java \
-javaagent:/dd-java-agent.jar \
-Ddd.service.name=ddtrace-server \
-Ddd.agent.host=10.0.16.221 \
-Ddd.agent.port=9529 \
-Ddd.trace.debug=true \
-Ddatadog.slf4j.simpleLogger.logFile=ddtrace.log \
-jar /data/app.jar

其中 -Ddd.agent.host 为 DataKit 的访问地址。

  • 日志采集服务

将日志上报到 kafka,选择对应的 kafka 实例,没有就创建一个,并填写对应的日志文件路径及上报 kafka 的 topic。

  • 保存

应用启动完成后,可以在应用实例部署信息查看部署和启动日志。

从日志里面已经可以看到 ddtrace 加载成功。

开启网络

应用启动完成后,按需开启网络,公网或者私网,由于这里需要对外访问,所以需要开放公网。当前应用端口为8090。开放成功后可以直接通过ip地址可以访问。

curl http://host:8090/gateway

效果展示

日志

在日志列表上,可以通过 source:springboot-server_log⁠ 来过滤当前业务日志,点击对应的日志详情,可以关联当前日志对应的链路信息。

链路

在链路详情里面,可以关联到当前链路对应业务所产生的日志信息。

指标

指标采集

由于阿里云不提供直接从 prometheus 获取指标数据,所以需要通过观测云 Function 平台(DataFlux.f(x))调用 SAE 的 API 采集指标数据。

具体步骤参考:阿里云 SAE 集成文档

指标列表
指标单位Dimensions描述
cpu_Average%userId、appId应用CPU
diskIopsRead_AverageCount/SeconduserId、appId应用磁盘IOPS读
diskIopsWrite_AverageCount/SeconduserId、appId应用磁盘IOPS写
diskRead_AverageByte/SeconduserId、appId应用磁盘IO吞吐率读
diskTotal_AverageKilobyteuserId、appId应用磁盘总量
diskUsed_AverageKilobyteuserId、appId应用磁盘使用量
diskWrite_AverageByte/SeconduserId、appId应用磁盘IO吞吐率写
instanceId_memoryUsed_AverageMBuserId、appId、instanceId实例已使用内存
instance_cpu_Average%userId、appId、instanceId实例CPU
instance_diskIopsRead_AverageCount/SeconduserId、appId、instanceId实例磁盘IOPS读
instance_diskIopsWrite_AverageCount/SeconduserId、appId、instanceId实例磁盘IOPS写
instance_diskRead_AverageByte/SeconduserId、appId、instanceId实例磁盘IO吞吐率读
instance_diskTotal_AverageKilobyteuserId、appId、instanceId实例磁盘总量
instance_diskUsed_AverageKilobyteuserId、appId、instanceId实例磁盘使用量
instance_diskWrite_AverageByte/SeconduserId、appId、instanceId实例磁盘IO吞吐率写
instance_load_AverageminuserId、appId、instanceId实例平均负载
instance_memoryTotal_AverageMBuserId、appId、instanceId实例总内存
instance_memoryUsed_AverageMBuserId、appId、instanceId实例已使用内存
instance_netRecv_AverageByte/SeconduserId、appId、instanceId实例接收字节
instance_netRecvBytes_AverageByteuserId、appId、instanceId实例总接收字节
instance_netRecvDrop_AverageCount/SeconduserId、appId、instanceId实例接收数据丢包
instance_netRecvError_AverageCount/SeconduserId、appId、instanceId实例接收错误数据包
instance_netRecvPacket_AverageCount/SeconduserId、appId、instanceId实例接收数据包
instance_netTran_AverageByte/SeconduserId、appId、instanceId实例发送字节
instance_netTranBytes_AverageByteuserId、appId、instanceId实例总发送字节
instance_netTranDrop_AverageCount/SeconduserId、appId、instanceId实例发送数据丢包
instance_netTranError_AverageCount/SeconduserId、appId、instanceId实例发送错误数据包
instance_netTranPacket_AverageCount/SeconduserId、appId、instanceId实例发送数据包
instance_tcpActiveConn_AverageCountuserId、appId、instanceId实例活跃TCP连接数
instance_tcpInactiveConn_AverageCountuserId、appId、instanceId实例非活跃TCP连接数
instance_tcpTotalConn_AverageCountuserId、appId、instanceId实例总TCP连接数
load_AverageminuserId、appId应用平均负载
memoryTotal_AverageMBuserId、appId应用总内存
memoryUsed_AverageMBuserId、appId应用已使用内存
netRecv_AverageByte/SeconduserId、appId应用接收字节
netRecvBytes_AverageByteuserId、appId应用总接收字节
netRecvDrop_AverageCount/SeconduserId、appId应用接收数据丢包
netRecvError_AverageCount/SeconduserId、appId应用接收错误数据包
netRecvPacket_AverageCount/SeconduserId、appId应用接收数据包
netTran_AverageByte/SeconduserId、appId应用发送字节
netTranBytes_AverageByteuserId、appId应用总发送字节
netTranDrop_AverageCount/SeconduserId、appId应用发送数据丢包
netTranError_AverageCount/SeconduserId、appId应用发送错误数据包
netTranPacket_AverageCount/SeconduserId、appId应用发送数据包
tcpActiveConn_AverageCountuserId、appId应用活跃TCP连接数
tcpInactiveConn_AverageCountuserId、appId应用非活跃TCP连接数
tcpTotalConn_AverageCountuserId、appId应用总TCP连接数

仪表板

  • 应用

  • 实例

监控器

内置了一部分 SAE 监控器,方便对 SAE 应用进行监控。

模板内容可以调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows环境 ffmpeg 命令使用介绍

记录一下纯命令操作ffmpeg的用法! 目录 一、FFmpeg查询命令帮助文档 1.ffmpeg、ffplay、ffprobe的区别 2.ffmpeg命令查看帮助文档 3.ffplay命令查看帮助文档 4.ffprobe命令查看帮助文档 二、FFmpeg音视频处理流程 三、FFmpeg命令分类查询 1.命令参数 2.查看…

深入理解Java虚拟机(五)

介绍垃圾收集器的算法及引用详解 1、引用计数器 引用计数器在对象中添加一个引用计数器,当一个地方引用的时候,计数器1,当引用失效时,计数器值就-1。 但是在Java里面存在对象循环引用:objA 和 objB都有字段instance…

Linux系统操作篇 one -文件指令及文件知识铺垫

Linux操作系统入门-系统篇 前言 Linux操作系统与Windows和MacOS这些系统不同,Linux是黑屏的操作系统,操作方式使用的是指令和代码行来进行,因此相对于Windows和MacOS这些带有图形化界面的系统,Linux的入门门槛和上手程度要更高&…

PostgreSQL的奥秘:表结构、TOAST与大对象

PostgreSQL(以下简称PSQL)因其灵活性和强大的功能深受欢迎。本文将详细介绍PSQL的内部结构,特别是页面缓冲机制,包括表结构、TOAST技术、大对象(BLOB/CLOB),以及页面缓冲表的工作原理。同时&…

SQL Server 可观测最佳实践

SQL Server 简介 SQL Server 是微软公司开发的一款关系数据库管理系统,支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。它支持多种操作系统平台,而无论是物理还是虚拟形式,自建部署环境还是在云环境中,运行的操作系…

MySQL8 安装配置及卸载教程

MySQL8 安装配置及卸载教程 0 卸载 MySQL 如果之前没安过 MySQL ,或者卸载干净了不用看这个。 如果安装中出现以下问题,有可能是为之前安装 MySQL 不成功,有残留的安装程序等文件程序或者是卸载 MySQL 不成功。 0.1 停止服务 首先进入服务…

大数据-194 数据挖掘 机器学习理论 有监督、无监督、半监督、强化学习

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Java最全面试题->数据库/中间件->KafKa面试题

文章目录 KafKaKafka中的ISR、AR代表什么?ISR的伸缩指什么?kafka中的broker 是干什么的?kafka中的 zookeeper 起到什么作用?kafka follower如何与leader同步数据?kafka 为什么那么快?kafka producer如何优化打入速度?kafka producer发送数据,ack为0,1,-1分别是什么意…

兼容Lodash的真正替代者

大家好,我是农村程序员,独立开发者,前端之虎陈随易。 这是我的个人网站:https://chensuiyi.me,欢迎一起交朋友~ 今天给大家分享一个前端工具库 Lodash 的替代品 es-toolkit。 仓库地址:https://github.com…

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版

MousePlus 是一款功能强大的鼠标增强工具,它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为,让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能:可以为鼠标的各个按钮设置不同的功能…

基于SpringBoot+Vue+MySQL的中药材进存销管理系统

系统展示 系统背景 中药材在医疗保健领域具有重要地位,随着中药材市场的不断发展,对中药材的进存销管理提出了更高的要求。传统的管理方式效率低下,容易出现错误和漏洞,无法满足快速发展的市场需求。因此,开发一套集成…

Nginx+Tomcat 动静分离

1. NginxTomcat 环境 Nginx 处理静态资源的优势同样可以应用在 Tomcat 环境中 。从实现方法上来说,NginxTomcat 环境的搭建思路与前面完成的 NginxApache 环境是完全相同的,只需要将 Nginx 与 Tomcat 的站点文档目录配置到同一目录下,利用 N…

npm安装过程的问题

报错信息C:\Users\lyyds>npm list -global npm error code ENOENT npm error syscall lstat npm error path D:\nodejs\node_global npm error errno -4058 npm error enoent ENOENT: no such file or directory, lstat D:\nodejs\node_global npm error enoent This is rel…

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网,eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一:vlan演示(交换机端口access模式)2、实验二:vlan演示(交换机端口trunk模式) 一、概念 VLAN(Virtual Local Area Ne…

SQL-lab靶场less1-4

说明:部分内容来源于网络,如有侵权联系删除 前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错: 这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除&#xf…

java中的二叉树

二叉树 树型结构概念相关概念树的表示形式树的应用 二叉树概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作前置说明二叉树的遍历二叉树的基本操作 二叉树相关OJ题 树型结构 概念 树是一种非线性的的数据结构,它是由n(n>0)个有限结点组成一个具有…

贵州鑫宏远农业-始终致力于推动现代农业的科技创新与发展

贵州鑫宏远农业科技有限公司,是一家在高科技农业领域深耕细作、锐意进取的企业。自成立以来,我们始终致力于推动现代农业的科技创新与发展,业务全面覆盖农业科学研发、组织培养生产、专业育苗培植、半成品及成品精细化养护、市场销售以及全方…

对比两个el-table,差异数据突显标记

前言 在数据分析和数据处理的过程中,经常需要对比两个数据集,以便发现其中的差异和变化。本文将介绍如何使用 el-table 组件来对比两个数据集,并通过差异数据的突显标记,帮助用户更直观地理解数据的变化。 cell-style 属性 其实利…

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景 卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面&am…

4个硬盘数据修复攻略:让你的数据失而复得。

据统计,在硬盘数据丢失的情况当中,有7成是因误删除、格式化和病毒攻击导致的。并且对与很多人来说,数据丢失是一个不小的问题。今天我就给大家分享几款能够帮助硬盘恢复数据的工具,希望能够在数据丢失是减小大家的焦虑。 1、福昕硬…