#influx-db #tokio #metrics #telegraf #async #tcp-connection

tokio_telegraf

基于 Tokio 的 Telegraf/InfluxDB 协议的最小异步 Rust 封装

4 个版本 (破坏性更新)

0.5.0 2024年2月14日
0.4.0 2024年2月12日
0.3.0 2024年1月12日
0.2.0 2024年1月10日
0.1.0 2024年1月9日

数据库接口 中排名第 574

Download history 43/week @ 2024-04-22 35/week @ 2024-04-29 15/week @ 2024-05-06 3/week @ 2024-05-13 10/week @ 2024-05-27 44/week @ 2024-06-03 39/week @ 2024-06-10 25/week @ 2024-06-17 63/week @ 2024-06-24 41/week @ 2024-07-01 83/week @ 2024-07-08 23/week @ 2024-07-15 24/week @ 2024-07-22 53/week @ 2024-07-29 162/week @ 2024-08-05

每月下载量 270

MIT 许可证

34KB
581

tokio_telegraf

开发中

tokio_telegraf crate tokio_telegraf crate downloads tokio_telegraf documentation

tokio_telegraf 是一个轻量级客户端库,用于使用 Telegraf 进行通用指标写入。Telegraf 是 InfluxData 提供的一个微服务,旨在使分布式服务的指标报告变得简单 - 有关更多信息,请参阅他们的 文档

此库是 maxmindlin/telegraf-rust 的分支,允许在 Tokio 生态系统下使用。

此库不提供查询或其他 InfluxDB 客户端库功能。这意味着它旨在为服务报告指标提供轻量级和简单性。

tokio_telegraf 支持所有套接字连接类型,如 UDS (Unix 域套接字)

  • TCP (tcp://)
  • UDP (udp://)
  • UDS 流 (unix://)
  • UDS 数据报 (unixgram://)

maxmindlin/telegraf-rust 的区别

  • 仅异步操作,基于 Tokio 生态系统。
  • 待定 - 通过减少 Box 的使用和处理数据点生命周期来减少分配。

安装

将其添加到您的 Cargo.toml 中

[dependencies]
tokio_telegraf = "*"

如何使用

使用此库假定您已在 Telegraf 配置文件中设置了套接字监听器。一个示例 TCP 连接如下所示

[[inputs.socket_listener]]
  service_address = "tcp://127.0.0.1:8094"

所有使用都从通过 Client 创建套接字连接开始。这支持多种连接协议 - 你使用哪种协议将由你的 Telegraf input.socket_listener 配置方式决定。

一旦设置好客户端,就有多种不同的方式来写入点

使用 derive 宏定义表示指标的 struct

use tokio_telegraf::*;

let mut client = Client::new("tcp://127.0.0.1:8094").await.unwrap();

#[derive(Metric)]
struct MyMetric {
    field1: i32,
    #[telegraf(tag)]
    tag1: String,
}

let point = MyMetric { field1: 1, tag1: "tag" };
client.write(&point).await;

默认情况下,测量名称将与 struct 相同。你可以通过 derive 属性来覆盖它

use tokio_telegraf::*;

#[derive(Metric)]
#[measurement = "custom_name"]
struct MyMetric {
    field1: i32,
}

与 Telegraf 的任何点一样,标签是可选的,但至少需要一个字段。

时间戳是可选的,可以通过 timestamp 属性设置

use tokio_telegraf::*;

#[derive(Metric)]
struct MyMetric {
    #[telegraf(timestamp)]
    ts: u64,
    field1: i32,
}

使用 point 宏来进行临时指标

use tokio_telegraf::*;

let mut client = Client::new("tcp://127.0.0.1:8094").await.unwrap();

let p = point!("measurement", ("tag1", "tag1Val"), ("field1", "val") ("field2", 10); 100);
client.write_point(&p).await;

宏的语法格式如下

(<measurement>, [(<tagName>, <tagVal>)], [(<fieldName>, <fieldVal>)]; <timestamp>)

测量名称、标签集和字段集是逗号分隔的。标签和字段元组是空格分隔的。时间戳是分号分隔的。标签集和时间戳是可选的。

手动 Point 初始化

use tokio_telegraf::{Client, Point};

let c = Client::new("tcp://127.0.0.1:8094").await.unwrap();

let p = Point::new(
    String::from("measurement"),
    vec![
        (String::from("tag1"), String::from("tag1value"))
    ],
    vec![
        (String::from("field1"), Box::new(10)),
        (String::from("field2"), Box::new(20.5)),
        (String::from("field3"), Box::new("anything!"))
    ],
    Some(100),
);

c.write_point(p).await

字段数据

任何将作为字段值的属性必须实现由该库提供的 IntoFieldData trait。

pub trait IntoFieldData {
    fn field_data(&self) -> FieldData;
}

为许多常见数据类型提供了开箱即用的实现,但也可以为其他数据类型进行手动实现。

时间戳

时间戳是可选的。如果不存在,Telegraf 守护进程将使用当前时间设置时间戳。时间戳以纳秒级精度指定 Unix 时间,因此 u64 必须实现字段类型的 From<T> trait,如果实现尚未存在

use tokio_telegraf::*;

#[derive(Copy, Clone)]
struct MyType {
    // ...
}

impl From<MyType> for u64 {
    fn from(my_type: MyType) -> Self {
        todo!()
    }
}

#[derive(Metric)]
struct MyMetric {
    #[telegraf(timestamp)]
    ts: MyType,
    field1: i32,
}

有关时间戳的更多信息,请参阅 此处

依赖关系

~4–13MB
~157K SLoC