Loki

使用方法

API

要通过原始 HTTP API 将日志发送到 GreptimeDB,请使用以下信息:

  • URL: http{s}://<host>/v1/loki/api/v1/push
  • Headers:
  • X-Greptime-DB-Name: <dbname>
  • Authorization: Basic 认证,这是一个 Base64 编码的 <username>:<password> 字符串。更多信息,请参考 认证 和 HTTP API。
  • X-Greptime-Log-Table-Name: <table_name>(可选)- 存储日志的表名。如果未提供,默认表名为 loki_logs。

请求使用二进制 protobuf 编码负载,定义的格式与 logproto.proto 相同。

示例代码

Grafana Alloy 是一个供应商中立的 OpenTelemetry (OTel) Collector 发行版。Alloy 独特地结合了社区中最好的开源可观测性信号。

它提供了一个 Loki 导出器,可以用来将日志发送到 GreptimeDB。以下是一个配置示例:

1. loki.source.file "greptime" {
2. targets = [
3. {__path__ = "/tmp/foo.txt"},
4. ]
5. forward_to = [loki.write.greptime_loki.receiver]
6. }

8. loki.write "greptime_loki" {
9. endpoint {
10. url = "${GREPTIME_SCHEME:=http}://${GREPTIME_HOST:=greptimedb}:${GREPTIME_PORT:=4000}/v1/loki/api/v1/push"
11. headers  = {
12. "x-greptime-db-name" = "${GREPTIME_DB:=public}",
13. "x-greptime-log-table-name" = "${GREPTIME_LOG_TABLE_NAME:=loki_demo_logs}",
14. }
15. }
16. external_labels = {
17. "job" = "greptime"
18. "from" = "alloy"
19. }
20. }

我们监听文件 /tmp/foo.txt 并将日志发送到 GreptimeDB。日志存储在表 loki_demo_logs 中,并带有 label job 和 from。

更多信息,请参考 Grafana Alloy loki.write 文档。

你可以运行以下命令来检查表中的数据:

1. SELECT * FROM loki_demo_logs;
2. +----------------------------+------------------------+--------------+-------+----------+
3. | greptime_timestamp         | line                   | filename     | from  | job      |
4. +----------------------------+------------------------+--------------+-------+----------+
5. | 2024-11-25 11:02:31.256251 | Greptime is very cool! | /tmp/foo.txt | alloy | greptime |
6. +----------------------------+------------------------+--------------+-------+----------+
7. 1 row in set (0.01 sec)

数据模型

Loki 日志数据模型根据以下规则映射到 GreptimeDB 数据模型:

没有 label 的默认表结构:

1. DESC loki_demo_logs;
2. +--------------------+---------------------+------+------+---------+---------------+
3. | Column             | Type                | Key  | Null | Default | Semantic Type |
4. +--------------------+---------------------+------+------+---------+---------------+
5. | greptime_timestamp | TimestampNanosecond | PRI  | NO   |         | TIMESTAMP     |
6. | line               | String              |      | YES  |         | FIELD         |
7. +--------------------+---------------------+------+------+---------+---------------+
8. 5 rows in set (0.00 sec)
  • greptime_timestamp: 日志的时间戳。
  • line: 日志消息。

如果你指定了外部 label,我们会将它们添加为表结构中的 tag。例如上面的 job 和 from。 在这种写入方式下不能手动指定,所有 label 都被视为 tag 并且类型为字符串。请不要尝试使用 SQL 提前创建表来指定 tag 列,这会导致类型不匹配而写入失败。

示例

以下是表结构的示例:

1. DESC loki_demo_logs;
2. +--------------------+---------------------+------+------+---------+---------------+
3. | Column             | Type                | Key  | Null | Default | Semantic Type |
4. +--------------------+---------------------+------+------+---------+---------------+
5. | greptime_timestamp | TimestampNanosecond | PRI  | NO   |         | TIMESTAMP     |
6. | line               | String              |      | YES  |         | FIELD         |
7. | filename           | String              | PRI  | YES  |         | TAG           |
8. | from               | String              | PRI  | YES  |         | TAG           |
9. | job                | String              | PRI  | YES  |         | TAG           |
10. +--------------------+---------------------+------+------+---------+---------------+
11. 5 rows in set (0.00 sec)
1. SHOW CREATE TABLE loki_demo_logs\G
2. *************************** 1. row ***************************
3. Table: loki_demo_logs
4. Create Table: CREATE TABLE IF NOT EXISTS `loki_demo_logs` (
5. `greptime_timestamp` TIMESTAMP(9) NOT NULL,
6. `line` STRING NULL,
7. `filename` STRING NULL,
8. `from` STRING NULL,
9. `job` STRING NULL,
10. TIME INDEX (`greptime_timestamp`),
11. PRIMARY KEY (`filename`, `from`, `job`)
12. )

14. ENGINE=mito
15. WITH(
16. append_mode = 'true'
17. )
18. 1 row in set (0.00 sec)