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:5555") 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),
            tag_filters={"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", 5557)
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:5555",
    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) Write points (JSON)
write_line_protocol(lines, *, idempotency_key) Write (line protocol)
query(measurement, time_range, *, tag_filters, field_columns, limit) 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)
QueryError Query/client error (4xx)

License

Apache-2.0 — same as Chronix.

Metadata

Release files for chronix-client 0.4.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.4.0
File Size Uploaded
chronix_client-0.4.0.tar.gz 20.6 kB Details

Built distribution (wheel)

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

Total release size: 35.4 kB

Release files / chronix_client-0.4.0.tar.gz

Download URL chronix_client-0.4.0.tar.gz
Size 20.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f74247343c6048b376c79f8dc76b3cea81912b07756fc5691d62d7ac20e83019
BLAKE2b-256 checksum
How to use checksums
047dd04bd7b1478ecb589c4703739f4d244deca8ff880010e7d6e3dccc9bb107
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 10, 2026.

Transparency log

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

Download URL chronix_client-0.4.0-py3-none-any.whl
Size 14.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0de988c2f95daa1fd64f3681cd48a5f681bcea02a0b12b3b14801f6c7294e8d
BLAKE2b-256 checksum
How to use checksums
0a2aecf0c05503f52e263c0cd4f27f4e7868a7688f8df2e58fa0f98de28ae4cb
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 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

This release

0.4.0 This release

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