【问题标题】:export C data structures to a Grafana-supported database: your advice?将 C 数据结构导出到 Grafana 支持的数据库:您的建议?
【发布时间】:2020-05-22 08:21:32
【问题描述】:

我有一个 C 程序,它填充和计算数据结构,例如

struct Users
{
    unsigned char login[LOGIN_SIZE+1];
    unsigned int hours, minut, works;
    struct Range {
        unsigned int hours_a, minut_a, time_a;
        unsigned int hours_b, minut_b, time_b;
        unsigned int dur_hours, dur_minut, dur_time;
        struct WorkIDs {
            unsigned int work_id;
            unsigned int filled;
        } work;
        unsigned int filled;
    } range[RANGE_SIZE];
    unsigned int verbosity;
    unsigned int filled;
} users[USERS_SIZE];

现在我需要将填充的数据结构从 C 程序导出到任何 Grafana 支持的数据库,即:InfluxDBMySQLPostgreSQL (完整列表可在https://grafana.com/docs/grafana/latest/features/datasources/ 获得,并且可以使用插件进行扩展)

但是,我找不到任何将 C 填充的数据结构导出到数据库的好示例,并且很难在这些技术之间建立连接。请您提供正确的方法吗?

【问题讨论】:

  • 从您的结构中制作 JSON 文档并将其插入到支持 JSON 文档的存储中,例如Elasticsearch, PostgreSQL, ... 当然要记住你想如何从那个 JSON 文档中选择数据,因为这可能是另一个限制,它将改变适合你的用例的存储范围。
  • @JanGaraj 谢谢。到目前为止,我找到了 JSON-C 之类的东西,但它似乎解析了 C 源代码以生成未填充任何数据的 JSON。你知道任何将结构导出为 JSON 的 C 示例,可以将其注入到 C 程序的代码中吗?

标签: c database postgresql structure grafana


【解决方案1】:

我的工作方法(请随意提出替代方案!)

1) 使用 PostgreSQL : 不像 MySQL 给了我很多各种各样的错误直到我放弃了,PostgreSQL 的安装非常快速和直接,只需关注类似 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04 的文章即可快速开始使用您的第一个示例数据库。

2) 使用 libpqxx 库:他们在文档 http://pqxx.org/development/libpqxx/ 中提供了一个很棒的 C++ 示例,可以使用类似 c++ -o post post.cxx -lpqxx -lpq 的命令构建。您的 libpqxx 库需要高于某个版本才能使此示例正常工作!在 Linux Mint 19.3 上,我必须从 https://launchpad.net/ubuntu/+source/libpqxx 下载“The Eoan Ermine”的 libpqxx-6.2_6.2.5-1_amd64.deblibpqxx-dev_6.2.5-1_amd64.deb:因为从源代码构建新的 libpqxx 并不容易,而它的版本在 Linux Mint发行版的官方存储库太旧且不够用。

此 C++ 示例中的连接字符串可以替换为类似 pqxx::connection c("dbname=anonymous host=localhost user=anonymous password=123"); 然后就可以了。整个修改后的源代码,以匹配从 1 开始的教程 - 将所有游乐场绘制成您选择的颜色:

#include <iostream>
#include <pqxx/pqxx>

int main(int, char *argv[])
{
  pqxx::connection c("dbname=anonymous host=localhost user=anonymous password=123");
  pqxx::work txn(c);
  int equip_id = 1;
  std::cout << "Updating equip_id #" << equip_id << " and others" << std::endl;

  for (equip_id = 1; equip_id < 3; equip_id++) {
      txn.exec0(
        "UPDATE playground "
        "SET color = " + txn.quote(argv[1]) +
        "WHERE equip_id = " + txn.quote(equip_id));
  }
  // Make our change definite.
  txn.commit();
}

那么,在一个循环中使用大量 SQL 查询将 C 结构数据字段导出到这个 PostgreSQL 数据库中只是时间问题;不过,在执行此操作之前,您还需要提出一个良好的数据库结构并使用 psql 交互式命令行将其添加到 PostgreSQL。

3) 安装 Grafana 并配置 PostgreSQL 数据源 - 使用类似的教程

我必须在 Data Sources / PostgreSQL 配置中禁用 SSL 模式才能使用与 C++ 程序相同的用户名/密码成功连接到数据库(不需要指定端口)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多