apptuit python客户端

apptuit的Python项目详细描述


apptuit.ai的python客户端

生成状态codecov< "rel rel rel="nofollo">许可证简介

  • 发送数据
  • 使用api发送数据
  • 使用发送-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度量的抽象。它提供 高级原语,以度量的形式累积数据,如metertimer仪表等,并发送至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传递额外参数

    pip install apptuit --upgrade
    
    5

    使用闭包传递额外参数

    pip install apptuit --upgrade
    
    6

    标记/元数据

    创建apptuitreporter时,可以提供一组标记(从现在起称为报告者标记) 这将是该报告者报告的所有指标的一部分。但是,为了提供标记 特定于在注册表中注册度量时需要提供的每个度量。例如:

    pip install apptuit --upgrade
    
    7

    在这里,我们通过调用timeseries.encode_metric来提供特定于度量的标记。 提供度量名称和标记作为参数。当注册度量时,我们提供这个 注册中心的编码名称,而不是普通的度量名称。

    要解码编码的度量名称,请使用timeseries模块中的decode\u metric()函数。

    pip install apptuit --upgrade
    
    8

    a推荐的做法是维护已创建度量的本地缓存并重用它们,而不是 每次都创建它们:

    pip install apptuit --upgrade
    
    9

    这里我们有一个方法get_order_counter它将city_code作为参数。那里 是由编码的度量名称键入的计数器的本地缓存。这样可以避免不必要的开销 如果我们已经为那个城市创建了一个计数器,那么每次都要对度量名称和标记进行编码。 它还确保我们将为不同城市代码的订单计数报告单独的时间序列。

    关于主机标记

    报告器将添加一个以主机名为值的主机标记键(通过调用socket.gethostname()获得)。 如果报告器在多台服务器上运行,这有助于按主机对度量进行分组。价值 可以通过将tags参数中的host标记传递给报告者或 通过在标记的全局环境变量中设置hosttag

    如果我们不希望在默认情况下设置host标记,可以通过设置 禁用host_标记报告者的参数以true。或者我们可以设置环境 变量apptuit_disable_host_tagtrue禁用它。

    对标记和度量名称的限制
    • 标记键和度量名称中允许的字符-标记键和度量名称可以有任何Unicode 字母(由Unicode规范定义)和以下特殊字符:->,/。 但是,如果我们希望遵循普罗米修斯的命名 ([见规范])(https://prometheus.io/docs/concepts/data_model/metric names and labels) 我们应该将它们限制为ascii字母d仅限数字和下划线,并且必须与 正则表达式[a-za-z懔][a-za-z0-9懔]*。标签值不受此限制。
    • 最大标记数-apptuit当前允许每个数据点最多25个标记键值对

    元指标

    apptuitreporter还报告一组元度量,如果报告者是 是否按预期工作,以及了解发送的点数和 应用程序API。这些元指标描述如下。

    • 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-每一代垃圾收集器阈值。

    注意-在Linux上标记为*的度量值为零,因为它不支持这些度量值

    全局标记、报告者标记和度量标记

    当使用"报告者"时,我们有三组标签,最好澄清一些关于它们的信息。

    • apptuitreporter接受一组标记作为参数。它将这些标记添加到它正在报告的所有度量中。
    • 如果设置了环境变量apptuit_tags,那么报告器也会考虑这些因素 传递给它的标记会优先考虑,以防由于常用标记键而发生冲突。
    • 如果发生冲突,报告者报告的每个度量也可能附加一些标记 由于常用的标记键,公制标记优先于报告器标记或全局标记。

    使用send()api发送数据

    除了使用pyformance reporter之外,您还可以使用apptuit中的低级send()api 客户端直接发送数据。如果发送时需要标记,可以使用全局标记 apptuit类的参数。如果设置了全局标记,则将不使用环境标记。

    fromapptuitimportApptuitclient=Apptuit(token=my_apptuit_token,global_tags={"service":"order-service"},sanitize_mode="prometheus")
    0

    使用send_timeseries()API发送数据

    sendapi处理数据点对象列表。创建每个datapoint对象需要验证metric名称和 标签。如果我们使用度量名称和标记创建数千个datapoint对象,它会很快变得非常昂贵。 为了避免这种开销,还有一个可选的api,它接受timeseries 物体。这更方便,因为我们需要创建一个带有度量名称和标记的timeseries对象。此后 我们可以通过调用timeseries对象的add_point()方法向其添加点。这样可以避免创建数据点对象 以及标签验证的开销。

    下面是我们内部运行的scraper的一个例子。我们调用一个http api,获取一个json响应,并在 时间序列的形式。为了避免对apptuit的api调用过多,每当我们累积了 50000分或以上。一旦我们进行发送时间序列调用,我们将重置序列列表对象以仅包含最新的 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作为需求的一部分,因为不是库的每个用户 希望查询或创建数据帧(许多用户只使用sendapi或reporter功能)

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


  • 热门话题
    java系统。出来打印导致延迟?   java如何使用dasein API连接Azure云(blob存储)   java如何将Jframe cardlayout中的“card”从属于card的Jpanel更改为另一个类?   java如何在单个消息框中显示循环的所有迭代?   java如何设置netbeans保存项目的操作?   java网站的某些选项在web视图中不起作用   java如何在安卓中打开从右到左的菜单滑动条   java更容易反转由静态方法(函数接口)内联创建的比较器?   映射Java HashMap。获取(键)和树形图。获取equals和compareTo方法的(键)用法   java Health endpoints只显示“status:up”,不显示敏感信息   java当我一直按back按钮登录时,字段显示以前插入的用户数据   JTable单元中的java图像显示   go Java vs.Golang for HOTP(rfc4226)   java使用函数链减少分支和清理代码,这有意义吗   java我应该为每个查询创建一个新的DB连接吗?   java推荐的函数调用方法(是否使用CompiledScript?)   java截断分区和地板分区有什么区别?   没有spring引导的java Profile特定属性文件?   异常如何在java中从控制台读取密码?