Send data from Python app to Axiom
The Axiom Python SDK is an open-source project and welcomes your contributions. For more information, see the GitHub repository.
Prerequisites#
- Create an Axiom account.
- Create a dataset in Axiom where you send your data.
- Create an API token in Axiom with permissions to ingest data to the dataset you have created.
Install SDK#
python3 -m pip install axiom-pypy -m pip install axiom-pypip3 install axiom-pyIf you use the Axiom CLI, run eval $(axiom config export -f) to configure your environment variables. Otherwise, create an API token and export it as AXIOM_TOKEN.
You can also configure the client using options passed to the client constructor:
import axiom_py
client = axiom_py.Client("API_TOKEN")Use client#
import axiom_py
client = axiom_py.Client()
client.ingest_events(
dataset="DATASET_NAME",
events=[
{"foo": "bar"},
{"bar": "baz"},
])
client.query(r"['DATASET_NAME'] | where foo == 'bar' | limit 100")For more examples, see the examples in GitHub.
Configure region#
By default, the client sends data to api.axiom.co. To target a specific edge region, pass the edge argument with the edge domain that matches the region your dataset lives in:
import axiom_py
client = axiom_py.Client(
token="xaat-your-api-token",
edge="eu-central-1.aws.edge.axiom.co",
)import axiom_py
client = axiom_py.Client(
token="xaat-your-api-token",
edge="us-east-1.aws.edge.axiom.co",
)The following edge domains are available:
| Edge deployment | Base domain for ingest and query |
|---|---|
| US East 1 (AWS) | us-east-1.aws.edge.axiom.co |
| EU Central 1 (AWS) | eu-central-1.aws.edge.axiom.co |
For more information about edge deployments, see Edge deployments.
To point at a custom edge endpoint such as a proxy or load balancer, use edge_url="https://your-edge-host" instead. edge_url takes precedence over edge if both are set.
Edge endpoints require an API token (xaat-), not a personal token (xapt-). Passing a personal token with edge configuration raises an error.
Edge configuration must be passed explicitly when you create the client. Unlike token and org_id, the edge and edge_url arguments are not read from environment variables.
Example with AxiomHandler#
The example below uses AxiomHandler to send logs from the logging module to Axiom:
import axiom_py
from axiom_py.logging import AxiomHandler
import logging
def setup_logger():
client = axiom_py.Client()
handler = AxiomHandler(client, "DATASET_NAME")
logging.getLogger().addHandler(handler)For a full example, see GitHub.
Example with structlog#
The example below uses structlog to send logs to Axiom. structlog isn't a dependency of the Axiom Python SDK, so install it separately with pip install structlog.
AxiomProcessor passes the event dictionary on unchanged so that later processors can run. Place a renderer such as structlog.dev.ConsoleRenderer() after it as the last processor. Without a renderer, structlog's logger receives a dictionary and raises a TypeError.
from axiom_py import Client
from axiom_py.structlog import AxiomProcessor
import structlog
def setup_logger():
client = Client()
structlog.configure(
processors=[
structlog.processors.add_log_level,
structlog.processors.TimeStamper(fmt="iso", key="_time"),
AxiomProcessor(client, "DATASET_NAME"),
structlog.dev.ConsoleRenderer(),
]
)For a full example, see GitHub.