当前位置: 首页 > news >正文

Prometheus 告警模块配置深度解析

本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析

Alertmanager 配置解析

Alertmanager 配置可以用命令行配置,也可以通过配置文件配置。命令行用来配置不可变的系统参数,配置文件用来定义限制规则用于通知路由和通知接收者。

Alertmanager 命令

命令配置详见上文《Prometheus 告警模块介绍》

Alertmanager 配置文件

Alertmanager 配置文件通过./alertmanager --config.file=alertmanager.yml命令配置,配置文件由全局配置、路由配置、HTTP配置等各部分组成,下面解释各个配置文件的含义。

全局配置

global:# SMTP发件人配置[ smtp_from: <tmpl_string> ]# 默认SMTP主机地址和端口# 端口通常为25,对于TLS协议的SMTP端口通常是587,比如 smtp.example.org:587[ smtp_smarthost: <string> ]# SMTP服务默认主机名,比如163邮箱,填163.com[ smtp_hello: <string> | default = "localhost" ]# SMTP 认证用户名[ smtp_auth_username: <string> ]# SMTP 认证密码[ smtp_auth_password: <secret> ]# 从文件读取 SMTP 认证密码[ smtp_auth_password_file: <string> ]# SMTP 认证标记[ smtp_auth_identity: <string> ]# SMTP 认证秘钥[ smtp_auth_secret: <secret> ]# 默认为 SMTP TLS# GO 不支持未加密的SMTP 连接[ smtp_require_tls: <bool> | default = true ]# Slack 通知的api url[ slack_api_url: <secret> ]# Slack 通知的api url 所在文件地址[ slack_api_url_file: <filepath> ][ victorops_api_key: <secret> ][ victorops_api_key_file: <filepath> ][ victorops_api_url: <string> | default = "https://alert.victorops.com/integrations/generic/20131114/alert/" ][ pagerduty_url: <string> | default = "https://events.pagerduty.com/v2/enqueue" ][ opsgenie_api_key: <secret> ][ opsgenie_api_key_file: <filepath> ][ opsgenie_api_url: <string> | default = "https://api.opsgenie.com/" ]#微信配置[ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/" ][ wechat_api_secret: <secret> ][ wechat_api_corp_id: <string> ][ telegram_api_url: <string> | default = "https://api.telegram.org" ][ webex_api_url: <string> | default = "https://webexapis.com/v1/messages" ]# HTTP 客户端配置[ http_config: <http_config> ]#ResolveTimeout 用于警报没有EndsAt时间时,使用的默认值,如果经过这段时间后,警报还未更新,则视其为已解决#对Prometheus没影响,因为其始终会包含EndsAt值[ resolve_timeout: <duration> | default = 5m ]#读取自定义通知模板的文件列表,最后一个可用使用通配符,比如 'templates/*.tmpl'.
templates:[ - <filepath> ... ]# 路由树配置节点
route: <route># 通知接收者配置节点
receivers:- <receiver> ...# 抑制规则配置节点
inhibit_rules:[ - <inhibit_rule> ... ]# 已过期:使用time_intervals 
mute_time_intervals:[ - <mute_time_interval> ... ]# 静音和激活路由的时间间隔列表
time_intervals:[ - <time_interval> ... ]

route

route 路由配置节点,用来配置根路由或子路由,如果未配置可选参数,将从父节点继承。
每个警报都会从根路由进入,遍历所有子路由,如果与路由匹配器匹配,则执行后续的子路由,不匹配则停止,如果没有 匹配到任何子节点,则使用默认配置参数处理警报。

路由配置文件如下:

[ receiver: <string> ]
# 用于将多个警报聚合到一个分组中。比如,cluster=A 和 alertname=LatencyHighFor的多个警报将批量聚合到一个分组。 
# 使用`...`,意味着完全禁用聚合,按原样传递所有警报
[ group_by: '[' <labelname>, ... ']' ]# 警报是否应该继续匹配后续的兄弟节点
[ continue: <boolean> | default = false ]# 过期:使用 matchers 
# 警报匹配器
match:[ <labelname>: <labelvalue>, ... ]# 已过期:使用 matchers 
# 正则格式的警报匹配器
match_re:[ <labelname>: <regex>, ... ]# 警报匹配器列表
matchers:[ - <matcher> ... ]#  最初发送分组警报通知的等待时间,这样可以有足够多的时间来收集同一分组的多条警报,然后一起发送
[ group_wait: <duration> | default = 30s ]# 发送一组新的警报信息的等待时间 (通常为 5分钟或更多)
[ group_interval: <duration> | default = 5m ]# 警报成功发送后,再次发送的等待时间 (通常是3小时或更多).
[ repeat_interval: <duration> | default = 4h ]# 路由静默时间,根节点不能配置静默时间,在此期间不会发送警报
mute_time_intervals:[ - <string> ...]# 路由激活的时间,这些值必须与time_intervals中定义的名称相匹配。空值的话,表示始终处于激活状态。另外根节点不能配置激活时间,路由仅在激活的时候发送通知
active_time_intervals:[ - <string> ...]# 更多的子路由节点
routes:[ - <route> ... ]

结合示例来说明:

# 根路由,如果它们未被覆盖,则由子路由继承
route:receiver: 'default-receiver'group_wait: 30sgroup_interval: 5mrepeat_interval: 4hgroup_by: [cluster, alertname]# 未匹配的所有警报将由'default-receiver'处理routes:# 跟 service=mysql 或 service=cassandra 匹配的告警将由database-pager处理- receiver: 'database-pager'group_wait: 10smatchers:- service=~"mysql|cassandra"# 与team=frontend匹配的警报由frontend-pager处理,它们根据product, environment分组- receiver: 'frontend-pager'group_by: [product, environment]matchers:- team="frontend"# 所有与service=inhouse-service匹配的告警由该路由处理。该路由将在offhours和holidays期间静默,由于配置了continue: true,如果匹配,警报将继续执行下一个路由- receiver: 'dev-pager'matchers:- service="inhouse-service"mute_time_intervals:- offhours- holidayscontinue: true# 所有与service=inhouse-service匹配的警报由该路由处理。该路由仅在offhours 和holidays 期间处理。- receiver: 'on-call-pager'matchers:- service="inhouse-service"active_time_intervals:- offhours- holidays

time_interval

指定用于静默或激活路由的时间间隔,该命名可以在路由配置中引用。

name: <string>
time_intervals:[ - <time_interval> ... ]

<time_interval> 是具体的时间定义,格式如下:

- times:[ - <time_range> ...]weekdays:[ - <weekday_range> ...]days_of_month:[ - <days_of_month_range> ...]months:[ - <month_range> ...]years:[ - <year_range> ...]location: <string>

这些字段都是列表。在每个非空列表中,必须至少满足一个元素才能匹配该字段。如果未指定字段,则任何值都将匹配该字段。对于匹配完整时间间隔的瞬间,所有字段都必须匹配。一些字段支持范围和负索引,详情如下。如果未指定时区,则采用 UTC 时间。

time_range:范围包括开始时间和结束时间,以便轻松表示小时开始/结束的边界时间。例如,start_time: ‘17:00’,end_time: ‘24:00’ 表示在 17:00 开始并在 24:00 之前结束。

    times:- start_time: HH:MMend_time: HH:MM

weekday_range:星期几的列表,一周从星期日开始到星期六结束。应按名称指定日期(例如“Sunday”)。为方便起见,范围也接受这种形式<start_day>:<end_day>,并且两端都包含在内。例如: ['monday:wednesday','saturday', 'sunday']
days_of_month_range:一个月中的数字天数列表。天数从 1 开始。也可以接受从月末开始的负值,例如,一月的 -1 表示一月 31 日。例如:['1:5', '-3:-1'],延长时间超过月初或月底将导致其被限制。例如,指定 ['1:31']二月期间会将实际结束日期限制为 28 或 29,这具体取决于闰年。包含两端
month_range:由不区分大小写的名称(例如“January”)或数字标识的日历月列表,其中 January = 1。也接受范围。例如,['1:3', 'may:august', 'december']包含两端
year_range: 年份的数字列表。范围被接受。例如,['2020:2022', '2030']包含两端
location:与 IANA 时区数据库中的位置匹配的字符串。例如,'Australia/Sydney'。该位置提供时间间隔的时区。例如,一个时间间隔的位置’Australia/Sydney’包含如下内容:

    times:- start_time: 09:00end_time: 17:00weekdays: ['monday:friday']

将包括周一至周五上午 9:00 至下午 5:00 之间的任何时间,使用澳大利亚悉尼当地时间。

您还可以使用'Local' 作为 location, 来使用运行 Alertmanager服务器的本地时间,或'UTC'使用 UTC 时间。如果未提供时区,则时间间隔采用 UTC 时间。注意:在 Windows 上,除非您使用ZONEINFO环境变量提供自定义时区数据库,否则仅支持LocalUTC

inhibit_rule

当存在与另一组匹配者相匹配的警报(源)时,inhibit_rule 规则将禁用与一组匹配器相匹配的警告。目标警报和源警报必须具有与eqaul列表中相同的标签名称和标签值。
缺失的标签跟空值标签是等同的,如果源警报和目标警报缺少equal中列出的所有标签名称,则将应用inhibit_rule(禁用规则)。
为防止警报抑制自身,同时匹配规则的目标端和源端的警报不能被条件相同的警报(包括自身)抑制。

# 已过期: 使用target_matchers
target_match:[ <labelname>: <labelvalue>, ... ]
# 已过期;使用target_matchers
target_match_re:[ <labelname>: <regex>, ... ]# 目标警报抑制要匹配的列表
target_matchers:[ - <matcher> ... ]# 已过期:使用source_matchers
source_match:[ <labelname>: <labelvalue>, ... ]
# 已过期:source_matchers
source_match_re:[ <labelname>: <regex>, ... ]# 至少有一个警报在匹配列表中才能使抑制生效
source_matchers:[ - <matcher> ... ]# 源警报和目标警报要具有相等的值,才能使抑制生效
[ equal: '[' <labelname>, ... ']' ]

http_config

HTTP客户端与服务端通信的配置

# basic_auth 和 authorization 是互斥的# 使用配置的 username 和 password 配置 Authorization 头
# password 和 password_file 是冲突的
basic_auth:[ username: <string> ][ password: <secret> ][ password_file: <string> ]# 可选的 Authorization 头配置
authorization:# 设置 authentication 类型[ type: <string> | default: Bearer ]# 设置凭证,跟credentials_file 是冲突的[ credentials: <secret> ]# 从配置文件读取 credentials # 跟 credentials 是冲突的[ credentials_file: <filename> ]# 可选的 OAuth 2.0 配置
# 不能同时使用 basic_auth 或者 authorization
oauth2:[ <oauth2> ]# 是否启用 HTTP2
[ enable_http2: <bool> | default: true ]# 可选 proxy_url
[ proxy_url: <string> ]# HTTP 请求是否遵循HTTP 3xx重定向
[ follow_redirects: <bool> | default = true ]# TLS 配置
tls_config:[ <tls_config> ]

oauth2

oauth2 配置参数

client_id: <string>
[ client_secret: <secret> ]# 从文件读取 客户端秘钥,跟 client_secret  是冲突的
[ client_secret_file: <filename> ]# token 请求的范围
scopes:[ - <string> ... ]# 获取token 的 URL
token_url: <string># 附加到 token URL 后面的可选参数
endpoint_params:[ <string>: <string> ... ]# 配置 token 请求的 TLS 配置
tls_config:[ <tls_config> ]# 可选 proxy URL
[ proxy_url: <string> ]

tls_config

TLS 连接配置

# 验证服务器证书的CA证书
[ ca_file: <filepath> ]# 用于对服务器进行客户端证书身份验证的证书和密钥文件。
[ cert_file: <filepath> ]
[ key_file: <filepath> ]# ServerName 扩展,用于表示服务器名称
# http://tools.ietf.org/html/rfc4366#section-3.1
[ server_name: <string> ]# 禁用服务器证书验证
[ insecure_skip_verify: <boolean> | default = false]# 最小能接受的TLS版本。可接受的值:TLS10 (TLS 1.0), TLS11 (TLS 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3)
# 如果未设置,Prometheus 将使用Go默认的最小版本, TLS 1.2
# 查看最小版本 https://pkg.go.dev/crypto/tls#Config
[ min_version: <string> ]
# 可接受的最大TLS版本。可接受的值:TLS10 (TLS 1.0), TLS11 (TLS 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3)
# 如果未设置,Prometheus 将使用Go默认的最大版本, TLS 1.3
# 查看最大版本:https://pkg.go.dev/crypto/tls#Config
[ max_version: <string> ]

receiver

用于配置通知接收者,省略了部分国内基本不会用到的通知配置

# 接收者的唯一名称
name: <string># 集成多个通知的配置
email_configs:[ - <email_config>, ... ]
opsgenie_configs:[ - <opsgenie_config>, ... ]
pagerduty_configs:[ - <pagerduty_config>, ... ]
pushover_configs:[ - <pushover_config>, ... ]
slack_configs:[ - <slack_config>, ... ]
sns_configs:[ - <sns_config>, ... ]
victorops_configs:[ - <victorops_config>, ... ]
webhook_configs:[ - <webhook_config>, ... ]
wechat_configs:[ - <wechat_config>, ... ]
telegram_configs:[ - <telegram_config>, ... ]
webex_configs:[ - <webex_config>, ... ]

email_config

# 是否通知已解决的警报
[ send_resolved: <boolean> | default = false ]# 要发送通知的目标邮件地址
to: <tmpl_string># 发件人地址
[ from: <tmpl_string> | default = global.smtp_from ]# 发送邮件的SMTP 主机
[ smarthost: <string> | default = global.smtp_smarthost ]# 要标识给SMTP服务器的主机名
[ hello: <string> | default = global.smtp_hello ]# SMTP 身份验证信息
# auth_password 和 auth_password_file 是冲突的
[ auth_username: <string> | default = global.smtp_auth_username ]
[ auth_password: <secret> | default = global.smtp_auth_password ]
[ auth_password_file: <string> | default = global.smtp_auth_password_file ]
[ auth_secret: <secret> | default = global.smtp_auth_secret ]
[ auth_identity: <string> | default = global.smtp_auth_identity ]# SMTP TLS 要求,Go不支持连接到远程SMTP的未加密连接
[ require_tls: <bool> | default = global.smtp_require_tls ]# TLS 配置
tls_config:[ <tls_config> ]# 邮件html正文
[ html: <tmpl_string> | default = '{{ template "email.default.html" . }}' ]
# 邮件通知文本正文
[ text: <tmpl_string> ]# 邮件其他头 key/value 对,
[ headers: { <string>: <tmpl_string>, ... } ]

webhook_config

webhook 配置

# 是否通知已解决的警报
[ send_resolved: <boolean> | default = true ]# HTTP Post 请求地址
url: <string># HTTP 客户端配置
[ http_config: <http_config> | default = global.http_config ]# 单个webhook 消息中的最大警报数。
# 超过此阈值的警报将被截断。保留为默认值0时,将包含所有警报。
[ max_alerts: <int> | default = 0 ]

如下是webhook 发送的JSON内容示例:

{"version": "4","groupKey": <string>,              // 标识警报组主键 (可以用于去重)"truncatedAlerts": <int>,          // 由于max_alerts截断的警报数量"status": "<resolved|firing>","receiver": <string>,"groupLabels": <object>,"commonLabels": <object>,"commonAnnotations": <object>,"externalURL": <string>,           // 警报关联链接 Alertmanager"alerts": [{"status": "<resolved|firing>","labels": <object>,"annotations": <object>,"startsAt": "<rfc3339>","endsAt": "<rfc3339>","generatorURL": <string>,      // 用于触发警报的实体"fingerprint": <string>        // 警报指纹},...]
}

wechat_config

微信通知

# 是否通知已解决的警报
[ send_resolved: <boolean> | default = false ]# 微信API秘钥
[ api_secret: <secret> | default = global.wechat_api_secret ]# 微信api地址
[ api_url: <string> | default = global.wechat_api_url ]# 身份验证的corp id
[ corp_id: <string> | default = global.wechat_api_corp_id ]# 定义API请求数据
[ message: <tmpl_string> | default = '{{ template "wechat.default.message" . }}' ]
# 消息类型,支持 text 和 markdown
[ message_type: <string> | default = 'text' ]
[ agent_id: <string> | default = '{{ template "wechat.default.agent_id" . }}' ]
[ to_user: <string> | default = '{{ template "wechat.default.to_user" . }}' ]
[ to_party: <string> | default = '{{ template "wechat.default.to_party" . }}' ]
[ to_tag: <string> | default = '{{ template "wechat.default.to_tag" . }}' ]

matcher

- receiver: 'frontend-pager'group_by: [product, environment]matchers:- team="frontend"

匹配器有三部分组成:

  • 有效的Prometheus 标签名称
  • =!==~!~=表示等于,!=表示字符串不相等,=~用于正则表达式的相等,!~用于正则表达式的不相等。它们的含义与 PromQL 选择器中的含义相同
  • UTF-8 字符串,可以用双引号引起来。在每个标记之前或之后,可能会有任意数量的空格

在第三部分中可能会是空字符串,这部分支持转义规则:\"双引号,\n换行符、\\反斜杠

匹配器会以AND 连接在一起,只有都符合时才会匹配,比如
警报有这些标签,{"alertname":"Watchdog","severity":"none"}
不会匹配该列表

matchers:- alertname = Watchdog- severity =~ "warning|critical"

匹配器支持多个组合成一个列表,也可以在单个字符串中组合多个匹配器
1、多个匹配器组成一个列表

matchers:- foo = bar- dings !=bums

2、多个匹配器在一个字符串中

matchers: [ foo = bar, dings != bums ]

也可以使用

matchers: [ "foo = bar,baz", "dings != bums" ]

3、使用类似PromQL的结构,使用单引号包括

matchers: [ '{foo="bar",dings!="bums"}' ]

4、为了避免转义问题,可以使用YAML块引用

matchers:- |{quote=~"She said: \"Hi, all!( How're you…)?\""}

Prometheus 告警规则定义

Prometheus 的告警规则定义在 Prometheus 服务中,Prometheus服务器定义告警规则,这些规则将触发警报,将警报发送到Alertmanager。
定义Prometheus 告警规则,需要在Prometheus全局配置文件中通过rule_files字段加载该文件

rule_files:[ - <filepath_glob> ... ]

告警规则定义在groups 下,如下是一组告警规则示例:

groups:
- name: examplerules:- alert: HighRequestLatencyexpr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5for: 10mlabels:severity: pageannotations:summary: High request latency

各个字段解释:

  • alert:告警规则名称
  • for:警报评估等待时间,只有当触发条件持续一段时间后才发送警报,等待期间,新的警报状态为pending
  • labels:自定义标签,允许附加额外的标签到告警上,任何已存在的冲突标签都会被重写,标签支持模板化。
  • annotations:指定另一组标签,用于存储更长的附加信息,比如警报描述,这个值支持模版化
  • expr:基于PromQL表达式的告警触发条件,计算是否有满足条件的告警

Prometheus 支持在告警规则中使用模板化定义labelsannotations。标签以变量$labels形式表示,指标值以$value形式表示,比如 $labels.instance 表示警报实例

groups:
- name: examplerules:# 对超过5分钟还挂掉的实例,发送警报- alert: InstanceDownexpr: up == 0for: 5mlabels:severity: pageannotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

Alertmanager 告警模板

Prometheus 告警模板指的是Alertmanager 消息通知模版,有两种方式。

1、使用模板字符串
获取告警规则中定义的内容,从CommonAnnotations中读取summarydescription

- name: 'team-x'slack_configs:- channel: '#alerts'# Alertmanager templates apply here.text: "<!channel> \nsummary: {{ .CommonAnnotations.summary }}\ndescription: {{ .CommonAnnotations.description }}"

2、定义可重用模版
创建一个模板文件/alertmanager/template/myorg.tmpl,并创建一个名为slack.myorg.txt的模板。

{{ define "slack.myorg.text" }}https://internal.myorg.net/wiki/alerts/{{ .GroupLabels.app }}/{{ .GroupLabels.alertname }}{{ end}}

在Alertmanager 全局配置中设置templates模板文件路径,随后在接收器中引用我们定义的模板slack.myorg.text

global:slack_api_url: '<slack_webhook_url>'route:receiver: 'slack-notifications'group_by: [alertname, datacenter, app]receivers:
- name: 'slack-notifications'slack_configs:- channel: '#alerts'text: '{{ template "slack.myorg.text" . }}'templates:
- '/etc/alertmanager/templates/myorg.tmpl'

模版也支持GO提供的默认函数,详见 Go Function

Alertmanager 告警通知结构

如下是使用webhook接收到的通知报文:

{"receiver": "webhook","status": "firing","alerts": [{"status": "firing","labels": {"alertname": "DemoJobDown","instance": "192.168.0.102:8000","job": "provider","monitor": "codelab-monitor","severity": "critical"},"annotations": {"description": "192.168.0.102:8000 实例 已经挂机超过1分钟","summary": "实例 192.168.0.102:8000 挂机"},"startsAt": "2023-02-27T05:02:27.189Z","endsAt": "0001-01-01T00:00:00Z","generatorURL": "http://5e22f422c1ad:9090/graph?g0.expr=up%7Bjob%3D%22provider%22%7D+%3D%3D+0\u0026g0.tab=1","fingerprint": "db97f3904a8341cc"}],"groupLabels": {"alertname": "DemoJobDown"},"commonLabels": {"alertname": "DemoJobDown","instance": "192.168.0.102:8000","job": "provider","monitor": "codelab-monitor","severity": "critical"},"commonAnnotations": {"description": "192.168.0.102:8000 实例 已经挂机超过1分钟","summary": "实例 192.168.0.102:8000 挂机"},"externalURL": "http://400258faa149:9093","version": "4","groupKey": "{}:{alertname=\"DemoJobDown\"}","truncatedAlerts": 0
}

整个报文表示一个Data
Receiver 表示通知接收者的名称,这里是webhook
Status firing 表示警报触发,resolved 表示警报已解决
Alerts 警报对象列表
GroupLabels 警报的分组
CommonLabels 警报的通用标签
CommonAnnotations 警报的通用注释,用于长描述字符串
ExternalURL 发送通知的Alertmanager地址链接

Alerts 警报对象列表字段
Status 当前警报是触发状态,还是已解决
Labels 附加到警报的标签
Annotations 警报的注释
StartsAt 警报触发时间,如果省略由Alertmanager定义
EndsAt 当知道警报结束时间时设置,否则为上次收到警报后可配置超时时间
GeneratorURL 引起该告警的实体地址链接
Fingerprint 警报指纹

Prometheus 系列文章

  1. Prometheus 的介绍和安装
  2. 直观感受PromQL及其数据类型
  3. PromQL之选择器和运算符
  4. PromQL之函数
  5. Prometheus 告警机制介绍及命令解读
  6. Prometheus 告警模块配置深度解析
  7. Prometheus 配置身份认证
  8. Prometheus 动态拉取监控服务
  9. Prometheus 监控云Mysql和自建Mysql
  10. Prometheus 监控服务器
  11. Prometheus 监控Redis
  12. Prometheus 监控消息队列
  13. Prometheus 监控ES
  14. Prometheus 自定义监控
  15. Prometheus 告警接入钉钉、邮箱、飞书
  16. Prometheus 高可用部署

相关文章:

Prometheus 告警模块配置深度解析

本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置&#xff0c;也可以通过配置文件配置。命令行用来配置不可变的系统参数&#xff0c;配置文件用来定义限制规则用于通知路由和通知接收者。 Alertmana…...

《分布式技术原理与算法解析》学习笔记Day23

分布式数据复制 我们在进行分布式数据存储设计时&#xff0c;通常会考虑对数据进行备份&#xff0c;以提高数据的可用性和可靠性&#xff0c;“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术&#xff1f; 在分布式数据库系统中&#xff0c;通常会设置主备…...

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…...

一起Talk Android吧(第五百零八回:多层布局功能)

文章目录功能介绍使用方法示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"图片滤镜ImageFilterView",这一回中咱们说的例子是" 多层布局功能"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;功能介绍 我…...

丁小喜の兵器谱(学生管理系统)

我的第一个独立看需求完成项目&#xff0c;虽然很简单&#xff08;笑&#xff09;建立一个可以增加&#xff0c;修改&#xff0c;删除&#xff0c;展示学生信息的系统首先是一个界面&#xff0c;让你决定进行哪个操作1.2.3.4.5分别对应不同的操作&#xff0c;switch与这一操作完…...

linux:字符串拷贝的五种方法:使用指针下标,指针变量加偏移量,指针变量自加等

字符串数组名做函数形参&#xff0c;会退化正指针变量&#xff0c;需要使用指针变量操作字符串 代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

cesium常用方法汇集(工具篇)

1.Scene.prototype.pickPositionWorldCoordinates 根据屏幕坐标获取世界坐标 2&#xff0c;Scene.prototype.pickPosition 根据屏幕坐标获取世界坐标 3&#xff0c;Scene.prototype.drillPick 通过屏幕坐标拾取多个对象 4&#xff0c;Scene.prototype.pickFromRay 通过射线拾…...

分布式一致性与共识算法(一)

这里写目录标题是什么ACIDCAP组合一致性概念共识为什么需要共识算法会如何发展列举Paxos算法ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;协议Raft 算法参考引用是什么 从实现效果上来说&#xff0c;很多人或多或少都了解或者设计过具有强一致性的系统。但是&#…...

C++---最长上升子序列模型---怪盗基德的滑翔翼(每日一道算法2023.2.27)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方&#xff0c;就是他每次都能逃脱中…...

Python 之 Pandas 文件操作和读取 CSV 参数详解

文章目录一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数一、Pandas 读取文件 当使用 Pandas 做数据分析的时&#xff0c;需要读取事先准备好的数据集&#xff0c;这是做数据分析的第一步。Panda 提…...

微服务的异步通信技术RabbitMQ

文章目录前言1.WorkQueue&#xff08;工作队列&#xff09;消息预取机制2.Publish&Subscribe&#xff08;发布-订阅&#xff09;1.Fanout&#xff08;广播&#xff09;2.DirectExchange&#xff08;路由&#xff09;3.TopicExchange&#xff08;话题&#xff09;MQ的优点前…...

Word处理控件Aspose.Words功能演示:使用 C++ 在 Word (DOC/DOCX) 中添加或删除水印

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…...

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年&#xff0c;自然语言处理 NLP 领域也步入了 LLM 时代&#xff0c;谷歌出品的 Bert 模型横空出世&#xff0c;碾压了以往的所有模型&#xff0c;直接在各种NLP的建模…...

四、阻塞队列

文章目录基础概念生产者消费者概念JUC阻塞队列的存取方法ArrayBlockingQueueArrayBlockingQueue的基本使用生产者方法实现原理ArrayBlockingQueue的常见属性add方法实现offer方法实现offer(time,unit)方法put方法消费者方法实现原理remove方法poll方法poll(time,unit)方法take方…...

企业电子招投标采购系统源码之登录页面

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…...

SQL零基础入门学习(十三)

上一篇&#xff08;SQL零基础入门学习&#xff08;十二&#xff09;&#xff09; SQL 视图&#xff08;Views&#xff09; 视图是可视化的表。 SQL CREATE VIEW 语句 在 SQL 中&#xff0c;视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列&#xff0c;就像一个…...

Java实现简单KV数据库

用Java实现一个简单的KV数据库 开发思路&#xff1a; 用map存储数据&#xff0c;再用一个List记录操作日志&#xff0c;开一个新线程将List中的操作写入日志文件中&#xff0c;再开一个线程用于网络IO服务接收客户端的命令&#xff0c;再启动时检查日志&#xff0c;如果有数据就…...

【Spark分布式内存计算框架——Spark Streaming】5. DStream(上)

3. DStream SparkStreaming模块将流式数据封装的数据结构&#xff1a;DStream&#xff08;Discretized Stream&#xff0c;离散化数据流&#xff0c;连续不断的数据流&#xff09;&#xff0c;代表持续性的数据流和经过各种Spark算子操作后的结果数据流。 3.1 DStream 是什么…...

Spring系列-9 Async注解使用与原理

背景&#xff1a; 本文作为Spring系列的第九篇&#xff0c;介绍Async注解的使用、注意事项和实现原理&#xff0c;原理部分会结合Spring框架代码进行。 本文可以和Spring系列-8 AOP原理进行比较阅读 1.使用方式 Async一般注解在方法上&#xff0c;用于实现方法的异步&#xf…...

Python自动化测试实战篇(6)用PO分层模式及思想,优化unittest+ddt+yaml+request登录接口自动化测试

这些是之前的文章&#xff0c;里面有一些基础的知识点在前面由于前面已经有写过&#xff0c;所以这一篇就不再详细对之前的内容进行描述 Python自动化测试实战篇&#xff08;1&#xff09;读取xlsx中账户密码&#xff0c;unittest框架实现通过requests接口post登录网站请求&…...

Linux 进程:父子进程

目录一、了解子进程二、创建子进程1.创建子进程2.区分父子进程三、理解子进程四、创建子进程的意义进程就是运行中的应用程序&#xff0c;如果一个程序较为庞大&#xff0c;我们可以给这个程序创建多个进程&#xff0c;每个进程负责一部分代码的运行。 A进程如果创建了B进程&am…...

Unity 之 实现读取代码写进Word文档功能实现 -- 软著脚本生成工具

Unity 之 实现读取代码写进Word文档功能前言一&#xff0c;实现步骤1.1 逻辑梳理1.2 用到工具二&#xff0c;实现读写文件2.1 读取目录相关2.2 读写文件三&#xff0c;编辑器拓展3.1 编辑器拓展介绍3.2 实现界面可视化四&#xff0c;源码分享4.1 工具目录4.2 完整代码前言 之所…...

Typora图床配置:Typora + PicGo + 阿里云OSS

文章目录一、前景提要二、相关链接三、搭建步骤1. 购买阿里云对象存储OSS2. 对象存储OSS&#xff1a;创建Bucket3. 阿里云&#xff1a;添加OSS访问用户及权限4. 安装Typora5. 配置PicGo方法一&#xff1a;使用PicGo-Core (Command line)方法二&#xff1a;使用PicGo(app)6. 最后…...

二进制搭建以太坊2.0节点-2023最新详细版文档

文章目录 一、配置 JWT 认证二、部署执行节点geth2.1 下载geth二进制文件2.2 geth节点启动三、部署共识节点Prysm3.1 下载Prysm脚本3.2 Prysm容器生成四、检查节点是否同步完成4.1 检查geth执行节点4.2 检查prysm共识节点4.3 geth常用命令五、节点同步详细说明5.1 启动时日志5.…...

如何简化跨网络安全域的文件发送流程,大幅降低IT人员工作量?

为什么要做安全域的隔离&#xff1f; 随着企业数字化转型的逐步深入&#xff0c;企业投入了大量资源进行信息系统建设&#xff0c;信息化程度日益提升。在这一过程中&#xff0c;企业也越来越重视核心数据资产的保护&#xff0c;数据资产的安全防护成为企业面临的重大挑战。 …...

带你深入了解c语言指针后续

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨在该…...

借助Intune无感知开启Bitlocker

希望使用 Intune 部署 BitLocker&#xff0c;但不知道从哪里开始&#xff1f;这是人们最开始使用 Intune 时最常见的问题之一。在本博客中&#xff0c;你将了解有关使用 Intune 管理 BitLocker 的所有信息&#xff0c;包括建议的设置、BitLocker CSP 在客户端上的工作方式&…...

零基础该如何转行Python工程师?学习路线是什么?

最近1年的主要学习时间&#xff0c;都投资到了 python 数据分析和数据挖掘上面来了&#xff0c;虽然经验并不是十分丰富&#xff0c;但希望也能把自己的经验分享下&#xff0c;最近也好多朋友给我留言&#xff0c;和我聊天&#xff0c;问我python该如何学习&#xff0c;才能少走…...

Go项目(商品微服务-1)

文章目录简介建表protohandler商品小结简介 商品微服务主要在于表的设计&#xff0c;建哪些表&#xff1f;表之间的关系是怎样的&#xff1f; 主要代码就是 CURD表和字段的设计是一个比较有挑战性的工作&#xff0c;比较难说清楚&#xff0c;也需要经验的积累&#xff0c;这里…...

机器学习——集成学习

引言 集成学习&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;群殴走起。 分类 1. Bagging:训练多个分类器取平均&#xff08;m代表树的个数&#xff09;。 2.Boosting&#xff08;提升算法&#xff09;:从弱学习器开始加&#xff0c;通过加权来进行训练。…...

腾讯网页版/天津seo培训

参加软考的同学都会要复习的UML相关的知识点&#xff0c;同时我们在学习和工作中也会用到UML工具。 最新的UML2.0有哪些图呢 用例图&#xff08;use case diagram&#xff09; 小人蛋活动图&#xff08;activity diagram&#xff09;静态结构图顺序图&#xff08;Sequence Di…...

微网站的图标怎么做/seo优化推广教程

一、介绍Oracle的同义词(synonyms)从字面上理解就是别名的意思&#xff0c;和视图的功能类似&#xff0c;就是一种映射关系。它可以节省大量的数据库空间&#xff0c;对不同用户的操作同一张表没有多少差别;它扩展了数据库的使用范围&#xff0c;能够在不同的数据库用户之间实现…...

做网站的企业排名/最近一周的重大新闻

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;peopleId&#xff09;来判断 select * from people where peopleId in (select peopleId from people group by peopleId having c…...

美国做调查的网站/短视频seo系统

据国外媒体报道&#xff0c;惠普公司8月23日宣布&#xff0c;计划以16亿美元竞购虚拟存储制造商3PAR。而在一周前&#xff0c;戴尔公司曾出价11.5亿美元收购此公司。 惠普是在给3PAR的董事长和CEO的信中透露其收购价格的。惠普执行副总裁兼首席战略和技术官谢恩罗宾逊&#xff…...

做任务领黄钻的网站/网络运营培训

删除逻辑 boolean del(taskName任务名称, busNo业务编号) keyqlscf_taskName_busNo 如果key存在 getRedisTemplate().delete(key) 获取逻辑 boolean get(taskName任务名称, busNo业务编号) keyqlscf_taskName_busNo 如果key存在 取出redis中key对应的value&#xff1a;getRe…...

苏州制作网站的有几家/网站排名在线优化工具

&#xff08;图片来源&#xff1a;网络&#xff09; 2022年2月4日&#xff0c;由量子经济发展联盟&#xff08;QED-C&#xff09;和总部位于加利福尼亚州的量子软件和服务公司QC Ware赞助&#xff0c;欧洲量子工业联盟和加拿大量子工业协助的Hyperion Research进行的一项新研究…...