Summary
October 2026 · 2026-10-01 – 2026-10-31
What landed this month:
- GreptimeDB v1.3.0 is GA, with native histograms on by default and opt-in Trace V2.
- On main for v1.4, JSON2 type-hint paths can declare inverted and skipping indexes, and JSON2 columns work on non-append-only tables.
- Also on main, PostgreSQL
COPY FROM STDINloads CSV and InfluxDB line protocol.
GreptimeDB v1.3.0 went GA on October 28, after v1.3.0-beta.2 on October 15 (release notes). A separate release post will cover it in detail. In short:
- Native histograms from Prometheus Remote Write v2 and OTLP are accepted by default, and PromQL can query them.
- Trace V2, opted into with
x-greptime-pipeline-name: greptime_trace_v2, stores span, scope, and resource attributes in three JSON2 columns instead of one column per attribute key. - SQL and PromQL fixes correct several wrong-result cases, including
matches_termmissing rows on fulltext bloom indexes (db#9470).
Before upgrading from v1.2, check:
- In a rolling upgrade, upgrade all datanodes before frontends, and roll back frontends first. v1.3 frontends with v1.2 datanodes can replay successful writes and duplicate rows in append-mode tables. Keep metasrv maintenance mode on until the upgrade is complete. On Kubernetes, use greptimedb-operator v1.3.0 or later (see Ecosystem Updates).
region_engine.mito.scan_memory_limitnow defaults to 25% of system memory, andscan_memory_on_exhausted = "wait"behaves as"fail". Setscan_memory_limit = "unlimited"to keep scans unbounded (db#9101).- VRL pipelines can no longer call environment, filesystem, hostname, network or local-timezone functions. Set
pipeline.allow_vrl_host_access = trueif a pipeline needs them (db#9610). - Queries skip existing fulltext bloom indexes until compaction or
ADMIN BUILD_INDEXrebuilds them. The default automatic flush interval drops from 30 to 10 minutes. MySQL text results truncate timestamps to microseconds (db#9831). OTLP metrics withservice.namespaceset usejob="<namespace>/<service.name>". The release notes list the rest.
Contributors
Over the past month, 243 PRs from 27 contributors were merged. Among them, 14 community contributors contributed 34 PRs. Welcome to our new contributors: @fengyue-xve, @Alorun, @Byte-Naut, @NightG1owZ, @Aumnertic, @dxqlovestudy, @niladrix719, @Aetherance!
Thanks to the community contributors who shipped this month:
- @fengyue-xve db#9500 db#9487 db#9485 db#9483 db#9482 db#9473 db#9468 db#9450
- @lczllx db#9954 db#9749 db#9616 db#9474 db#9445
- @Alorun db#9951 db#9876 db#9753
- @Aumnertic db#9759 db#9332
- @BootstrapperSBL db#9715 db#9586
- @Byte-Naut db#9999 db#9956
- @dhruvxvaishnav db#9979 db#9830
- @NightG1owZ db#9700 db#9519
- @tian1220A db#9953 db#9357
- @yihong0618 db#9721 db#9453
- @Aetherance db#9438
- @DeviousCardi db#9446
- @dxqlovestudy db#9581
- @niladrix719 db#9455
Highlights
The following changes merged to main after the v1.3 branch was cut and will ship in v1.4. They are available in the nightly builds.
db#9324 feat(json2): support inverted index
JSON2 type hints can declare an index on each path. INVERTED INDEX and SKIPPING INDEX (a Bloom filter, db#9967) are built during flush and compaction, so predicates on those paths prune SSTs instead of scanning them. A path can have both.
CREATE TABLE logs (
ts TIMESTAMP TIME INDEX,
attrs JSON2 (
service.name STRING INVERTED INDEX,
status BIGINT SKIPPING INDEX
)
) WITH ('append_mode' = 'true');Changing hints with ALTER TABLE does not rebuild indexes on existing SSTs; later flushes and compactions use the new hints. Manual index rebuilds don't rebuild JSON2 path indexes on existing SSTs, and can remove the ones already built.
JSON2 columns also work on non-append-only tables with last_row and last_non_null merge modes. A newer object replaces the previous one as a whole, and JSON2 columns cannot be primary keys (db#9985). Plain JSON columns accept the same dot access as JSON2, so SELECT j.a.b reads a nested field (db#9775).
db#9297 feat: COPY FROM STDIN for postgres interface
PostgreSQL clients can stream data into a table with COPY ... FROM STDIN, for example \copy cpu FROM 'cpu.csv' WITH (FORMAT csv, HEADER) in psql. Specify the format explicitly: csv, or influxdb as described below. PostgreSQL's text and binary formats are not supported. In the PR's benchmark with 2,000-row batches, COPY loaded about 997K rows/s, against about 47K rows/s for INSERT.
WITH (FORMAT influxdb) takes InfluxDB line protocol, with an optional precision that defaults to nanoseconds. The statement names no table, since each line carries its measurement: COPY FROM STDIN WITH (FORMAT influxdb, precision 'ms'). One statement accepts up to 64 MiB (db#9982).
db#9754 feat(otlp)!: support raw delta exponential histograms
OTLP delta exponential histograms are stored as they arrive, in the native histogram format with the otlp_aggregation_temporality="delta" label. Each sample counts only its own interval: sum_over_time(metric[3m]) gives the total over three minutes, and dividing by 180 gives a per-second rate.
The same PR removes the legacy OTLP metric conversion that v1.3 still has. otlp_metric_compat is still accepted but no longer changes how metrics are converted, so check dashboards and alerts that depend on legacy metric names before moving to v1.4.
Prometheus Remote Read can also return native histograms (db#9971), which v1.3.0 does not support.
Also this month
- Storage: TWCS stops rewriting L1 files in windows that receive no new data. In the PR's 6-hour benchmark with 5% late data, write amplification fell from 40.7 to 3.3 and futile compactions from 327 to 0 (db#9741). Compaction also overlaps merging with encoding, and
experimental_compaction_output_parallelism(default1) parallelizes decoding and encoding within one output (db#9945). Columns can set their own compression and encoding, such as"prompt" STRING COMPRESSION WITH (type = 'zstd', level = 3, page_size = '8MiB'); new trace tables use plain encoding for span IDs (db#9426, db#9629). - Jaeger UI v2 can query GreptimeDB through new
/v1/jaeger/api/v3endpoints for services, operations, trace lookup and search. The existing endpoints still work (db#9409). - Two breaking changes for v1.4: GreptimeDB rejects tables that set
primary_key_encoding = 'sparse'by hand unless they have the metric engine's reserved key columns (db#10020); and the datanode Kafka WAL index is removed, withcreate_indexanddump_index_intervalignored (db#9563). - From the community: with the default
sync_write = false, the raft-engine WAL's periodic sync never called fsync; it does now (db#9715). Pipelines get alogfmtprocessor (db#9586), and log ingestion acceptsapplication/x-json-streamfrom Fluent Bit'sjson_streamoutput (db#9581).TRUNCATE TABLEacceptsWITH (wait = ..., timeout = ...)(db#9753), and datanodes check that each object store can be written, read, listed and deleted before starting (db#9954).
Ecosystem Updates
Operator and Helm Charts
greptimedb-operator v0.7.0 enables the dedicated HTTP API server by default, which requires GreptimeDB v1.2.1 or later. On older GreptimeDB versions, set enableHttpApiServer: false in the cluster CR before upgrading the operator. v1.3.0 adds logging and OTLP export settings. From this release the operator version follows GreptimeDB: run operator v1.3.0 or later with GreptimeDB v1.3.0.
The Helm charts use the same versioning. greptimedb-cluster 1.3.0 and greptimedb-standalone 1.3.1 deploy GreptimeDB v1.3.0 by default, and greptimedb-operator 1.3.0 deploys operator v1.3.0. greptimedb-cluster 1.3.0 requires greptimedb-operator chart 1.3.0 or later (compatibility matrix).
Dashboard
v0.14.2, bundled with v1.3.0, adds Signals Explore, which filters metrics, logs and traces by label and links logs to traces and back. Native and gauge histograms are not charted yet. The timezone setting applies to both displayed times and SQL requests, the logs table scrolls through large result sets, and trace ID queries are fixed.
MCP Server
v0.6.1 applies read-only mode to pipeline and dashboard writes: create_pipeline, delete_pipeline, create_dashboard and delete_dashboard require --allow-write true or GREPTIMEDB_ALLOW_WRITE=true. Tool output is capped at 1 MiB by default (GREPTIMEDB_MAX_RESULT_BYTES), and search_table_semantics takes a schema argument to search another database.
Get Involved
- Docs: https://docs.greptime.com
- GitHub: https://github.com/GreptimeTeam/greptimedb
- X: https://x.com/Greptime
Open an issue for bugs and feature requests, or drop into the community channel.


