docs: README for annotations, notebooks, and sqlite (#21832)
* docs: sqlite package docs * docs: annotations and notebooks README * chore: fix typos & correctionspull/21836/head
parent
962b9d7d02
commit
ff31c9b8fa
|
@ -0,0 +1,33 @@
|
||||||
|
## Annotations
|
||||||
|
|
||||||
|
This package provides an HTTP API for interacting with both annotations and
|
||||||
|
streams independently. The HTTP handlers are located in the `transport` folder.
|
||||||
|
The code for interacting with the sqlite datastore is located in the
|
||||||
|
`service.go` file. Definitions for the basic types & interfaces associated with
|
||||||
|
annotations and streams used throughout the platform are located in the
|
||||||
|
top-level `influxdb` package, in the `annotation.go` file.
|
||||||
|
|
||||||
|
### Anatomy
|
||||||
|
|
||||||
|
An annotation is, at its simplest, a textual note on a range of time. The start
|
||||||
|
and stop time of that range can be the same point in time, which represents an
|
||||||
|
annotation at a single instance. Annotations can also have "stickers".
|
||||||
|
"Stickers" allow users to "tag" the annotation with further granularity for
|
||||||
|
filtering in key-value pairs. Some examples of sticker key-value pairs are:
|
||||||
|
`"product: oss"`, `"product: cloud"`, or `"service: tasks"`, but keys and values
|
||||||
|
can be any string.
|
||||||
|
|
||||||
|
Every annotation belongs to a single "stream". A "stream" represents a logical
|
||||||
|
grouping of annotated events. Some examples of stream names are: `"incidents"`,
|
||||||
|
`"deployments"`, or `"marketing"`, but can be any string. A stream can also have
|
||||||
|
a description to further clarify what annotated events may be expected in the
|
||||||
|
stream.
|
||||||
|
|
||||||
|
### Use
|
||||||
|
|
||||||
|
Requested annotations may be filtered by stream name, stickers, and/or time
|
||||||
|
range. Streams may also be retrieved, in order to view their description. If a
|
||||||
|
stream is deleted, all annotations associated with that stream are deleted as
|
||||||
|
well. Every annotation that is created must have a stream associated with it -
|
||||||
|
if a stream name is not provided when creating an annotation, it will be
|
||||||
|
assigned to the default stream.
|
|
@ -0,0 +1,25 @@
|
||||||
|
## Notebooks
|
||||||
|
|
||||||
|
This package provides an HTTP API for interacting with InfluxDB notebooks. The
|
||||||
|
HTTP handlers are located in the `transport` folder. The code for interacting
|
||||||
|
with the sqlite datastore is located in the `service.go` file. Definitions for
|
||||||
|
the basic types & interfaces associated with notebooks used throughout the
|
||||||
|
platform are located in the top-level `influxdb` package, in the `notebook.go`
|
||||||
|
file.
|
||||||
|
|
||||||
|
### Anatomy
|
||||||
|
|
||||||
|
The backend representation of a notebook is very simple: An object with an ID,
|
||||||
|
Name, associated organization ID, created/modified times, and a "spec". The
|
||||||
|
"spec" is a mechanism for storing a JSON string defined entirely by the frontend
|
||||||
|
UI. The notebook spec will likely be further defined in the future as the
|
||||||
|
notebooks feature is developed and more sophisticated backend behaviors are
|
||||||
|
required.
|
||||||
|
|
||||||
|
### Use
|
||||||
|
|
||||||
|
Basic CRUD actions are available for interacting with notebooks through the API.
|
||||||
|
Notebooks are persisted in the relational sqlite database, although they
|
||||||
|
currently do not make use of any relational features. Again, it is likely that
|
||||||
|
the more advanced features of the datastore will be utilized in the future as
|
||||||
|
the notebooks feature evolves.
|
|
@ -0,0 +1,79 @@
|
||||||
|
## SQlite
|
||||||
|
|
||||||
|
### Purpose
|
||||||
|
|
||||||
|
This `sqlite` package provides a basic interface for interacting with the
|
||||||
|
embedded sqlite database used by various InfluxDB services which require storing
|
||||||
|
relational data.
|
||||||
|
|
||||||
|
The actual sqlite driver is provided by
|
||||||
|
[`mattn/go-sqlite3`](https://github.com/mattn/go-sqlite3).
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
A single instance of `SqlStore` should be created using the `NewSqlStore`
|
||||||
|
function. Currently, this is done in the top-level `launcher` package, and a
|
||||||
|
pointer to the `SqlStore` instance is passed to services which require it as
|
||||||
|
part of their initialization.
|
||||||
|
|
||||||
|
The [`jmoiron/sqlx`](https://github.com/jmoiron/sqlx) package provides a
|
||||||
|
convenient and lightweight means to write and read structs into and out of the
|
||||||
|
database and is sufficient for performing simple, static queries. For more
|
||||||
|
complicated & dynamically constructed queries, the
|
||||||
|
[`Masterminds/squirrel`](https://github.com/Masterminds/squirrel) package can be
|
||||||
|
used as a query builder.
|
||||||
|
|
||||||
|
### Concurrent Access
|
||||||
|
|
||||||
|
An interesting aspect of using the file-based sqlite database is that while it
|
||||||
|
can support multiple concurrent read requests, only a single write request can
|
||||||
|
be processed at a time. A traditional RDBMS would manage concurrent write
|
||||||
|
requests on the database server, but for this sqlite implementation write
|
||||||
|
requests need to be managed in the application code.
|
||||||
|
|
||||||
|
In practice, this means that code intended to mutate the database needs to
|
||||||
|
obtain a write lock prior to making queries that would result in a change to the
|
||||||
|
data. If locks are not obtained in the application code, it is possible that
|
||||||
|
errors will be encountered if concurrent write requests hit the database file at
|
||||||
|
the same time.
|
||||||
|
|
||||||
|
### Migrations
|
||||||
|
|
||||||
|
A simple migration system is implemented in `migrator.go`. When starting the
|
||||||
|
influx daemon, the migrator runs migrations defined in `.sql` files using
|
||||||
|
sqlite-compatible sql scripts. These migration scripts include a statement to
|
||||||
|
set the `user_version` pragma in the database, and only scripts with a higher
|
||||||
|
`user_version` than the currently stored pragma are executed.
|
||||||
|
|
||||||
|
When creating new migrations, follow the file naming convention established by
|
||||||
|
existing migration scripts, which should look like `00XX_script_name.sql`, where
|
||||||
|
`XX` is the version number. New scripts should have the version number
|
||||||
|
incremented by 1.
|
||||||
|
|
||||||
|
### In-Memory Database
|
||||||
|
|
||||||
|
When running `influxd` with the `--store=memory` flag, the database will be
|
||||||
|
opened using the `:memory:` path, and the maximum number of open database
|
||||||
|
connections is set to 1. Because of the way in-memory databases work with
|
||||||
|
sqlite, each connection would see a completely new database, so using only a
|
||||||
|
single connection will ensure that requests to `influxd` will return a
|
||||||
|
consistent set of data.
|
||||||
|
|
||||||
|
### Backup & Restore
|
||||||
|
|
||||||
|
Methods for backing up and restoring the sqlite database are available on the
|
||||||
|
`SqlStore` struct. These operations make use of the [sqlite backup
|
||||||
|
API](https://www.sqlite.org/backup.html) made available by the `go-sqlite3`
|
||||||
|
driver. It is possible to restore and backup into sqlite databases either stored
|
||||||
|
in memory or on disk.
|
||||||
|
|
||||||
|
### Sqlite Features / Extensions
|
||||||
|
|
||||||
|
There are many additional features and extensions available, see [the go-sqlite3
|
||||||
|
package docs](https://github.com/mattn/go-sqlite3#feature--extension-list) for
|
||||||
|
the full list.
|
||||||
|
|
||||||
|
We currently use the `sqlite_foreign_keys` and `sqlite_json` extensions for
|
||||||
|
foreign key support & JSON query support. These features are enabled using
|
||||||
|
build tags defined in the `Makefile` and `.goreleaser` config for use in
|
||||||
|
local builds & CI builds respectively.
|
Loading…
Reference in New Issue