实现自定义exporter

news2024/11/15 10:21:03

1、实现自定义exporter

在这里插入图片描述

1.1 四种常用Metrics

1.1.1 Counter

连续增加不会减少的计数器,可以用于记录只增不减的类型,例如:网站访问人数,系统运行时间等。

对于 Counter 类型的指标,只包含一个increment()的方法,就是用于计数器+1。

一般而言,Counter 类型的 metric 指标使用 _total 结束,如 http_requests_total。

1.1.2 Gauge

可增可减的仪表盘,曲线图。

对于这类可增可减的指标,用于反应应用的当前状态。

例如在监控主机时,主机当前空闲的内存大小,可用内存大小等等。

在设置指标时指定指标的值。

1.1.3 Histogram

主要用来统计数据的分布情况,这是一种特殊的 metrics 数据类型,代表的是一种近似的百分比估算数值,统计所

有离散的指标数据在各个取值区段内的次数。例如:我们想统计一段时间内 http 请求响应小于 0.005 秒、小于

0.01秒、小于0.025秒的数据分布情况。那么使用 Histogram 采集每一次 http 请求的时间,同时设置 bucket。

Histogram 会自动创建 3 个指标,分别为:

1、事件发生总次数: basename_count:

实际含义: 当前一共发生了2次http请求

io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0

2、所有事件产生值的大小的总和: basename_sum

实际含义: 发生的2次http请求总的响应时间为13.107670803000001 秒

io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001

3、事件产生的值分布在bucket中的次数: basename_bucket{le="上包含"}

在总共2次请求当中。http请求响应时间 <=0.005 秒 的请求次数为0

io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0

在总共2次请求当中。http请求响应时间 <=0.01 秒 的请求次数为0

io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0

在总共2次请求当中。http请求响应时间 <=0.025 秒 的请求次数为0

io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0

1.1.4 Summary

Summary 和 Histogram非常相似,都可以统计事件发生的次数或者大小,以及其分布情况,他们都提供了对时间

的计数 _count 以及值的汇总 _sum,也都提供了可以计算统计样本分布情况的功能,不同之处在于 Histogram

可以通过 histogram_quantile 函数在服务器计算分位数,而 Sumamry 的分位数则是直接在客户端进行定义的。

因此对于分位数的计算,Summary 在通过 PromQL 进行查询的时候有更好的性能表现,而 Histogram 则会消耗

更多的资源,但是相对于客户端而言 Histogram 消耗的资源就更少。用哪个都行,根据实际场景自由调整即可。

需要注意的是,Prometheus 需要收集的数据是随着时间的增长而增长的,所以它一般不建议保留长期的指标数

据,默认保留 15 天。如果监控的数据发现问题,那么需要我们配置告警发现,快速处理。

1.2 基于SpringBoot写一个简单的exporter_demo

1.2.1 pom.xml 配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-web-expoter-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-web-exporter-demo</name>
    <description>自定义实现exporter</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2.2 启动类

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @author zsx
 */
@EnableScheduling
@SpringBootApplication
public class SpringWebExporterDemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringWebExporterDemoApplication.class, args);
    }
}

1.2.3 配置文件

management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
spring.application.name=exporter
management.metrics.tags.application=${spring.application.name}
management.metrics.export.prometheus.enabled=true
management.metrics.enable.jvm=false
management.metrics.enable.tomcat=false
management.metrics.enable.logback=false
management.metrics.enable.process=false
management.metrics.enable.executor=false
management.metrics.enable.http=false
management.metrics.enable.system=false
management.metrics.enable.disk=false
management.metrics.enable.application=false

1.2.4 CounterDemo

package com.example.prometheus;

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * @author zhangshixing
 * @date 2022年03月16日 20:57
 * https://vimsky.com/examples/detail/java-method-io.micrometer.core.instrument.MeterRegistry.counter.html
 * https://vimsky.com/examples/detail/java-class-io.micrometer.core.instrument.MeterRegistry.html
 */
@Configuration
public class CounterDemo {

    @Autowired
    private MeterRegistry registry;

    @Scheduled(cron = "0/5 * * * * ?")
    public void changeCounter() {
        Counter c = registry.counter("MyCounter", Tags.of("MyCounterKey1", "MyCounterValue1", "MyCounterKey2", "MyCounterValue2"));
        c.increment(2);
    }
}

1.2.5 GaugeDemo

package com.example.prometheus;

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.Random;

/**
 * @author zhangshixing
 * @date 2022年03月16日 21:28
 * https://vimsky.com/examples/detail/java-method-io.micrometer.core.instrument.MeterRegistry.gauge.html
 */
@Configuration
public class GaugeDemo {

    @Autowired
    private MeterRegistry registry;

    @Scheduled(cron = "0/5 * * * * ?")
    public void changeGauge() {
        Random random = new Random();
        Gauge gauge = registry.find("GaugeDemo").gauge();
        if (gauge == null) {
            registry.gauge("GaugeDemo", Tags.of("GaugeDemoKey1", "GaugeDemoValue1"), random.nextInt(100));
        } else {
            registry.remove(gauge.getId());
            registry.gauge("GaugeDemo", Tags.of("GaugeDemoKey1", "GaugeDemoValue1"), random.nextInt(100));
        }
    }
}

1.2.6 SummaryDemo

package com.example.prometheus;

import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.Random;

/**
 * @author zhangshixing
 * @date 2022年03月16日 21:40
 * https://vimsky.com/examples/detail/java-method-io.micrometer.core.instrument.MeterRegistry.summary.html
 */
@Configuration
public class SummaryDemo {

    @Autowired
    private MeterRegistry registry;

    @Scheduled(cron = "0/5 * * * * ?")
    public void changeSummary() {
        Random random = new Random();
        DistributionSummary distributionSummary = registry.summary("SummaryDemo", Tags.of("SummaryDemoKey1", "SummaryDemoValue1"));
        distributionSummary.record(random.nextInt(100));
        distributionSummary.record(random.nextInt(100));
        distributionSummary.record(random.nextInt(100));
        distributionSummary.record(random.nextInt(100));
    }
}

1.2.7 HistogramDemo

package com.example.prometheus;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.Duration;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

/**
 * @author zhangshixing
 * @date 2022年03月16日 21:47
 * https://vimsky.com/zh-tw/examples/detail/java-class-io.micrometer.core.instrument.Timer.html
 */
@Configuration
public class HistogramDemo {

    @Autowired
    private MeterRegistry registry;

    @Scheduled(cron = "0/5 * * * * ?")
    public void changeHistogram() {
        Timer timer = Timer.builder("HistogramDemo").publishPercentileHistogram().publishPercentiles(0.1, 0.5, 0.99).register(registry);
        IntStream.rangeClosed(1, 20).forEach(i -> {
            timer.record(Duration.ofSeconds(ThreadLocalRandom.current().nextInt(20)));
        });
    }
}

1.2.8 Info

package com.example.prometheus;

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * @author zhangshixing
 * @date 2022年03月16日 22:00
 * https://vimsky.com/examples/detail/java-class-com.codahale.metrics.annotation.ExceptionMetered.html
 */
@Configuration
public class Info {

    @Autowired
    private MeterRegistry registry;

    @Scheduled(cron = "0/5 * * * * ?")
    public void info() {
        registry.getMeters()
                .stream()
                .forEach(m -> {
                    System.out.println(m.getId() + "-->" + m.measure());
                });
    }
}

1.2.9 结果

最终的结果如下所示:

# HELP HistogramDemo_seconds  
# TYPE HistogramDemo_seconds histogram
HistogramDemo_seconds{application="exporter",quantile="0.1",} 5.066719232
HistogramDemo_seconds{application="exporter",quantile="0.5",} 11.24073472
HistogramDemo_seconds{application="exporter",quantile="0.99",} 19.2937984
HistogramDemo_seconds_bucket{application="exporter",le="0.001",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.001048576",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.001398101",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.001747626",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.002097151",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.002446676",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.002796201",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.003145726",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.003495251",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.003844776",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.004194304",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.005592405",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.006990506",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.008388607",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.009786708",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.011184809",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.01258291",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.013981011",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.015379112",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.016777216",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.022369621",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.027962026",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.033554431",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.039146836",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.044739241",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.050331646",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.055924051",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.061516456",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.067108864",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.089478485",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.111848106",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.134217727",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.156587348",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.178956969",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.20132659",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.223696211",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.246065832",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.268435456",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.357913941",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.447392426",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.536870911",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.626349396",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.715827881",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.805306366",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.894784851",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="0.984263336",} 1.0
HistogramDemo_seconds_bucket{application="exporter",le="1.073741824",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="1.431655765",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="1.789569706",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="2.147483647",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="2.505397588",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="2.863311529",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="3.22122547",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="3.579139411",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="3.937053352",} 2.0
HistogramDemo_seconds_bucket{application="exporter",le="4.294967296",} 3.0
HistogramDemo_seconds_bucket{application="exporter",le="5.726623061",} 5.0
HistogramDemo_seconds_bucket{application="exporter",le="7.158278826",} 9.0
HistogramDemo_seconds_bucket{application="exporter",le="8.589934591",} 12.0
HistogramDemo_seconds_bucket{application="exporter",le="10.021590356",} 17.0
HistogramDemo_seconds_bucket{application="exporter",le="11.453246121",} 20.0
HistogramDemo_seconds_bucket{application="exporter",le="12.884901886",} 24.0
HistogramDemo_seconds_bucket{application="exporter",le="14.316557651",} 30.0
HistogramDemo_seconds_bucket{application="exporter",le="15.748213416",} 31.0
HistogramDemo_seconds_bucket{application="exporter",le="17.179869184",} 36.0
HistogramDemo_seconds_bucket{application="exporter",le="22.906492245",} 40.0
HistogramDemo_seconds_bucket{application="exporter",le="28.633115306",} 40.0
HistogramDemo_seconds_bucket{application="exporter",le="30.0",} 40.0
HistogramDemo_seconds_bucket{application="exporter",le="+Inf",} 40.0
HistogramDemo_seconds_count{application="exporter",} 40.0
HistogramDemo_seconds_sum{application="exporter",} 446.0
# HELP HistogramDemo_seconds_max  
# TYPE HistogramDemo_seconds_max gauge
HistogramDemo_seconds_max{application="exporter",} 19.0
# HELP SummaryDemo  
# TYPE SummaryDemo summary
SummaryDemo_count{SummaryDemoKey1="SummaryDemoValue1",application="exporter",} 8.0
SummaryDemo_sum{SummaryDemoKey1="SummaryDemoValue1",application="exporter",} 366.0
# HELP SummaryDemo_max  
# TYPE SummaryDemo_max gauge
SummaryDemo_max{SummaryDemoKey1="SummaryDemoValue1",application="exporter",} 98.0
# HELP MyCounter_total  
# TYPE MyCounter_total counter
MyCounter_total{MyCounterKey1="MyCounterValue1",MyCounterKey2="MyCounterValue2",application="exporter",} 4.0
# HELP GaugeDemo  
# TYPE GaugeDemo gauge
GaugeDemo{GaugeDemoKey1="GaugeDemoValue1",application="exporter",} 0.0

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

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

相关文章

Eclipse中的实用工具之JUnit

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于JUnit的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 是什么 为什么要用 怎么用 是什么 JUnit…

奇舞周刊第497期:解锁 PDF 文件:使用 JavaScript 和 Canvas 渲染 PDF 内容

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 解锁 PDF 文件&#xff1a;使用 JavaScript 和 Canvas 渲染 PDF 内容 最近研究了 Web 的 FileSystemAccess Api&#xff0c;它弥补了 Web 长期以来缺少的能力&#xff1a;操作用户…

《PyTorch深度学习实践》第九讲 多分类问题

b站刘二大人《PyTorch深度学习实践》课程第九讲多分类问题笔记与代码&#xff1a;https://www.bilibili.com/video/BV1Y7411d7Ys?p9&vd_sourceb17f113d28933824d753a0915d5e3a90 二分类问题中计算出 P ( y 1 ) P(y1) P(y1)即可直接得到 P ( y 0 ) P(y0) P(y0)&#xff0…

LeetCode 打卡day46-- 单词拆分和多重背包问题

一个人的朝圣 — LeetCode打卡第46天 知识总结 Leetcode 139. 单词拆分题目说明代码说明 知识总结 今天写了一道题目, 但是还挺难的, 而且是面试高频题目 还过了一遍多重背包问题. 多重背包与01背包的区别在于多重背包限制了物品的个数, 某些物品的个数可能不为1, 可以使用两…

Opencascade源码学习之模型算法_建模算法介绍

Opencascade源码学习之模型算法_建模算法介绍 介绍几何工具相交两曲线相交曲线曲面相交两曲面相交 插值Geom2dAPI_InterpolateGeomAPI_Interpolate 约束的直线和圆约束类型可用的线和圆的类型外部/内部直线的方向两个圆相切给定半径的圆与两个圆相切算法的类型 约束的曲线和曲面…

初识React/JSX

JSX ​​​​​​​推荐使用小括号包裹jsx

【Linux】硬链接 和 软链接

为了方便用户访问文件&#xff0c;Linux提供了一种称为连接&#xff08;link&#xff09;的机制&#xff0c;可以将一个文件或目录与另一个文件或目录建立关联&#xff0c;从而实现多个路径指向同一个文件或目录的效果。 一、概述二、硬链接和软链接详解2.1 硬链接2.11 硬链接的…

ASIC 数字设计:概述和开发流程

概述 集成电路是由硅晶圆&#xff08;wafer&#xff09;切割出来的芯片&#xff08;die&#xff09;组成的。每个晶圆可以切割出数百个芯片。 ASIC是指针对特定应用而设计的集成电路&#xff08;Application Specific Integrated Circuit&#xff09;&#xff0c;与通用的存储器…

ctfhub靶场练习——SSRF攻击

文章目录 前言关卡、内网访问关卡、伪协议读取文件关卡、端口扫描关卡、POST1、使用http协议查看本地的flag.php文件2、使用burp抓包&#xff0c;并发送到Repeater模块进行操作3、构造一个简单的POST请求&#xff1a;4、对构造的post请求进行url编码第一次编码&#xff1a;对第…

【裸机开发】GPT 定时器(一) —— GPT的功能、寄存器解析

后续需要使用 GPT 计数器实现中断以及延时&#xff0c;这里我们需要先了解一下GPT的功能以及相关寄存器。 目录 一、GPT 定时器的功能 1、计数器 2、输入捕获 3、输出比较&#xff08;GPT的两种工作模式&#xff09; 二、寄存器解析 1、GPTx_CR 2、GPTx_PR 3、GPTx_SR …

Jetson Nano烧写系统镜像

Jetson Nano是一款形状和接口类似于树莓派的嵌入式主板&#xff0c;搭载了四核Cortex-A57处理器&#xff0c;GPU则是拥有128个NVIDIA CUDA核心的NVIDIA Maxwell架构显卡&#xff0c;内存为4GB的LPDDR4&#xff0c;60Hz视频解码。 1.烧录前准备 电源线&#xff08;必备&#xf…

游戏陪玩语音聊天系统3.0商业升级独立版本源码

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码 1、增加人气店员轮播 2、优化ui界面丨优化游戏图标展示丨优化分类展示 3、增加动态礼物打赏功能 4、增加礼物墙功能 增加店员满足业绩&#xff0c;才能升级功能 5、增加店员等级不同&#xff0c;可接…

操作系统第4章习题

B 一个目录文件包含多个目录项 B. 在打开文件的时候还不用 只有在读文件的时候 才需要把数据读到内存中 C 不完整 D 在外存中 FCB不是文件控制块吗 为什么是文件目录项 文件属性&#xff1a;有的文件是只读的 访问控制的灵活性较高

【前端2】jquary,bootstrap,vue

文章目录 1.jquary&#xff1a;选择器1.1 jquery框架引入&#xff1a;$("mydiv") 当成id选择器1.2 jquery版本/对象&#xff1a;$(js对象) -> jquery对象1.3 jquery的页面加载事件&#xff1a;$ 想象成 window.onload 1.4 jquery的基本选择器&#xff1a;$()里内容…

7 拓展中断_事件控制器(EXTI)(STM32HAL库 )

目录 EXTI-扩展中断和事件控制器 事件的概念 EXTI-扩展中断和事件控制器 EXTI外设框图 F1/F4/F7&#xff08;看懂与或门&#xff09; H7 STM32CubeMX中的EXTI配置 EXTI-扩展中断和事件控制器 事件的概念 STM32上许许多多的外设&#xff0c;是通过内部信号来协同工作的。…

Android Compose Button defaultButtonColors

Android Compose Button defaultButtonColors 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 发现问题 最近看 Android Compose 相关资料发现如下代码 colors defaultButtonColors( backgroundColor if (count > 5) Color.Green else Color.White )原文地…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态&#xff08;polymorphism&#xff09; 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字&#xff08;C11&#xff09; 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

通信接口和通信方式总结

通信接口和通信方式总结 一、通信接口主要的5种类型二、通信方式2.1 并行和串行2.2 单工、半双工及全双工通信2.3 串行通信分类 - 同步\异步2.4 波特率 Baud Rate 三、串联设备的接口类型 - 网口和串口3.1 串口 - COM口3.1.1 基本介绍及应用3.1.2 接线方式 - 232、422、485接线…

时序预测 | MATLAB实现PSO-GRU(粒子群优化门控循环单元)时间序列预测

时序预测 | MATLAB实现PSO-GRU(粒子群优化门控循环单元)时间序列预测 目录 时序预测 | MATLAB实现PSO-GRU(粒子群优化门控循环单元)时间序列预测预测效果基本介绍模型介绍PSO模型GRU模型PSO-GRU模型 程序设计参考资料致谢 预测效果 基本介绍 Matlab基于PSO-GRU粒子群算法优化门…

【vue3-element-admin 】基于 Vue3 + Vite4 + TypeScript5+ Element-Plus 从0到1搭建企业级后台管理系统(前后端开源)

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案&#xff0c;技术栈为 Vue3 Vite4 TypeScript Element Plus Pinia Vue Router 等当前主流框架。 相较于其他管理前端框架&#xff0c;vue3-element-admin 的优势在于一…