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

系统可观测性(1)基础概念

系统可观测性(1)基础概念(Log/Tracing/Metrics)


Author: Once Day Date: 2025年2月8日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 分布式系统可观测性之应用业务指标监控 - 掘金

  • blog-cn/observability-of-distributed-system.md at master · pingcap/blog-cn ·
    GitHub

  • 可观测性和监控概览 | Documentation | Google Cloud

  • What Is Observability?

  • What is OpenTelemetry? | OpenTelemetry

  • 分布式系统可观测性(Observability)系列: Distributed Tracing(一) - 知乎

  • Metrics, tracing, and logging - Peter Bourgon

  • Observability: the hard parts - Peter Bourgon

  • Google SRE - Site reliability engineering book Google index


文章目录

  • 系统可观测性(1)基础概念(Log/Tracing/Metrics)
        • 1. 引言
        • 2. 三大支柱(Metrics/Tracing/Logging)
        • 3. 可观测性与监控
        • 4. 可观测性与运维
        • 5. 可观测性项目(OpenTelemetry)

1. 引言

2017年的分布式追踪峰会(2017 Distributed Tracing Summit)结束后,Peter Bourgon 撰写了总结文章《Metrics, Tracing, and Logging》系统地阐述了这三者的定义、特征,以及它们之间的关系与差异。 文中将可观测性问题映射到了如何处理指标(metrics)、追踪(tracing)、日志(logging)三类数据上。

可观测性(Observability)是近年来在IT领域,特别是云原生应用和分布式系统中备受关注的话题。它源于控制论,是一个系统能够提供其内部状态信息的能力。这种能力让运维和开发人员能够从外部观察系统的内部工作状态,快速检测、定位和解决问题,保障系统的稳定运行。

可观测性可以解决什么问题?Google SRE Book 第十二章给出了简洁明快的答案:快速排障

在传统的单体应用时代,系统通常没那么复杂,通过日志分析和监控工具基本可以满足排障需求。但随着架构向微服务和云原生方向演进,系统变得高度分布式和动态,错综复杂的服务调用链路给问题定位带来巨大挑战。同时,开发迭代和业务变化越来越快,传统的日志和监控方式难以跟上变化节奏。可观测性应运而生。

可观测性通常由3大支柱组成:

  • 指标(Metrics):系统的各种可度量指标数据,例如请求数、延迟、错误率、资源使用等。通常从系统各处收集汇总,供聚合分析和可视化。
  • 日志(Logging):各种离散的事件记录,包括应用日志、审计日志等。需要收集、存储、检索和分析海量的半结构化日志数据。
  • 分布式跟踪(Distributed Tracing):记录跨度多个服务的请求执行路径、时间戳等数据。利用这些数据可以发现服务间调用的瓶颈和异常,评估系统性能。

在这里插入图片描述

上图引用自:Metrics, tracing, and logging - Peter Bourgon。

将这三种数据有机结合,可以全面地洞察系统行为,快速发现和定位问题根源,做出相应优化。市面上出现了很多可观测性相关的开源和商业产品,例如:

  • 指标监控和警报:Prometheus、Grafana、Datadog等。
  • 日志管理:ELK Stack、Splunk等。
  • 分布式跟踪:Jaeger、Zipkin、SkyWalking等。

以下是一些关于可观测性原理的推荐书籍和在线资源:

  • 《Distributed Systems Observability》 - Cindy Sridharan著。这是关于可观测性的权威著作,系统全面地介绍了可观测性的概念、工具链、最佳实践等。

  • 《Prometheus: Up & Running》 - Brian Brazil著。Prometheus是一个广泛使用的开源监控系统,本书详细介绍了如何使用Prometheus进行系统监控和告警。

  • 《Mastering Distributed Tracing》 - Yuri Shkuro著。分布式追踪是可观测性的重要手段,本书深入剖析了分布式追踪的原理和实践。

  • 《Database Reliability Engineering》- Laine Campbell & Charity Majors合著。本书讨论了如何对数据库系统进行可靠性设计,可观测性是其中的重要内容。

  • OpenTelemetry官方文档,https://opentelemetry.io/docs/,OpenTelemetry 是一个新兴的开源可观测性框架,提供了一致的API、SDK等以实现metrics、logs、traces的标准化采集。官网包含了详尽的概念和使用文档。

2. 三大支柱(Metrics/Tracing/Logging)

(1)指标(Metrics),是对系统某些属性(如请求持续时间、资源利用率等)的数值化表示,通常是时间序列数据。Metrics适合用于显示系统的整体健康状况和行为趋势。

关键特征:可聚合性,即一段时间内可以组合成单个逻辑gauge(计量器)、counter(计数器)或histogram(直方图)。

一些例子:队列的当前深度可以建模为gauge,更新遵循last-writer-wins(后写入者胜出)语义进行聚合。传入的HTTP请求数可以建模为counter,通过简单的加法进行聚合更新。请求的观测持续时间可以建模为histogram,更新聚合到各个时间桶中,生成统计汇总信息。

(2)日志(Logging),Logging是以结构化或非结构化的文本形式记录离散的事件。Logging适合用于记录specific domain的事件,供事后审计、分析、排障等。

定义特征:处理离散的事件。

一些例子:应用程序的调试或错误信息通过旋转文件、syslog发送到Elasticsearch(或OK Log)。审计跟踪事件通过Kafka推送到像BigTable这样的数据湖。从服务调用中提取特定请求的元数据发送到像NewRelic这样的错误跟踪服务。

(3)分布式追踪(Tracing),Tracing记录了一个请求在分布式系统中的端到端路径,包括经过的所有服务、每个服务内部的关键操作等。Tracing适合用于理解系统的行为,优化性能瓶颈,定位异常请求的根因。

定义特征:处理请求范围内(request-scoped)的信息,即任何可以绑定到系统中单个事务对象生命周期的数据或元数据。

一些例子:对远程服务的出站RPC调用的持续时间;发送到数据库的实际SQL查询的文本;入站HTTP请求的关联ID。

综上,三者的侧重点各不相同:

  • 指标(Metrics)强调可聚合性,用于生成统计信息和图表
  • 日志(Logging)强调离散事件,用于记录独立的消息
  • 追踪(Tracing)强调请求上下文信息,用于分析和优化分布式系统性能

同时,它们又是相辅相成的,指标和追踪数据常常带有一定程度的离散性,日志经过聚合也可以生成统计信息。

在这里插入图片描述

上图引用自:Metrics, tracing, and logging - Peter Bourgon。

虽然在故障定位过程中,大部分检测目标与请求或者流量有关,但这并不意味着所有检测目标数据都要与追踪上下文生命周期绑定。例如,进程的CPU和内存使用率,队列的缓存数量和延迟等。因此,并非所有指标或日志都适合硬塞进追踪(Tracing)系统,这也能避免额外的工作资源消耗

直接在应用程序中统计指标(Metrics)更有好处,可以根据设备或者集群的实时视图进行健康状态评估。相比之下,如果将指标(Metrics)硬塞进日志管道,可能会迫使我们放弃其中一些优势(灵活性和快速迭代能力)。

在三个领域中,指标往往需要最少的资源来管理,因为就其性质而言,它们的"压缩"效果相当好。相反,日志记录往往非常繁琐,其数量往往超过其所报告的生产流量。

因此,可以绘制出一种数量或操作开销梯度,从指标(低)到日志(高),而追踪可能处于中间位置

3. 可观测性与监控

可观测性(Observability)是指基于系统暴露的外部数据来理解系统内部发生的情况的能力。通过收集系统运行时的表层数据,而不是拆开系统来暴露其内部状态,就可以充分理解一个可观测的系统。

举个例子,假设房间的灯突然无法打开了。其中一种解决办法就是把墙壁撬开跟踪电线,直到找到问题的根源。但这种方法既耗时又把家里破坏的不成样子。而更有效的方法是收集电表系统的可见数据,或者灯附近的其他电器的状态。如果数据足够观测,那么足以引导找到问题的根源。

在IT系统中,可观测性意味着能够根据从复杂环境表面收集的信息来解释环境的内部状态。表层数据包括软件和基础设施日志、跟踪和指标,以及CI/CD管道或服务台等互补系统的数据。

为什么在现代复杂的分布式系统中,需要可观测性(Observability)

  • 复杂系统本质上是不完全健康和不可预测的。无法预测系统每个部分可能出现的所有故障状态。因此,从设计到操作的每个阶段,都必须考虑到失败和易于调试。可观测性可以在系统设计时作为一种特性纳入,以应对这种不可预测性。

  • 通过可观测性,系统可以先在真实环境中测试后再构建。在测试过程中就可以发现一旦部署后会导致警报的失效模式,这有助于在问题影响生产环境之前发现和解决问题。

  • 可观测性允许系统增量部署。如果关键指标偏离基线,就可以触发回滚。这确保了系统可以在出现问题时快速恢复,将影响降到最低。

  • 运行时的可观测性可以报告足够多的关于系统健康和行为的数据点,有效反映其内部状态。这使得系统能够被更好地理解、调试和发展,这对于复杂的分布式系统至关重要。

Observability的目标则是提供关于无法被监控或者被测试的不可预测的故障和异常的信息。Monitoring的目标是监控可预测的故障和异常并生成警报。

简而言之,Monitoring监控的是已知的故障,而Observability观测的是未知的故障

在这里插入图片描述

上图引用自:What is observability?

监控(Monitoring)是驱动可观测性的一个过程,但可观测性远不止监控。监控只告诉你表面发生了什么,而可观测性利用数据深入内部,获得对系统的理解。监控类似检查脉搏,可观测性类似做核磁共振。

可见性(Visibility)是通往可观测性的一步,但还不够。可见性意味着孤立地了解系统的离散部分,而可观测性通过关联数据提供对整个系统的理解。

可观测性的程度可以用系统可以被调试的程度来衡量。调试通常是一个迭代过程:从高级指标开始,通过系统各组件报告的各种细粒度上下文进行深入研究,正确排除并验证理论是否成立。对于分布式系统,调试需要的是证据,而不是猜测或假设。

可观测性(Observability)不是灵丹妙药,并不能让人们摒弃思考行为,它主要是通过数据引导开发人员思考并找到答案。

4. 可观测性与运维

Google SRE(Site Reliability Engineering)手册是Google工程师多年实践经验的结晶,是一本关于如何运行和管理大规模分布式系统的宝典。这本书涵盖了SRE工作的方方面面,从基本原则到具体实践,为我们展示了Google如何确保其服务的可靠性、可维护性和可扩展性。

这本书的核心价值在于,它提供了一套完整的、经过实践检验的方法论,用于管理现代复杂的分布式系统。它强调以工程的方式来解决运维问题,主张通过自动化、数据驱动和持续改进来提高系统的可靠性。同时,它也强调人的因素,讨论了如何建立良好的工作文化和实践,如何在团队中建立共识和协作。

在这些理念中,可观测性是一个重要的主题。尽管书中并未明确使用"可观测性"这个词,但其中许多讨论都与可观测性的理念紧密相关。

首先,书中强调全面和有效的监控是管理分布式系统的基础。没有对系统行为的深入洞察,就无法实现可靠的运维。Google SRE手册详细介绍了Google的监控实践,包括如何选择监控指标,如何设计监控系统,如何设置合理的警报等。这些都是建立可观测性的基础。

其次,书中提倡白盒监控,即对系统内部的关键指标进行监控,而不仅仅依赖于黑盒监控。这与可观测性的理念高度一致。可观测性要求我们不仅要知道系统是否正常工作,还要知道为什么,需要对系统内部有深入的理解。

再次,书中讨论了如何设置SLO和SLI,如何建立事件响应机制,如何进行混沌工程实验等。这些实践都有助于提高系统的可观测性,使我们能够更快地发现问题,更准确地定位根因,更有效地进行故障处理。

《SRE Book》自2016年发布以来,影响了无数企业的可靠性实践。Google也在持续更新这本书的内容,目前已发布了第二版《The Site Reliability Workbook》,进一步扩展了相关主题。

5. 可观测性项目(OpenTelemetry)

OpenTelemetry是一个开源的、独立于供应商的遥测数据收集和管理框架,旨在帮助实现系统的可观测性。它为创建和管理追踪、指标和日志等遥测数据提供了一套标准化的工具和API

OpenTelemetry是由OpenTracing和OpenCensus这两个项目合并而成的,目标是成为可观测性领域的标准。

OpenTelemetry与供应商和工具无关,可以与多种开源和商业的可观测性后端兼容,如Jaeger、Prometheus等,避免了供应商锁定。OpenTelemetry关注遥测数据的生成、收集、管理和输出,让用户能够轻松地监测应用程序或系统,而无需考虑其语言、基础设施或运行时环境。遥测数据的存储和可视化则交由其他工具处理。

OpenTelemetry主要由以下几部分组成:

  • 一套规范,定义了所有组件的标准。
  • 一个标准协议,定义了遥测数据的格式。
  • 语义约定,定义了常见遥测数据类型的标准命名方案。
  • API,定义了如何生成遥测数据。
  • SDK,实现了规范、API和遥测数据的输出。
  • 工具生态系统,为常见库和框架提供了检测功能。
  • 自动检测组件,无需更改代码即可生成遥测数据。
  • OpenTelemetry Collector,一个接收、处理和输出遥测数据的代理。

OpenTelemetry的一大特点是高度可扩展。例如,可以为Collector添加自定义数据源的接收器,为SDK加载自定义检测库,为特定用例定制SDK或Collector发行版,为不支持OpenTelemetry协议(OTLP)的自定义后端创建新的输出器,以及为非标准上下文传播格式创建自定义传播器等。虽然大多数用户可能不需要扩展OpenTelemetry,但该项目在几乎每一层都提供了扩展的可能性。

OpenTelemetry是云原生计算基金会(CNCF)的一个项目,由OpenTracing和OpenCensus两个先前的项目合并而成。这两个项目都旨在解决代码检测和将遥测数据发送到可观测性后端方面缺乏标准的问题。由于任何一个项目都无法独立完全解决这个问题,它们合并成立了OpenTelemetry,结合了各自的优势,提供了一个统一的解决方案。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

相关文章:

系统可观测性(1)基础概念

系统可观测性(1)基础概念(Log/Tracing/Metrics) Author: Once Day Date: 2025年2月8日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 十年代码训练…...

Redis未授权访问漏洞导致getshell

一、漏洞信息 redis默认情况下会绑定在本地6379端口,如果没有进行采用相关的策略,就会将redis服务暴露到公网上,如果再没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问到目标服务器的情况下未授权访问redis以及读取r…...

Electron 全面解析:跨平台桌面应用开发指南

引言 在当今多平台并存的数字时代,如何高效开发跨平台桌面应用成为开发者面临的重要挑战。Electron作为GitHub开源的跨平台框架,凭借其独特的Web技术融合能力,已成为构建桌面应用的热门选择。本文将深入探讨Electron的核心原理、开发实践及未…...

React进阶之React核心源码解析(一)

React核心源码解析 react 特点CPU卡顿IO 卡顿 新老 react 架构对比v15v16.8Scheduler 调度器Reconciler 协调器 React fiber原理更新dommount 构建过程 render阶段 — scheduler reconcilerreact源码解析react-domreact-dom/src/client/ReactDOMRoot.js react-reconcilerreact-…...

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理,可以从以下几个方面入手,结合理论知识和实例进行学习: 贝叶斯定理与智能世界的暗语 条件概率,全概率公式与贝叶斯公式的推导,理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

Jupyter lab 无法导出格式 Save and Export Notebook As无法展开

本来尝试jypyter lab如何导出HTML带有侧边导航栏,一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了,浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...

Mac之JDK安装

Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统,打开中断命令,输入: uname -a Compressed Archive 是压缩文档,下载的是一个 .tar.gz 压缩包 D…...

OpenEuler学习笔记(三十一):在OpenEuler上搭建仓颉语言开发环境

仓颉语言(Cangjie programming language)相对较为小众,截至2025年,并没有广泛的资料和成熟的通用搭建流程。不过下面为你提供一个较为通用的在OpenEuler上搭建开发环境的大致思路,你可以根据实际情况进行调整。 1. 安…...

2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现: 一、背景   UWB(Ultra-Wideband)技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一种无需任何载波,通过发送纳秒…...

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…...

HCIA项目实践--RIP的拓展配置

9.4.7 RIP的拓展配置 (1)RIPV2的手工认证 RIPv2 的手工认证是增强网络安全性的手段。管理员手动配置密钥,路由器在收发 RIPv2 路由更新消息时,会对消息中的认证信息进行检查。发送方添加密钥,接收方用预设密钥验证。若…...

常用架构图:业务架构、产品架构、系统架构、数据架构、技术架构、应用架构、功能架构及信息架构

文章目录 引言常见的架构图I 业务架构图-案例模块功能说明1. 用户界面层 (UI)2. 应用服务层3. 数据管理层4. 基础设施层业务流程图示例技术实现II 功能架构图 -案例功能模块说明1. 船舶监控模块2. 报警管理模块3. 应急响应模块4. 通信管理模块5. 数据分析模块数据管理层基础设施…...

初阶c语言(练习题,猜随机数,关机程序)

目录 第一题,使用函数编写一个随机数,然后自己猜,猜随机数 第二道题(关机程序) 实现代码(关机程序) 实现代码(猜数字) 前言: 学习c语言,学习…...

三维重建(十二)——3D先验的使用

文章目录 零、最近感受和前言一、使用能够快速得到重建初始化的方法1.1 Colmap(多视角)1.2 深度估计(单视角)二、已知形状模板2.1 人脸2.2 人体2.3 动物三、刚性与非刚性约束(变形约束)3.1 刚性变形3.2 非刚性变形四、统计(深度学习)先验——从大量(3D)数据中提取信息…...

DDoS技术解析

这里是Themberfue 今天我们不聊别的,我们聊聊著名的网络攻击手段之一的 DDoS,看看其背后的技术细节。 DoS 了解 DDoS 前,先来讲讲 DoS 是什么,此 DoS 而不是 DOS 操作系统啊。1996年9月6日,世界第三古老的网络服务提供…...

总结:如何在SpringBoot中使用https协议以及自签证书?

总结:如何在SpringBoot中使用https协议以及自签证书? 前提一:什么是http协议?前提二:什么是https协议?一生成自签证书二 将证书转换为PKCS12格式三 配置SpringBoot(1)修改配置文件&a…...

Django开发入门 – 4.创建Django app

Django开发入门 – 4.创建Django app Create A Django App Under An Existing Project By JacksonML 1. 什么是Django app? Django项目面向Web应用程序,它会由一个或多个子模块组成,这些子模块称为apps。 Django apps负责执行完整Web应用程序中涉及…...

安装WPS后,导致python调用Excel.Application异常,解决办法

在使用xlwings编辑excel文件时,默认调用的是“Excel.Application”,如果安装过wps,会导致该注册表为WPS,会导致xlwings执行异常 因为安装过WPS,导致与Excel不兼容的问题,想必大家都听说过。有些问题及时删…...

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT(监督微调)和RLHF(基于人类反馈的强化学习)的区别 STF(Supervised Fine-Tuning)和RLHF(Reinforcement Learning from Human Feedback)是两种不同的模型训练方法,分别…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4,后7...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...