Prometheus 入门

Prometheus 入门 Prometheus 是一个开源的监控解决方案,也是云原生基金会 CNCF 的毕业项目,它能够提供指标数据的采集、存储、查询、告警等功能。本文主要介绍 Prometheus 的基础概念和应用中需要注意的一些问题。 1 监控系统 1.1 监控模式 监控系统执行监控检查的模式有两种,分别是 pull 和 push。Prometheus 采用了 pull 模式进行数据收集,同时也支持使用 Pushgateway 的 push 模式进行数据中转。 pull 方式的特点是有拉取间隔,不能及时获取数值的变化,因此需要进一步的数据处理;它的优点是在告警时可以按照策略分片,仅拉取需要的数据,并且支持聚合场景;缺点是监控的数据量庞大,对存储有较高的要求,切需要考虑数据的冷热分离。 push 方式的特点是由服务主动将数据推向监控系统,实时性更高;它的缺点是推送数据的不可预知性,因为当大量数据被推送到监控系统时,数据的缓存和解析会消耗大量资源,此时如果因为网络原因数据的收发没有得到确认,很容易产生数据的重发和重复,因此需要进行去重等操作。 pull 模式在云原生环境中更有优势,因为我们可以通过服务发现对所有需要进行监控的节点进行统一的数据拉取,如果使用 push 模式则需要在每个被监控的服务中部署上报数据的客户端,并配置监控服务器的信息,这会加大部署的难度。 1.2 Prometheus Prometheus 是一套开源的数据采集与监控框架,可以做后台服务器的监控告警,此处用来采集被测服务的性能指标数据,包括CPU占用比率、内存消耗、网络IO等。 特点 Prometheus 最主要的特点有 4 个: 通过 PromQL 实现多维度数据模型的灵活查询;这使得监控指标可以关联到多个标签,并对时间序列进行切片和切块,以支持各种查询和告警场景 定义了开放指标数据的标准,可以方便地自定义探针(exporter) 利用 Pushgateway 组件可以以 push 的方式接收监控数据 提供了容器化版本 架构 Prometheus 的架构主要由以下部分组成: Prometheus Server Prometheus 服务器主要包含了使用 pull 模式抓取监控数据,通过本地存储(本地磁盘)和远程存储(OpenTSDB, InfluxDB, ElasticSearch 等)保存数据,使用 PromQL 查询数据三大功能。 PromQL (Prometheus Query Language) 是 Prometheus 内置的数据查询语言,提供了对时间序列数据的查询,聚合和逻辑运算等操作的支持,被广泛地应用在数据的查询,可视化和告警中。关于 PromQL 的相关操作可以参考 探索PromQL。...

October 21, 2021 · 3 min

Python 源码学习(5):协程

Python 源码学习(5):协程 协程 coroutine 是一种用户态的轻量级线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程;Python中的生成器 generator 就是一个典型的协程应用,本文简单地对 Python 中生成器的实现进行分析。 1 生成器 如果 Python 中的函数含有 yield 关键字,那么在调用这个函数时,它不会如同普通的函数一样运行到 return 语句并返回一个变量,而是会立即返回一个生成器对象;以一个斐波那契数列生成函数为例: def FibonacciSequenceGenerator(): a, b = 0, 1 while True: yield a + b a, b = b, a + b if __name__ == "__main__": fsg = FibonacciSequenceGenerator() print(fsg) print(type(fsg)) $ python3 main.py <generator object FibonacciSequenceGenerator at 0x7fb4720b1ac0> <class 'generator'> 可以看到函数 FibonacciSequenceGenerator 返回了一个类型为 generator 的生成器对象 f;对于生成器对象,我们不能像操作普通函数一样直接进行函数调用,而是要使用 next() 或 fsg.send() 来进行函数切换,使得生成器函数开始或继续执行,直到 yield 所在行或是函数末尾再将执行权交还给调用方: for i in range(100): print(next(fsg)) $ python3 main....

August 4, 2021 · 5 min

Python 源码学习(4):编译器和虚拟机

Python 源码学习(4):编译器和虚拟机 Python 是一种解释型语言,一般在使用前我们会从 Python 官方网站上下载使用 C 语言开发编译的 CPython 解释器,本文用到的源码均来自 CPython。 Python 解释器(Python Interpreter)由 Python 编译器(Python Compiler)和 Python 虚拟机(Python Virutal Machine)两部分组成。当我们通过 Python 命令执行 Python 代码时,Python 编译器会将 Python 代码编译为 Python 字节码(bytecode);随后 Python 虚拟机会读取并逐步执行这些字节码。 1 Python 编译器 1.1 代码对象 Python 提供了内置函数 compile,可以编译 Python 代码并生成一个包含字节码信息的对象,举例如下: # test.py def Square(a): return a * a print(f"result:\t\t{Square(5)}") # main.py f = "test.py" code_obj = compile(open(f).read(), f, 'exec') exec(code_obj) print(f"code_obj:\t{code_obj}") print(f"type:\t\t{type(code_obj)}") $ python3 main.py result: 25 code_obj: <code object <module> at 0x7f052c156b30, file "test....

May 26, 2021 · 13 min

Python 源码学习(3):list 类型

Python 源码学习(3):list 类型 Python 中的 list 类型在源码中是一个名为 PyListObject 的结构体,定义在 listobject.h 文件中: // Include/cpython/listobject.h typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for 'allocated' elements. The number * currently in use is ob_size. * Invariants: * 0 <= ob_size <= allocated * len(list) == ob_size * ob_item == NULL implies ob_size == allocated == 0 * list.sort() temporarily sets allocated to -1 to detect mutations....

May 6, 2021 · 7 min

ProtoBuf 语法和编码原理入门

ProtoBuf 语法和编码原理入门 序列化是指将结构化数据转换成易于存储或发送的数据格式的过程,Protocol Buffer 简称 ProtoBuf,是一种语言无关,平台无关的序列化工具,由谷歌在 2008 年开源。相较于常见的序列化工具 XML, JSON, YAML, CSV 等,ProtoBuf 的优势主要包括序列化后数据量小,序列化和反序列化过程速度快,使用时只需定义 proto 文件使得其维护成本低,可向后兼容等;但因为其数据以二进制数据流的形式存在,也有人类不可读的劣势。 本文主要介绍 ProtoBuf 的使用方法,包括 .proto 文件的语法,以及如何使用 protoc 工具来生成不通语言的代码;以及其编码原理。 1 语法 首先从 https://github.com/protocolbuffers/protobuf 找到最新版本的 ProtoBuf,下载预编译好的二进制文件 protoc 解压到环境变量目录,本文使用的是 3.15.7 版本: $ protoc --version libprotoc 3.15.7 以一个简单的 proto 文件为例,它的语法和 C++ 类似: // msg.proto syntax = "proto3"; package Message; message SearchRequest { reserved 6, 9 to 12; reserved "foo", "bar"; string query = 1; int32 page_number = 2; int32 result_per_page = 3; } message ResultType { message Result { string url = 1; string title = 2; repeated string snippets = 3; } } message SearchResponse { repeated ResultType....

April 26, 2021 · 7 min