Skip to main content

chronix-client (Python)

Async Python client for the Chronix time-series database.

Features

  • Async-first — built on httpx for non-blocking I/O
  • JSON + Line Protocol writes — both formats supported
  • Structured queries + SQL — first-class support for both query APIs
  • PromQL — instant & range queries via Prometheus-compatible endpoints
  • Arrow Flight SQL — zero-copy queries via ADBC driver
  • Schema introspection — list measurements, get column schemas
  • Multi-tenant — namespace header support
  • Typed — full type annotations with py.typed marker

Installation

pip install chronix-client

With pandas support:

pip install "chronix-client[pandas]"

Quick Start

import asyncio
from chronix_client import ChronixClient, Point, TimeRange

async def main():
    async with ChronixClient("http://localhost:8086") as client:
        # Write
        await client.write([
            Point("cpu", {"usage": 42.5}, tags={"host": "a"})
        ])

        # Query
        result = await client.query(
            "cpu",
            TimeRange(start=0, end=2**63 - 1),
            tags={"host": "a"},
        )
        for row in result:
            print(row)

        # SQL
        result = await client.sql("SELECT * FROM cpu ORDER BY _time DESC LIMIT 10")
        df = result.to_dataframe()  # requires pandas extra

asyncio.run(main())

Exact Decimals

f64 cannot represent 0.1. For a meter register a bill is computed from, write a decimal.Decimal and the digits stay digits — in the request body, in storage, and in the query result:

from decimal import Decimal

await client.write([
    Point("meter", {"z1nb_q": Decimal("1234.5678")}, tags={"device": "main"})
])

The client sends {"z1nb_q": {"decimal": "1234.5678"}} rather than a JSON number, because a JSON number is parsed as a double at the other end. Line protocol uses the d suffix: meter,device=main z1nb_q=1234.5678d.

A decimal column stores a fixed number of fractional digits, set when the column is created; a value needing more is refused rather than rounded. Declare it first when the first value might not carry the digits you mean to keep — see Data Model.

Line Protocol Writes

await client.write_line_protocol([
    "cpu,host=a usage=42.5 1700000000000000000",
    "mem,host=a total=16384i,used=8192i 1700000000000000000",
])

PromQL Queries

# Instant query
result = await client.prom_query('cpu_usage{host="server-1"}')

# Range query
result = await client.prom_query_range(
    'rate(cpu_usage[5m])',
    start="2024-01-01T00:00:00Z",
    end="2024-01-02T00:00:00Z",
    step="60s",
)

# Label discovery
labels = await client.prom_labels()
values = await client.prom_label_values("host")

Arrow Flight SQL (Zero-Copy)

For high-throughput analytical queries, use Arrow Flight SQL via ADBC:

import adbc_driver_flightsql.dbapi

uri = ChronixClient.flight_sql_uri("localhost", 8817)
conn = adbc_driver_flightsql.dbapi.connect(uri)
cursor = conn.cursor()
cursor.execute("SELECT * FROM cpu WHERE _time > now() - INTERVAL '1 hour'")
table = cursor.fetch_arrow_table()
df = table.to_pandas()

Authentication & Multi-Tenancy

client = ChronixClient(
    "http://localhost:8086",
    api_key="your-api-key",
    namespace="production",
)

Idempotent Writes

await client.write(
    [Point("cpu", {"usage": 42.5})],
    idempotency_key="batch-2024-01-15-001",
)
# Second call with same key → WriteError (HTTP 409)

API Reference

ChronixClient

Method Description
health() Health check
ready() Readiness check
server_info() Server metadata
write(points, *, idempotency_key, backfill) Write points (JSON); backfill=True imports history outside the out-of-order window
write_line_protocol(lines, *, idempotency_key) Write (line protocol)
query(measurement, time_range, *, tags, fields, limit, offset) Structured query
sql(query) SQL query
explain(measurement, time_range) Explain query plan
list_measurements() List measurements
get_schema(measurement) Get column schema
drop_measurement(measurement) Drop measurement
delete(measurement, time_range=None, *, tags) Delete data; returns a DeleteResult — check .complete
prom_query(query, *, time) PromQL instant query
prom_query_range(query, start, end, step) PromQL range query
prom_labels() List Prometheus labels
prom_label_values(label) Label values
prom_series(match) Find series
list_rollups() List rollup rules
list_connectors() List connectors
openapi_spec() Fetch OpenAPI spec
flight_sql_uri(host, port) Build Flight SQL URI

Models

Type Description
Point Data point with measurement, tags, fields, timestamp. A decimal.Decimal field is written exactly
TimeRange Closed [start, end] in nanoseconds — both ends inclusive
QueryResult Query result with .rows, .to_dataframe()
ColumnSchema Column metadata (name, role, data_type)
MeasurementInfo Measurement summary (name)
ServerInfo Server metadata (version, uptime, measurement_count)

Exceptions

Exception When
ChronixError Base exception (server errors)
ConnectionError Cannot reach server
WriteError Write failure (including idempotency conflict, HTTP 409)
QueryError Query/client error (other 4xx)
BackpressureError HTTP 503/507 — back off and retry; .retry_after carries the server's hint
DeadlineExceeded HTTP 504 — the server stopped waiting; the write may still land

License

Apache-2.0 — same as Chronix.

Metadata

Release files for chronix-client 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chronix-client 0.6.0
File Size Uploaded
chronix_client-0.6.0.tar.gz 23.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for chronix-client 0.6.0
File Interpreter ABI Platform
chronix_client-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 38.7 kB

Release files / chronix_client-0.6.0.tar.gz

Download URL chronix_client-0.6.0.tar.gz
Size 23.4 kB
Tags Source
SHA-256 checksum
How to use checksums
dbaa4ca1880103c0f1c48a7a8dd0aa267437125383c45f472995b7f7c7894a8a
BLAKE2b-256 checksum
How to use checksums
dd0b9b71c32f3ae3be96eb41da4f3aa0f03c6e4ffb6712854bde0fa6330e3991
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / chronix_client-0.6.0-py3-none-any.whl

Download URL chronix_client-0.6.0-py3-none-any.whl
Size 15.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c5c848a99236b9b4adf7fed476ed997d221a3c859126bd041d4096f9fa5bb752
BLAKE2b-256 checksum
How to use checksums
ea734a894021fca11663dfe96b90fa0c825768fdbb00b28dfa72741a9ab5db87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

2 release files

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page