APISIX 可观测性最佳实践

news2025/1/17 4:12:31

APISIX 介绍

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关。它构建于 NGINX + ngx_lua 的技术基础之上,充分利用了 LuaJIT 所提供的强大性能。

APISIX 主要分为两个部分:

  • APISIX 核心:包括 Lua 插件、多语言插件运行时(Plugin Runner)、Wasm 插件运行时等;
  • 功能丰富的各种内置插件:包括可观测性、安全、流量控制等。

APISIX 在其核心中,提供了路由匹配、负载均衡、服务发现、API 管理等重要功能,以及配置管理等基础性模块。除此之外,APISIX 插件运行时也包含其中,提供原生 Lua 插件的运行框架和多语言插件的运行框架,以及实验性的 Wasm 插件运行时等。APISIX 多语言插件运行时提供多种开发语言的支持,比如 Golang、Java、Python、JS 等。

APISIX 目前也内置了各类插件,覆盖了 API 网关的各种领域,如认证鉴权、安全、可观测性、流量管理、多协议接入等。本文中的可观测性就是基于APISIX 的插件来实现数据上报。

案例介绍

本 demo 案例采用了 Ruoyi 系统 + APISIX 的最佳实践,采用了Opentelemetry + DDtrace 多链路协议的方式,以下是具体版本信息:

DataKit Agent:v1.22.1

DataKit Operator:v1.2.1

APISIX:v3.2 (LTS)

  • Opentelemetry-plugin

Ruoyi:v3.6.3

  • Vue 前端 SDK:Opentelemetry
  • Java 后端 SDK:DDtrace

如何接入

APISIX 的可观测性有多种插件和接入方式,我们以下面的几种插件来举例说明:

种类接入方式(插件)
Tracersopentelemetry 插件,可用于根据 OpenTelemetry specification 协议规范上报 Tracing 数据。(该插件目前仅支持 http 请求上报)
Loggers1、file-logger 插件,可用于将日志数据存储到指定位置。2、console 输出方式,可用于修改 APISIX 的 access_log 文件格式
Metricsprometheus 插件,以规定的格式上报指标到 Prometheus 中。

Tracing

1、RUM 接入改造

前端 npm sdk 版本 保持最新版本即可

RUM 接入时需要修改 traceType 修改为 w3c_traceparent 。

traceType: 'w3c_traceparent'

开启效果:

开启后,可实现前端 w3c 协议头上报 , 在请求头中可以查看到 w3c 的协议头 Traceparent 请求头至后端,方便客户排障时获取关联的 trace_id 。

2、Opentelemetry 插件开启

官方参考文档: opentelemetry | Apache APISIX® -- Cloud-Native API Gateway

APISIX Dashboard opentelemetry 的配置

{ 
    "additional_attributes": [ 
        "resp_body", 
        "balancer_ip", 
        "route_name" 
    ],
    "disable": false, 
    "sampler": { 
        "name": "always_on" 
    } 
}

在插件市场配置如下所示:

在 Apisix config.yaml 关于 otel 的配置

plugins:
 - opentelemetry
plugin_attr: 
  opentelemetry: 
    resource: 
      service.name: APISIX 
      tenant.id: business_id 
    collector: 
      address: 127.0.0.1:9529/otel 
      request_timeout: 3 
      #request_headers: 
      # foo: bar 
    batch_span_processor: 
      drop_on_queue_full: false 
      max_queue_size: 6 
      batch_timeout: 2 
      inactive_timeout: 1 
      max_export_batch_size: 2

其中 127.0.0.1:9529/otel 是 datakit 的上报 trace 的地址,datakit 完整的上报地址是 127.0.0.1:9529/otel/v1/trace 。

但是 apisix 上报 trace 的路径是 /v1/traces ,两者路径不一致,需要在 APISIX 上对 datakit 的上报路径做个转发。

3、Datakit 开启 Opentelemetry 采集

1)参考 https://docs.guance.com/datakit/opentelemetry/ ,开启 otel 采集器采集;
2)修改 DataKit 默认上报的 Opentelemetry 路径,trace_api 修改为 /otel/v1/traces ,若 key 不存在,添加即可。

  • apisix 默认上报 路径 /v1/traces
  • DataKit 默认接收 路径 /otel/v1/trace
[[inputs.opentelemetry]]
  ## During creating 'trace', 'span' and 'resource', many labels will be added, and these labels will eventually appear in all 'spans'
  ## When you don't want too many labels to cause unnecessary traffic loss on the network, you can choose to ignore these labels
  ## with setting up an regular expression list.
  ## Note: ignore_attribute_keys will be effected on both trace and metrics if setted up.
  # ignore_attribute_keys = ["os_*", "process_*"]
  ## The acceptable http_status_ok values will be 200 or 202.
  
   
  [inputs.opentelemetry.http]
   enable = true
   http_status_ok = 200
   trace_api = "/otel/v1/traces"

配置好 opentelemetry.conf 之后,采用 systemctl restart datakit 重启 datakit ,配置生效。

注意:http 协议的路由是不可配置的,请求路径(Trace/Metric)分别为 /otel/v1/trace 和 /otel/v1/metric 。

上报完成之后,可以在观测云上看的采集 APISIX 的 trace 信息。

最终效果:

Loggers

1、日志改造
1.1、日志文件输出方式

file-loggger 插件

实际配置效果

{ 
    "disable": false, 
    "include_resp_body": true, 
    "include_resp_body_expr": false, 
    "path": "/usr/local/apisix/logs/file.log" 
}

在插件市场配置如下所示:

注意:path 的路径需要是绝对路径,不能写成相对的,配置成功之后,查看日志文件是否有日志生成。

1.2、console 输出方式

修改配置文件 conf/config.yaml ,修改访问日志格式 access_logger_format 。

nginx_config:
  http:
    access_log_format: '{"remote_addr": "$remote_addr", "remote_user": "$remote_user", "time_local": "$time_local", "http_host": "$http_host", "request": "$request", "status": "$status", "body_bytes_sent": "$body_bytes_sent", "request_time": "$request_time", "http_referer": "$http_referer", "http_user_agent": "$http_user_agent", "upstream_addr": "$upstream_addr", "upstream_status": "$upstream_status", "upstream_response_time": "$upstream_response_time", "upstream_url": "$upstream_scheme://$upstream_host$upstream_uri","x-gc-trace-id": "$http_x_gc_trace_id","x-gc-span-id": "$http_x_gc_span_id","traceparent": "$http_traceparent"}'

其中 traceparent 的值为标准 W3C 128-bit trace_id

2、日志切割
2.1、pipeline 日志切割转换

pipeline 编写参考

if vaild_json(_) { # true
  origin = load_json(_)
  add_key(remote_addr,origin["remote_addr"])
  add_key(remote_user,origin["remote_user"])
  add_key(http_host,origin["http_host"])
  add_key(request,origin["request"])
  add_key(http_referer,origin["http_referer"])
  add_key(body_bytes_sent,origin["body_bytes_sent"])
  add_key(upstream_url,origin["upstream_url"])


  add_key(trace_id,origin["traceparent"])
  grok(trace_id, "%{DATA}-%{DATA:trace_id}-%{DATA}") 

}

测试效果如下:

Metric

1、APISIX 开启 Promethues 插件

官方参考链接:prometheus | Apache APISIX® -- Cloud-Native API Gateway

2、Datakit 开启 Promethues 采集

在观测云平台中,点击「集成」中,选择「APISIX」可以通过 promethues 的方式采集 APISIX 数据。

日志和 trace 数据关联

apisix 导出的日志格式如下:

{"client_ip":"127.0.0.1","server": 
{"hostname":"localhost.localdomain","version":"2.14.1"},"apisix_latency":0,"upstream":"127. 
0.0.1:9529","upstream_latency":1,"request": 
{"url":"http:\/\/127.0.0.1:80\/otel\/v1\/traces","size":836,"uri":"\/otel\/v1\/traces","que 
rystring":{},"headers":{"content-type":"application\/x-protobuf","user-agent":"lua-resty- 
http\/0.16.1 (Lua) ngx_lua\/10021","content-length":"672","traceparent":"00-749cc2e62e47bcf01fb76932c74ec1fe-d0a6101332bca613-01","host":"127.0.0.1"},"method":"POST"},"latency":0.99992752075195,"start_time":1685688047 
197,"service_id":"","route_id":"462899766133524220","response": 
{"size":493,"status":200,"headers":{"access-control-allow-headers":"Content-Type, Content- 
Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X- 
Requested-With, X-Token, X-Datakit-UUID, X-RP, X-Precision, X-Lua","access-control-allow- 
credentials":"true","server":"APISIX\/2.14.1","content-length":"0","access-control-allow- 
origin":"*","x-datakit":"1.5.7\/2023-03-20 11:50:32","connection":"close","access-control- 
allow-methods":"POST, OPTIONS, GET, PUT","date":"Fri, 02 Jun 2023 06:40:47 GMT"}}}

通过以上日志,我们可以看到 traceparent 信息:

"traceparent":"00-749cc2e62e47bcf01fb76932c74ec1fe-d0a6101332bca613-01"

这是 opentelemetry 所产生的 trace 数据,其中749cc2e62e47bcf01fb76932c74ec1fe 才是对应的 trace_id 信息,这个时候需要通过观测云的 Pipelines 做下切割,切割的脚本可以参考如下:

json(_, client_ip, client_ip) 
json(_, upstream, upstream) 
json(_, request.url, url) 
json(_, response.status, http_status) 
json(_, route_id, route_id) 
json(_, request.headers.traceparent, trace_id) 
grok(_, "%{DATA}traceparent\":\"%{DATA}-%{DATA:trace_id}-%{DATA}\"") 

trace_id 就被切割出来了,00-749cc2e62e47bcf01fb76932c74ec1fe-d0a6101332bca613-01 切割成 749cc2e62e47bcf01fb76932c74ec1fe 。

因为 tracing 的 id 和日志的 id 一致,所以可以通过观测云关联起来,效果如下:

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

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

相关文章

2024年适合小白的副业—steam搬砖项目

对于普通人,找一个常年稳定,有个人全程带的项目难能可贵! 别去想快速路,别去想挂机,作弊、别去想躺赚,否则最后又是竹篮打水一场空!! 普通人也可以靠steam搬砖项目这个翻身&#xf…

Net2FTP网站搭建并结合内网穿透实现远程访问本地个人文件

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…

psm的stata实现

1. PSM 简介 在经济学中,我们通常希望评估某项公共政策实施后的效应,为此,我们构建 "处理组" 和 "控制组" 以评估「处理效应 (treatment effect)」。然而,我们的数据通常来自非随机的观察研究中,处…

SpringBoot集成阿里云OSS、华为云OBS、七牛云、又拍云等上传案例【附白嫖方案】【附源码】

1. 项目背景 唉!本文写起来都是泪点。不是刻意写的本文,主要是对日常用到的文件上传做了一个汇总总结,同时希望可以给用到的小伙伴带来一点帮助吧。 上传本地,这个就不水了,基本做技术的都用到过吧; 阿里…

MySQL的备份与恢复案例

新建数据库 数据库备份,数据库为school,素材如下1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address…

【ansible】自动化运维ansible之playbook剧本编写与运行

目录 一、ansible剧本playbook的组成 二、palybook的基础应用: 实操1:通过palybooks完成nginx的安装 第一种:通过yum安装nginx 第二种:通过编译安装nginx 实操2:playbook定义、引用变量​​​​​​​ 实操3:通过…

maptalks多边形区域和点位-vue组件

多边形 <!-- 地图组件 --> <template><div :id"id" class"container"></div> </template><script> import _ from "lodash"; import "maptalks/dist/maptalks.css"; import * as maptalks from &…

有趣的 Streamlit

先看一则新闻&#xff1a;「Snowflake」以8亿美元收购「Streamlit」&#xff0c;以帮助客户构建基于数据的应用程序 Streamlit 是什么&#xff1f;去年过年前好好研究学习了一番&#xff0c;的确是个很有意思的面向数据开发者的工具&#xff0c;让不懂前端&#xff0c;只懂一点…

SpringBoot配置文件日志

目录 一、SpringBoot配置文件的作用 二、SpringBoot配置文件的分类 1、application.properties 2、application.yml 3、application.yaml 三、使用配置文件实例--验证码 1、使用Kaptcha插件生成验证码 2、网页需求分析 3、前端页面 4、发送请求 5、服务器作出响应 …

反射reflecttion的入门理解+暴力反射的应用简介

反射怎么理解,&#xff08;个人白话理解,有个类,类中有很多属性、方法、构造器&#xff0c;可以通过一面镜子将类里面的东西像光一样反射出来&#xff0c;被我们看到和使用&#xff0c;reflecttion其实也可以理解为映像&#xff0c;主要为了获取类中私有的东西&#xff0c;通过…

骨传导耳机是什么?骨传导耳机的优缺点是什么

骨传导耳机是什么&#xff1f;骨传导耳机采用一种创新的声音传输方式&#xff0c;它通过人体的颅骨、骨迷路、内耳淋巴液、螺旋器和听觉中枢传递声波。与传统耳机不同&#xff0c;骨传导耳机仅需悬挂在耳旁即可听见声音。 骨传导耳机的优缺点 缺点 相较传统耳机&#xff0c;由…

高数总结(6

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

走进科学系列之遭遇鬼打墙的OUTLOOK

网管小贾 / sysadm.cc 正值春运&#xff0c;车站里熙熙攘攘、人头攒动。 鲍勃和约瑟夫正在候车室&#xff0c;等待检票。 “嗨&#xff01;约瑟夫&#xff01;快来看看&#xff0c;我的电脑出问题了&#xff01;” “得了吧&#xff0c;马上就要检票上车了&#xff0c;你就不…

第99讲:MHA高可用集群配置实战:邮件告警和Binlog服务器搭建详解

文章目录 一、配置当MHA故障切换时发生邮件告警1.准备发送邮件的脚本2.配置MHA支持邮箱告警3.重启MHA4.模拟主库故障切换观察邮件接收 二、为MHA高可用集群配置Binlog服务器1.为什么要配置Binlog服务器2.搭建Binlog服务器2.1.创建保存主库Binlog的路径2.2.配置MHA增加Binlog服务…

MySQL Replication

0 序言 MySQL Replication 是 MySQL 中的一个功能&#xff0c;允许从一个 MySQL 数据库服务器&#xff08;称为主服务器或 master&#xff09;复制数据和数据库结构到另一个服务器&#xff08;称为从服务器或 slave&#xff09;。这种复制是异步的&#xff0c;意味着从服务器不…

特征选择、特征降维和特征提取到底有什么区别和联系?这篇文章一次性给你讲清楚!

目录 一、特征选择&#xff1a; 1.最大互信息系数(MIC)&#xff1a; 2.互信息(MI)&#xff1a; 3.最大相关最小冗余算法(mRMR)&#xff1a; 4.支持向量机递归特征消除(SVM_RFE)&#xff1a; 二、特征降维&#xff1a; 1.主成分分析(PCA)&#xff1a; 2.核主成分分析(KP…

有哪些好用的网页原型网站?

与桌面端相比&#xff0c;在线网页原型网站的使用具有优势&#xff0c;因为在线网页原型网站在整个使用过程中不需要安装&#xff0c;在线网页原型网站在任何地方都没有限制。更重要的是&#xff0c;无论是现在使用的Linux&#xff0c;在线网页原型网站在操作系统中都没有限制、…

智胜未来,新时代IT技术人风口攻略-第六版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一种严谨态度企业对鸿蒙的一些诉求 …

opencv安装介绍以及基本图像处理详解

文章目录 一、什么是OpenCV &#xff1f;二. OpenCV 安装1. 下载地址2.安装命令&#xff1a;pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作&#xff08;彩色图片&#xff09;&#xff08;1&#xff09;读取图片&#xff1a;cv2.imread( )&#xff08…

OPPO公布全新AI战略,AI 手机时代再提速

2024年2月20日&#xff0c;深圳——今日OPPO 举办 AI 战略发布会&#xff0c;分享新一代 AI 手机的四大能力特征&#xff0c;展望由AI驱动的手机全栈革新和生态重构的趋势&#xff0c;并发布由OPPO AI 超级智能体和 AI Pro 智能体开发平台组成的OPPO 1N 智能体生态战略&#xf…