Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ emits benchstat output) can be pointed at any `addr` from `systems.yml` — see
in `queries/native/`; they measure the same retrieval work, not identical
semantics. Queries with no equivalent report `n/a`.
- **Datasets.** Metrics are live `node_exporter` series multiplied to 10 hosts by
vmagent during a prewarm (`PREWARM` env, default 90s); some engines have PromQL
vmagent during a prewarm (`PREWARM` env, default 30s); some engines have PromQL
dialect gaps (e.g. GreptimeDB rejects `topk` and bare `{__name__=~...}`),
reported as `ERR`/empty. Logs match
the loghub suite when `LOGHUB_DIR` is set, else synthetic. Traces are
Expand Down
6 changes: 6 additions & 0 deletions cmd/benchctl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ func run(args []string) error {
return e.Ingest(must(rest, 0, "ingest <metrics|logs|traces>"))
case "query":
return e.Query(must(rest, 0, "query <metrics|logs|traces> [runs]"), runs(rest, 1, e.Runs), 3)
case "check":
return e.Check(must(rest, 0, "check <metrics|logs|traces>"))
case "collect":
return e.Collect()
case "report":
Expand Down Expand Up @@ -92,6 +94,9 @@ func benchLane(e *bench.Env, lane string, n int) error {
if err := e.Query(lane, n, 3); err != nil {
return err
}
if err := e.Check(lane); err != nil {
return err
}
return e.Collect()
}

Expand All @@ -101,6 +106,7 @@ func usage() {
up [metrics|logs|traces|all] build + start a lane (default all)
ingest <metrics|logs|traces> push canonical dataset (fan-out)
query <metrics|logs|traces> [runs] replay suite against every engine
check <metrics|logs|traces> verify query results (count vs reference)
collect capture storage + memory footprint
report render results/REPORT.md
bench <metrics|logs|traces> [runs] up→ingest→settle→query→collect
Expand Down
2 changes: 1 addition & 1 deletion compose/base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ services:
entrypoint: ["/bin/sh", "-c"]
command:
- |
for b in mimir loki tempo greptimedb; do
for b in mimir loki tempo greptimedb oteldb-s3; do
aws --endpoint-url http://fs:9000 s3 mb "s3://$$b" 2>/dev/null || true
done
echo "buckets ready"
Expand Down
7 changes: 5 additions & 2 deletions compose/metrics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ services:
- -promscrape.config=/etc/vmagent/scrape.yml
- -remoteWrite.url=http://oteldb:19291/api/v1/write
- -remoteWrite.url=http://oteldb-ch:19291/api/v1/write
- -remoteWrite.url=http://oteldb-s3:19291/api/v1/write
- -remoteWrite.url=http://prometheus:9090/api/v1/write
- -remoteWrite.url=http://victoriametrics:8428/api/v1/write
- -remoteWrite.url=http://mimir:9009/api/v1/push
Expand Down Expand Up @@ -77,9 +78,11 @@ services:
ports: ["127.0.0.1:9009:9009"]

# GreptimeDB standalone, object storage on go-faster/fs S3 (bucket: greptimedb).
# In [logs]/[traces] too: it ingests the OTLP log/trace streams into otel_logs /
# opentelemetry_traces and is queried over SQL (systems.yml, queries/native/greptimedb.yml).
greptimedb:
image: greptime/greptimedb:v0.11.0
profiles: [metrics]
image: greptime/greptimedb:v1.1.1
profiles: [metrics, logs, traces]
networks: [bench]
depends_on:
fs-init: { condition: service_completed_successfully }
Expand Down
27 changes: 27 additions & 0 deletions compose/shared.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

volumes:
oteldb-data:
oteldb-s3-data:
clickhouse-data:
clickhouse-oteldb-data:

Expand Down Expand Up @@ -38,6 +39,32 @@ services:
- "127.0.0.1:9010:9010" # pprof
- "127.0.0.1:19291:19291" # prometheus remote-write ingest

# oteldb, S3 variant: same image and --embedded, but the embedded storage
# engine's object-store backend is the shared go-faster/fs S3 (bucket oteldb-s3),
# putting oteldb in the apples-to-apples object-store group. Only the WAL is local.
oteldb-s3:
image: ${OTELDB_IMAGE:-ghcr.io/oteldb/oteldb:v0.41.0}
command: ["--config=/etc/otel/cfg.yml", "--embedded"]
networks: [bench]
depends_on:
fs-init: { condition: service_completed_successfully }
volumes:
- ../config/oteldb/oteldb-s3.yml:/etc/otel/cfg.yml:ro
- oteldb-s3-data:/data
environment:
- OTEL_LOG_LEVEL=info
- OTEL_METRICS_EXPORTER=none
- OTEL_LOGS_EXPORTER=none
- OTEL_TRACES_EXPORTER=none
- PPROF_ADDR=0.0.0.0:9010
- GOMAXPROCS=${BENCH_CPUS:-}
- GOMEMLIMIT=${BENCH_MEMLIMIT:-}
ports:
- "127.0.0.1:9093:9090" # promql
- "127.0.0.1:3103:3100" # logql
- "127.0.0.1:3203:3200" # traceql
- "127.0.0.1:9012:9010" # pprof

# oteldb, ClickHouse-backed variant: same image WITHOUT --embedded, serving all
# three signals from oteldb's chstorage on a dedicated ClickHouse (so its disk
# footprint is isolated from gigapipe's). Distinct host ports from the embedded
Expand Down
12 changes: 12 additions & 0 deletions config/otelcol/logs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,19 @@ exporters:
otlp/oteldb-ch:
endpoint: oteldb-ch:4317
tls: { insecure: true }
otlp/oteldb-s3:
endpoint: oteldb-s3:4317
tls: { insecure: true }
otlphttp/victorialogs:
logs_endpoint: http://victorialogs:9428/insert/opentelemetry/v1/logs
tls: { insecure: true }
otlphttp/greptimedb:
# GreptimeDB OTLP logs: default (no pipeline) -> structured table with a
# fulltext-indexed `body`, `severity_text`/`severity_number`, and JSON
# log/resource attributes. Table selected by the x-greptime-log-table-name header.
logs_endpoint: http://greptimedb:4000/v1/otlp/v1/logs
headers: { x-greptime-log-table-name: otel_logs }
tls: { insecure: true }
loki/loki:
endpoint: http://loki:3100/loki/api/v1/push
tls: { insecure: true }
Expand All @@ -35,6 +45,8 @@ service:
exporters:
- otlp/oteldb
- otlp/oteldb-ch
- otlp/oteldb-s3
- otlphttp/victorialogs
- otlphttp/greptimedb
- loki/loki
- loki/gigapipe
14 changes: 14 additions & 0 deletions config/otelcol/traces.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,24 @@ exporters:
otlp/oteldb-ch:
endpoint: oteldb-ch:4317
tls: { insecure: true }
otlp/oteldb-s3:
endpoint: oteldb-s3:4317
tls: { insecure: true }
otlp/tempo:
endpoint: tempo:4317
tls: { insecure: true }
otlphttp/victoriatraces:
traces_endpoint: http://victoriatraces:10428/insert/opentelemetry/v1/traces
tls: { insecure: true }
otlphttp/greptimedb:
# GreptimeDB OTLP traces -> table opentelemetry_traces (columns span_name,
# duration_nano, parent_span_id, span_attributes/resource_attributes JSON),
# queried via SQL. v1.1.x requires the built-in trace pipeline header.
traces_endpoint: http://greptimedb:4000/v1/otlp/v1/traces
headers:
x-greptime-trace-table-name: opentelemetry_traces
x-greptime-pipeline-name: greptime_trace_v1
tls: { insecure: true }
otlp/gigapipe:
endpoint: gigapipe:4317
tls: { insecure: true }
Expand All @@ -33,6 +45,8 @@ service:
exporters:
- otlp/oteldb
- otlp/oteldb-ch
- otlp/oteldb-s3
- otlp/tempo
- otlphttp/victoriatraces
- otlphttp/greptimedb
- otlp/gigapipe
58 changes: 58 additions & 0 deletions config/oteldb/oteldb-s3.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# oteldb under test, S3 variant. Same embedded go-faster/storage engine as
# config/oteldb/oteldb.yml, but its object-store backend is the shared
# go-faster/fs S3 server (bucket: oteldb-s3) instead of a local `file` volume —
# the apples-to-apples object-store substrate Mimir/Loki/Tempo/GreptimeDB use.
# Only the WAL is local (S3 is stateless); see storage.s3 below.
storage:
backend: s3
# Local write-ahead log (the only on-disk state for the s3 backend).
wal_dir: /data/wal
s3:
bucket: oteldb-s3
endpoint: http://fs:9000
region: us-east-1
force_path_style: true # go-faster/fs serves path-style (endpoint/bucket/key)
access_key_id: bench
secret_access_key: benchbench
# Parallelize LogQL result materialization across workers, like the file variant.
log_query_parallelism: 8
# Flush head data to S3 on this interval so a short bench actually exercises (and
# measures the footprint of) the object store rather than serving only from the
# in-memory head. Default (0) is size-triggered only — a one-shot ingest would
# never reach S3.
flush_interval: 10s

prometheus: # PromQL HTTP API (Prometheus-compatible)
bind: 0.0.0.0:9090
max_samples: 1_000_000
timeout: 1m
enable_negative_offset: true
loki: # LogQL HTTP API (Loki-compatible)
bind: 0.0.0.0:3100
tempo: # TraceQL HTTP API (Tempo-compatible)
bind: 0.0.0.0:3200
health_check:
bind: 0.0.0.0:13133

# Ingest receivers: Prometheus remote-write for metrics, OTLP for logs + traces.
# Under --embedded the oteldbexporter writes to the embedded storage engine, so
# its DSN is ignored — but every pipeline must still name an exporter.
otelcol:
receivers:
prometheusremotewrite:
endpoint: 0.0.0.0:19291
time_threshold: 100000h
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
oteldbexporter:
dsn: clickhouse://default:default@clickhouse:9000 # ignored under --embedded
service:
pipelines:
metrics: { receivers: [prometheusremotewrite], exporters: [oteldbexporter] }
logs: { receivers: [otlp], exporters: [oteldbexporter] }
traces: { receivers: [otlp], exporters: [oteldbexporter] }
Loading