Undertow 介绍
Undertow 是 Red Hat 开发的一款高性能、灵活的 Java Web 服务器,也是 WildFly 应用服务器的嵌入式组件。它支持非阻塞 I/O,基于 NIO 构建,并提供了 HTTP/2、WebSockets 和 Servlet 4.0 等现代 Web 技术支持。Undertow 以其轻量级、嵌入式友好 的特性而闻名,开发者可以轻松将其集成到自己的应用程序中,也可以作为独立服务器运行。它的模块化设计允许用户按需选择所需功能,从而实现低资源占用和高吞吐量。
Undertow 可观测性在现代应用中至关重要。APM 虽能展示 HTTP 请求的端到端耗时,但它们无法直接揭示 Undertow 内部处理请求的细节。
Undertow 线程池配置不当可能导致:
因此,监控 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# 重启 Datakitdatakit service -R
       复制代码
 开启链路采集
 # 开启采集器cp /usr/local/datakit/conf.d/ddtrace/ddtrace.conf.sample /usr/local/datakit/conf.d/ddtrace/ddtrace.conf# 重启 Datakitdatakit service -R
       复制代码
 客户端配置
场景环境:
 jdk: 1.8.0_361 spring-boot: 2.7.12-SNAPSHOTundertow: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=8080server.undertow.threads.worker=10server.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
场景视图
登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “Undertow”, 选择 “Undertow 监控视图”,点击 “确定” 即可添加视图。
监控器(告警)
Undertow 排队请求数监控
简要描述:检测指标 queue_size , 5 分钟内超过 100 触发告警,如下图:
Undertow 线程池使用率监控
简要描述:检测指标 pool_size/max_pool_size , 5 分钟内超过 90% 触发告警,如下图:
总结
这些指标提供了 Undertow 线程池运行状态的全面视图,帮助开发者和运维人员监控和优化线程池的性能。通过合理配置和监控这些指标,可以确保线程池在高并发场景下高效运行,同时避免资源浪费和性能瓶颈。
评论