2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus

1.1 安装

prometheus官网下载地址

sudo -i
mkdir -p /opt/prometheus
#移动解压后的文件名到/opt/,并改名prometheus
mv prometheus-2.45 /opt/prometheus/
#创建一个专门的prometheus用户: -M 不创建家目录, -s 不让登录
useradd -M -s /usr/sbin/nologin prometheus##更改prometheus用户的文件夹权限:
chown prometheus:prometheus -R /opt/prometheus
1.2 修改配置
global:scrape_interval: 30s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 30s # Evaluate rules every 15 seconds. The default is every 1 minute.# 其他全局配置...scrape_configs:# Prometheus 自身的监控配置- job_name: "prometheus"static_configs:- targets: ["localhost:9070"]- job_name: 'node_widgets'scheme: https  # 使用 HTTPStls_config:insecure_skip_verify: true  # 忽略证书验证static_configs:- targets: ['xxxxx.xxx.com:443']  # 替换为您的服务器 B 地址和端口metrics_path: '/prometheus/metrics'  # Node Exporter 的路径

如果修改了配置可以验证配置

./promtool check config new_prometheus.yml

热更新

curl -X POST http://localhost:9070/-/reload
1.3 配置自启动
vim /etc/systemd/system/prometheus.service
写入数据
[Unit]
Description=Prometheus Server
After=network-online.target
[Service]
Type=simple
User=prometheus
Group=prometheus
Restart=on-failure
WorkingDirectory=/opt/prometheus/prometheus-2.45
ExecStart=/opt/prometheus/prometheus-2.45/prometheus --web.listen-address ":9070" --config.file /opt/prometheus/prometheus-2.45/new_prometheus.yml --storage.tsdb.path /opt/prometheus/prometheus-2.45/data --storage.tsdb.retention.time=20d --web.enable-lifecycle
[Install]
WantedBy=multi-user.target

开机自启动

sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl restart prometheus
sudo systemctl status prometheus

二、安装node_exporter

2.1 官网下载地址 https://prometheus.io/download/
2.2 开机自启动

添加

sudo vim /etc/systemd/system/node_exproter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
User=ubuntu
Group=ubuntu
ExecStart=/opt/prometheus/node_exproter-1.7.0/node_exporter --web.listen-address=":9101"
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable node_exproter
sudo systemctl restart node_exproter
sudo systemctl status node_exproter

三、安装grafana

3.1 官网下载地址 https://grafana.com/grafana/download?edition=oss&platform=linux
3.2 添加开机启动

添加service

sudo vim /etc/systemd/system/grafana.service
[Unit]
Description=Grafana server
Documentation=http://docs.grafana.org
[Service]
Type=simple
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/opt/prometheus/grafana-v10.2.2/bin/grafana-server \--config=/opt/prometheus/grafana-v10.2.2/conf/grafana.ini \--homepath=/opt/prometheus/grafana-v10.2.2 \--http-port=3000
[Install]
WantedBy=multi-user.target
3.2 修改 grafana.init 邮箱配置
[smtp]
enabled = true
host = smtp.gmail.com:587
user = xuzan@lippu.ltd
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = 授权码
cert_file =
key_file =
skip_verify = true
from_address = xuzan@lippu.ltd
from_name = Grafana
ehlo_identity =
startTLS_policy =
sudo systemctl daemon-reload
sudo systemctl enable grafana
sudo systemctl restart grafana
sudo systemctl status grafana

四、alertmanager 安装

4.1 安装官网地址 https://prometheus.io/download/
4.2 新增启动项

编辑

sudo vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Alert Manager
Wants=network-online.target
After=network-online.target[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/prometheus/alertmanager-0.26.0/alertmanager \--config.file=/opt/prometheus/alertmanager-0.26.0/alertmanager.yml \--storage.path=/opt/prometheus/alertmanager-0.26.0/data \--web.listen-address=:9071 \--cluster.listen-address=:9072Restart=always[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable alertmanager
sudo systemctl restart alertmanager
sudo systemctl status alertmanager -l
4.3 使用了prometheus 需要修改 new_prometheus.yml

新增

# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:- alertmanager:9071# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "alert.yml"

在项目更目录下新增 新增alert.yml

groups:
- name: Prometheus alertrules:# 对任何实例超过30s无法联系的情况发出警报- alert: 服务告警expr: up == 0for: 30slabels:severity: criticalannotations:instance: "{{ $labels.instance }}"description: "{{ $labels.job }} 服务已关闭"
具体告警规则:alert: 这是告警的名称,在这个例子中命名为 "服务告警"。
expr: 这是触发告警的表达式。在这个例子中,表达式 up == 0 检查 up 指标是否等于 0。up 指标是 Prometheus 用来表示目标实例可达性的标准指标,其中 0 表示不可达,1 表示可达。
for: 这个条件指定了在触发告警之前必须满足告警条件的持续时间。在这里设置为 30s,意味着只有当 up 指标持续为 0 超过 30 秒时,才会触发告警。
labels: 这部分定义了附加到告警上的标签。在这个例子中,它设置了一个严重性标签(severity: critical),表示这是一个严重的告警。
annotations:
这部分提供了关于告警的更多信息,通常用于在告警通知中显示。在这个例子中,它包括两个注解:
instance: "{{ $labels.instance }}":这将显示触发告警的实例。
description: "{{ $labels.job }} 服务已关闭":这提供了一个描述性的消息,指出哪个服务(job)已经关闭。
4.4 验证配置
./promtool check config new_prometheus.yml

在这里插入图片描述
重新热加载配置

curl -X POST http://localhost:9070/-/reload

五、grafana 添加数据源

5.1 添加数据来源

这里填写prometheus 的数据源地址,因为grafana 和 prometheus 放到一台服务器上了,所以我填写的是localhost
在这里插入图片描述

5.2 添加dashboards,添加地址: https://grafana.com/grafana/dashboards/

选择一个dashborads
在这里插入图片描述
copy dashborads 的ID
在这里插入图片描述
在grafana 界面导入dashborad ,可以通过ID导入
在这里插入图片描述

最后选择刚刚的数据源
在这里插入图片描述

最终显示
在这里插入图片描述

六、配置gmail告警

6.1 打开gmail 配置

在这里插入图片描述
点击查看所有配置
在这里插入图片描述

在这里插入图片描述
最后保存

6.2 还需要打开二次验证生成授权码

在这里插入图片描述
打开专用密码
在这里插入图片描述
创建一个自定义名称的应用,这个授权码,就是发送邮箱设置的密码,会随机生成一段字符串

七、通过alertmanager 配置邮箱告警

7.1 alertmanager.yml配置
global:# 全局配置smtp_smarthost: 'smtp.gmail.com:587'  # 指定SMTP服务器和端口,这里使用的是Gmail的SMTP服务器和587端口smtp_from: 'xuzan@lippu.ltd'          # 发送告警邮件时使用的发件人邮箱地址smtp_auth_username: 'xuzan@lippu.ltd' # SMTP认证时使用的用户名,这里是邮箱地址smtp_auth_password: '二次认证上面生成auth密码' # SMTP认证时使用的密码route:# 路由配置group_by: ['critical','warning']   # 告警分组依据,这里按照 'server_alert' 标签分组group_wait: 30s              # 分组后等待30秒,如果这段时间内有新的相同分组的告警则一起发送group_interval: 5m           # 分组告警发送间隔,即每5分钟发送一次同一组的告警repeat_interval: 1h          # 重复告警发送间隔,即相同的告警每小时重复发送一次receiver: 'email-notifications' # 默认接收器,用于处理没有匹配特定路由的告警routes:- match:severity: 'warning'     # 匹配规则,当告警级别为warning时receiver: 'email-notifications' # 使用此接收器处理告警group_by: ['warning']     # 告警分组依据,这里按照 'warning' 标签分组- match:severity: 'critical'    # 匹配规则,当告警级别为critical时receiver: 'email-notifications' # 使用此接收器处理告警group_by: ['critical']    # 告警分组依据,这里按照 'critical' 标签分组group_wait: 10s           # 分组后等待10秒,如果这段时间内有新的相同分组的告警则一起发送
receivers:# 接收器定义- name: 'email-notifications'     # 接收器名称email_configs:- to: 'xuzan@lippu.ltd'       # 告警接收的邮箱地址send_resolved: true         # 告警解决后是否发送通知
7.2 prometheus.yml 修改
global:scrape_interval: 30s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 30s # Evaluate rules every 15 seconds. The default is every 1 minute.# 其他全局配置...scrape_configs:# Prometheus 自身的监控配置- job_name: "prometheus"static_configs:- targets: ["localhost:9070"]- job_name: 'node_widgets'scheme: https  # 使用 HTTPStls_config:insecure_skip_verify: true  # 忽略证书验证static_configs:- targets: ['xxx:443']  # 替换为您的服务器 B 地址和端口metrics_path: '/prometheus/metrics'  # Node Exporter 的路径- job_name: '正式服'scheme: https  # 使用 HTTPStls_config:insecure_skip_verify: true  # 忽略证书验证static_configs:- targets: ['xxx.com:443']  # 替换为您的服务器 B 地址和端口metrics_path: '/v1/app/metrics'  # Node Exporter 的路径- job_name: '测式服'scheme: http  # 使用 HTTPSstatic_configs:- targets: ['23.8323.373.2437:8063']  # 替换为您的服务器 B 地址和端口metrics_path: '/v1/app/metrics'  # Node Exporter 的路径# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:- localhost:9071# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "alert.yml"# 测试的#- "test_alert.yml"
7.3 报警配置

alert.yml 配置服务是否down机,内存,cpu和 磁盘使用告警

groups:- name: Prometheus alertrules:# 对任何实例超过30s无法联系的情况发出警报- alert: 服务是否down机expr: up == 0for: 30slabels:severity: criticalannotations:instance: "{{ $labels.instance }}"description: "{{ $labels.job }} 服务down机了,紧急查看"# 内存使用率超过 80% 的告警- alert: 内存使用情况expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80for: 30slabels:severity: warningannotations:instance: "{{ $labels.instance }}"description: "内存使用率超过 80%,当前值:{{ $value }}%"# CPU 使用率超过 80% 的告警- alert: cpu使用情况expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80for: 30slabels:severity: criticalannotations:instance: "{{ $labels.instance }}"description: "CPU 使用率超过 80%,当前值:{{ $value }}%"# 磁盘使用率超过 80% 的告警- alert: 磁盘使用情况expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 80for: 30slabels:severity: warningannotations:instance: "{{ $labels.instance }}"description: "磁盘使用率超过 80%,当前值:{{ $value }}%"#  - name: myapp_alerts_down
#    rules:
#      - alert: 程序挂掉了(紧急查看)
#        expr: myapp_up == 1
#        for: 30s
#        labels:
#          severity: warning
#        annotations:
#          summary: "程序掉了 down,超过了30s了"
#          description: "instance {{ $labels.instance }} with job {{ $labels.job }}"
7.4 测试报警 test.alert
groups:- name: test_alertsrules:- alert: TestAlertexpr: vector(1)labels:severity: warning
7.5 告警模版也可以自定义,下面这个是官方的模版

https://raw.githubusercontent.com/prometheus/alertmanager/master/template/email.html

<!--
Style and HTML derived from https://github.com/mailgun/transactional-email-templatesThe MIT License (MIT)Copyright (c) 2014 MailgunPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{{ template "__subject" . }}</title>
<style>
/* -------------------------------------GLOBALA very basic CSS reset
------------------------------------- */
* {margin: 0;font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;box-sizing: border-box;font-size: 14px;
}img {max-width: 100%;
}body {-webkit-font-smoothing: antialiased;-webkit-text-size-adjust: none;width: 100% !important;height: 100%;line-height: 1.6em;/* 1.6em * 14px = 22.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients *//*line-height: 22px;*/
}/* Let's make sure all tables have defaults */
table td {vertical-align: top;
}/* -------------------------------------BODY & CONTAINER
------------------------------------- */
body {background-color: #f6f6f6;
}.body-wrap {background-color: #f6f6f6;width: 100%;
}.container {display: block !important;max-width: 600px !important;margin: 0 auto !important;/* makes it centered */clear: both !important;
}.content {max-width: 600px;margin: 0 auto;display: block;padding: 20px;
}/* -------------------------------------HEADER, FOOTER, MAIN
------------------------------------- */
.main {background-color: #fff;border: 1px solid #e9e9e9;border-radius: 3px;
}.content-wrap {padding: 30px;
}.content-block {padding: 0 0 20px;
}.header {width: 100%;margin-bottom: 20px;
}.footer {width: 100%;clear: both;color: #999;padding: 20px;
}
.footer p, .footer a, .footer td {color: #999;font-size: 12px;
}/* -------------------------------------TYPOGRAPHY
------------------------------------- */
h1, h2, h3 {font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;color: #000;margin: 40px 0 0;line-height: 1.2em;font-weight: 400;
}h1 {font-size: 32px;font-weight: 500;/* 1.2em * 32px = 38.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients *//*line-height: 38px;*/
}h2 {font-size: 24px;/* 1.2em * 24px = 28.8px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients *//*line-height: 29px;*/
}h3 {font-size: 18px;/* 1.2em * 18px = 21.6px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients *//*line-height: 22px;*/
}h4 {font-size: 14px;font-weight: 600;
}p, ul, ol {margin-bottom: 10px;font-weight: normal;
}
p li, ul li, ol li {margin-left: 5px;list-style-position: inside;
}/* -------------------------------------LINKS & BUTTONS
------------------------------------- */
a {color: #348eda;text-decoration: underline;
}.btn-primary {text-decoration: none;color: #FFF;background-color: #348eda;border: solid #348eda;border-width: 10px 20px;line-height: 2em;/* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients *//*line-height: 28px;*/font-weight: bold;text-align: center;cursor: pointer;display: inline-block;border-radius: 5px;text-transform: capitalize;
}/* -------------------------------------OTHER STYLES THAT MIGHT BE USEFUL
------------------------------------- */
.last {margin-bottom: 0;
}.first {margin-top: 0;
}.aligncenter {text-align: center;
}.alignright {text-align: right;
}.alignleft {text-align: left;
}.clear {clear: both;
}/* -------------------------------------ALERTSChange the class depending on warning email, good email or bad email
------------------------------------- */
.alert {font-size: 16px;color: #fff;font-weight: 500;padding: 20px;text-align: center;border-radius: 3px 3px 0 0;
}
.alert a {color: #fff;text-decoration: none;font-weight: 500;font-size: 16px;
}
.alert.alert-warning {background-color: #E6522C;
}
.alert.alert-bad {background-color: #D0021B;
}
.alert.alert-good {background-color: #68B90F;
}/* -------------------------------------INVOICEStyles for the billing table
------------------------------------- */
.invoice {margin: 40px auto;text-align: left;width: 80%;
}
.invoice td {padding: 5px 0;
}
.invoice .invoice-items {width: 100%;
}
.invoice .invoice-items td {border-top: #eee 1px solid;
}
.invoice .invoice-items .total td {border-top: 2px solid #333;border-bottom: 2px solid #333;font-weight: 700;
}/* -------------------------------------RESPONSIVE AND MOBILE FRIENDLY STYLES
------------------------------------- */
@media only screen and (max-width: 640px) {body {padding: 0 !important;}h1, h2, h3, h4 {font-weight: 800 !important;margin: 20px 0 5px !important;}h1 {font-size: 22px !important;}h2 {font-size: 18px !important;}h3 {font-size: 16px !important;}.container {padding: 0 !important;width: 100% !important;}.content {padding: 0 !important;}.content-wrap {padding: 10px !important;}.invoice {width: 100% !important;}
}
</style>
</head><body itemscope itemtype="https://schema.org/EmailMessage"><table class="body-wrap"><tr><td></td><td class="container" width="600"><div class="content"><table class="main" width="100%" cellpadding="0" cellspacing="0"><tr>{{ if gt (len .Alerts.Firing) 0 }}<td class="alert alert-warning">{{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}{{ .Name }}={{ .Value }}{{ end }}</td>{{ else }}<td class="alert alert-good">{{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}</td>{{ end }}</tr><tr><td class="content-wrap"><table width="100%" cellpadding="0" cellspacing="0"><tr><td class="content-block"><a href='{{ template "__alertmanagerURL" . }}' class="btn-primary">View in {{ template "__alertmanager" . }}</a></td></tr>{{ if gt (len .Alerts.Firing) 0 }}<tr><td class="content-block"><strong>[{{ .Alerts.Firing | len }}] Firing</strong></td></tr>{{ end }}{{ range .Alerts.Firing }}<tr><td class="content-block"><strong>Labels</strong><br />{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}{{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}<a href="{{ .GeneratorURL }}">Source</a><br /></td></tr>{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}{{ if gt (len .Alerts.Firing) 0 }}<tr><td class="content-block"><br /><hr /><br /></td></tr>{{ end }}<tr><td class="content-block"><strong>[{{ .Alerts.Resolved | len }}] Resolved</strong></td></tr>{{ end }}{{ range .Alerts.Resolved }}<tr><td class="content-block"><strong>Labels</strong><br />{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}{{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}<a href="{{ .GeneratorURL }}">Source</a><br /></td></tr>{{ end }}</table></td></tr></table><div class="footer"><table width="100%"><tr><td class="aligncenter content-block"><a href='{{ .ExternalURL }}'>Sent by {{ template "__alertmanager" . }}</a></td></tr></table></div></div></td><td></td></tr>
</table></body>
</html>

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

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

相关文章

女士内衣市场分析:预计2028年将达到643.08亿美元

内衣 (英文名:Underwear)&#xff0c;是指贴身穿的衣物。内衣有保暖及污秽的危害作用&#xff0c;有时会被视为性征。女士内衣行业生产的主要原料是各类织布或无纺布&#xff0c;成分有海绵、边、定型纱、骨胶、肩带等&#xff0c;布面料在内衣企业的生产成本中所占比重较大。女…

Python基础(四、探索迷宫游戏)

Python基础&#xff08;四、探索迷宫游戏&#xff09; 游戏介绍游戏说明 游戏介绍 在这个游戏中&#xff0c;你将扮演一个勇敢的冒险者&#xff0c;进入了一个神秘的迷宫。你的任务是探索迷宫的每个房间&#xff0c;并最终找到隐藏在其中的宝藏。 游戏通过命令行界面进行交互…

web 前端之标签练习+知识点

目录 实现过程&#xff1a; 结果显示 1、HTML语法 2、注释标签 3、常用标签 4、新标签 5、特殊标签 6、在网页中使用视频和音频、图片 7、表格标签 8、超链接标签 使用HTML语言来实现该页面 实现过程&#xff1a; <!DOCTYPE html> <html><head>…

泡沫包装市场分析:预计2029年将达到659亿元

泡沫包装&#xff0c;简单地讲&#xff0c;就是用数学方法对无线电测量或光学测量所获得的弹道数据进行检验、整理、校正、计算&#xff0c;减小或消除数据的误差&#xff0c;得出反映运载火箭运动轨迹的精确弹道参数。通常所说的泡沫包装&#xff0c;主要是指由可发性聚苯乙烯…

超静音的两相步进电机驱动芯片GC6609,GC6610的性能分析

两相步进电机驱动芯片GC6609&#xff0c;GC6610它们是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A和2.5A &#xff0c…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

STM32-01-认识单片机

文章目录 一、单片机简介二、Cortex-M系列介绍三、初识STM32四、STM32原理图设计五、搭建开发环境六、STM32初体验七、MDK5使用技巧 一、单片机简介 单片机是什么&#xff1f; 单片机&#xff1a;Single-Chip Microcomputer&#xff0c;单片微型计算机&#xff0c;是一种集成电…

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…

【计算机网络】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行&#xff1a;包含三部分&#xff1a;协议版本&#xff0c;状态码&#xff0c;状态码描述响应头&a…

如何选择LED天幕屏的型号

随着LED屏幕技术的不断成熟&#xff0c;其应用范围也日益扩大&#xff0c;从传统的墙面固定安装&#xff0c;到落地式、租赁移动式&#xff0c;再到LED互动地砖屏和安装在天花板上的LED天幕屏等&#xff0c;安装方式多种多样。那么&#xff0c;在面对如此多元化的选择时&#x…

PHP基础 - 类型比较

在 PHP 中,作为一种弱类型语言,它提供了松散比较和严格比较两种方式来比较变量的值和类型。 松散比较: 使用两个等号(==)进行比较,只会比较变量的值,而不会考虑它们的数据类型。例如: $a = 5; // 整数 $b = 5; // 字符串if ($a == $b) {echo "相等"; // 输…

C/C++ 编程规范总结

目录 前言 一、编程规范的作用 二、规范的三种形式 三、规范的内容 1. 基本原则 原则1-1 原则1-2 原则1-3 原则1-4 原则1-5 原则1-6 原则1-7 2. 布局 规则2-1-1 规则2-1-2 规则2-1-3 规则2-1-4 规则2-1-5 规则2-1-6 规则2-2-1 规则2-2-2 规则2-2-3 建议2…

简单聊聊使用lombok 的争议

大家好&#xff0c;我是G探险者。 项目里&#xff0c;因为我使用了Lombok插件&#xff0c;然后代码走查的时候被领导点名了。 我心想&#xff0c;这么好用的插件&#xff0c;为啥不推广呢&#xff0c;整天写那些烦人的setter&#xff0c;getter方法就不嫌烦么&#xff1f; 领导…

AidLux:手机/平板上的Linux环境与AI开发利器

AidLux是一个基于ARM架构的跨生态&#xff08;鸿蒙/AndroidLinux&#xff09;一站式智能物联网&#xff08;AIoT&#xff09;应用开发和部署平台&#xff0c;正受到越来越多开发者和用户的青睐。既可以作为手机/平板上的一个Linux环境使用&#xff0c;也可以作为AI开发利器以发…

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用&#xff0c;它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能&#xff0c;提供详实的示例代码&#xff0c;帮助大家更好地使用和定制Django后台管理界面。 安装与…

无法解除Word文档限制编辑?上干货

方法一&#xff1a;新建一个文档-点击“插入”-点击“对象”-点击选择中的倒三角-然后选择“文件中的文字”-找到相应文档即可 具体操作界面如下图这个方法会导致格式出现稍稍微的变化 方法二&#xff1a;将受编辑的文件另存为 文件类型一定要选择*.xml 另存好之后是这样的 打…

智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.参考…

[C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

文章目录 1、priority_queue1.1 priority_queue的介绍和使用1.2 priority_queue的使用模拟实现&#xff1a; 2、容器适配器2.1 什么是适配器2.2 STL标准库中stack和queue的底层结构 3、deque3.1 deque的原理介绍3.2 deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容…

docker配置连接harbor私有仓库

一、前言 以下分为两种情况说明docker对harbor私有仓库的访问配置&#xff0c;一种是harbor使用自建证书配置https&#xff0c;一种是使用公有证书配置https 二、docker配置 harbor使用自建证书的情况 使用自建证书对harbor进行https配置&#xff0c;docker会将该仓库识别成不…

SDXL使用animateDiff和hotshot-xl进行文生视频

截至2023.12.8号&#xff0c;目前市面上有两款适用于SDXL的文生视频开源工具&#xff0c;分别是AnimateDiff和hotshot-xl。 一、工具下载链接 &#xff08;1&#xff09;AnimateDiff的webui版本的git链接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…