Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

news2024/12/25 12:33:34

1. Spring Boot 工程集成 Micrometer

1.1引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

1.2配置

方式一:修改配置文件application.yml

management:
  endpoints:
    web:
      exposure:
        include:
          - prometheus
          - health
  metrics:
    tags:
      application: ${spring.application.name}

这里 management.endpoints.web.exposure.include 配置为开启 Actuator 服务,因为Spring Boot Actuator 会自动配置一个 URL 为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不过默认该服务是关闭的,该配置将打开对应或者所有的 Actuator 服务。

management.metrics.tags.application 配置会将该工程应用名称添加到计量器注册表的 tag 中去,方便后边 Prometheus 根据应用名称来区分不同的服务。

方式二:添加Spring 配置 向Prometheus 添加application 的tag

management.endpoints.web.exposure.include 还是要有的

public class PrometheusConfiguration {

    @Value("${spring.application.name}")
    private String applicationName;

    @Bean
    MeterRegistryCustomizer<MeterRegistry> appMetricsCommonTags() {
        return registry -> registry.config().commonTags("application", applicationName);
    }
}

1.3 运行查看监控效果

启动项目,访问 http://8080/actuator, 就可以看到Actuator提供的所有监控

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "prometheus": {
      "href": "http://localhost:8080/actuator/prometheus",
      "templated": false
    }
  }
}

参考监控数据 http://localhost:8080/actuator/prometheus

在这里插入图片描述

1.4创建自定义监控

我们可以利用Prometheus client自定义metric

这一步非必要,只是创建业务需要的监控数据

@Service
public class PrometheusMeter {

    @Autowired
    private CollectorRegistry collectorRegistry;

    // 定义name为prometheus_counter的counter
    public Counter prometheusCounter(){
        return Counter.build().name("prometheus_counter").help("prometheus counter test")
                .register(collectorRegistry);
    }

    @PostConstruct
    public void init(){
        Counter counter = prometheusCounter();
        new Thread(()-> {
            while (true){
                counter.inc();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

1.5 运行在k8s环境下

示例工程:https://github.com/admin4j/alertmanager-dingtalk-webhook

docker: docker pull admin4j/alertmanager-dingtalk-webhook

k8s 运行yml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager-dingtalk-webhook
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alertmanager-dingtalk-webhook
  template:
    metadata:
      labels:
        app: alertmanager-dingtalk-webhook
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - alertmanager-dingtalk-webhook
      containers:
        - name: alertmanager-dingtalk-webhook
          image: admin4j/alertmanager-dingtalk-webhook:latest
          imagePullPolicy: Always
          resources:
            limits:
              memory: 1G
            requests:
              memory: 1G
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60
            timeoutSeconds: 10
            periodSeconds: 120
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 10
            timeoutSeconds: 10
            periodSeconds: 120
          env:
            - name: dingTalk_assessToken
              valueFrom:
                configMapKeyRef:
                  name: alertmanager-webhook-cm
                  key: dingTalk_assessToken
            - name: dingTalk_secret
              valueFrom:
                configMapKeyRef:
                  name: alertmanager-webhook-cm
                  key: dingTalk_secret
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager-webhook-cm
data:
  dingTalk_assessToken: d54bd0d41decb444d8e716fa661c03233d10f75559a0041c60148a1de8bb802x
  dingTalk_secret: SEC7f5baedc3bc637942041077a6e5aeb4275cf403ad3c057e75b0ed8921dc2662x

----
kind: Service
apiVersion: v1
metadata:
  name: alertmanager-webhook-service
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: alertmanager-dingtalk-webhook
  type: ClusterIP
  sessionAffinity: None

2.集成 Prometheus、Alertmanager、Grafana

安装方式参考 Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控这里就不细说了。

3. Prometheus自动发现 springboot 应用

方式一:使用Prometheus Operator 的自定义资源 CRD

3.1 使用 PodMonitors

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: alertmanager-webhook
  labels:
    app: alertmanager-webhook
spec:
  selector:
    matchLabels:
      app: alertmanager-webhook
  namespaceSelector: {}
  podMetricsEndpoints:
  - port: web
    interval: 15s
    path: /metrics

类似地,修改 Prometheus CRD对像的用spec.podMonitorSelector字段。

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceAccountName: prometheus
  podMonitorSelector:
    matchLabels:
      team: alertmanager-webhook

3.2 使用 ServiceMonitors

与 PodMonitors 具体参考 Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控

3.3 使用注解

参考 我的 【k8s 实战】Prometheus Operator 高级配置- 监控Kubernetes自动发现 一文

使用注解让 Prometheus 自动发现pod

修改yml,添加注解 prometheus.io/xx注解

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager-dingtalk-webhook
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alertmanager-dingtalk-webhook
  template:
    metadata:
      labels:
        app: alertmanager-dingtalk-webhook
    annotations:
      prometheus.io/path: /actuator/prometheus
      prometheus.io/prot: '8080'
      prometheus.io/scrape: 'true'

在这里插入图片描述

4.使用 Grafana Dashboard 展示监控项数据

去Grafana 官网找一个 springboot 监控模板 https://grafana.com/grafana/dashboards/

在这里插入图片描述

搜索 spring boot 或者 JVM选择一个监控模板

我们这里选择 12900和4701

在这里插入图片描述

12900 效果

在这里插入图片描述

4701效果

在这里插入图片描述

5. 利用AlertManager 发送报警消息

添加PrometheusRule CRD

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  creationTimestamp: null
  labels:
    prometheus: k8s
    role: alert-rules
  name: prometheus-springboot-rules
spec:
  groups:
  - name: springboot
    rules:
    - alert: JvmMemoryFillingUp
      expr: (sum by (instance)(jvm_memory_used_bytes{area="heap"}) / sum by (instance)(jvm_memory_max_bytes{area="heap"})) * 100 > 80
      for: 2m
      labels:
        severity: warning
      annotations:
        summary: JVM memory filling up (instance {{ $labels.instance }})
        description: "JVM memory is filling up (> 80%)\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

添加成功

在这里插入图片描述

参考

Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控

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

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

相关文章

JVM简单介绍

JVMJVM内存区域划分JVM类加载机制JVM垃圾回收机制【哪些内存需要被JVM中垃圾回收机制回收】【JVM中垃圾回收机制的基本单位】【JVM中垃圾回收机制是如何判断对象是否是垃圾】【如何回收垃圾】JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软…

电巢:半导体ATE国产化产业探究(附国内外厂家汇总)

前言 2022年10月7日&#xff0c;美国BIS发布近年来范围最大半导体管制举措&#xff0c;管控范围包括芯片、设备、零部件、人员等。 12月6日下午&#xff0c;全球最大晶圆代工厂台积电&#xff0c;在美国亚利桑那州凤凰城高调举行了首批机台设备迁机仪式。 据联合早报12月8日报道…

分蛋糕

题目描述 SYCSYC在每个阶段结束(语言阶段、基础算法、提高算法)后,都会切蛋糕 现在MasMas有一个蛋糕,他希望将蛋糕分成nn份 规定一刀合法的蛋糕切法为符合以下两种条件之一 一刀的切痕迹是一条线段,线段两个端点在圆上,且线段经过圆心(切痕为圆的直径) 一刀的切痕迹是一条线…

[附源码]计算机毕业设计Python电商小程序(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

2023年数字信号处理前沿国际会议(CFDSP 2023)

2023年数字信号处理前沿国际会议&#xff08;CFDSP 2023&#xff09; 重要信息 会议网址&#xff1a;www.cfdsp.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周内 收录检索&am…

【OpenCV】SURF图像拼接和Stitcher拼接

介绍两种图像拼接的方法&#xff0c;一种是SURF算法的图像拼接&#xff0c;另一种是Stitcher硬拼接 首先先从简单的讲起 一、Stitcher直接拼接 可以实现多张图片一起拼接&#xff0c;只要两行代码就可以实现拼接&#xff1b; 1.首先准备多张图片&#xff0c;放入向量容器中…

PDF如何插入空白页?3 次点击在PDF中插入空白页!

由于工作和学习的需要&#xff0c;您可能需要在现有的PDF文件中插入一张空白页或几页PDF&#xff0c;使之成为一个完整的PDF文件。但是&#xff0c;PDF文件实际上是最终作品&#xff0c;似乎不可能向其添加额外的页面。事实上&#xff0c;将空白页或 PDF 文件插入现有 PDF 文件…

Conv2Former ~2

还是来说Conv2Former~~ 上次发了一次~~ 一种卷积调制模块&#xff0c;利用卷积来建立关系&#xff0c;这比注意力机制在处理高分辨率图像时更高效&#xff0c;称为 Conv2Former。作者在 ImageNet 分类、目标检测和语义分割方面的实验也表明&#xff0c;Conv2Former 比以前基于…

【2022.12.19】备战春招Day14——每日一题 + 234. 回文链表 + 860. 柠檬水找零

【每日一题】1971. 寻找图中是否存在路径 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n -1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi之间的双向边。…

昆仑万维的AI作画简直就是业界天花板

AI作画的业界天花板被我找到了&#xff0c;AIGC模型揭秘 | 昆仑万维。 一、前景 1、AI和AIGC的关系 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的…

SpringMVC入门到实战------ 十一 拦截器的使用

1、拦截器的配置 拦截器用于拦截控制器方法的执行 拦截器需要实现HandlerInterceptor 拦截器必须在SpringMVC的配置文件中进行配置 1.1 和1.2 是对所有的请求进行拦截&#xff1b;1.3 对排出的请求不在拦截 1.1 不使用注解的情况 创建拦截器类 /*** 拦截器* author zyz* ve…

牛客竞赛每日俩题 - Day11

目录 错排问题 有理数运算 错排问题 年会抽奖__牛客网 全部都不获奖的概率必定是由 n个人都拿错的情况种数 除 n个人拿出的所有排列情况数。n个人拿出的所有排列情况数显然是n的阶乘。 假设a的名字没有被a拿到&#xff0c;其他n - 1个人都有可能拿到&#xff0c;即有n - 1种…

JavaScript 中的设计模式

目录 1. 单例模式 2. 策略模式 3. 代理模式 4. 装饰者模式 5. 组合模式 6. 工厂模式 7. 访问者模式 8. 发布订阅模式 9. 观察者模式 10. 参考链接 设计模式&#xff08;Design Pattern&#xff09;是从许多优秀的软件系统中&#xff0c;总结出的成功的、能够实现可维…

CentOS 7安装及使用MobaXterm连接

1、 下载centos7映像文件地址&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64 选择CentOS-7.0-x86_64-DVD-2009.iso 标准安装版或者CentOS-7-x86_64-Everything-1908.iso下载 2、安装centos7 2.1、右击以管理员身份运行 2.2、点击创建新的虚拟机 2.3、选择…

c++ - 第18节 - 哈希

1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行很…

MockServer 服务框架设计

大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘&#xff0c;比如对 socket 协议的应用进行 mock&#xff0c;或者对于支付接口的失败重试的定制化 mock 场景。 为解决上述问题&#xff0c;霍格沃兹测试学院设计并研…

【Redis -String、List介绍和应用场景】

String String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M。 内部实现 String 类…

万字解析,带你深入掌握多种排序算法!-C语言

今天我们来看排序&#xff0c;排序在生活中经常使用&#xff0c;非常重要&#xff0c;是必学的内容。 目录 1.插入排序 1.1直接插入排序 1.2希尔排序 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 3.2快速排序 3.2.1挖坑法 3.2.2左右指针法 3.2.3…