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.5.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.5.0
File Size Uploaded
chronix_client-0.5.0.tar.gz 23.4 kB Details

Built distribution (wheel)

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

Total release size: 38.6 kB

Release files / chronix_client-0.5.0.tar.gz

Download URL chronix_client-0.5.0.tar.gz
Size 23.4 kB
Tags Source
SHA-256 checksum
How to use checksums
b9522385cdb5cb8cbfd46e79a1423e7b163e1aa99d00570c5c72e95d53115b9a
BLAKE2b-256 checksum
How to use checksums
bc86b6a972631cffe73282dc7a7b82ce444321f9d65d77acb338814c2cd8437d
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 12, 2026.

Transparency log

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

Download URL chronix_client-0.5.0-py3-none-any.whl
Size 15.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6e0e4c367117b9283ea38c63647b42708f1ee1d92d3de80b92e9ad28d633a72b
BLAKE2b-256 checksum
How to use checksums
00f11e85093ae27a462e460d982b931bd5d205e87d452c91d244940bad9f7ab3
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 12, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

2 release files

0.6.0

2 release files

This release

0.5.0 This release

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