全面Kafka监控方案:从配置到指标

文章目录

  • 1.1.监控配置
  • 1.2.监控工具
  • 1.3.性能指标
    • 系统相关指标
    • GC相关指标
    • JVM相关指标
    • Topic相关指标
    • Broker相关指标
  • 1.4.性能指标说明
  • 1.5.重要指标说明

1.1.监控配置

开启JMX服务端口:kafka基本分为broker、producer、consumer三个子项,每一项的启动都需要用到 $KAFKA_HOME/bin/kafka-run-class.sh 脚本,在该脚本中,存在以下语句:

if ...
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false"fi
if ...KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
Fi

​ 在启动kafka的过程中,只要指定 JMX_PORT 的值,即可对broker、producer、consumer进行监控。目前有两种方法,在$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/bin/kafka-console-consumer.sh $KAFKA_HOME/bin/kafka-console producer.sh三个脚本中分别添加 $JMX_PORT=XXXX 语句,但是只适用于使用console方式对topic进行使用的情况。
修改$KAFKA_HOME/bin/kafka-run-class.sh 脚本中的上述语句,使其端口随机变化,可以通过 ps -ef |grep kafka 命令来获取随机的端口号,来进行监控。

1.2.监控工具

Prometheus监控Kafka

  1. 如可以采用docker部署
kafka-exporter:
docker run -ti -d --rm -p 9308:9308 danielqsj/kafka-exporter --kafka.server=192.168.0.4:9092
监控项名称阈值说明使用的公式
Kafka的Brokers在线1m !=1严重count(kafka_server_replicamanager_leadercount{job=~"$job"})
Kafka集群中副本处于同步失败或失效状态的分区数>0严重sum(kafka_topic_partition_under_replicated_
partition{topic=~"$topic", namespace=~"$kubernetes_namespace"})
Kafka集群中控制器的数量!=1严重sum(kafka_controller_kafkacontroller_activecontrollercount{job=~"$job"})
Kafka离线分区数>0严重sum(kafka_controller_kafkacontroller_offlinepartitionscount{job=~"$job"})
Kafka每秒入网络流量>=150中度avg_over_time(kafka_server_BrokerTopicMetrics_
OneMinuteRate{name="BytesInPerSec",topic=""}[1m]) / 1024 /1024
Kafka请求处理程序线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_server_KafkaRequestHandlerPool_
OneMinuteRate{name="RequestHandlerAvgIdlePercent",}[1m])

在这里插入图片描述
2. 在prometheus.yml出添加kafka配置

  - job_name: 'kafka_exporter'static_configs:- targets: ['$node1:9308']
  1. 重启prometheus加载。
  2. 在promethues的管理界面可以查看状态:
    在这里插入图片描述
  3. 然后配置grafana来展示图表效果。
  4. 告警监控项,如下表供参考:
时间百分比rcent",}[1m])
Kafka请求处理程序线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_server
_KafkaRequestHandlerPool
_OneMinuteRate{name=“
RequestHandlerAvgIdlePercent”,}[1m])
Kafka网络处理器线程空闲的平均时间百分比<= 0.3中度avg_over_time(kafka_network_
SocketServer_Value{name=“
NetworkProcessorAvgIdlePercent”,}[1m])
Kafka已建立的连接数> 3000中度> 5000严重sum(avg_over_time(kafka_
server_socket_server_metrics_
connection_count{listener=“PLAINTEXT”,}
[1m])) by (instance,app)
Kafka每秒新建连接数> 100中度> 200 严重sum(avg_over_time(kafka_server
_socket_server_metrics_connection
_creation_rate[1m])) by (instance)
Kafka请求在请求队列中等待的时间>5000中度avg_over_time(kafka_networ
k_RequestMetrics_999thPercentile
{name=“RequestQueueTimeMs”,
request=“Produce”,}[1m])
Kafka_leader处理请求的时间>5000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“LocalTimeMs”,request=“Produce”,}[1m])
Kafka请求等待follower的时间>1000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“RemoteTimeMs”,request=“Produce”,}[1m])
Kafka请求在响应队列中等待的时间>1000中度avg_over_time(kafka_network_
RequestMetrics_999thPercentile
{name=“ResponseQueueTimeMs”,request=“Produce”,}[1m])
Kafka发送响应的时间>1000中度avg_over_time(kafka_network_RequestMetrics
_999thPercentile{name=“ResponseSendTimeMs”,
request=“Produce”,}[1m])
Kafka汇总传入消息速率> 200000中度avg_over_time(kafka_server_
BrokerTopicMetrics_OneMinuteRate
{name=“MessagesInPerSec”,topic=“”}[1m])
kafka消费滞后告警>1000sum(kafka_consumergroup
_lag{topic!=“sop_free_study_fix-student_wechat_detail”})
by (consumergroup, topic) > 1000
kafka-exporter停止< 1kafka_exporter_build_info
kafka server停止<1kafka_brokers
kafka监控topic实时生产速率>= 0sum(irate(kafka_topic_partition_current_
offset{topic !~ "__consumer_offsets
Kafka消费者端分区偏移量5m >= 0sum(delta(kafka_consumergroup_current
_offset[5m])/5) by (consumergroup, topic)
Kafka消费者组的当前主题分区偏移汇总sum(delta(kafka_consumergroup_current
_offset_sum[5m])/5) by (consumergroup, topic)
Kafka某个消费组消费延迟5m >100000中度sum(kafka_consumergroup_lag)
by (consumergroup,partition,topic)
Kafka某个消费者组在某个主题分区的近似滞后情况汇总sum(kafka_consumergroup_lag_sum)
by (consumergroup,partition,topic)
某个消费组成员kafka_consumergroup_
members{instance=“$instance”}
Kafka分区的位移量汇总sum(kafka_topic_partition_current_offset) by (partition,topic)
Kafka分区的同步副本数1m =0 中度sum(kafka_topic_partition_in_sync_replica)
Kafka旧主题分区偏移sum(kafka_topic_partition_oldest
_offset{topic=~“$topic”}) by (partition,topic)
Kafka主题分区的副本数1m <3中度sum(kafka_topic_partition
_replicas{topic=~“$topic”})
Kafka主题分区复制不足的分区数sum(kafka_topic_partition_under
_replicated_partition{topic=~“$topic”})
Kafka 总分区数5m >1000中度sum(kafka_topic_partitions) by(topic)

1.3.性能指标

系统相关指标

  1. 系统信息收集 java.lang:type=OperatingSystem
  2. Thread信息收集 java.lang:type=Threading
  3. 获取mmaped和direct空间
  4. 通过BufferPoolMXBean获取used、capacity、count

GC相关指标

  1. Young GC
    java.lang:type=GarbageCollector,name=G1 Young Generation
  2. Old GC
    java.lang:type=GarbageCollector,name=G1 Old Generation

JVM相关指标

通过MemoryMXBean获取JVM相关信息HeapMemoryUsage和NonHeapMemoryUsage;通过MemoryPoolMXBean获取其他JVM内存空间指标,例如:Metaspace、Codespace等

Topic相关指标

  1. Topic消息入站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=" + topic
  2. Topic消息出站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=" + topic
  3. Topic请求被拒速率
    kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic=" + topic
  4. Topic失败拉去请求速率
    kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec,topic=" + topic;
  5. Topic发送请求失败速率
    kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=" + topic
  6. Topic消息入站速率(message)
    kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=" + topic

Broker相关指标

  1. Log flush rate and time
    kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMs
  2. 同步失效的副本数
    kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
  3. 消息入站速率(消息数)
    kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
  4. 消息入站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec
  5. 消息出站速率(Byte)
    kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec
  6. 请求被拒速率
    kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec
  7. 失败拉去请求速率
    kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec
  8. 发送请求失败速率
    kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec
  9. Leader副本数
    kafka.server:type=ReplicaManager,name=LeaderCount
  10. Partition数量
    kafka.server:type=ReplicaManager,name=PartitionCount
  11. 下线Partition数量
    kafka.controller:type=KafkaController,name=OfflinePartitionsCount
  12. Broker网络处理线程空闲率
    kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent
  13. Leader选举比率
    kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs
  14. Unclean Leader选举比率
    kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec
  15. Controller存活数量
    kafka.controller:type=KafkaController,name=ActiveControllerCount
  16. 请求速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=Produce
  17. Consumer拉取速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=FetchConsumer
  18. Follower拉去速率
    kafka.network:type=RequestMetrics,name=RequestsPerSec,request=FetchFollower
  19. Request total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce
  20. Consumer fetch total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchConsumer
  21. Follower fetch total time
    kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchFollower
  22. Time the follower fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=FetchFollower
  23. Time the Consumer fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=FetchConsumer
  24. Time the Produce fetch request waits in the request queue
    kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=Produce
  25. Broker I/O工作处理线程空闲率
    kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent
  26. ISR变化速率
    kafka.server:type=ReplicaManager,name=IsrShrinksPerSec

1.4.性能指标说明

指标单位具体含义
kafka.broker_offset offsetsbroker上当前消息的偏移量(offset)
kafka.consumer.bytes_inbytes/secondconsumer 字节率(bytes in rate)
kafka.consumer.delayed_requestsrequests延迟的 consumer 请求数
kafka.consumer.expires_per_secondevictions/second延迟 consumer 的请求到期(expiration)速率
kafka.consumer.fetch_raterequestsconsumer 向 broker 发送提取请求(fetch requests)的最低速率
kafka.consumer.kafka_commitswrites/second面向 Kafka 的 offset commits 速率
kafka.consumer.max_lagoffsets最大消费滞后(consumer lag)
kafka.consumer.messages_inmessages/secondconsumer 消息消费(consumption)的速率
kafka.consumer.zookeeper_commitswrites/second面向 ZooKeeper 的 offset commits 速率
kafka.consumer_lagoffsetsconsumer 和 broker 之间的消息滞后(lag)
kafka.consumer_offsetoffsetsconsumer 的当前消息偏移量(current message offset)
kafka.expires_secevictions/second延迟生产者(delayed producer)的请求到期(request expiration)速率
kafka.follower.expires_per_secondevictions/second关注者(followers)的请求到期(request expiration)速率
kafka.log.flush_rateflushes/second日志刷新速率
kafka.messages_inmessages传入(incoming)信息速率
kafka.net.bytes_inbytes/second传入(incoming)字节速率
kafka.net.bytes_outbytes/second传出(outgoing)字节速率
kafka.net.bytes_rejectedbytes/second被拒绝(rejected)的字节速率
kafka.producer.bytes_outbytes/secondproducer 字节输出速率
kafka.producer.delayed_requestsrequests延迟的 producer 请求数
kafka.producer.expires_per_secondsevictions/secondproducer 请求到期率
kafka.producer.io_waitnanosecondsProducer I/O 等待时间
kafka.producer.message_ratemessages/secondProducer 消息速率
kafka.producer.request_latency_avgmillisecondsProducer 平均请求延迟
kafka.producer.request_raterequests/secondproducer 每秒钟的请求数
kafka.producer.response_rateresponses/secondproducer 每秒钟的响应数
kafka.replication.isr_expandsnodes/second副本加入 ISR 池的速率
kafka.replication.isr_shrinksnodes/second副本离开 ISR 池的速率
kafka.replication.leader_electionsevents/second领导选举(Leader election)频率
kafka.replication.unclean_leader_electionsevents/secondUnclean 的领导选举(Leader election)频率
kafka.replication.under_replicated_partitions未使用的分区数
kafka.request.fetch.failedrequests客户端获取请求(fetch request)失败次数
kafka.request.fetch.failed_per_secondrequests/second每秒钟的客户端获取请求(fetch request)失败率
kafka.request.fetch.time.99percentilerequests/second获取请求(fetch request)时间的第 99 百分位的值
kafka.request.fetch.time.avgrequests/second获取请求(fetch request)时间的平均值
kafka.request.handler.avg.idle.pctfractions请求处理程序线程(request handler threads)的平均空闲时间占比
kafka.request.metadata.time.99percentilemilliseconds元数据(metadata)请求时间的第 99 百分位的值
kafka.request.metadata.time.avgmilliseconds元数据(metadata)请求时间的的平均值
kafka.request.offsets.time.99percentilemillisecondsoffset 请求时间的第 99 百分位的值
kafka.request.offsets.time.avgmillisecondsoffset 请求时间的平均值
kafka.request.produce.failedrequests失败的产品请求(produce requests)数
kafka.request.produce.failed_per_secondrequests/second每秒钟的产品请求(produce requests)失败率
kafka.request.produce.time.99percentilerequests/second产品请求(produce requests)时间的第 99 百分位的值
kafka.request.produce.time.avgrequests/second产品请求(produce requests)平均时间
kafka.request.update_metadata.time.99percentilemilliseconds更新元数据请求(update metadata requests)时间的第 99 百分位的值
kafka.request.update_metadata.time.avgmilliseconds更新元数据请求(update metadata requests)时间的平均值

1.5.重要指标说明

参照kafka-manager管理工具
1.

kafka.replication.under_replicated_partitions:
Under Replicated Partitions

: 在一个运行健康的集群中,处于同步状态的副本数(ISR)应该与总副本数(简称AR:Assigned Repllicas)完全相等,如果分区的副本远远落后于leader,那这个follower将被ISR池删除,随之而来的是IsrShrinksPerSec(可理解为isr的缩水情况,后面会讲)的增加。由于kafka的高可用性必须通过副本来满足,所有有必要重点关注这个指标,让它长期处于大于0的状态。
2. Brokers Spread:
broker使用率,如kafka集群9个broker,某topic有7个partition,则broker spread: 7 / 9 = 77%
3. Brokers Leader Skew:
leader partition是否存在倾斜,如kafka集群9个broker,某topic14个partition,则正常每个broker有2个leader partition。若其中一个broker有0个leader partition,一个有4个leader partition,则broker leader skew: (4 - 2) / 14 = 14%
由于kafka所有读写都在leader上进行, broker leader skew会导致不同broker的读写负载不均衡,配置参数 auto.leader.rebalance.enable=true 可以使kafka每5min自动做一次leader的rebalance,消除这个问题。
4. Lag:
表示consumer的消费能力,计算公式为Lag = LogSize - Consumer Offset,Kafka Manager从zk获取LogSize,从kafka __consumer_offsets topic读取Offset。两步操作存在一个时间gap,因此吞吐很大的topic上会出现LogSize > Offset 的情况。导致Lag负数。

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

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

相关文章

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

雷电模拟器安装LSPosed

雷电模拟器最新版支持LSPosed。记录一下安装过程 首先到官网下载并安装最新版&#xff0c;我安装的时候最新版是9.1.34.0&#xff0c;64位 然后开启root和系统文件读写 然后下载magisk-delta-6并安装 ,这个是吾爱破解论坛提供的&#xff0c;号称适配安卓7以上所有机型&#x…

模型 10-10-10旁观思维

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。超脱当下&#xff0c;透视决策长远影响。 1 10-10-10旁观思维的应用 1.1 职业选择决策 背景&#xff1a;小张是一名大学毕业生&#xff0c;面对未来职业的选择感到迷茫。他擅长营销、策略和经济学&a…

ORM框架详解:为什么不直接写SQL?

想象一下&#xff0c;你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者&#xff0c;你可能会想&#xff1a;“我已经学会了SQL&#xff0c;为什么还要使用ORM框架呢&#xff1f;直接写SQL语句不是更简单、更直接吗&#xff1f;” 如…

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

Linux实验报告9-进程管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)列出当前系统中的所有进程,如何观察进程的优先级? (2)查看当前终端运行的 bash 进程的 PID,在当前终端启动 vim 编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。 (3)请自行挂载U盘或光盘,然后…

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法&#xff0c;DerssionPage同selenium一样&#xff0c;也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作&#xff0c;也能够实现收发数据包&#xff0c;也可以把两者的功能合二为一。 DressionPage的…

【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体

版本&#xff1a;Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码&#xff0c;生成一个Texture3D资源&#xff0c;它只能脚本生成&#xff0c;是一个32*32*32的立方体&#xff0c;导出路径记得改下&#xff0c;不然报错。 using UnityEditor; using Uni…

最短路径-Dijkstra 算法

前言 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展&#xff0c;直到扩展到终点…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…

Eclipse中引入NS3项目

参考资料&#xff1a; 博主&#xff1a;深度不睡觉 NS3的3.36版本将Eclipse作IDE_ns3使用eclipse-CSDN博客 从1.2安装eclipse开始 其中参考教程中省略的几点&#xff1a; 1.下载解压tar包 mkdir /Tools/Eclipse/EclipseTool # 新建目录 tar -zxvf /path/to/eclipse-cpp-20…

机器学习周报-TCN文献阅读

文章目录 摘要Abstract 1 TCN通用架构1.1 序列建模任务描述1.2 因果卷积&#xff08;Causal Convolutions&#xff09;1.3 扩张卷积&#xff08;Dilated Convolutions&#xff09;1.4 残差连接&#xff08;Residual Connections&#xff09; 2 TCN vs RNN3 TCN缺点4 代码4.1 TC…

Quartz任务调度框架实现任务动态执行

说明&#xff1a;之前使用Quartz&#xff0c;都是写好Job&#xff0c;指定一个时间点&#xff0c;到点执行。最近有个需求&#xff0c;需要根据前端用户设置的时间点去执行&#xff0c;也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…

Spring-kafka快速Demo示例

使用Spring-Kafka快速发送/接受Kafka消息示例代码&#xff0c;项目结构是最基础的SpringBoot结构&#xff0c;提前安装好Kafka&#xff0c;确保Kafka已经正确启动 pom.xml&#xff0c;根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…

【C++】B2079 求出 e 的值

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目介绍输入格式输出格式输入输出样例说明/提示 &#x1f4af;实现方法一&#xff1a;单层 for 循环计算代码实现运行逻辑解析优点不足 &#x1f4af;实现方法二&#xff…

STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计

SMEC88ST SDK卡发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的&#xff0c;主要是因为方案主芯片不具备防破解的功能&#xff0c;这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制&#xff0c;到市场上的只能以价格竞争&#xff0c;最后工厂复制的产…

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用&#xff08;将Word、Excel、PDF等转换为Markdown格式&#xff09; 本文目录&#xff1a; 零、时光宝盒&#x1f33b; 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒&#x1f33b; &a…

Qanything 2.0源码解析系列6 PDF解析逻辑

Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…