Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录

  • 一、部署alertmanager相关组件
    • 1.alertmanager-config
    • 2.alertmanager-message-tmpl
    • 3.alertmanager
  • 二、调试邮件告警
  • 三、钉钉群/企业微信群 报警
    • 3.1添加钉钉群机器人
    • 3.2添加企业微信群机器人
    • 3.3部署alertmanager-webhook-adapter
      • message-tmpl
      • alertmanager-webhook-adapter
      • alertmanager-config
    • 3.4钉钉群报警信息效果
    • 3.5企业微信群报警信息效果
  • 总结


Prometheus报警功能利用Alertmanager组件完成,Prometheus会对接收的指标数据比对告警规则,如果满足条件,则将告警时间发送给Alertmanager组件,Alertmanager组件发送到接收人
使用步骤:

  1. 部署Alertmanager
  2. 配置告警接收人
  3. 配置Prometheus与Alertmanager通信
  4. 在Prometheus中创建告警规则
    在这里插入图片描述

一、部署alertmanager相关组件

1.alertmanager-config

#alertmanager-config.yaml主配置文件,主要配置altermanager的告警配置

apiVersion: v1
kind: ConfigMap
metadata:name: alertmanager-confignamespace: ops
data:alertmanager.yml: |global:#恢复告警等待时间,如果5m没收到来自prometheus的告警 则发送恢复告警通知resolve_timeout: 5m#邮箱服务器smtp_smarthost: 'smtp.exmail.qq.com:465'#发送告警的邮箱地址smtp_from: 'fanxxxxuai@cxxxxne.com'#发送者的邮箱登陆用户名smtp_auth_username: 'fanxxxxuai@cxxxxne.com'#发送者的邮箱授权吗(若是企业微信邮箱的话为发送者的登陆邮箱密码)smtp_auth_password: '123456'#关闭tls,默认是开启tls的,若不关闭则会报错,错误为本篇总结出所示smtp_require_tls: false#alertmanager告警消息的模版templates:- '/etc/alertmanager/msg-tmpl/*.tmpl'#主路由route: #指定告警接收者receiver: 'mail-receiver'#分组(通过alertname标签的值分组)group_by: [cluster, alertname]#第一次产生告警,等待30s,足内有告警的话就一起发出,没有则单独发group_wait: 30s#第二次产生告警,先等待5m,如果5m后还没有恢复就进入repeat_interval。(定义相同的Group之间发送告警通知的时间间隔)group_interval: 5m#在最终发送消息前再等待30m,30m后还没恢复就发送第二次告警repeat_interval: 30m##所以每次告警之间的间隔时间为35m(group_interval+repeat_interval)#配置告警接受者receivers:- name: 'mail-receiver'#使用邮件接收email_configs:- to: 'fanxxxxuai@cxxxxne.com'send_resolved: truehtml: '{{ template "emailMessage" . }}'

2.alertmanager-message-tmpl

#alertmanager-message-tmpl.yaml 告警模版(邮件)

apiVersion: v1
kind: ConfigMap
metadata:name: alertmanager-message-tmplnamespace: ops
data:email.tmpl: |{{ define "emailMessage" }}{{- if gt (len .Alerts.Firing) 0 -}}{{- range $index, $alert := .Alerts -}}{{- if eq $index 0 }}------ 告警问题 ------<br>告警状态:{{ .Status }}<br>告警级别:{{ .Labels.severity }}<br>告警名称:{{ .Labels.alertname }}<br>故障实例:{{ .Labels.instance }}<br>告警概要:{{ .Annotations.summary }}<br>告警详情:{{ .Annotations.description }}<br>故障时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>------ END ------<br>{{- end }}{{- end }}{{- end }}{{- if gt (len .Alerts.Resolved) 0 -}}{{- range $index, $alert := .Alerts -}}{{- if eq $index 0 }}------ 告警恢复 ------<br>告警状态:{{ .Status }}<br>告警级别:{{ .Labels.severity }}<br>告警名称:{{ .Labels.alertname }}<br>恢复实例:{{ .Labels.instance }}<br>告警概要:{{ .Annotations.summary }}<br>告警详情:{{ .Annotations.description }}<br>故障时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>------ END ------<br>{{- end }}{{- end }}{{- end }}{{- end }}

3.alertmanager

#alertmanager.yaml 部署altermanager

apiVersion: apps/v1
kind: Deployment
metadata:name: alertmanagernamespace: ops
spec:replicas: 1selector:matchLabels:app: alertmanagertemplate:metadata:labels:app: alertmanagerspec:containers:#用于热加载配置文件- name: prometheus-alertmanager-configmap-reloadimage: "jimmidyson/configmap-reload:v0.1"imagePullPolicy: "IfNotPresent"args:- --volume-dir=/etc/config- --webhook-url=http://localhost:9093/-/reloadvolumeMounts:- name: configmountPath: /etc/configreadOnly: trueresources:limits:cpu: 10mmemory: 10Mirequests:cpu: 10mmemory: 10Mi- name: alertmanagerimage: "prom/alertmanager:latest"ports:- containerPort: 9093readinessProbe:httpGet:path: /#/statusport: 9093initialDelaySeconds: 30timeoutSeconds: 30livenessProbe:httpGet:path: /#/statusport: 9093initialDelaySeconds: 30timeoutSeconds: 30resources:requests:cpu: 100mmemory: 256Milimits:cpu: 500mmemory: 512MivolumeMounts:- name: configmountPath: /etc/alertmanager- name: message-tmpl mountPath: /etc/alertmanager/msg-tmpl- name: datamountPath: /data- name: timezonemountPath: /etc/localtimevolumes:- name: configconfigMap:name: alertmanager-config- name: message-tmplconfigMap:name: alertmanager-message-tmpl- name: datapersistentVolumeClaim:claimName: alertmanager-data- name: timezonehostPath:path: /usr/share/zoneinfo/Asia/Shanghai
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: alertmanager-datanamespace: ops
spec:storageClassName: "managed-nfs-storage"accessModes:- ReadWriteOnceresources:requests:storage: "2Gi"
---
apiVersion: v1
kind: Service
metadata:name: alertmanagernamespace: ops
spec:type: NodePortports:- name: httpport: 9093protocol: TCPtargetPort: 9093nodePort: 30093selector:app: alertmanager

部署完成后访问 IP:30093即可访问altermanager的web展示界面
在这里插入图片描述



二、调试邮件告警

此时可以尝试重启一个pod进行调试
将资源配额调至超出可申请资源 让其为pending状态 如下:
test-alertmanager.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80resources:requests:memory: "24Gi"cpu: "12000m"limits:memory: "24Gi"cpu: "12000m"

启动此Pod观察
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

邮件告警如下:
在这里插入图片描述



三、钉钉群/企业微信群 报警

(webhook自定义机器人类型即可)

目前prometheus没有集成钉钉群和企业微信群接口,需要自己写webhook(数据转换)或者用别人写的
例如:https://github.com/bougou/alertmanager-webhook-adapter
在这里插入图片描述

3.1添加钉钉群机器人

在这里插入图片描述

创建完成后会有一个webhook地址,稍后会使用到此webhook的token
在这里插入图片描述



3.2添加企业微信群机器人

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建完成后会有一个webhook地址,稍后会使用到此webhook的key
在这里插入图片描述


3.3部署alertmanager-webhook-adapter

message-tmpl

#message-tmpl.yaml告警模版我把钉钉的和企业微信的放一起了
模版来源于:https://github.com/bougou/alertmanager-webhook-adapter/tree/main/pkg/models/templates

apiVersion: v1
kind: ConfigMap
metadata:name: message-tmplnamespace: ops
data:
####################################################################################################################dingding.tmpl: |{{ define "__subject" -}}【{{ .Signature }}】{{- if eq (index .Alerts 0).Labels.severity "ok" }} OK{{ end }}{{- if eq (index .Alerts 0).Labels.severity "info" }} INFO{{ end }}{{- if eq (index .Alerts 0).Labels.severity "warning" }} WARNING{{ end }}{{- if eq (index .Alerts 0).Labels.severity "error" }} ERROR{{ end }}{{- ` • ` }}{{- if .CommonLabels.alertname_cn }}{{ .CommonLabels.alertname_cn }}{{ else if .CommonLabels.alertname_custom }}{{ .CommonLabels.alertname_custom }}{{ else if .CommonAnnotations.alertname  }}{{ .CommonAnnotations.alertname }}{{ else }}{{ .GroupLabels.alertname }}{{ end }}{{- ` • ` }}{{- if gt (.Alerts.Firing|len) 0 }}告警中:{{ .Alerts.Firing|len }}{{ end }}{{- if and (gt (.Alerts.Firing|len) 0) (gt (.Alerts.Resolved|len) 0) }}/{{ end }}{{- if gt (.Alerts.Resolved|len) 0 }}已恢复:{{ .Alerts.Resolved|len }}{{ end }}{{ end }}{{ define "__externalURL" -}}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{- end }}{{ define "__alertinstance" -}}{{- if ne .Labels.alertinstance nil -}}{{ .Labels.alertinstance }}{{- else if ne .Labels.instance nil -}}{{ .Labels.instance }}{{- else if ne .Labels.node nil -}}{{ .Labels.node }}{{- else if ne .Labels.nodename nil -}}{{ .Labels.nodename }}{{- else if ne .Labels.host nil -}}{{ .Labels.host }}{{- else if ne .Labels.hostname nil -}}{{ .Labels.hostname }}{{- else if ne .Labels.ip nil -}}{{ .Labels.ip }}{{- end -}}{{- end }}{{ define "__alert_list" }}{{ range . }}---> **告警名称**: {{ if .Labels.alertname_cn  }}{{ .Labels.alertname_cn }}{{ else if .Labels.alertname_custom  }}{{ .Labels.alertname_custom }}{{ else if .Annotations.alertname  }}{{ .Annotations.alertname }}{{ else }}{{ .Labels.alertname }}{{ end }}>> **告警级别**: {{ ` ` }}{{- if eq .Labels.severity "ok" }}OK{{ end -}}{{- if eq .Labels.severity "info" }}INFO{{ end -}}{{- if eq .Labels.severity "warning" }}WARNING{{ end -}}{{- if eq .Labels.severity "error" }}ERROR{{ end }}>> **告警实例**: `{{ template "__alertinstance" . }}`>{{- if .Labels.region }}> **地域**: {{ .Labels.region }}>{{- end }}{{- if .Labels.zone }}> **可用区**: {{ .Labels.zone }}>{{- end }}{{- if .Labels.product }}> **产品**: {{ .Labels.product }}>{{- end }}{{- if .Labels.component  }}> **组件**: {{ .Labels.component }}>{{- end }}> **告警状态**: {{ if eq .Status "firing" }}🚨{{ else }}{{ end }} {{ .Status | toUpper }}>> **开始时间**: {{ .StartsAt.Format "2006-01-02T15:04:05Z07:00" }}>> **结束时间**: {{ if .EndsAt.After .StartsAt }}{{ .EndsAt.Format "2006-01-02T15:04:05Z07:00" }}{{ else }}Not End{{ end }}>{{- if eq .Status "firing" }}> 告警描述: {{ if .Annotations.description_cn }}{{ .Annotations.description_cn }}{{ else }}{{ .Annotations.description }}{{ end }}>{{- end }}{{ end }}{{ end }}{{ define "__alert_summary" }}{{ range . }}- {{ template "__alertinstance" . }}{{ end }}{{ end }}{{ define "prom.title" }}{{ template "__subject" . }}{{ end }}{{ define "prom.markdown" }}{{ .MessageAt.Format "2006-01-02T15:04:05Z07:00" }}#### **摘要**{{ if gt (.Alerts.Firing|len ) 0 }}##### **🚨 触发中告警 [{{ .Alerts.Firing|len }}]**{{ template "__alert_summary" .Alerts.Firing }}{{ end }}{{ if gt (.Alerts.Resolved|len) 0 }}##### **✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]**{{ template "__alert_summary" .Alerts.Resolved }}{{ end }}#### **详请**{{ if gt (.Alerts.Firing|len ) 0 }}##### **🚨 触发中告警 [{{ .Alerts.Firing|len }}]**{{ template "__alert_list" .Alerts.Firing }}{{ end }}{{ if gt (.Alerts.Resolved|len) 0 }}##### **✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]**{{ template "__alert_list" .Alerts.Resolved }}{{ end }}{{ end }}{{ define "prom.text" }}{{ template "prom.markdown" . }}{{ end }}####################################################################################################################wechat.tmpl: | {{ define "__subject" -}}【{{ .Signature }}】{{- if eq (index .Alerts 0).Labels.severity "ok" }} OK{{ end }}{{- if eq (index .Alerts 0).Labels.severity "info" }} INFO{{ end }}{{- if eq (index .Alerts 0).Labels.severity "warning" }} WARNING{{ end }}{{- if eq (index .Alerts 0).Labels.severity "error" }} ERROR{{ end }}{{- ` • ` }}{{- if .CommonLabels.alertname_cn }}{{ .CommonLabels.alertname_cn }}{{ else if .CommonLabels.alertname_custom }}{{ .CommonLabels.alertname_custom }}{{ else if .CommonAnnotations.alertname  }}{{ .CommonAnnotations.alertname }}{{ else }}{{ .GroupLabels.alertname }}{{ end }}{{- ` • ` }}{{- if gt (.Alerts.Firing|len) 0 }}告警中:{{ .Alerts.Firing|len }}{{ end }}{{- if and (gt (.Alerts.Firing|len) 0) (gt (.Alerts.Resolved|len) 0) }}/{{ end }}{{- if gt (.Alerts.Resolved|len) 0 }}已恢复:{{ .Alerts.Resolved|len }}{{ end }}{{ end }}{{ define "__externalURL" -}}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{- end }}{{ define "__alertinstance" -}}{{- if ne .Labels.alertinstance nil -}}{{ .Labels.alertinstance }}{{- else if ne .Labels.instance nil -}}{{ .Labels.instance }}{{- else if ne .Labels.node nil -}}{{ .Labels.node }}{{- else if ne .Labels.nodename nil -}}{{ .Labels.nodename }}{{- else if ne .Labels.host nil -}}{{ .Labels.host }}{{- else if ne .Labels.hostname nil -}}{{ .Labels.hostname }}{{- else if ne .Labels.ip nil -}}{{ .Labels.ip }}{{- end -}}{{- end }}{{ define "__alert_list" }}{{ range . }}> <font color="comment"> 告警名称 </font>: {{ if .Labels.alertname_cn  }}{{ .Labels.alertname_cn }}{{ else if .Labels.alertname_custom  }}{{ .Labels.alertname_custom }}{{ else if .Annotations.alertname  }}{{ .Annotations.alertname }}{{ else }}{{ .Labels.alertname }}{{ end }}>> <font color="comment"> 告警级别 </font>:{{ ` ` }}{{- if eq .Labels.severity "ok" }}OK{{ end -}}{{- if eq .Labels.severity "info" }}INFO{{ end -}}{{- if eq .Labels.severity "warning" }}WARNING{{ end -}}{{- if eq .Labels.severity "error" }}ERROR{{ end }}>> <font color="comment"> 实例 </font>: `{{ template "__alertinstance" . }}`>{{- if .Labels.region }}> <font color="comment"> 地域 </font>: {{ .Labels.region }}>{{- end }}{{- if .Labels.zone }}> <font color="comment"> 可用区 </font>: {{ .Labels.zone }}>{{- end }}{{- if .Labels.product }}> <font color="comment"> 产品 </font>: {{ .Labels.product }}>{{- end }}{{- if .Labels.component  }}> <font color="comment"> 组件 </font>: {{ .Labels.component }}>{{- end }}> <font color="comment"> 告警状态 </font>: {{ if eq .Status "firing" }}🚨{{ else }}{{ end }} <font color="{{ if eq .Status "firing" }}warning{{ else }}info{{ end }}">{{ .Status | toUpper }}</font>>> <font color="comment"> 开始时间 </font>: {{ .StartsAt.Format "2006-01-02T15:04:05Z07:00" }}>> <font color="comment"> 结束时间 </font>: {{ if .EndsAt.After .StartsAt }}{{ .EndsAt.Format "2006-01-02T15:04:05Z07:00" }}{{ else }}Not End{{ end }}{{- if eq .Status "firing" }}>> <font color="comment"> 告警描述 </font>: {{ if .Annotations.description_cn }}{{ .Annotations.description_cn }}{{ else }}{{ .Annotations.description }}{{ end }}{{- end }}{{ end }}{{ end }}{{ define "__alert_summary" -}}{{ range . }}<font color="{{ if eq .Status "firing" }}warning{{ else }}info{{ end }}">{{ template "__alertinstance" . }}</font>{{ end }}{{ end }}{{ define "prom.title" -}}{{ template "__subject" . }}{{ end }}{{ define "prom.markdown" }}{{ .MessageAt.Format "2006-01-02T15:04:05Z07:00" }}#### 摘要{{ if gt (.Alerts.Firing|len ) 0 }}##### <font color="warning">🚨 触发中告警 [{{ .Alerts.Firing|len }}]</font>{{ template "__alert_summary" .Alerts.Firing }}{{ end }}{{ if gt (.Alerts.Resolved|len) 0 }}#####  <font color="info">✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]</font>{{ template "__alert_summary" .Alerts.Resolved }}{{ end }}#### 详请{{ if gt (.Alerts.Firing|len ) 0 }}##### <font color="warning">🚨 触发中告警 [{{ .Alerts.Firing|len }}]</font>{{ template "__alert_list" .Alerts.Firing }}{{ end }}{{ if gt (.Alerts.Resolved|len) 0 }}#####  <font color="info">✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]</font>{{ template "__alert_list" .Alerts.Resolved }}{{ end }}{{ end }}{{ define "prom.text" }}{{ template "prom.markdown" . }}{{ end }}

alertmanager-webhook-adapter

#alertmanager-webhook-adapter.yaml webhook连接器服务
来源于:https://github.com/bougou/alertmanager-webhook-adapter/tree/main/deploy/k8s

apiVersion: apps/v1
kind: Deployment
metadata:name: alertmanager-webhook-adapternamespace: ops
spec:replicas: 1selector:matchLabels:app: alertmanager-webhook-adaptertemplate:metadata:labels:app: alertmanager-webhook-adapterspec:containers:- name: webhookimage: bougou/alertmanager-webhook-adapter:v1.1.7command:- /alertmanager-webhook-adapter#监听端口- --listen-address=:8090#告警第一行告警数据来源(随便写)- --signature=MyIDC#告警模版所在目录- --tmpl-dir=/msg-tmpl#使用哪个告警模版(这里取决于你想用什么应用报警)#钉钉群机器人的话就写 --tmpl-name=dingding#企业微信群机器人的话就写 --tmpl-name=wechat- --tmpl-name=dingding#- --tmpl-lang=zhenv:- name: TZvalue: Asia/Shanghairesources:requests:memory: 50Micpu: 100mlimits:memory: 250Micpu: 500mvolumeMounts:- name: message-tmplmountPath: /msg-tmplvolumes:- name: message-tmplconfigMap:name: message-tmplrestartPolicy: Always---
apiVersion: v1
kind: Service
metadata:name: alertmanager-webhook-adapternamespace: ops
spec:ports:- port: 80targetPort: 8090protocol: TCPselector:app: alertmanager-webhook-adaptersessionAffinity: None

alertmanager-config

#alertmanager-config.yaml主配置文件,这里主要是修改发送告警的方式

apiVersion: v1
kind: ConfigMap
metadata:name: alertmanager-confignamespace: ops
data:alertmanager.yml: |global: resolve_timeout: 5msmtp_smarthost: 'smtp.exmail.qq.com:465'smtp_from: 'fanxxxxuai@cxxxxne.com'smtp_auth_username: 'fanxxxxuai@cxxxxne.com'smtp_auth_password: '12345'smtp_require_tls: falsetemplates:- '/etc/alertmanager/msg-tmpl/*.tmpl'route:#receiver: 'email-receiver'receiver: 'dingding-receiver'#receiver: 'wechat-receiver'group_by: [cluster, alertname]group_wait: 30sgroup_interval: 5mrepeat_interval: 30mreceivers:#邮件告警- name: 'email-receiver'email_configs:- to: 'fanxxxxuai@cxxxxne.com'send_resolved: truehtml: '{{ template "emailMessage" . }}'#钉钉群告警- name: 'dingding-receiver'webhook_configs:#如下url只需将地址串里的token #替换为创建钉钉群机器人时webhook的token即可#531c0f251944b69c6e731a3bea9a609d9557ebdbcf17b1bc0df8f7b9cf506734- url: http://alertmanager-webhook-adapter:80/webhook/send?channel_type=dingtalk&token=531c0f251944b69c6e731a3bea9a609d9557ebdbcf17b1bc0df8f7b9cf506734#是否发送告警恢复通知send_resolved: true#企业微信群告警- name: 'wechat-receiver'webhook_configs:#如下url只需将地址串里的token #替换为创建企业微信群机器人时webhook的token即可#1cb01f46-f536-4c98-aeac-1455e1472e5d- url: http://alertmanager-webhook-adapter:80/webhook/send?channel_type=weixin&token=1cb01f46-f536-4c98-aeac-1455e1472e5d#是否发送告警恢复通知send_resolved: true 

ps:将prometheus的告警规则 label处添加个’alertinstance’ 若是没有则没有效果里的标题、描述等
规则如下:
在这里插入图片描述
在这里插入图片描述

3.4钉钉群报警信息效果

在这里插入图片描述

在这里插入图片描述


3.5企业微信群报警信息效果

在这里插入图片描述

在这里插入图片描述


总结

在使用alertmanager报警时, 若开启tlssmtp_require_tls: true 的话在发送告警时会报如下错误,需要设置成false即可发送成功;
在这里插入图片描述

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

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

相关文章

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP&#xff08;Hypertext Preprocessor&#xff09;超文本预处理器是一种开源的通用脚本语…

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数&#xff1a;2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART&#xff08;Classification And Regression T…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联

帮同事处理网络问题&#xff0c;尝试了拔插网线&#xff0c;重启电脑&#xff0c;禁用启用以太网&#xff0c;都没有解决。 于是在**命令提示符(cmd)**中执行命令&#xff1a; ipconfig /release 按回车执行后&#xff0c;返回提示&#xff1a;本地连接时出错&#xff1a;地址…

什么是GD32 MCU读保护?

如今电子产品市场风云变幻&#xff0c;暗流汹涌&#xff0c;有没有小伙伴遇到自己费了大力气写出来的代码&#xff0c;很容易就被别人“借鉴”了&#xff0c;真的是让闻者伤心&#xff0c;听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢&#xff1f;答案当…

大众点评2024年6月全国全分类店铺基础信息数据库

大众点评的采集在2023年之前还是比较好采集的&#xff0c;很多接口不需要登录&#xff0c;即使登录一个帐号也可以采集很多&#xff0c;所以大约2023年8月以前的大众点评店铺字段非常丰富&#xff0c;几乎所有常见店铺字段都能采集。 2023年8月以后&#xff0c;大量接口权限变…

网安新声 | 网易云音乐崩了:网络安全如何守护在线体验

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 8月19日&#xff0c;#网易云音乐崩…

企业高性能web服务器【Nginx详解】

一.Web 服务基础介绍 1.1 互联网发展历程 1993年3月2日&#xff0c;中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通&#xff0c;成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站 中国黄页…

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步&#xff1a;删除install.lock文件&#xff0c;访问 install.php 抓包 第二步&#xff1a;通过审计构造payload 第三步&#xff1a;修改抓包请求内容&#x…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

目录 背景: 解决方法1: 解决方法2: 什么是驱动程序&#xff1a; 背景: 今天在日常的工作中&#xff0c; 我想将笔记本分屏到另一个显示屏&#xff0c;我这电脑Windows10系统&#xff0c;当我按下Windows键P键&#xff0c;屏幕信息上提示我"你的电脑不能投影到其他屏幕…

mybatis-plus使用saveOrUpdateBatch函数时数据库中已存在对应id数据,但报错插入时出现重复键

1. 问题背景 ProgramLang pl4 new ProgramLang(); // pl4.setId(100L).setLangName("YY").setDescription("Drama2");pl4.setId(100L);pl4.setLangName("YY");pl4.setDescription("Drama2");List<ProgramLang> updatedE…

调研在深度学习中如何读代码

这里调研了四个up主的内容&#xff0c;对他们讲的内容摘了一下主要的内容。想要看原文的画可以看原篇。 1.如何学习别人的代码&#xff08;代码量较大时&#xff09;_怎么学习别人的代码-CSDN博客 想要掌握的好&#xff0c;光阅读是不够的&#xff0c;一定要动手写、训练模型…

STM32学习9

USART串口协议 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

[Qt][Qt 文件]详细讲解

目录 1.输入输出设备类2.文件读写类3.文件和目录信息类 1.输入输出设备类 在Qt中&#xff0c;⽂件读写的类为QFile&#xff0c;其⽗类为QFileDevice QFileDevice提供了⽂件交互操作的底层功能QFileDevice的⽗类是QIODevice&#xff0c;其⽗类为QObject QIODevice是Qt中所有I/O…

统一待办集成方案:优化工作流,实现高效协作

在现代企业中&#xff0c;待办事项的管理往往分散在多个系统和工具中&#xff0c;这不仅导致信息孤岛&#xff0c;还可能影响工作效率和协作效果。为了解决这些问题&#xff0c;统一待办集成方案应运而生&#xff0c;它通过整合不同的待办事项管理系统&#xff0c;实现统一的任…

做无效私域,比不做还可怕!

这几年&#xff0c;市场上几乎80%的企业都在做同一件事&#xff1a;“私域”营销。 公众号、私域社群、企业微信、视频号……大家用的工具和平台都差不多&#xff0c;但运营效果却是天差地别。为什么很多企业的私域都做不起来&#xff0c;有的企业却做的风生水起&#xff0c;今…