Etcd 可观测最佳实践

简介

Etcd 是一个高可用的分布式键值存储系统,它提供了一个可靠的、强一致性的存储服务,用于配置管理和服务发现。它最初由 CoreOS 开发,现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性,能保证数据在所有节点间保持同步。

Etcd 作为一个关键的分布式键值存储系统,广泛应用于 Docker、Kubernetes等分布式系统中,用于存储配置信息、服务发现、领导者选举等,它保证了集群数据的强一致性和高可用性。因此对 Etcd 可观测是非常重要的,尤其是在生产环境中,观测 Etcd 的运行指标可以帮助及时发现和解决潜在的问题,确保集群的稳定性和可靠性。

Etcd 自带 metrics 接口,可以通过 curl 命令访问默认的 “/metrics” 端点来查看可用的指标。如果 Etcd 集群配置了 TLS,还需要指定客户端证书和密钥等信息 。

curl http://<etcd-node-ip>:2379/metrics

观测云是一款统一的可观测平台,可实现对多云、云原生、中间件、应用等进行实时可观测。观测云数据的采集是通过 DataKit 来实现的,DataKit 自带的有 Etcd 采集器,不依赖 Prometheus,只需要安装 DataKit,开通 Etcd 采集器,配置 metrics url 、证书、密钥等信息,即可采集到 Etcd 指标到观测云。下面是在 Kubernetes 集群部署 DataKit 并开通 Etcd 采集器的示例。

操作步骤

部署 DataKit

登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml,拷贝第 3 步中的 token。

编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中“token=”后面,设置环境变量 ENV_CLUSTER_NAME_K8S 的值并增加环境变量 ENV_NAMESPACE,这两个环境变量的值一般和集群名称对应,一个工作空间集群名称要唯一。

        - name: ENV_NAMESPACEvalue: xxxx

把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令。

kubectl apply -f datakit.yaml
kubectl get pod -n datakit

开通 Etcd 采集

KubernetesPrometheus 是 DataKit 的一个采集器,它根据自定义配置实现自动发现 Prometheus 服务并进行采集,极大简化了采集 Kubernetes 集群中 Etcd 指标的复杂度。

apiVersion: v1
kind: ConfigMap
metadata:name: datakit-confnamespace: datakit
data:etcd.conf: |-  [inputs.kubernetesprometheus]      [[inputs.kubernetesprometheus.instances]]role       = "pod"namespaces = ["kube-system"]selector   = "component=etcd,tier=control-plane"      scrape   = "true"scheme   = "https"port     = "2379"path     = "/metrics"interval = "60s"[inputs.kubernetesprometheus.instances.custom]measurement        = "etcd"job_as_measurement = false[inputs.kubernetesprometheus.instances.custom.tags]node_name        = "__kubernetes_node_name"cluster_name_k8s = "k8s-dev"[inputs.kubernetesprometheus.instances.auth]bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"[inputs.kubernetesprometheus.instances.auth.tls_config]insecure_skip_verify = falseca_certs = ["/rootfs/etc/kubernetes/pki/etcd/ca.crt"]cert     = "/rootfs/etc/kubernetes/pki/etcd/peer.crt"cert_key = "/rootfs/etc/kubernetes/pki/etcd/peer.key"
再把 etcd.conf 挂载到 DataKit 的 /usr/local/datakit/conf.d/kubernetesprometheus/etcd.conf 下面,最后重新部署 DataKit。- mountPath: /usr/local/datakit/conf.d/kubernetesprometheus/etcd.confname: datakit-confsubPath: etcd.conf

指标

登录观测云控制台,点击「指标」 -「指标管理」,输入“etcd”,就能查询采集到的指标。

Etcd 采集器默认会把所有指标都采集到观测云,为了减少时间线,需要使用 pipeline,drop 未被使用的指标。登录观测云控制台,点击「管理」 -「新建Pipeline」,选择“指标”、“etcd”,drop_key(grpc_server_started_total) 即是不采集 grpc_server_started_total 指标。

完整解析规则如下:

drop_key(grpc_server_started_total)
drop_key(etcd_cluster_version) 
drop_key(etcd_debugging_auth_revision)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_sum)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_sum)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_sum)
drop_key(etcd_debugging_lease_granted_total)
drop_key(etcd_debugging_lease_renewed_total)
drop_key(etcd_debugging_lease_revoked_total)
drop_key(etcd_debugging_lease_ttl_total_bucket)
drop_key(etcd_debugging_lease_ttl_total_count)
drop_key(etcd_debugging_lease_ttl_total_sum)
drop_key(etcd_debugging_mvcc_compact_revision)
drop_key(etcd_debugging_mvcc_current_revision)
drop_key(etcd_debugging_mvcc_db_compaction_keys_total)
drop_key(etcd_debugging_mvcc_db_compaction_last)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_events_total)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_pending_events_total)
drop_key(etcd_debugging_mvcc_range_total)
drop_key(etcd_debugging_mvcc_slow_watcher_total)
drop_key(etcd_debugging_mvcc_total_put_size_in_bytes)
drop_key(etcd_debugging_mvcc_watch_stream_total)
drop_key(etcd_debugging_mvcc_watcher_total)
drop_key(etcd_debugging_server_lease_expired_total)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_bucket)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_count)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_sum)
drop_key(etcd_debugging_snap_save_total_duration_seconds_bucket)
drop_key(etcd_debugging_snap_save_total_duration_seconds_count)
drop_key(etcd_debugging_snap_save_total_duration_seconds_sum)
drop_key(etcd_debugging_store_expires_total)
drop_key(etcd_debugging_store_reads_total)
drop_key(etcd_debugging_store_watch_requests_total)
drop_key(etcd_debugging_store_watchers)
drop_key(etcd_debugging_store_writes_total)
drop_key(etcd_disk_backend_defrag_duration_seconds_bucket)
drop_key(etcd_disk_backend_defrag_duration_seconds_count)
drop_key(etcd_disk_backend_defrag_duration_seconds_sum)
drop_key(etcd_disk_backend_snapshot_duration_seconds_bucket)
drop_key(etcd_grpc_proxy_cache_hits_total)
drop_key(etcd_grpc_proxy_cache_keys_total)
drop_key(etcd_grpc_proxy_cache_misses_total)
drop_key(etcd_grpc_proxy_events_coalescing_total)
drop_key(etcd_grpc_proxy_watchers_coalescing_total)
drop_key(etcd_mvcc_db_open_read_transactions)
drop_key(etcd_mvcc_delete_total)
drop_key(etcd_mvcc_hash_duration_seconds_bucket)
drop_key(etcd_mvcc_hash_duration_seconds_count)
drop_key(etcd_mvcc_hash_duration_seconds_sum)
drop_key(etcd_mvcc_hash_rev_duration_seconds_bucket)
drop_key(etcd_mvcc_hash_rev_duration_seconds_count)
drop_key(etcd_mvcc_hash_rev_duration_seconds_sum)
drop_key(etcd_mvcc_put_total)
drop_key(etcd_mvcc_range_total)
drop_key(etcd_mvcc_txn_total)
drop_key(etcd_server_apply_duration_seconds_bucket)
drop_key(etcd_server_apply_duration_seconds_count)
drop_key(etcd_server_apply_duration_seconds_sum)
drop_key(etcd_server_client_requests_total)
drop_key(etcd_server_go_version)drop_key(etcd_server_id)
drop_key(etcd_server_is_leader)
drop_key(etcd_server_is_learner)
drop_key(etcd_server_learner_promote_successes)
drop_key(etcd_server_quota_backend_bytes)
drop_key(etcd_server_slow_apply_total)
drop_key(etcd_server_slow_read_indexes_total)
drop_key(etcd_server_version)
drop_key(etcd_snap_db_fsync_duration_seconds_bucket)
drop_key(etcd_snap_db_fsync_duration_seconds_count)
drop_key(etcd_snap_db_fsync_duration_seconds_sum)
drop_key(etcd_snap_db_save_total_duration_seconds_bucket)
drop_key(etcd_snap_db_save_total_duration_seconds_count)
drop_key(etcd_snap_db_save_total_duration_seconds_sum)
drop_key(etcd_snap_fsync_duration_seconds_bucket)
drop_key(etcd_snap_fsync_duration_seconds_count)
drop_key(etcd_snap_fsync_duration_seconds_sum)
drop_key(go_gc_duration_seconds)
drop_key(go_gc_duration_seconds_count)
drop_key(go_gc_duration_seconds_sum)
drop_key(go_goroutines)
drop_key(go_info)
drop_key(go_memstats_frees_total)
drop_key(go_memstats_gc_cpu_fraction)
drop_key(go_memstats_gc_sys_bytes)
drop_key(go_memstats_heap_idle_bytes)
drop_key(go_memstats_heap_inuse_bytes)
drop_key(go_memstats_heap_objects)
drop_key(go_memstats_heap_released_bytes)
drop_key(go_memstats_heap_sys_bytes)
drop_key(go_memstats_last_gc_time_seconds)
drop_key(go_memstats_lookups_total)
drop_key(go_memstats_mallocs_total)
drop_key(go_memstats_mcache_inuse_bytes)
drop_key(go_memstats_mcache_sys_bytes)
drop_key(go_memstats_mspan_sys_bytes)
drop_key(go_memstats_next_gc_bytes)
drop_key(go_memstats_other_sys_bytes)
drop_key(go_memstats_stack_inuse_bytes)
drop_key(go_memstats_stack_sys_bytes)
drop_key(go_memstats_sys_bytes)
drop_key(go_threads)
drop_key(grpc_server_msg_received_total)
drop_key(grpc_server_msg_sent_total)
drop_key(process_resident_memory_bytes)
drop_key(process_start_time_seconds)
drop_key(process_virtual_memory_bytes)
drop_key(process_virtual_memory_max_bytes)
drop_key(promhttp_metric_handler_requests_in_flight)
drop_key(promhttp_metric_handler_requests_total)

监控视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “etcd”, 选择“Etcd 监控视图”,点击“确定”。

关键指标

Etcd 的监控指标主要包括 Server、Disk 和 Network 三大类。

  • Server 指标:描述了 Etcd 服务器的状态,包括是否有 leader、leader 切换次数、已提交和已应用的提案总数、等待提交的提案数以及失败的提案数等。
  • Disk 指标:描述了磁盘操作的状态,例如 WAL fsync 调用的延迟和后端提交操作的延迟。
  • Network 指标:描述了网络状态,包括发送和接收的字节数、发送和接收失败数以及节点间的 RTT 时间等。
指标描述单位
etcd_server_has_leader这个指标表示 Etcd 集群中是否存在 Leader。count
etcd_server_health_successetcd 服务器健康检查成功的次数count
etcd_server_health_failuresetcd 服务器健康检查失败的次数count
process_resident_memory_bytes用于表示 etcd 进程当前占用的常驻内存(resident memory)大小Bytes
etcd_server_proposals_committed_total成功提交到 Raft 日志中的提案(proposals)总数count
etcd_server_proposals_applied_total成功应用或执行(Apply)的提案(proposals)总数count
etcd_server_proposals_pending当前等待处理的提案数量count
etcd_server_proposals_failed_total失败的提案总数count
etcd_mvcc_db_total_size_in_bytes数据库的总大小Bytes
etcd_disk_wal_fsync_duration_seconds_sum当前日志执行 fsync 操作的总耗时Seconds
etcd_disk_backend_commit_duration_seconds_sum后台数据库提交操作的总耗时Seconds
etcd_network_client_grpc_received_bytes_totaletcd 服务器从客户端通过 gRPC 协议接收到的总字节数Bytes
etcd_network_client_grpc_sent_bytes_totaletcd 服务器通过 gRPC 协议发送给客户端的总字节数Bytes
etcd_server_leader_changes_seen_totalleader 的切换次数count
process_open_fds操作系统进程当前打开的文件描述符数量count
process_max_fds操作系统允许一个进程打开的最大文件描述符数量count
提案(Proposal)

Etcd 基于 Raft 实现一致性算法。在 Raft 中,任何试图更改系统状态的动作都以提案(Proposal)的形式被提出。

etcd_server_proposals_pending 表示正在等待处理的 Proposal 数量。

etcd_server_proposals_committed_total 和 etcd_server_proposals_applied_total :这两个指标分别表示成功提交到 Raft 日志中的提案数量和成功应用或执行(Apply)的提案数量。它们可以帮助监控集群处理请求的能力。如果提交和应用的提案数之间存在较大差异,可能表明集群正在处理大量请求,或者存在性能瓶颈。

etcd_server_proposals_failed_total :这个指标记录了处理失败的提案数量。提案失败可能由于多种原因,包括网络问题、集群不稳定或资源限制。监控这个指标有助于及时发现和解决影响 Etcd 集群稳定性的问题。

同步时间

etcd_disk_wal_fsync_duration_seconds_bucket 和 etcd_disk_backend_commit_duration_seconds_bucket :这两个指标反映了 Etcd 存储数据的效率,高延迟可能表明磁盘性能问题或集群过载。

WAL 日志同步时间 etcd_disk_wal_fsync_duration_seconds_bucket ,表示 WAL 日志同步到磁盘时,WAL 调用 fsync 的延迟,正常应该低于10ms,当 99 百分位的 fsync 延迟超过某个阈值(比如 100 毫秒)时触发告警。

库同步时间 etcd_disk_backend_commit_duration_seconds_bucket ,当 etcd 将其最新的增量快照提交到磁盘时,会调用 backend_commit , 正常应该低于120ms。

Leader 是否存在

etcd_server_has_leader :这个指标表示 Etcd 集群中是否存在 Leader。Leader 对于 Etcd 集群至关重要,因为它负责处理所有的写请求。0 表示不是,1表示是,如果这个值为 0,意味着集群中没有 Leader,这将导致写操作无法进行,整个集群不可用。因此,监控这个指标可以帮助及时发现集群是否处于正常工作状态。

Leader 切换频次

etcd_server_leader_changes_seen_total 指标,记录了 leader 的切换次数。当 Etcd 通过 Raft 协议选举出 leader 后,leader 应该是固定不变的。频繁的 Leader 切换可能是由于网络问题或集群不稳定造成的,这会影响集群的性能和稳定性。监控这个指标有助于发现潜在的网络问题或集群健康问题。生产环境如果在一个小时内发生超过三次的 leader 切换,需要触发告警。

监控器(告警)

通过合理配置监控器,可以及时处理 etcd 故障,观测云也提供了相应的模板供客户参考使用。

Leader 监控器

值为 0 触发紧急告警。

Leader 频繁切换监控

如需更多监控器可以按照实际生产需求进行配置。

总结

总之,对 Etcd 进行可观测,是确保分布式系统稳定运行的关键步骤,观测云是一款实用的可观测产品,建议把生产环境中 Etcd 接入观测云,使用观测云的监控器对重要指标进行监控告警。

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

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

相关文章

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

fpga开发环境总结

这里使用Altera(阿尔特拉&#xff09;Cyclone IV E系列的EP4CE10F17C8开发为例&#xff0c;参考正点原子开发板手册进行总结&#xff0c;。 一&#xff0c;Quartus II介绍。 1&#xff0c;Quartus II 是 Altera 公司的综合性 FPGA 开发软件&#xff0c;可以完成从设…

软件测试人员必问的十大面试题..

在软件测试职位面试中&#xff0c;准备并回答一些常见的必问面试题非常重要。这些问题涵盖了软件测试的关键概念、技术和实践&#xff0c;帮助面试官评估你的能力和经验。理解这些问题的重要性是为了在面试中展示你的专业知识和技能&#xff0c;以及你在软件测试领域的实际应用…

使用RabbitMQ实现延迟消息的完整指南

在分布式系统中&#xff0c;消息队列通常用于解耦服务&#xff0c;RabbitMQ是一个广泛使用的消息队列服务。延迟消息&#xff08;也称为延时队列或TTL消息&#xff09;是一种常见的场景应用&#xff0c;特别适合处理某些任务在一段时间后执行的需求&#xff0c;如订单超时处理、…

零基础Java第十期:类和对象(一)

目录 一、拜访对象村 1.1. 什么是面向对象 1.2. 面向对象与面向过程 二、类定义和使用 2.1. 类的定义格式 2.2. 类的定义练习 三、类的实例化 3.1. 什么是实例化 3.2. 类和对象的说明 四、this引用 4.1. 什么是this引用 4.2. this引用的特性 一、拜访对象村 在…

使用python代码绘制好看的统计图

代码功能 上述代码使用 matplotlib 和 seaborn 生成四种不同的统计图&#xff0c;具体如下&#xff1a; 玫瑰图&#xff1a;在极坐标上绘制柱状图&#xff0c;展示不同角度的数值分布。雷达图&#xff1a;绘制多维数据的雷达图&#xff0c;用于对比不同维度的数值。热力图&am…

<项目代码>YOLOv8煤矿输送带异物识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

java项目之基于web的智慧社区设计与实现(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于web的智慧社区设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于web的智…

【优先算法】双指针 --(结合例题讲解解题思路)(C++)

今日鸡汤&#xff1a; “无人负我青云志&#xff0c;我自踏雪至山巅。” -徐霞客《青云志》 释义&#xff1a;没有人能够帮助我实现我的理想&#xff0c;即使面对再大的困难&#xff0c;我也要踏着积雪&#xff0c;一步步&#xff0c;到达山巅。 目录 1.快乐数 2.盛最多的…

【Unity 安装教程】

Unity 中国官网地址链接 Unity - 实时内容开发平台 | 3D、2D、VR & AR可视化https://unity.cn/首先我们想要安装Unity之前&#xff0c;需要安装Unity Hub&#xff1a; Unity Hub 是 Unity Technologies 开发的一个集成软件&#xff0c;它为使用 Unity 引擎的开发者提供了一…

大一物联网要不要转专业,转不了该怎么办?

有幸在2014年&#xff0c;踩中了物联网的风口&#xff0c;坏消息&#xff0c;牛马的我&#xff0c;一口汤都没喝上。 依稀记得&#xff0c;当时市场部老大&#xff0c;带我去上海参加电子展会&#xff0c;印象最深的&#xff0c;一些物联网云平台&#xff0c;靠着一份精美PPT&a…

从汇编角度看C/C++函数指针与函数的调用差异

函数指针本质上是一个指针变量&#xff0c;只不过这个变量保存的地址是一个函数的地址&#xff0c;那么直接调用函数和通过函数指针调用有没有区别呢&#xff1f;答案是有的&#xff0c;下面的代码是一个直接调用函数和通过指针调用函数的例子&#xff0c;使用gdb反汇编main函数…

蓝桥杯题目理解

1. 一维差分 1.1. 小蓝的操作 1.1.1. 题目解析&#xff1a; 这道题提到了对于“区间”进行操作&#xff0c;而差分数列就是对于区间进行操作的好方法。 观察差分数列&#xff1a; 给定数列&#xff1a;1 3 5 2 7 1 差分数列&#xff1a;1 2 2 -3 5 6 题目要求把原数组全部…

【2024|滑坡数据集论文解读1】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集

【2024|滑坡数据集论文解读1】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 【2024|滑坡数据集论文解读1】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 文章目录 【2024|滑坡数据集论文解读1】CAS滑坡数据集&#xff1a;用…

【TFR-Net】基于transformer的鲁棒多模态情感分析特征重构网络

代码地址&#xff1a;TFR-Net/models at main thuiar/TFR-Net GitHub abstract&#xff1a; 提高对数据缺失的鲁棒性已经成为多模态情感分析&#xff08;MSA&#xff09;的核心挑战之一&#xff0c;MSA旨在从语言、视觉和声学信号中判断说话者的情感。在目前的研究中&#…

HBuilder X 中Vue.js基础使用->计算属性的应用(三)

一、通过简单的计算属性&#xff1a;对两数进行加法&#xff0c;减法&#xff0c;乘法&#xff0c;除法运算 <template><div><h1>computed 计算属性</h1><el-input type"text" v-model"numOne" /> <el-input type"t…

D49【python 接口自动化学习】- python基础之类

day49 类的常见错误 学习日期&#xff1a;20241026 学习目标&#xff1a;类 -- 63 避坑指南&#xff1a;类的常见错误 学习笔记&#xff1a; 语法错误 设计错误 总结 self 是刚开始学习面向对象编程时&#xff0c;最容易忽略的语法编写多个类时&#xff0c;解决依赖关系是…

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25 声明:本文图片来源于网络 A模拟信号特点: 电压或者电流 缓慢上升 随着时间连续缓慢上升或下降 D数字信号特点:电压或者电流 保持一段时间的高/低电平 状态 / 突变 (高电压瞬间低电压) 数字电路中 通常将0-1v电压称…

Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具

关于Segugio Segugio是一款功能强大的恶意软件安全分析工具&#xff0c;该工具允许我们轻松分析恶意软件执行的关键步骤&#xff0c;并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤&#xff0c;其中包括从点击第一阶段到提取恶意软件的最…

STM32Lx GXHT3x SHT3x iic 驱动开发应用详解

简介 项目开发过程中&#xff0c;采用STM32L151 为主控芯片进行设计&#xff0c;并外接GXHT3x进行温湿度数据采集。这里MCU采用片上IIC与GXHT3x进行数据交互&#xff0c;本文详细记录了开发过程&#xff0c;为今后的项目提供参考&#xff0c;加速项目开发进度。 硬件设计 相…