Undertow 可观测性最佳实践(可观测性定义)
myzbx 2025-07-28 19:08 39 浏览
Undertow 介绍
Undertow 是 Red Hat 开发的一款高性能、灵活的 Java Web 服务器,也是 WildFly 应用服务器的嵌入式组件。它支持非阻塞 I/O,基于 NIO 构建,并提供了 HTTP/2、WebSockets 和 Servlet 4.0 等现代 Web 技术支持。Undertow 以其轻量级、嵌入式友好 的特性而闻名,开发者可以轻松将其集成到自己的应用程序中,也可以作为独立服务器运行。它的模块化设计允许用户按需选择所需功能,从而实现低资源占用和高吞吐量。
Undertow 可观测性在现代应用中至关重要。APM 虽能展示 HTTP 请求的端到端耗时,但它们无法直接揭示 Undertow 内部处理请求的细节。
Undertow 线程池配置不当可能导致:
- 请求排队:线程不足时,新请求等待处理,APM 中表现为 HTTP 请求耗时增加。
- 资源浪费或瓶颈转移:线程过多会增加上下文切换开销,甚至将压力转嫁给下游服务。
因此,监控 Undertow 的 XNIO Worker 线程数、活跃线程数、任务队列大小等指标,能有效识别请求处理瓶颈,确保系统高效稳定运行。
观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
部署 DataKit
DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。
登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式,当前采用 Linux 主机部署 DataKit。
采集器配置
DataKit 配置
DataKit 安装完成后,可以自定义开启采集器,本集成需要开启如下两个采集器。
开启 StatsD 采集器
# 开启采集器
cp /usr/local/datakit/conf.d/statsd/statsd.conf.sample /usr/local/datakit/conf.d/statsd/statsd.conf
# 重启 Datakit
datakit service -R
开启链路采集
# 开启采集器
cp /usr/local/datakit/conf.d/ddtrace/ddtrace.conf.sample /usr/local/datakit/conf.d/ddtrace/ddtrace.conf
# 重启 Datakit
datakit service -R
客户端配置
场景环境:
jdk: 1.8.0_361
spring-boot: 2.7.12-SNAPSHOT
undertow:2.2.24.Final
备注: 不同版本指标可能会有差异。
以 Java Demo 应用为例,使用 undertow 作为 web 容器配置。
##启用 Undertow pom 配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
Demo 项目中 undertow 运行配置如下:
server.port=8080
server.undertow.threads.worker=10
server.undertow.threads.io=2
接入 APM ,配置采集 jmx ,应用启动增加如下参数,启动命令如下:
java \
-javaagent:/xxx/dd-java-agent.jar \
-Ddd.agent.port=9529 \
-Ddd.service=demo \
-Ddd.jmxfetch.check-period=1000 \
-Ddd.jmxfetch.enabled=true \
-Ddd.jmxfetch.config.dir=/xxx/ \
-Ddd.jmxfetch.config=undertow.yaml \
-jar xxxx.jar
dd-java-agent.jar Guance 版下载地址:
wget -O dd-java-agent.jar 'https://static.guance.com/dd-image/dd-java-agent.jar'
其中 -Ddd.jmxfetch.config.dir 和 -Ddd.jmxfetch.config=undertow.yaml 需要把 undertow.yaml 放到 Java 启动可以读取到的地址。
undertow.yaml 内容如下,无需修改。
init_config:
instances:
- jvm_direct: true
name: undertow-monitoring
collect_default_jvm_metrics: false
collect_default_metrics: false
refresh_beans: 60
conf:
- include:
bean_regex: "org.xnio:type=Xnio,provider=\"nio\",worker=\"XNIO-.*\""
attribute:
IoThreadCount:
metric_type: gauge
alias: undertow.io.thread.count
- include:
bean_regex: "jboss.threads:name=\"XNIO-.*\",type=thread-pool"
attribute:
CorePoolSize:
metric_type: gauge
alias: undertow.core.pool.size
MaximumPoolSize:
metric_type: gauge
alias: undertow.max.pool.size
ActiveCount:
metric_type: gauge
alias: undertow.active.count
LargestPoolSize:
metric_type: gauge
alias: undertow.largest.pool.size
CompletedTaskCount:
metric_type: gauge
alias: undertow.completed.task.count
PoolSize:
metric_type: gauge
alias: undertow.pool.size
GrowthResistance:
metric_type: gauge
alias: undertow.growth.resistance
MaximumQueueSize:
metric_type: gauge
alias: undertow.max.queue.size
LargestQueueSize:
metric_type: gauge
alias: undertow.largest.queue.size
SubmittedTaskCount:
metric_type: gauge
alias: undertow.submitted.task.count
RejectedTaskCount:
metric_type: gauge
alias: undertow.rejected.task.count
SpinMissCount:
metric_type: gauge
alias: undertow.spin.miss.count
QueueSize:
metric_type: gauge
alias: undertow.queue.size
KeepAliveTimeSeconds:
metric_type: gauge
alias: undertow.keep.alive.time.seconds
关键指标
指标集:undertow
指标 | 描述 | 用途 |
active_count | 活跃线程数 | 当前线程池中正在执行任务的线程数量。 |
completed_task_count | 已完成任务数 | 线程池自启动以来已完成的任务总数。 |
core_pool_size | 核心线程池大小 | 线程池中始终保持活动的线程数,即使它们处于空闲状态。 |
io_thread_count | I/O 线程数 | Undertow 底层 XNIO 框架用于处理网络 I/O 事件(如接受连接、读写数据)的线程数量。 |
keep_alive_time_seconds | 线程保持活跃时间 | 当线程数超过核心线程数时,多余的空闲线程在被终止前可以等待的时间。 |
largest_pool_size | 历史最大线程池大小 | 线程池自启动以来达到的最大线程数量。 |
largest_queue_size | 历史最大队列大小 | 任务队列自启动以来达到的最大任务数量。 |
max_pool_size | 最大线程池大小 | 线程池允许创建的最大线程数量。这是一个关键的配置参数,限制了并发处理能力。 |
max_queue_size | 最大队列大小 | 任务队列可以容纳的最大任务数量。 |
pool_size | 当前线程池大小 | 当前线程池中的总线程数量(包括活跃和空闲线程)。 |
queue_size | 当前队列大小 | 当前在任务队列中等待被执行的任务数量。持续增长通常表示处理能力不足。 |
rejected_task_count | 被拒绝任务数 | 由于线程池已满(线程数达到最大且队列已满)或拒绝策略触发,而被拒绝执行的任务数量。这是一个重要的过载指标。 |
场景视图
登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “Undertow”, 选择 “Undertow监控视图”,点击 “确定” 即可添加视图。
监控器(告警)
Undertow 排队请求数监控
简要描述:检测指标 queue_size , 5分钟内超过100触发告警,如下图:
Undertow 线程池使用率监控
简要描述:检测指标 pool_size/max_pool_size , 5分钟内超过90% 触发告警,如下图:
总结
这些指标提供了 Undertow 线程池运行状态的全面视图,帮助开发者和运维人员监控和优化线程池的性能。通过合理配置和监控这些指标,可以确保线程池在高并发场景下高效运行,同时避免资源浪费和性能瓶颈。
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
