When this was originally developed, many exisiting patterns in the
application weren't established yet. This adds support for the
chronograf.Logger as well as removes some cruft that just isn't used
anymore. Interfaces have also been updated to align with what they are
today.
Open() wasn't a hard requirement, so it was a little surprising to need
to use it when creating an enterprise.Client in some circumstances but
not others. This returns an error when Querying if Open() was not
called, preventing panics which would otherwise result. Granted, this
would only be encountered by developers, but I believe a helpful error
is sometimes more useful than a mysterious panic when making libs that
devs actually enjoy using. Furthermore, a preflight check to see whether
dataNodes was initialized makes the Open() method idempotent.
Many different ways exist to specify the URL for a meta node, including
host:port, scheme://host:port. This provides a function that handles the
irregularities associated with meta URLs and initializes a Client with a
control.Client for introspecting the associated cluster.
container/ring wasn't being used correctly, so all requests were
directed to the first data node in the ring. This ensures (via test)
that queries are properly distributed among available data nodes.
This is an initial implementation of the Influx Enterprise client. It
incorporates introspection of a cluster to determine available data
nodes and issues requests in a round-robin fasion to those nodes.
Currently all nodes are assumed to be healthy, so there is no pruning of
the available data node pool.
Since this is a flag that is being accepted by the application, it makes
sense to group it with the other flags. Also, the `json` struct tag was
a remnant from an earlier attempt at implementing this feature, and is
no longer necessary.
URLPrefixer had nothing to do with assets, so it actually belongs up in
the mux, where we're assembling handlers together across the
application.
Also, the setup was painful to look at, and others will probably use the
same `Attrs`, so a `NewDefaultURLPrefixer` was added to spawn a prefixer
with only a prefix and a next handler.
React-router and also the client that we use in the frontend need to be
informed on how to access the Chronograf backend when it's being hosted
on a route other than /. To accomplish this, a data attribute is written
into the `<div>` which serves as our React root. We then make the React
router aware of this if it's set and also pass the prefix to axios (our
front end HTTP client) by way of window.
Originally, it was desired to have the basepath accessible via an API,
but this proved to be impossible because to access that API, the front
end would already need to know the basepath. The technique we went with
was arrived at independently, but is also used by Jupityr notebooks
which encountered the same problem.