19 个版本

0.5.2 2024年7月22日
0.5.0 2024年1月30日
0.4.5 2023年12月6日
0.4.4 2023年9月20日
0.1.0 2021年8月19日

#157Web 编程

Download history 711/week @ 2024-05-01 1009/week @ 2024-05-08 854/week @ 2024-05-15 767/week @ 2024-05-22 1063/week @ 2024-05-29 947/week @ 2024-06-05 1215/week @ 2024-06-12 1052/week @ 2024-06-19 948/week @ 2024-06-26 835/week @ 2024-07-03 769/week @ 2024-07-10 942/week @ 2024-07-17 1151/week @ 2024-07-24 1022/week @ 2024-07-31 1031/week @ 2024-08-07 1112/week @ 2024-08-14

每月下载量 4,549
5 crates 中使用

MIT 许可证

185KB
4K SLoC

influxdb2

这是一个使用 2.0 API 的 Rust 客户端库,用于连接 InfluxDB。

设置

将以下内容添加到 cargo.toml

influxdb2 = "0.3"
influxdb2-structmap = "0.2"
influxdb2-derive = "0.1.1"
num-traits = "0.2"

用法

查询

use chrono::{DateTime, FixedOffset};
use influxdb2::{Client, FromDataPoint};
use influxdb2::models::Query;

#[derive(Debug, FromDataPoint)]
pub struct StockPrice {
    ticker: String,
    value: f64,
    time: DateTime<FixedOffset>,
}

impl Default for StockPrice {
    fn default() -> Self {
        Self {
            ticker: "".to_string(),
            value: 0_f64,
            time: chrono::MIN_DATETIME.with_timezone(&chrono::FixedOffset::east(7 * 3600)),
        }
    }
}

async fn example() -> Result<(), Box<dyn std::error::Error>> {
    let host = std::env::var("INFLUXDB_HOST").unwrap();
    let org = std::env::var("INFLUXDB_ORG").unwrap();
    let token = std::env::var("INFLUXDB_TOKEN").unwrap();
    let client = Client::new(host, org, token);

    let qs = format!("from(bucket: \"stock-prices\") 
        |> range(start: -1w)
        |> filter(fn: (r) => r.ticker == \"{}\") 
        |> last()
    ", "AAPL");
    let query = Query::new(qs.to_string());
    let res: Vec<StockPrice> = client.query::<StockPrice>(Some(query))
        .await?;
    println!("{:?}", res);

    Ok(())
}

写入

#[derive(Default, WriteDataPoint)]
#[measurement = "cpu_load_short"]
struct CpuLoadShort {
    #[influxdb(tag)]
    host: Option<String>,
    #[influxdb(tag)]
    region: Option<String>,
    #[influxdb(field)]
    value: f64,
    #[influxdb(timestamp)]
    time: i64,
}

async fn example() -> Result<(), Box<dyn std::error::Error>> {
    use chrono::Utc;
    use futures::prelude::*;
    use influxdb2::models::DataPoint;
    use influxdb2::Client;
    use influxdb2_derive::WriteDataPoint;

    let host = std::env::var("INFLUXDB_HOST").unwrap();
    let org = std::env::var("INFLUXDB_ORG").unwrap();
    let token = std::env::var("INFLUXDB_TOKEN").unwrap();
    let bucket = std::env::var("INFLUXDB_BUCKET").unwrap();
    let client = Client::new(host, org, token);
    
    let points = vec![
        CpuLoadShort {
            host: Some("server01".to_owned()),
            region: Some("us-west".to_owned()),
            value: 0.64,
            time: Utc::now().timestamp_nanos(),
        },
        CpuLoadShort {
            host: Some("server02".to_owned()),
            region: None,
            value: 0.64,
            time: Utc::now().timestamp_nanos(),
        },
    ];

    client.write(bucket, stream::iter(points)).await?;
    
    Ok(())
}

支持的数据类型

InfluxDB 数据点不支持 Rust 支持的所有数据类型。因此, derive 宏只允许使用 InfluxDB 也支持的数据类型子集。

支持的 struct 字段类型

  • bool
  • f64
  • i64
  • u64 - 已弃用,将在版本 0.4 中删除
  • String
  • Vec
  • chrono::Duration
  • DateTime

功能

实现的 API

  • 查询 API
  • 写入 API
  • 删除 API
  • Bucket API(部分:仅列表、创建、删除)
  • 组织 API(部分:仅列表)
  • 任务 API(部分:仅列表、创建、删除)

TLS 实现

此 crate 在底层使用 reqwest。您可以使用此 crate 提供的功能在 native-tlsrustls 之间进行选择。默认情况下,选择 native-tls,就像 reqwest 一样。

# Usage for native-tls (the default).
influxdb2 = "0.3"

# Usage for rustls.
influxdb2 = { version = "0.3", features = ["rustls"], default-features = false }

开发状态

此项目仍处于 alpha 状态,所有错误尚未被解决。话虽如此,请自行承担风险使用,并且欢迎创建问题或 pull request。

依赖项

~10–26MB
~365K SLoC