apptuit python客户端
apptuit的Python项目详细描述
apptuit.ai的python客户端
- 使用apptuit pyformance reporter发送数据
- apptuitreporter中的错误处理
- 发送标记/元数据
- 关于主机标签
- 对标记的限制
- 元指标
- python进程度量
发送-u-timeseries()
api发送数据简介
这个包提供了向apptuit发送timeseries数据和查询它的功能。 有两个主要组件
- AppTuit客户端-提供查询和发送数据的核心功能
- apptuit pyformance reporter-在客户机之上提供一个高级抽象
使您能够轻松地将应用程序中的度量报告给apptuit。
它基于Coda Hale的度量设计,提供了
仪表
,仪表
,计数器以累积和报告数据。 它使用下面的pyformancepyformance。
使用AppTuit客户端:
apptuit客户端对象可以简单地创建为以下行:
fromapptuitimportApptuitclient=Apptuit(token=my_apptuit_token,global_tags={"service":"order-service"},sanitize_mode="prometheus")
令牌
:应该是您的apptuit令牌全局标记
:应该是要应用于所有数据的默认标记集。它是一个可选参数清理模式
:指定要使用的清理模式的字符串值。 用于度量名称和标记键。 您可以将清理模式
设置为三个值:无
:禁用消毒。apptuit
:将清理模式设置为apptuit,它将替换 所有带的无效字符。此模式中的有效字符都是 ascii字母、数字、
/
、-
、、
\/code>和unicode字母。 其他任何字符都是无效字符。
普罗米修斯
:将消毒模式设置为普罗米修斯,它将替换 所有带的无效字符。此模式中的有效字符是ASCII字母、数字 并且,任何其他内容都被视为无效。
除此之外,apptuit构造函数还采用了以下几个可选参数:
api_endpoint
:这应该是用于调用apptuit api的http端点。通常您不需要指定它,默认值设置为https://api.apptuit.ai
忽略环境标记:默认情况下为false。它告诉客户是否要查找 是否为环境变量中的全局标记。全局标记是应用于所有 通过客户端发送的数据点。我们将在"配置"部分对此有更多的说明。
客户机提供两种方法,查询
和发送
,在
查询数据
分别使用send()部分发送数据。
使用AppTuit Pyformance Reporter
apptuit pyformance reporter是一个基于code hale度量的抽象。它提供
高级原语,以度量的形式累积数据,如meter
,timer
,
仪表
等,并发送至Apptuit。这些事情在
有关使用apptuit pyformance reporter发送数据的详细信息,请参阅reporter部分,
在这里,我们将了解如何创建报告器及其支持的各种参数。
fromapptuit.pyformanceimportApptuitReporterfrompyformanceimportMetricsRegistryreporter_tags={"service":"order-service"}registry=MetricsRegistry()reporter=ApptuitReporter(token="my_apptuit_token",registry=registry,reporting_interval=60,tags=reporter_tags,collect_process_metrics=True,sanitize_mode="prometheus")<:
令牌
:是您的apptuit令牌注册表
:是MetricsRegistry的一个实例(在 使用apptuit pyformance reporter发送数据rel="nofollow">报告程序部分)报告间隔
:再次重新发送之前等待的秒数标记
:标记键和值的字典。 这些标记适用于通过此报表程序报告的所有度量。collect_process_metrics
:一个将启用或禁用收集的布尔值 与python进程相关的各种度量(cpu、内存、gc和线程)。默认情况下 禁用时,将此参数设置为true
以启用它。清理模式
:这与 客户端(请参见上面的客户端使用示例)。
配置
如上所述,我们需要将令牌和全局标记作为参数传递给 apptuit客户端。或者我们可以将这些设置为 环境变量,这样我们就不需要在代码中硬编码它们。 下面介绍这些环境变量。
应用程序API_ token
:如果apptuit客户端和apptuitreporter未传递令牌参数,则它们将在该变量中查找令牌。如果此变量也未设置,则客户端将引发apptuitexception
指示丢失的令牌apptuit_tags
:这是apptuit客户端的global_tags
参数的另一种选择。如果apptuit客户机未收到global_tags
参数的值,则会检查此环境变量。global_标记
参数 而且apptuit_tags
环境变量是严格可选的。如果存在,apptuit客户端会将这些标记添加到 发送的点。
此变量值的格式如下:
exportAPPTUIT_TAGS="tag_key1: tag_val1, tag_key2: tag_val2, tag_key3: tag_val3"
逗号和冒号后面的空格是可选的。
apptuit_tags
变量也由apptuit reporter
读取,后者将它们与其报告者标记组合在一起。
如果两组标记中的同一个标记键发生冲突,则报告者标记优先。
注意:在apptuit py的1.0.0
版本中添加了对这些变量的支持,并且不可用
在任何较早发布的版本中。
发送数据
有两种方法可以将数据发送到apptuit。首先是使用apptuitreporter
第二个选项是使用apptuit客户端的send()
方法。
我们将演示如何使用下面两个选项。
使用AppTuit Pyformance Reporter发送数据
importsocketfrompyformanceimportMetricsRegistryfromapptuit.pyformance.apptuit_reporterimportApptuitReporterclassOrderService:def__init__(self,apptuit_token):self.registry=MetricsRegistry()self.init_reporter(apptuit_token,self.registry)definit_reporter(self,token,registry):hostname=socket.gethostname()global_tags={"host":hostname,"env":"dev","service":"order-service"}self.reporter=ApptuitReporter(registry=registry,reporting_interval=60,# data reported every 1 minutetoken=token,tags=global_tags,retry=2#this will retry in case of 500 response or connection errors occur.)# reporter.start() will start reporting the data asynchronously based on the reporting_interval set.self.reporter.start()defhandle_order(self,order):order_counter=self.registry.counter("order_count")# order handling related codeorder_counter.inc()defshutdown(self):# you can stop the reporter when you no longer wish to send data or when shutting downself.reporter.stop()
在上面的例子中有一点值得指出:
- 在
handle_order
中,我们创建了一个新的计数器order_count
和度量名称order_count
。第一 调用此方法时,将创建一个新的计数器对象并在注册表中注册。为了 在随后的调用中,该计数器将被重用,因为注册表内部已经有一个 用那个名字顶住。
MetricsRegistry
metricsregistry是应用程序中所有度量的容器。我们可以用它来注册和创建 各种度量(仪表、仪表、计数器等)。例如:
frompyformanceimportMetricsRegistryregistry=MetricsRegistry()counter=registry.counter("order_count")meter=registry.meter("order_requests_rate")timer=registry.timer("order_requests_processing_time")
现在,让我们来看看不同类型的度量以及如何使用它们。
仪表
仪表测量事件的速率,例如每秒请求数。仪表保持平均速率,并且 1分钟、5分钟、15分钟移动平均值。
frompyformanceimportMetricsRegistryregistry=MetricsRegistry()metric_name="order_requests_rate"requests_meter=registry.meter(metric_name)defhandle_request(request):requests_meter.mark()# handle request
仪表
量表是对一个值的瞬时测量。例如,队列中挂起的作业数。
fromqueueimportQueuefrompyformanceimportMetricsRegistryfrompyformance.meters.gaugeimportCallbackGaugeclassQueueManager:def__init__(self,registry,name):self.q=Queue()jobs_metric=registry.add(name,CallbackGauge(self.get_queue_size))defget_queue_size(self):returnself.q.size()
报告器将以其预定的频率调用get_queue_size
函数并报告
队列的大小。
计数器
计数器可以用来简单地计算一些数据。它提供了两种方法来增加
它的值和dec()
来减小它。
frompyformanceimportMetricsRegistryregistry=MetricsRegistry()jobs_counter=registry.counter('pending_jobs')defadd_job(self,job):jobs_counter.inc(1)self.q.put(job)deftake_job(self):jobs_counter.dec(1)self.q.get()
计时器
计时器聚合计时持续时间并提供持续时间统计信息以及吞吐量统计信息。
pip install apptuit --upgrade
0
上面的示例将使用计时器报告服务每个请求所用的时间。
直方图
直方图测量数据流中值的统计分布。它提供聚合数据 例如min、max、mean、sum和count。
pip install apptuit --upgrade
1
apptuitreporter中的错误处理
apptuitreporter异步发送数据(除非我们在同步模式下显式使用它
不调用start()
方法)。异步的
很难知道记者是否工作正常。为了让这更容易
apptuitreporter
接受一个错误处理程序的参数。
错误处理程序
应为函数引用
这需要4个论点。函数的签名和参数解释为爱洛:
pip install apptuit --upgrade
2
状态代码
:对apptuit的post api调用的http状态代码成功点数
:成功处理的点数失败的点数
:由于错误而无法处理的点数错误
:描述每个失败点失败原因的错误消息列表
默认情况下,apptuitreporter
注册一个default\u error\u处理程序
,它将错误写入stderr
。
重写您可以传递自己的错误处理程序实现,或者如果您不希望对错误执行任何操作
您可以将none
传递给错误处理程序
参数。
带默认错误处理程序的报告程序
pip install apptuit --upgrade
3
不带错误处理程序的报告程序
pip install apptuit --upgrade
4
根据定义,错误处理程序函数只接受四个参数。 如果希望向错误处理程序传递额外的参数,可以使用 闭包或部分函数以绕过限制。
使用partial传递额外参数
使用闭包传递额外参数
创建apptuitreporter时,可以提供一组标记(从现在起称为报告者标记)
这将是该报告者报告的所有指标的一部分。但是,为了提供标记
特定于在注册表中注册度量时需要提供的每个度量。例如: 在这里,我们通过调用timeseries.encode_metric来提供特定于度量的标记。
提供度量名称和标记作为参数。当注册度量时,我们提供这个
注册中心的编码名称,而不是普通的度量名称。 要解码编码的度量名称,请使用 a推荐的做法是维护已创建度量的本地缓存并重用它们,而不是
每次都创建它们: 这里我们有一个方法 报告器将添加一个以主机名为值的 如果我们不希望在默认情况下设置 apptuitreporter还报告一组元度量,如果报告者是
是否按预期工作,以及了解发送的点数和
应用程序API。这些元指标描述如下。 注意-在Linux上标记为 当使用"报告者"时,我们有三组标签,最好澄清一些关于它们的信息。 除了使用pyformance reporter之外,您还可以使用apptuit中的低级 下面是我们内部运行的scraper的一个例子。我们调用一个http api,获取一个json响应,并在
时间序列的形式。为了避免对apptuit的api调用过多,每当我们累积了
50000分或以上。一旦我们进行 需要注意的是,使用
5
pip install apptuit --upgrade
6
pip install apptuit --upgrade
标记/元数据
7
pip install apptuit --upgrade
timeseries
模块中的decode\u metric()
函数。
8
pip install apptuit --upgrade
9
pip install apptuit --upgrade
get_order_counter
它将city_code
作为参数。那里
是由编码的度量名称键入的计数器的本地缓存。这样可以避免不必要的开销
如果我们已经为那个城市创建了一个计数器,那么每次都要对度量名称和标记进行编码。
它还确保我们将为不同城市代码的订单计数报告单独的时间序列。关于主机标记
主机
标记键(通过调用socket.gethostname()
获得)。
如果报告器在多台服务器上运行,这有助于按主机对度量进行分组。价值
可以通过将tags
参数中的host
标记传递给报告者或
通过在标记的全局环境变量中设置host
tag
host
标记,可以通过设置
禁用host_标记
报告者的参数以true
。或者我们可以设置环境
变量apptuit_disable_host_tag
到true
禁用它。对标记和度量名称的限制
,
-
,>,
/
。
但是,如果我们希望遵循普罗米修斯的命名
([见规范])(https://prometheus.io/docs/concepts/data_model/metric names and labels)
我们应该将它们限制为ascii字母d仅限数字和下划线,并且必须与
正则表达式[a-za-z懔][a-za-z0-9懔]*
。标签值不受此限制。元指标
apptuit_reporter_send_total
-发送的总点数apptuit_reporter_send_successful
-成功处理的点数apptuit_reporter_send_failed
-失败的点数apptuit_reporter_send_time
-发送API的计时统计信息
python进程度量
apptudireporter
还可以配置为报告
它正在运行的python进程。默认情况下它是禁用的,但是我们可以通过
在创建
报告者对象。报告者将收集与系统资源使用相关的度量
按进程(CPU、内存、IPC等)以及与垃圾收集相关的度量
和线。收集的所有指标的完整列表如下:python_cpu_time_used_seconds
-进程在用户模式和系统模式下花费的总时间。python_memory_usage_bytes
-进程使用的内存总量。python_page_faults
-进程接收的页错误总数。python_process_交换
-从主内存交换进程的总次数。python_block_操作
-块输入和输出操作的总数。python_ipc_消息
-进程发送和接收的进程间消息总数。python_system_signals
-进程接收的信号总数。python_context_switches
-进程的上下文切换总数。python_线程
-活动线程、demon线程和伪线程的计数。python_gc_collection
-每一代在gc中收集的对象的计数。python_gc_threshold
-每一代垃圾收集器阈值。*
的度量值为零,因为它不支持这些度量值全局标记、报告者标记和度量标记
apptuitreporter
接受一组标记作为参数。它将这些标记添加到它正在报告的所有度量中。使用send()api发送数据
send()
api
客户端直接发送数据。如果发送时需要标记,可以使用全局标记
apptuit类的参数。如果设置了全局标记,则将不使用环境标记。fromapptuitimportApptuitclient=Apptuit(token=my_apptuit_token,global_tags={"service":"order-service"},sanitize_mode="prometheus")
0
使用send_timeseries()API发送数据
send
api处理数据点对象列表。创建每个datapoint对象需要验证metric名称和
标签。如果我们使用度量名称和标记创建数千个datapoint对象,它会很快变得非常昂贵。
为了避免这种开销,还有一个可选的api,它接受timeseries
物体。这更方便,因为我们需要创建一个带有度量名称和标记的timeseries对象。此后
我们可以通过调用timeseries对象的add_point()
方法向其添加点。这样可以避免创建数据点对象
以及标签验证的开销。发送时间序列
调用,我们将重置序列列表
对象以仅包含最新的
timeseries
对象(所有以前的序列都将发送到apptuit)。fromapptuitimportApptuitclient=Apptuit(token=my_apptuit_token,global_tags={"service":"order-service"},sanitize_mode="prometheus")
1
查询数据
fromapptuitimportApptuitclient=Apptuit(token=my_apptuit_token,global_tags={"service":"order-service"},sanitize_mode="prometheus")
2
to_df()
方法需要安装熊猫
。
默认情况下,我们不会安装pandas
作为需求的一部分,因为不是库的每个用户
希望查询或创建数据帧(许多用户只使用send
api或reporter功能)推荐PyPI第三方库