InfluxEx
Library for working with the v2.X InfluxDB API.
installation
Installation
def deps do
[
{:influx_ex, "~> 0.3.1"},
# below are optional deps but InfluxEx will try to use them as defaults so
# if you are okay with these defaults ensure they are added in your deps as
# well.
{:req, "~> 0.2.0"},
{:jason, "~> 1.0"},
{:nimble_csv, "~> 1.0"}
]
end
setup
Setup
To get started quickly you need to add these optional dependencies to your deps:
{:req, "~> 0.2.0"},
{:jason, "~> 1.0"},
{:nimble_csv, "~> 1.0"}After adding these to your dependencies run mix deps.get
Then run docker-compose up -d to start a InfluxDB container which will be
reachable at http://localhost:8086.
Next lets check the current user but running iex -S mix and typing:
client = InfluxEx.Client.new("devtoken")
InfluxEx.me(client)
{:ok, %InfluxEx.Me{}}If you don't want to use the default libraries for HTTP, JSON, and CSV see the configuration section below for more information.
If you're using docker-compose, the development token is "devtoken" and
during tests the token is "testtoken".
client
Client
InfluxEx does not provide a process based client. This provided the most
flexibility to consuming applications to decide if a process is needed or not
for managing state.
If you want the client to be in a process here's a stub of what that might look like to get you started:
defmodule MyApp.InfluxClient do
use GenServer
alias InfluxEx.{Client, Orgs}
@type arg() ::
{:token, InfluxEx.token()}
| {:org, Orgs.name()}
| {:org_id, Orgs.id()}
| {:port, :inet.port_number()}
| {:host, :inet.hostname()}
@doc """
Start the client
"""
@spec start_link([arg()]) :: GenServer.on_start()
def start_link(args) do
GenServer.start_link(__MODULE__, args, name: __MODULE__)
end
@impl GenServer
def init(args) do
# required args
token = Keyword.fetch!(args, :token)
org = Keyword.fetch!(args, :org)
org_id = Keyword.fetch!(args, :org_id)
# optional args
port = Keyword.get(args, :port) || 8086
host = Keyword.get(args, :host) || "http://localhost"
client = Client.new(token, port: port, host: host, org: org, org_id: org_id)
{:ok, %{client: client}}
end
end
configuration
Configuration
http-client
HTTP Client
The InfluxDB API uses the HTTP protocol. By default InfluxEx will try to use
Req to make HTTP request. If you want to use Req you will need to add
it to your deps in your mix.exs file.
{:req, "~> 0.2.0"}If you use a different HTTP library you can provide the client with a module
that implements the InfluxEx.HTTP behaviour that wraps your preferred HTTP
library.
my_client = InfluxEx.Client.new("mytoken", http_client: MyHTTPClient)
json-library
JSON Library
The InfluxDB API using JSON format to communicate data between the client and
server. InfluxEx needs away to encode and decode the JSON payloads to and from
Elixir data types. By default InfluxEx will try to use the Jason library. To
use this default you need to add :jason to you deps in your mix.exs:
{:jason, "~> 1.0"}If you want to use a different JSON library pass a module name into the
:json_library option when creating a client. Ensure that the module
implements the InfluxEx.JSONLibrary behaviour.
InfluxEx.Client.new("mytoken", json_library: MyJSONLibrary)
csv-library
CSV Library
For some API calls the InfluxDB API requires working with the CSV content type.
By default InfluxEx will try to use the :nimble_csv library. If you are
okay with default you need to add this to your mix.exs file:
{:nimble_csv, "~> 1.0"}If you want to use a different decoder you can supply that to
InfluxEx.Client.new/2.
If you want to use a different library you can supply a module that implements
InfluxEx.CSVLibrary to your client using the :csv_library option:
InfluxEx.Client.new("mytoken", csv_library: MyCSVLibrary)One important note about using a custom CSV library is the parse_string/1
callback implementation needs to keep the CSV headers as InfluxEx needs them to
ensure it handles tag names and values correctly.