前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s-java-thread-dumper新版发布:支持Prometheus啦!!!

k8s-java-thread-dumper新版发布:支持Prometheus啦!!!

作者头像
SRE运维手记
发布2024-09-26 10:33:47
1280
发布2024-09-26 10:33:47
举报
文章被收录于专栏:SRE运维手记

k8s-java-thread-dumper 是一款开源工具,专为在k8s环境中捕捉 Java 应用程序高负载时的线程池信息设计,帮助进行问题排查和处理。

在前面的文章《开源!Pod高负载自动打印JAVA线程堆栈》中我发布了k8s-java-thread-dumper的第一个版本,并获得小伙伴们通过微信和Github issue的积极反馈与建议,其中有几个不错的建议都在本次发布的新版本中实现,具体功能介绍和使用方法请见下文。

01、优化内容

下面橙色字体为本次新增功能点:

  • 支持新版的Grafana、Prometheus
  • 支持企业微信告警
  • 支持k8s部署
  • 支持configmap进行配置
  • 支持arthas-boot.jar通过远程拷贝(适用于极简容器没有curl场景)
  • 修复n多已知问题

02、工作流程

Grafana告警

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

整体流程如下:

  • 为 Grafana 添加 webhook 类型的告警通知渠道,地址为该程序的 url(默认的hooks路径为 /hooks/grafana)。
  • 配置Grafana图表,并设置告警阈值
  • 当 webhook 触发时,程序会自动将 crawl.sh 脚本拷贝到对应 Pod 的容器中并执行。
  • 程序将 stdout 保存到本地文件,并推送到企业微信。

Prometheus告警

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

整体流程如下:

  • 为 Prometheus 添加告警规则,并设置告警阈值。
  • 为 Alertmanager 配置route规则和receiver,当alertname等于HighPodCPUUsage时,将告警信息回调该程序的url(默认的hooks路径为 /hooks/prometheus)。
  • 当 webhook 触发时,程序会自动将 crawl.sh 脚本拷贝到对应 Pod 的容器中并执行。
  • 程序将 stdout 保存到本地文件,并推送到企业微信。

03、效果预览

  • 企业微信告警展示
  • “点击查看”跳转访问arthas捕获的线程堆栈
  • 通过web浏览arthas捕获的线程信息
代码语言:javascript
复制
代码语言:javascript
复制
http://xxxxxx:8099/stacks/

04、支持环境

Grafana v10.x (v9.x应该也支持,未测试)

05、配置说明

  • config/config.yaml配置项
代码语言:javascript
复制
server:
  # 服务监听端口
  port: 8099
  # 每node同时运行执行数为10
  maxNodeLockManager: 10
  # 服务监听域名
  domain: "http://127.0.0.1:8099"

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

arthas:
  # 是否远程拷贝arthas,值为false时将通过crawl.sh脚本进行下载
  remoteCopy: true
  #arthas-boot.jar源的存放路径
  path: "tools/arthas-boot.jar"
  • 默认取最繁忙的前50个线程的堆栈信息 (可在 crawl.sh 中修改)
  • 采集样本时间为2秒 (可在 crawl.sh 中修改)

06、如何使用

Docker镜像

  • 这是编译好的镜像,可以直接拉取使用
代码语言:javascript
复制
docker pull registry.cn-hangzhou.aliyuncs.com/yilingyi/k8s-java-thread-dumper:2.1.0
  • 自行构建

拉取源码

代码语言:javascript
复制
代码语言:javascript
复制
git clone https://github.com/yilingyi/k8s-java-thread-dumper.git

构建镜像

代码语言:javascript
复制
make docker IMAGE=yilingyi/k8s-java-thread-dumper:2.1.0

Kubernetes部署

  • 创建命名空间monitor
代码语言:javascript
复制
kubectl create namespace monitor
  • 将下面三个文件放在同一目录下,并使用kubectl apply -f . -n monitor进行k8s资源创建

Deployment.yaml

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-java-thread-dumper
  labels:
    app: k8s-java-thread-dumper
spec:
  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.1.0
        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

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: k8s-java-thread-dumper-service
  labels:
    app: k8s-java-thread-dumper
spec:
  selector:
    app: k8s-java-thread-dumper
  ports:
  - protocol: TCP
    port: 8099
    targetPort: 8099
  type: NodePort

ConfigMap.yaml

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: k8s-java-thread-dumper-config
data:
  config.yaml: |
    server:
      port: 8099
      maxNodeLockManager: 10
      domain: "http://xxxxx:8099"
    wework:
      webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxx"
    arthas:
      remoteCopy: true
      path: "tools/arthas-boot.jar"
  • 资源授权

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

代码语言:javascript
复制
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: <target-namespace>
  name: pod-exec-role
rules:
- apiGroups: [""]
  resources: ["pods/exec"]
  verbs: ["create"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pod-exec-role-binding
  namespace: <target-namespace>
subjects:
- kind: ServiceAccount
  name: default
  namespace: monitor
roleRef:
  kind: Role
  name: pod-exec-role
  apiGroup: rbac.authorization.k8s.io

回调接口

  • Grafana webhook 回调地址
代码语言:javascript
复制
http://xxxxxx:8099/hooks/grafana
  • Prometheus webhook 回调地址
代码语言:javascript
复制
http://xxxxxx:8099/hooks/prometheus

Grafana告警规则

  • Metrics Browser中填写
代码语言:javascript
复制
代码语言:javascript
复制
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 中填写
代码语言:javascript
复制
{{node}} - {{namespace}} - {{pod}} - {{container}}

配置完如下:

  • 联络点配置
代码语言:javascript
复制
选择webhook,URL地址为http://xxxxx/hooks/grafana

配置完如下:

Prometheus&Alertmanager告警规则
  • Prometheus告警规则
代码语言:javascript
复制
代码语言:javascript
复制
rules:
  - alert: HighPodCPUUsage
    expr: 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 > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High CPU usage detected on pod {{ $labels.pod }} in namespace {{ $labels.namespace }}"
      description: "CPU usage is above 90% for more than 5 minutes.\n  VALUE = {{ $value }}\n  POD = {{ $labels.pod }}\n  NAMESPACE = {{ $labels.namespace }}"
  • Alertmanager规则配置

新增路由,将alertname为HighPodCPUUsage的告警发送到receiver:high-pod-cpu-usage,然后回调接口http://xxxxx/hooks/prometheus

代码语言:javascript
复制
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  receiver: 'default'

  routes:
  - match:
      alertname: 'HighPodCPUUsage'
    receiver: 'high-pod-cpu-usage'

receivers:
- name: 'default'
  webhook_configs:
  - url: 'http://default-webhook-url/api/v1/alerts'

- name: 'high-pod-cpu-usage'
  webhook_configs:
  - url: 'http://xxxxx/hooks/prometheus'
代码语言:javascript
复制

07、结 语

本次新版增加了prometheus回调功能,并增加了arthas远程拷贝,满足极简容器环境使用,使用期间有遇到问题或者建议欢迎反馈。本期分享就到这里,谢谢!

源码地址:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维手记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Grafana告警
  • Prometheus告警
  • Docker镜像
    • Prometheus&Alertmanager告警规则
    相关产品与服务
    Prometheus 监控服务
    Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档