【Prometheus】PromQL数据类型以及常用的计算函数用法详解
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑
文章目录
- PromQL常用函数
- 1. Count类型常用函数
- 1、rate用于计算平均增长速率
- 2、irate用于计算瞬时的增长速率(灵敏度较高)
- 3、increase用于计算指定时间范围内样本值的增加量
- 2. Gauge类型常用函数
- 1、predict_linear(v range-vector, t, scalar):预测时间序列v在t秒后的值
- 2、delta(v range-vector):计算范围向量中每个时间序列上的 最后一个样本值 与 第一个样本值之差
- 3、changes() :计算监控时间范围内某个时间序列的数据变化的次数。
- PromQL二元运算符
- 1. 算术运算符介绍
- 2. 算术运算符实践
- 3. 比较运算符介绍
- 4. 比较运算符实践
- 5. 集合运算符介绍
- 6. 集合运算符实践
PromQL常用函数
PromQL提供了对时间序列数据的查询、聚合、计算和过滤等功能。在Prometheus中,时间序列(Time Series)是基本的数据单位,每个时间序列由指标名(metric name)和一组键值对(key-value pairs,即标签labels)唯一标识。
1. Count类型常用函数
在前面我们讲过,Counter类型的监控指标只增不减,因此其样本值应该是不断增大的。我们要一个不断增大的数也没什么意义,更多的时候,比如根据汽车的总里程数和时间,计算出汽车的时速。
因此单纯的Counter总数并没有直接作用,而是需要借助于rate、irate、increase等函数来计算样本数据的变化状况(增长率);
1、rate用于计算平均增长速率
计算公式:通过指定时间范围内的样本,使用最后一个样本的值减去第一个样本的值,而后除以这两个样本之间的间隔时长。
例如: rate(nginx_http_requests_total[1m]) ,表示要获取1分钟内,该指标上的http总请求数的平均增长速率;
2、irate用于计算瞬时的增长速率(灵敏度较高)
计算公式:通过指定时间范围内的样本最后一个样本的值减去前一个样本的值,而后除以这两个样本之间的间隔时长。
例如: irate(nginx_http_requests_total[1m]) ,表示要获取1分钟内,该指标上的http总请求数的瞬时增长速率;
3、increase用于计算指定时间范围内样本值的增加量
计算公式:通过指定时间范围内的样本最后一个样本的值减去第一个样本的值。
注意:increase可能会引用时间范围边界之前的样本值,以便于计算能覆盖到指定的整个时间范
围。
例如: increase(nginx_http_requests_total[1m]) ,表示要获取1分钟内,http请求的增量;
2. Gauge类型常用函数
Gauge类型的指标,存储的值是随着时间会变发生变化的,它常用求和、取平均值、最小值、最大值等;也会结合PromQL的 predict_linear 和 delta 函数使用;
1、predict_linear(v range-vector, t, scalar):预测时间序列v在t秒后的值
它通过线性回归的方式来预测样本数据的变化趋势;
例如: predict_linear(node_filesystem_avail_bytes[4h], 60602430) ,使用过去4小时的数据来预测接下来30天(60602430)的磁盘空间趋势。
我们先看下jingtian01根分区磁盘使用,目前可用33G
我们根据目前的使用情况,来预测未来30后根分区可用磁盘空间
predict_linear(node_filesystem_avail_bytes{instance="jingtian01:9100",mountpoint="/"}[1d],60*60*24*30)/1024/1024/1024
根据目前使用速度,30天后可用为28G
如此,我们就可以增加告警通知,当30天后磁盘不足多少时,触发告警,这样我们就有充足的时间来处理
2、delta(v range-vector):计算范围向量中每个时间序列上的 最后一个样本值 与 第一个样本值之差
其计算结果与increase函数相同;但delta 更适用于没有重置的场景,或者用来监控那些可能上升或下降的指标,例如温度、磁盘空间等。
例如: delta(cpu_temp_celsius{host=“prom01.oldxu.net”}[2h]) ,返回该服务器上的CPU温度与2小时之前的差异;
例如: delta(node_filesystem_avail_bytes[10m]) /1024 /1024 ,返回服务器上磁盘可用空间与10分钟之前的差异;
3、changes() :计算监控时间范围内某个时间序列的数据变化的次数。
它只关心变化的次数,而不关心具体变化的值是什么。
例如: changes(nginx_up[10m]) 监控Nginx服务在给定时间内变化的次数,如果停止了变化次数+1,启动了变化次数+1。
我们的程序没有重启过,所以都是0
当我们重启jingtian01上的node_exporter后,检测到状态变化两次,可以看到该值变成了2
由此可以判断某个服务是否发生了重启
PromQL二元运算符
PromQL提供了一系列二元运算符,包括算术运算(+ - * /)、⽐较运算( == <= >=)、以及集合运算( and or unless)。在PromQL中,用户可以执⾏以下
类型的运算:
1、标量与标量之间的运算
2、即时向量与标量之间的运算
3、两个即时向量之间的运算。(当涉及到两个即时向量的运算时,PromQL遵循向量匹配机制(Vector Matching),定义其运算逻辑)
1. 算术运算符介绍
在PromQL中算术运算符,是用来对指标数据执⾏基本的数学运算。支持的运算符有:+(加)、-(减)、*(乘)、/(除)、%(取模)和^(幂运算)
1、标量与标量之间进行数学运算,其最终得到的也是标量(使⽤较少)
# 标量与标量算数运算表达式
5 + 5
# 结果
scalar 10
2、即时向量与标量进行运算,例如
将 node_memory_MemTotal_bytes (节点内存总大小)的默认bytes单位转为MB
# 即时向量与标量算数运算表达式
node_memory_MemTotal_bytes/1024/1024
3、即时向量与即时向量进行运算,它们需要遵循向量的匹配逻辑,也就是向量与向量的标签必须完全匹配一致才可以进行运算,如果它们的标签不一致,则不会执行这个运算。
例如:我们想计算内存的可用百分比,计算公式为“(内存可用空间 / 内存总空间 * 100)= 内存可用百分比 ”这两个向量的标签是完全一致的,因此可以直接进行运算,否则⽆法正常进行运算,除非进行向量匹配特殊的处理。
# 即时向量与即时向量算数运算表达式
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100
2. 算术运算符实践
实例1:计算所有实例节点的ens33网卡,接收的总流量和发送的总流量之和
(以GB显示)
node_network_receive_bytes_total :节点网络接收的总大小
(以字节为单位)
node_network_transmit_bytes_total :节点网络发送的总大小
(以字节为单位)
# 表达式( 计算公式:(ens33接收的总流量 + ens33发送的总流量) /1024 / 1024 /1024 )
(node_network_receive_bytes_total{device="ens33"} + node_network_transmit_bytes_total{device="ens33"})/1024/1024/1024
实例2:计算所有实例节点的 /分区 已经使用了,多少空间(以GB显示)
node_filesystem_size_bytes :文件系统总大小(以字节为单
位)
node_filesystem_avail_bytes :文件系统可用空间(以字节为单
位)
# 表达式( 计算公式:(总空间 - 剩余空间) /1024 / 1024 /1024 )
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"})/1024/1024/1024
实例3:计算所有实例节点的 /分区 “已用空间百分比”
# 表达式( 计算公式:(总空间 - 可用的空间) / 总空间 * 100 )
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"})/ node_filesystem_size_bytes * 100
实例4:计算所有节点内存的“已用百分比”
node_memory_MemTotal_bytes :总内存大小(单位字节)
node_memory_MemAvailable_bytes :内存可用大小(单位字节)
# 表达式( 计算公式:(总内存 - 可用内存) / 总内存 * 100 )
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
3. 比较运算符介绍
在PromQL中比较运算符,是用来对指标的数据进行条件判断,一般在告警规则中定义何时应该触发告警。PromQL支持的比较运算符有如下几个:
== :等于,当两边的数值相等时为真。
!= :不等于,当两边的数值不相等时为真。
> :大于,当左边的数值大于右边时为真。
< :小于,当左边的数值小于右边时为真。
>= :大于等于,当左边的数值大于或等于右边时为真。
<= :小于等于,当左边的数值小于或等于右边时为真。
在PromQL中,使用比较运算符时,默认情况下,如果比较结果为假(即条件不满足),则相关的时间序列不会出现在结果中。
但是,如果在测试时,想要明确地看到哪些时间序列满足条件(为真)和哪些不满足(为假),
可以使用bool修饰符,这个修饰符会将所有的时间序列都显示在结果中,满足条件的序列会有一个值为1(true),不满⾜的序列会有一个值为0(false)。
1、标量与标量之间进行比较运算
#结果为false的显示0
5 == bool 6
#结果为true的显示1
2、即时向量与标量进行比较运算,例如判断服务器1分钟的负载,是否有大于0以上的节点
# 即时向量与标量进行比较表达式
node_load1 > 0
3、即时向量与即时向量进行比较运算,它们需要遵循向量的匹配逻辑,也就是向量与向量的标签必须完全匹配一致才可以进行运算,如果它们的标签不一致,则不会执行这个运算。
例如:我们可以比较“可用内存”是否大于“空闲内存”,如果满足该条件,那么会显示左侧的指标名称和指标当前的值。
node_memory_MemAvailable_bytes > node_memory_MemFree_bytes
4. 比较运算符实践
实例1:查询node_exporter这个job中,目前不存活实例有哪些(1为存活、0为不存活)。
up{job="node_exporter"} != 1
实例2:查询所有实例 “已使用内存”超过 30%
# 表达式:(计算公式:(总内存-可用内存)/ 总内存 * 100 大于 30 )
((node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100) > 30
实例3:查询所有的实例“磁盘可用空间”不足30%的实例
# 表达式:(计算公式:(可用空间 / 总磁盘空间) * 100 小于 30 )
(node_filesystem_avail_bytes / node_filesystem_size_bytes * 100) < 30
实例4:查询所有实例中ens33设备的网络带宽,每秒发送速率超过 200Mb/s的实例
#1、在两个测试的节点上安装:yum install iperf -y
#2、服务端运行并指定端口:iperf -s -p 9999
#3、客户端模拟带宽发送命令,-b指定发送大小,-t指定发送持续时长:iperf -c -p 99
99 -b 300M -t 60
iperf -c jingtian01 -p 9999 -b 300M -t 5000
#表达式(计算公式:rate(总的传输[1m]) * 8 /1024/1024) > 200) 网络速度或带宽通常
以位每秒(如 Mbps, Gbps)为单位。
因此需要将字节乘以8,能够将字节转换为位,这样可以更准
确地描述传输速率
如果不乘以8 则单位是M
B/s
1MB/s=8Mbps=8Mb/s
首先是“Mbps”,其全称为Million bits per second,意为每秒传输百万位(比特)数量的数据,而这里的bit(比特,1比特等于1个位)是表示数字信号数据的最小单位。
而Mb/s中的Mb与Mbps中的Mb意义相同,均表示百万位(比特)数据数量,所以Mbps=Mb/s。
rate(node_network_transmit_bytes_total{device="ens33"}[1m]) * 8 /1024 /1024
实例5:查询所有https的域名,检查域名证书的过期时间,将还剩不到90天的域名列出来(需要借助后面的blackbox黑盒监控,才能获取到对应的指标)
# 表达式,计算公式( (过期时间-当前时间) / 天(24*60*60) )
(probe_ssl_earliest_cert_expiry - time() ) / 86400 < 90
5. 集合运算符介绍
在Prometheus的查询语言中,集合运算符主要用到的运算符包括 and(并且)、or(或者)和 unless(排除)
例如:我们有两个关键指标:backup_duration_seconds 用于记录每次备份操作的持续时间,而 backup_success 则指示备份操作是否成功(1表示成功,0表示失败)
场景1:备份成功但时间超过9s
当备份操作成功完成(backup_success == 1),并且执行时间超过9秒(backup_duration_seconds > 9)时,我们需要发出告警通知“备份成功但备份时间过长”。
这就需要使用 and 运算符来确保只有当这两个条件都满足时,才触发告警。对应的表达式为: backup_duration_seconds > 9 and backup_success == 1
场景2:备份失败或时间超过9s
如果备份时长超过了9秒(backup_duration_seconds > 9),或者备份操作失败(backup_success == 0),则同样需要发出告警通知“备份失败或时间过长”。
在这种情况下,是用 or 运算符可以帮助我们在任一条件满足时触发告警。对应的表达式为: backup_duration_seconds > 9 or backup_success == 0
场景3:查询成功的备份,但排除耗时超过9s
查询所有成功的备份任务,同时排除那些执行时间超过9秒的任务,这样我们就可以只关注于那些成功备份的任务,并且备份效率较高的。
我们可以利用unless 运算符来实现,对应的表达式为: backup_success == 1 unless backup_duration_seconds > 9
1、and运算符示例,查询当前实例“1分钟负载大于2,并且5分钟负载小于2”,如果满足条件说明当前发了了突增的负载压力。
注意:and运算需要遵循向量的匹配逻辑,也就是向量与向量的标签必须完全匹配一致才可以进行匹配,如果它们的标签不一致,则不会执行匹配逻辑,除⾮使用ignore忽略不一致的标签来进行匹配。
# 模拟负载高命令 stress --cpu 8 --timeout 60
yum install stress -y
#由于我们压力测试只执行了60秒。所以jingtian021分钟负载⽐较高,而5分钟负载并不高
node_load1 > 2 and node_load5 < 2
2、or示例,查询 jingtian01:9100 上CPU编号为 0 的idle 时间或 user 时间
node_cpu_seconds_total{cpu="0",mode="idle"} or node_cpu_seconds_total{cpu="0",mode="user"}
3、unless示例,查询 node_cpu_seconds_total 指标上CPU编号为0的,但要排除node02和node03节点,同时还要排除模式为 idle|user|system|steal|nice
node_cpu_seconds_total{cpu="0"} unless node_cpu_seconds_total{instance=~"jingtian02:9100|jingtian03:9100"} unless node_cpu_seconds_total{mode=~"idle|user|system|steal|nice"}
6. 集合运算符实践
实例1:查询实例的网络接收流量“并且”网络发送流量,每秒传输超过 200Mb/s
#模拟接收和发送流量比较高:"需要在同一节点"模拟服务端和客户端,执行如下命令
#1、模拟服务端:iperf -s -p 9999
#2、模拟客户端:iperf -c prom-node01.oldxu.net -p 9999 -b 300M -t 60
# 表达式
rate(node_network_receive_bytes_total[1m]) *8 /1024 /1024 >200 andrate(node_network_transmit_bytes_total[1m]) *8 /1024 /1024 >200
# 结果
{device="ens33", instance="jingtian01:9100", job="node_exporter"}300.4421537611219 # 这个实例发送和接收同时达到了300Mb/s
实例2:查询当前磁盘,可用空间不足20GB“或者”当前磁盘可用空间不足30%
node_filesystem_avail_bytes /1024/1024/1024 < 20 or (node_filesystem_avail_bytes / node_filesystem_size_bytes * 100 < 30)
实例3:通过 probe_http_status_code 指标获取当前监控的网站返回的状态码,并从中筛选出小于200的状态码“或者”大于400的状态码
# 表达式
probe_http_status_code <= 199 orprobe_http_status_code >= 400
相关文章:

【Prometheus】PromQL数据类型以及常用的计算函数用法详解
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

STM32高级定时器生成互补PWM的原理与代码实现
文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM(Complementary PWM)是指一对逻辑状态互为反相的 PWM(脉冲宽度调制)信号。这种信号配置常见于电机控…...

双指针题总结
双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接: 283.移动零 代码: class Solution {public void moveZeroes(int[] nums) {int slow 0;for (int fast 0; fast < nums.length; fast ){if (nums[fas…...

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8068 标注数量(xml文件个数):8068 标注数量(txt文件个数):8068 标注…...

JVM3-双亲委派机制
目录 概述 作用 如何指定加载类的类加载器? 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制ÿ…...

经典文献阅读之--DEviLOG(使用合成数据和真实世界数据的数据驱动占用网格映射基于Transformer的BEV方案量产方案)
0. 简介 在自动驾驶汽车(AV)的感知任务中,数据驱动的方法往往优于传统方法。这促使我们开发了一种基于数据的方法来从激光雷达测量中计算占用网格地图(OGM)。我们的方法扩展了之前的工作,使得估计的环境表…...

ssh之登录服务器后,自动进入目录(四十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

如何看待IBM中国研发部裁员?
背景: 近日,IBM中国宣布撤出在华两大研发中心,引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展,也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对这一突如其来的变化&…...

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

2024年高校辅导员考试题库及答案
一、判断题 121.高校学生身份权是基于高等教育的性质,学生应该获得的本体性权利。 答案:正确 122.学费占年生均教育培养成本的比例和标准由财政部制定。 答案:错误 123.享受国家专业奖学金的高校学生免缴学费。 答案:错误 124…...

使用python对股票市场进行数据挖掘的书籍资料有哪些
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...

Python 将字典转换为 JSON
在 Python 中,可以使用 json 模块将字典转换为 JSON 格式的字符串。该模块提供了 json.dumps() 方法,用于将 Python 对象(如字典、列表)序列化为 JSON 字符串。 1、问题背景 用户想要将一个 Python 字典转换为 JSON 格式…...

就服务器而言,ARM架构与X86架构有什么区别?各自的优势在哪里?
一、服务器架构概述 在数字化时代,服务器架构至关重要。服务器是网络核心节点,存储、处理和提供数据与服务,是企业和组织信息化、数字化的关键基础设施。ARM 和 x86 架构为服务器领域两大主要架构,x86 架构服务器在市场占主导&…...

[论文笔记]Dimensionality Reduction by Learning an Invariant Mapping
引言 今天带来一篇真正远古(2005年)论文的笔记,论文是Dimensionality Reduction by Learning an Invariant Mapping。 该论文中提出的对比损失(2.1节)可以用于训练嵌入模型。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 降维涉及将一…...

链表算法题(下)
在链表算法题(上)长中我们已经学习了一系列的链表算法题,那么在本篇中我们将继续来学习链表的算法题,接下来就继续来破解链表的算法题吧! 1.相交链表 160. 相交链表 - 力扣(LeetCode) 通过以上…...

UE4_后期处理_后期处理材质及后期处理体积二
效果: 步骤: 1、创建后期处理材质,并设置参数。 2、回到主界面,找到需要发光的物体的细节面板。 渲染自定义深度通道,默认自定义深度模具值为10(需要修改此值,此值影响物体的亮度)。 3、添加…...

Linux系统与高效进程控制的实战技巧
Linux系统与高效进程控制的实战技巧 Linux,作为一种开源的Unix-like操作系统内核,自1991年由芬兰程序员Linus Torvalds首次发布以来,已成为全球范围内广泛使用的操作系统之一。其强大的功能、灵活的配置以及高度的可定制性,使得L…...

陈文自媒体:抖音创作者伙伴计划,你不知道的几点!
本月的2号开始,官方就下达了通知,各位西瓜创作者,大家要抓紧时间升级为抖音创作者伙伴计划,如果你不升级是吧,没问题,19号开始不发西瓜和中视频收益了。 在这个政策解读和操作过程中,我从同行、…...

便携式气象仪器的主要特点
TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍: 主要特点 高精度与多功能:便携式气象仪器…...

【开源风云】从若依系列脚手架汲取编程之道(四)
📕开源风云系列 🍊本系列将从开源名将若依出发,探究优质开源项目脚手架汲取编程之道。 🍉从不分离版本开写到前后端分离版,再到微服务版本,乃至其中好玩的一系列增强Plus操作。 🍈希望你具备如下…...

华为 HCIP-Datacom H12-821 题库 (15)
有需要题库的可以看主页置顶 1.以下关于 OSPF 路由聚合的描述,错误的是哪一项? A、OSPF 中任意一台路由器都可以进行路由聚合的操作 B、OSPF 有两种路由聚合方式:ABR 聚合和ASBR 聚合 C、路由聚合是指将相同前缀的路由信息聚合一起…...

MT6895(天玑8100)处理器规格参数_MTK联发科平台方案
MT6895平台 采用台积电5nm工艺,与天玑 8000 相比性能提升 20% ,搭载4 个 2.85GHz A78 核心 4 个 2.0GHz A55 核心,CPU能效比上一代提高 25% 。GPU 采用了第三代的Valhall Arm Mali-G610 MC6架构,拥有6核心,搭配天玑81…...

从 0 开始搞定 RAG 应用系列(第一篇):构建简单 RAG
从 0 开始搞定 RAG 应用系列(第一篇):构建简单 RAG 前言 LLM 已经从最初的研究性转变为实际应用性,尤其在今年各大 LLM 厂商都在研究 LLM 的商业化落地方案(包括我司)。而在各种商业化场景中个人觉得最具…...

接口(Interface)和端点(Endpoint)的区别
在软件开发和相关的文档中,我们经常会看到两个专有名词:接口(Interface)和端点(Endpoint)。而它们的使用场景有很大的重合部分,让人有些分不清到底用哪个。那么,这两者到底有什么区别…...

小米汽车再陷“抄袭”争议,上汽高管直言“真不要脸”
小米SU7在上市初期就曾面临来自各方的争议与质疑,不少人将其戏称为“米时捷”或“保时米”。 转载科技新知 原创 作者丨杰瑞 编辑丨影蕨 近日,在成都车展上,上汽乘用车常务副总经理俞经民对小米汽车提出了尖锐批评,指责其“抄袭”…...

VS C++ 加入dump实现崩溃日志 可以再崩溃的时候使用VS调试
调用 // 加入崩溃dump文件功能SetUnhandledExceptionFilter(ExceptionFilter); 实现 #include "DbgHelp.h"//生成dump int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers) {// 定义函数指针typedef BOOL(WINAPI * MiniDumpWriteDumpT)(HANDLE,DWORD,H…...

Ubuntu22.04版本左右,开机自动启动脚本
Ubuntu22.04版本左右,开机自动启动脚本 1. 新增/lib/systemd/system/rc-local.service中[Install]内容 vim /lib/systemd/system/rc-local.service 按 i 进入插入模式后,新增内容如下: [Install] WantedBymulti-user.target Aliasrc-local.…...

中秋之美——html5+css+js制作中秋网页
中秋之美——html5cssjs制作中秋网页 一、前言二、功能展示三、系统实现四、其它五、源码下载 一、前言 八月十五,秋已过半,是为中秋。 “但愿人长久,千里共婵娟”,中秋时节,气温已凉未寒,天高气爽&#x…...

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)
5,结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“…...

Golang path/filepath包详解:高效路径操作与实战案例
Golang path/filepath包详解:高效路径操作与实战案例 引言基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 路径操作Join 函数Split 函数Rel 函数Ma…...