首页 > 编程语言 >开源!Pod高负载自动打印JAVA线程堆栈

开源!Pod高负载自动打印JAVA线程堆栈

时间:2024-09-26 10:37:28浏览次数:10  
标签:JAVA name thread container 线程 java Pod k8s dumper

开源!Pod高负载自动打印JAVA线程堆栈

运维技术探讨    2024年08月29日 17:39 广东  

以下文章来源于SRE运维手记 ,作者亦零一

SRE运维手记.

一个在房地产、家居科技、游戏和电商行业摸爬滚打的运维老司机#sre #k8s #kubernetes #prometheus#devops

01

背 景

 

    在实际的k8s维护场景中,我们时常会遇到 Pod CPU 突刺的现象。由于信息捕获依赖人工采集,有时甚至还未完成信息捕获,问题就已经恢复了,这让人非常头大。因此,我们需要一个可以自动捕获信息的工具。在GitHub上,我们发现了一个不错的项目k8s-java-debug-daemon,但由于年久失修,已无法满足当前环境的运行需求,所以我们决定对该项目进行二次开发。

 

02

优化内容

 

  • 支持新版的Grafana消息体

  • 支持企业微信告警

  • 支持k8s部署

  • 支持configmap进行配置

  • 修复n多已知问题

 

03

工作流程

 

    与 Grafana 的告警联动,配合阿里的 arthas,来完成高CPU使用率线程的堆栈抓取。 

整体流程如下:

1. 为 Grafana 添加 webhook 类型的告警通知渠道,地址为该程序的 url(默认的hooks路径为 /hooks)。

2. 配置Grafana图表,并设置告警阈值

3. 当 webhook 触发时,程序会自动将 crawl.sh 脚本拷贝到对应 Pod 的容器中并执行。

4. 程序将 stdout 保存到本地文件,并推送到企业微信。

 

04

效果预览

 

  • 企业微信告警展示

图片

 

  • “点击查看”跳转访问arthas捕获的线程堆栈

图片

 

05

支持环境

 

已验证 Grafana v10.x (v9.x应该也支持,待测试)

 

06

配置说明

 

- config/config.yaml配置项

server:  port: 8099  # 服务监听端口  maxNodeLockManager: 10 # 每node同时运行执行数为10  domain: "http://127.0.0.1:8099" # 服务监听域名

wework: webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxx" # 企业微信webhook地址

- 默认取最繁忙的前50个线程的堆栈信息 (可在 `crawl.sh` 中修改)

- 采集样本时间为2秒 (可在 `crawl.sh` 中修改)

 

07

如何使用

 

Docker镜像

  • 这是编译好的镜像,可以直接拉取使用

docker pull registry.cn-hangzhou.aliyuncs.com/yilingyi/k8s-java-thread-dumper:2.0.1

 

  • 自行构建

拉取源码

git clone https://github.com/yilingyi/k8s-java-thread-dumper.git

构建镜像

make docker IMAGE=yilingyi/k8s-java-thread-dumper:2.0.1

Kubernetes部署

  • 创建命名空间monitor

kubectl create namespace monitor
  • 将下面三个文件放在同一目录下,并使用`kubectl apply -f . -n monitor`进行k8s资源创建

Deployment.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  name: k8s-java-thread-dumper  labels:    app: k8s-java-thread-dumperspec:  replicas: 1  selector:    matchLabels:      app: k8s-java-thread-dumper  template:    metadata:      labels:        app: k8s-java-thread-dumper    spec:      containers:      - name: k8s-java-thread-dumper        image: registry.cn-hangzhou.aliyuncs.com/yilingyi/k8s-java-thread-dumper:2.0.1        ports:        - containerPort: 8099        volumeMounts:        - name: config-volume          mountPath: /app/config/config.yaml          subPath: config.yaml      volumes:      - name: config-volume        configMap:          name: k8s-java-thread-dumper-config

Service.yaml

apiVersion: v1kind: Servicemetadata:  name: k8s-java-thread-dumper-service  labels:    app: k8s-java-thread-dumperspec:  selector:    app: k8s-java-thread-dumper  ports:  - protocol: TCP    port: 8099    targetPort: 8099  type: NodePort

ConfigMap.yaml

apiVersion: v1kind: ConfigMapmetadata:  name: k8s-java-thread-dumper-configdata:  config.yaml: |    server:      port: 8099      maxNodeLockManager: 10      domain: "http://127.0.0.1:8099"    wework:      webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxx"
  • 资源授权

保存为rolebinding.yaml,并使用`kubectl apply -f rolebinding.yaml`进行创建,其中`<target-namespace>`改为目标命名空间

kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: <target-namespace>  name: pod-exec-rolerules:- apiGroups: [""]  resources: ["pods/exec"]  verbs: ["create"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: pod-exec-role-binding  namespace: <target-namespace>subjects:- kind: ServiceAccount  name: default  namespace: monitorroleRef:  kind: Role  name: pod-exec-role  apiGroup: rbac.authorization.k8s.io

Grafana告警规则

  • Metrics Browser中填写

sum(irate(container_cpu_usage_seconds_total{prometheus_name=~"gz",pod=~".*",container =~".*",container !="",container!="POD",node=~".*",namespace=~"(prod)"}[2m])) by (namespace, pod, node, container) / (sum(container_spec_cpu_quota{prometheus_name=~"gz",pod=~".*",container =~".*",container !="",container!="POD",node=~".*",namespace=~"(prod)"}/100000) by (namespace, pod, node, container)) * 100
  • Legend 中填写

{{node}} - {{namespace}} - {{pod}} - {{container}}

配置完如下:

图片

  • 联络点配置

选择webhook,URL地址为http://xxxxx/hooks

配置完如下:

图片

 

08

结 语

 

    完成上述配置后,方可实现当Pod出现CPU高负载时,自动采集Java线程堆栈信息,并推送至企业微信,若使用上有什么疑问可以下方留言,或添加我的微信(yilingyi619836)进行交流,本期分享就到这里,谢谢!

源码地址:

https://github.com/majian159/k8s-java-debug-daemon

标签:JAVA,name,thread,container,线程,java,Pod,k8s,dumper
From: https://www.cnblogs.com/cheyunhua/p/18432956

相关文章

  • JavaScript有哪些数据类型?
    JavaScript共有八种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。Symbol和BigInt其中Symbol和BigInt是ES6+(ECMAScript2015+)中新增的数据类型:Symbol可以理解为一个独特的标识符。想象一下,你有一把独一无二的钥匙,这把钥匙就是S......
  • .NetCore MySqlException 多线程中(There is already an open DataReader associated w
    问题描述:其实标题只是遇到问题的其中之一,遇到三种异常信息如下:Lockwaittimeoutexceeded;tryrestartingtransaction大概意思:超过锁定等待超时;尝试重新启动事务 ThereisalreadyanopenDataReaderassociatedwiththisConnectionwhichmustbeclosedfirst.大......
  • 将Java编译的 .jar文件做成windows服务 实现开机自启动
    将Java编译的.jar文件做成windows服务实现开机自启动1、将windows服务制作工具(在网上下载) 复制到 jar程序目录下,并改名为 install.exe2、新建xml文件,将文件名命名为 install.xml3、将下面内容复制到xml文件中,启动模式为自动启动Automatic   修改jar文件路径......
  • Java OpenFeign详解
    OpenFeign是一个用于Java的声明式HTTP客户端,主要用于简化RESTAPI的调用。它通常与SpringCloud结合使用,提供了方便的接口来与微服务进行交互。以下是对OpenFeign的详细介绍,包括其核心概念、用法和配置。核心概念声明式调用:OpenFeign允许开发者通过注解的方式定......
  • 多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用
    一、功能特点组件同时集成了导出数据到csv、xls、pdf和打印数据。所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。提供静态方法直接传入QTableView、QTab......
  • java基本数据类型
    1、整数数据类型byte:1个字节,8位,256种状态,取值范围为【-128,127】short:2个字节,16位,65536种状态,取值范围为【-32768,32767】int:4个字节,32位,整数类型默认是int类型,取值范围约21亿long:8个字节,64位,long类型表示long类型常量,要加L或者l,建议加L2、小数数据类型float:4个字节,32位,单......
  • 自然语言处理实战项目java环境案例
    自然语言处理(NLP)是计算机科学和人工智能的一个重要分支,旨在实现计算机对人类语言的理解、处理和生成。随着深度学习和机器学习的进步,NLP应用在语音助手、文本分析、情感分析、机器翻译等方面得到了广泛应用。在Java中,虽然相比Python来说,NLP的生态系统并不算完善,但仍然有许多库......
  • Java中到底有哪些锁
    乐观锁和悲观锁不是具体的锁,是指看待并发同步的角度悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁:乐观锁不是真......
  • Java基于SpringBoot的高校门诊管理系统+Vue[毕业设计]
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低高校门诊的运营人员成本,实现了高校门诊管理的标准化、制度化、程序化的管理,有效地防止了高校门诊管理的随意管理,提......
  • Java基于SpringBoot的高校自习室预约系统+Vue[毕业设计]
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍高校自习室预约系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和学生来对系统进行设计构建。主要功......