2016-10-20 14:38:23 +00:00
package chronograf
2016-09-12 19:43:01 +00:00
import (
2016-10-25 15:20:06 +00:00
"context"
2017-03-06 21:16:45 +00:00
"io"
2016-10-25 15:20:06 +00:00
"net/http"
2017-06-06 22:26:08 +00:00
"time"
2016-10-25 15:20:06 +00:00
)
2016-09-12 19:43:01 +00:00
2016-10-25 15:20:06 +00:00
// General errors.
const (
2017-11-02 20:47:45 +00:00
ErrUpstreamTimeout = Error ( "request to backend timed out" )
ErrSourceNotFound = Error ( "source not found" )
ErrServerNotFound = Error ( "server not found" )
ErrLayoutNotFound = Error ( "layout not found" )
ErrDashboardNotFound = Error ( "dashboard not found" )
ErrUserNotFound = Error ( "user not found" )
ErrLayoutInvalid = Error ( "layout is invalid" )
2017-12-15 04:10:17 +00:00
ErrDashboardInvalid = Error ( "dashboard is invalid" )
2017-12-19 21:14:00 +00:00
ErrSourceInvalid = Error ( "source is invalid" )
ErrServerInvalid = Error ( "server is invalid" )
2017-11-02 20:47:45 +00:00
ErrAlertNotFound = Error ( "alert not found" )
ErrAuthentication = Error ( "user not authenticated" )
ErrUninitialized = Error ( "client uninitialized. Call Open() method" )
ErrInvalidAxis = Error ( "Unexpected axis in cell. Valid axes are 'x', 'y', and 'y2'" )
2017-12-15 03:07:19 +00:00
ErrInvalidColorType = Error ( "Invalid color type. Valid color types are 'min', 'max', 'threshold', 'text', and 'background'" )
2017-12-07 03:05:16 +00:00
ErrInvalidColor = Error ( "Invalid color. Accepted color format is #RRGGBB" )
ErrUserAlreadyExists = Error ( "user already exists" )
ErrOrganizationNotFound = Error ( "organization not found" )
2017-12-01 04:10:30 +00:00
ErrOrganizationAlreadyExists = Error ( "organization already exists" )
2017-11-02 20:47:45 +00:00
ErrCannotDeleteDefaultOrganization = Error ( "cannot delete default organization" )
2017-12-13 18:38:01 +00:00
ErrConfigNotFound = Error ( "cannot find configuration" )
2016-09-12 19:43:01 +00:00
)
2016-10-25 15:20:06 +00:00
// Error is a domain error encountered while processing chronograf requests
type Error string
func ( e Error ) Error ( ) string {
return string ( e )
}
// Logger represents an abstracted structured logging implementation. It
// provides methods to trigger log messages at various alert levels and a
// WithField method to set keys for a structured log message.
type Logger interface {
2016-10-24 17:08:36 +00:00
Debug ( ... interface { } )
2016-10-25 15:20:06 +00:00
Info ( ... interface { } )
Error ( ... interface { } )
WithField ( string , interface { } ) Logger
2017-03-06 21:16:45 +00:00
// Logger can be transformed into an io.Writer.
// That writer is the end of an io.Pipe and it is your responsibility to close it.
Writer ( ) * io . PipeWriter
2016-10-25 15:20:06 +00:00
}
2017-03-31 15:20:44 +00:00
// Router is an abstracted Router based on the API provided by the
// julienschmidt/httprouter package.
type Router interface {
http . Handler
GET ( string , http . HandlerFunc )
PATCH ( string , http . HandlerFunc )
POST ( string , http . HandlerFunc )
DELETE ( string , http . HandlerFunc )
PUT ( string , http . HandlerFunc )
Handler ( string , string , http . Handler )
}
2016-10-25 15:20:06 +00:00
// Assets returns a handler to serve the website.
type Assets interface {
Handler ( ) http . Handler
}
2017-03-13 21:45:05 +00:00
// Supported time-series databases
const (
// InfluxDB is the open-source time-series database
InfluxDB = "influx"
// InfluxEnteprise is the clustered HA time-series database
InfluxEnterprise = "influx-enterprise"
// InfluxRelay is the basic HA layer over InfluxDB
InfluxRelay = "influx-relay"
)
// TSDBStatus represents the current status of a time series database
type TSDBStatus interface {
// Connect will connect to the time series using the information in `Source`.
Connect ( ctx context . Context , src * Source ) error
// Ping returns version and TSDB type of time series database if reachable.
Ping ( context . Context ) error
// Version returns the version of the TSDB database
Version ( context . Context ) ( string , error )
// Type returns the type of the TSDB database
Type ( context . Context ) ( string , error )
}
2016-10-25 15:20:06 +00:00
// TimeSeries represents a queryable time series database.
type TimeSeries interface {
// Query retrieves time series data from the database.
Query ( context . Context , Query ) ( Response , error )
// Connect will connect to the time series using the information in `Source`.
Connect ( context . Context , * Source ) error
2017-02-17 19:37:00 +00:00
// UsersStore represents the user accounts within the TimeSeries database
Users ( context . Context ) UsersStore
2017-02-27 19:31:38 +00:00
// Permissions returns all valid names permissions in this database
Permissions ( context . Context ) Permissions
2017-02-23 22:02:53 +00:00
// Roles represents the roles associated with this TimesSeriesDatabase
Roles ( context . Context ) ( RolesStore , error )
}
// Role is a restricted set of permissions assigned to a set of users.
type Role struct {
2017-10-30 16:28:57 +00:00
Name string ` json:"name" `
Permissions Permissions ` json:"permissions,omitempty" `
Users [ ] User ` json:"users,omitempty" `
2017-11-03 01:52:30 +00:00
Organization string ` json:"organization,omitempty" `
2017-02-23 22:02:53 +00:00
}
// RolesStore is the Storage and retrieval of authentication information
type RolesStore interface {
// All lists all roles from the RolesStore
All ( context . Context ) ( [ ] Role , error )
// Create a new Role in the RolesStore
Add ( context . Context , * Role ) ( * Role , error )
// Delete the Role from the RolesStore
Delete ( context . Context , * Role ) error
// Get retrieves a role if name exists.
Get ( ctx context . Context , name string ) ( * Role , error )
// Update the roles' users or permissions
Update ( context . Context , * Role ) error
2016-10-25 15:20:06 +00:00
}
2016-11-29 21:04:54 +00:00
// Range represents an upper and lower bound for data
type Range struct {
2016-11-30 21:22:35 +00:00
Upper int64 ` json:"upper" ` // Upper is the upper bound
Lower int64 ` json:"lower" ` // Lower is the lower bound
2016-11-29 21:04:54 +00:00
}
2017-04-19 16:18:23 +00:00
// TemplateValue is a value use to replace a template in an InfluxQL query
2017-11-08 17:27:35 +00:00
type TemplateValue struct {
2017-04-20 15:33:47 +00:00
Value string ` json:"value" ` // Value is the specific value used to replace a template in an InfluxQL query
2017-04-20 19:30:17 +00:00
Type string ` json:"type" ` // Type can be tagKey, tagValue, fieldKey, csv, measurement, database, constant
2017-04-20 15:33:47 +00:00
Selected bool ` json:"selected" ` // Selected states that this variable has been picked to use for replacement
2017-04-19 16:18:23 +00:00
}
// TemplateVar is a named variable within an InfluxQL query to be replaced with Values
2017-11-08 17:27:35 +00:00
type TemplateVar struct {
Var string ` json:"tempVar" ` // Var is the string to replace within InfluxQL
Values [ ] TemplateValue ` json:"values" ` // Values are the replacement values within InfluxQL
2017-06-13 18:42:52 +00:00
}
2017-04-20 15:33:47 +00:00
// TemplateID is the unique ID used to identify a template
type TemplateID string
// Template represents a series of choices to replace TemplateVars within InfluxQL
type Template struct {
2017-11-08 17:27:35 +00:00
TemplateVar
2017-04-20 15:33:47 +00:00
ID TemplateID ` json:"id" ` // ID is the unique ID associated with this template
2017-04-20 19:30:17 +00:00
Type string ` json:"type" ` // Type can be fieldKeys, tagKeys, tagValues, CSV, constant, query, measurements, databases
2017-04-20 15:33:47 +00:00
Label string ` json:"label" ` // Label is a user-facing description of the Template
Query * TemplateQuery ` json:"query,omitempty" ` // Query is used to generate the choices for a template
}
2016-10-25 15:20:06 +00:00
// Query retrieves a Response from a TimeSeries.
type Query struct {
2017-11-08 17:27:35 +00:00
Command string ` json:"query" ` // Command is the query itself
DB string ` json:"db,omitempty" ` // DB is optional and if empty will not be used.
RP string ` json:"rp,omitempty" ` // RP is a retention policy and optional; if empty will not be used.
2018-01-12 05:05:23 +00:00
Epoch string ` json:"epoch,omitempty" ` // Epoch is the time format for the return results
2017-11-08 17:27:35 +00:00
TemplateVars [ ] TemplateVar ` json:"tempVars,omitempty" ` // TemplateVars are template variables to replace within an InfluxQL query
Wheres [ ] string ` json:"wheres,omitempty" ` // Wheres restricts the query to certain attributes
GroupBys [ ] string ` json:"groupbys,omitempty" ` // GroupBys collate the query by these tags
Resolution uint ` json:"resolution,omitempty" ` // Resolution is the available screen resolution to render query results
Label string ` json:"label,omitempty" ` // Label is the Y-Axis label for the data
Range * Range ` json:"range,omitempty" ` // Range is the default Y-Axis range for the data
2016-10-25 15:20:06 +00:00
}
Introduce ability to edit a dashboard cell
* Correct documentation for dashboards
* Exclude .git and use 'make run-dev' in 'make continuous'
* Fix dashboard deletion bug where id serialization was wrong
* Commence creation of overlay technology, add autoRefresh props to DashboardPage
* Enhance overlay magnitude of overlay technology
* Add confirm buttons to overlay technology
* Refactor ResizeContainer to accommodate arbitrary containers
* Refactor ResizeContainer to require explicit ResizeTop and ResizeBottom for clarity
* Add markup and styles for OverlayControls
* CellEditorOverlay needs a larger minimum bottom height to accommodate more things
* Revert Visualization to not use ResizeTop or flex-box
* Remove TODO and move to issue
* Refactor CellEditorOverlay to allow selection of graph type
* Style Overlay controls, move confirm buttons to own stylesheet
* Fix toggle buttons in overlay so active is actually active
* Block user-select on a few UI items
* Update cell query shape to support Visualization and LayoutRenderer
* Code cleanup
* Repair fixture schema; update props for affected components
* Wired up selectedGraphType and activeQueryID in CellEditorOverlay
* Wire up chooseMeasurements in QueryBuilder
Pass queryActions into QueryBuilder so that DataExplorer can provide
actionCreators and CellEditorOverlay can provide functions that
modify its component state
* semicolon cleanup
* Bind all queryModifier actions to component state with a stateReducer
* Overlay Technologies™ can add and delete a query from a cell
* Semicolon cleanup
* Add conversion of InfluxQL to QueryConfig for dashboards
* Update go deps to add influxdb at af72d9b0e4ebe95be30e89b160f43eabaf0529ed
* Updated docs for dashboard query config
* Update CHANGELOG to mention InfluxQL to QueryConfig
* Make reducer’s name more specific for clarity
* Remove 'table' as graphType
* Make graph renaming prettier
* Remove duplicate DashboardQuery in swagger.json
* Fix swagger to include name and links for Cell
* Refactor CellEditorOverlay to enable graph type selection
* Add link.self to all Dashboard cells; add bolt migrations
* Make dash graph names only hover on contents
* Consolidate timeRange format patterns, clean up
* Add cell endpoints to dashboards
* Include Line + Stat in Visualization Type list
* Add cell link to dashboards
* Enable step plot and stacked graph in Visualization
* Overlay Technologies are summonable and dismissable
* OverlayTechnologies saves changes to a cell
* Convert NameableGraph to createClass for state
This was converted from a pure function to encapsulate the state of the
buttons. An attempt was made previously to store this state in Redux,
but it proved too convoluted with the current state of the reducers for
cells and dashboards. Another effort must take place to separate a cell
reducer to manage the state of an individual cell in Redux in order for
this state to be sanely kept in Redux as well.
For the time being, this state is being kept in the component for the
sake of expeditiousness, since this is needed for Dashboards to be
released. A refactor of this will occur later.
* Cells should contain a links key in server response
* Clean up console logs
* Use live data instead of a cellQuery fixture
* Update docs for dashboard creation
* DB and RP are already present in the Command field
* Fix LayoutRenderer’s understanding of query schema
* Return a new object, rather that mutate in place
* Visualization doesn’t use activeQueryID
* Selected is an object, not a string
* QueryBuilder refactored to use query index instead of query id
* CellEditorOverlay refactored to use query index instead of query id
* ConfirmButtons doesn’t need to act on an item
* Rename functions to follow convention
* Queries are no longer guaranteed to have ids
* Omit WHERE and GROUP BY clauses when saving query
* Select new query on add in OverlayTechnologies
* Add click outside to dash graph menu, style menu also
* Change context menu from ... to a caret
More consistent with the rest of the UI, better affordance
* Hide graph context menu in presentation mode
Don’t want people editing a dashboard from presentation mode
* Move graph refreshing spinner so it does not overlap with context menu
* Wire up Cell Menu to Overlay Technologies
* Correct empty dashboard type
* Refactor dashboard spec fixtures
* Test syncDashboardCell reducer
* Remove Delete button from graph dropdown menu (for now)
* Update changelog
2017-03-24 00:12:33 +00:00
// DashboardQuery includes state for the query builder. This is a transition
// struct while we move to the full InfluxQL AST
type DashboardQuery struct {
Command string ` json:"query" ` // Command is the query itself
Label string ` json:"label,omitempty" ` // Label is the Y-Axis label for the data
Range * Range ` json:"range,omitempty" ` // Range is the default Y-Axis range for the data
QueryConfig QueryConfig ` json:"queryConfig,omitempty" ` // QueryConfig represents the query state that is understood by the data explorer
2017-09-14 18:13:47 +00:00
Source string ` json:"source" ` // Source is the optional URI to the data source for this queryConfig
2017-11-10 19:06:48 +00:00
Shifts [ ] TimeShift ` json:"-" ` // Shifts represents shifts to apply to an influxql query's time range. Clients expect the shift to be in the generated QueryConfig
Introduce ability to edit a dashboard cell
* Correct documentation for dashboards
* Exclude .git and use 'make run-dev' in 'make continuous'
* Fix dashboard deletion bug where id serialization was wrong
* Commence creation of overlay technology, add autoRefresh props to DashboardPage
* Enhance overlay magnitude of overlay technology
* Add confirm buttons to overlay technology
* Refactor ResizeContainer to accommodate arbitrary containers
* Refactor ResizeContainer to require explicit ResizeTop and ResizeBottom for clarity
* Add markup and styles for OverlayControls
* CellEditorOverlay needs a larger minimum bottom height to accommodate more things
* Revert Visualization to not use ResizeTop or flex-box
* Remove TODO and move to issue
* Refactor CellEditorOverlay to allow selection of graph type
* Style Overlay controls, move confirm buttons to own stylesheet
* Fix toggle buttons in overlay so active is actually active
* Block user-select on a few UI items
* Update cell query shape to support Visualization and LayoutRenderer
* Code cleanup
* Repair fixture schema; update props for affected components
* Wired up selectedGraphType and activeQueryID in CellEditorOverlay
* Wire up chooseMeasurements in QueryBuilder
Pass queryActions into QueryBuilder so that DataExplorer can provide
actionCreators and CellEditorOverlay can provide functions that
modify its component state
* semicolon cleanup
* Bind all queryModifier actions to component state with a stateReducer
* Overlay Technologies™ can add and delete a query from a cell
* Semicolon cleanup
* Add conversion of InfluxQL to QueryConfig for dashboards
* Update go deps to add influxdb at af72d9b0e4ebe95be30e89b160f43eabaf0529ed
* Updated docs for dashboard query config
* Update CHANGELOG to mention InfluxQL to QueryConfig
* Make reducer’s name more specific for clarity
* Remove 'table' as graphType
* Make graph renaming prettier
* Remove duplicate DashboardQuery in swagger.json
* Fix swagger to include name and links for Cell
* Refactor CellEditorOverlay to enable graph type selection
* Add link.self to all Dashboard cells; add bolt migrations
* Make dash graph names only hover on contents
* Consolidate timeRange format patterns, clean up
* Add cell endpoints to dashboards
* Include Line + Stat in Visualization Type list
* Add cell link to dashboards
* Enable step plot and stacked graph in Visualization
* Overlay Technologies are summonable and dismissable
* OverlayTechnologies saves changes to a cell
* Convert NameableGraph to createClass for state
This was converted from a pure function to encapsulate the state of the
buttons. An attempt was made previously to store this state in Redux,
but it proved too convoluted with the current state of the reducers for
cells and dashboards. Another effort must take place to separate a cell
reducer to manage the state of an individual cell in Redux in order for
this state to be sanely kept in Redux as well.
For the time being, this state is being kept in the component for the
sake of expeditiousness, since this is needed for Dashboards to be
released. A refactor of this will occur later.
* Cells should contain a links key in server response
* Clean up console logs
* Use live data instead of a cellQuery fixture
* Update docs for dashboard creation
* DB and RP are already present in the Command field
* Fix LayoutRenderer’s understanding of query schema
* Return a new object, rather that mutate in place
* Visualization doesn’t use activeQueryID
* Selected is an object, not a string
* QueryBuilder refactored to use query index instead of query id
* CellEditorOverlay refactored to use query index instead of query id
* ConfirmButtons doesn’t need to act on an item
* Rename functions to follow convention
* Queries are no longer guaranteed to have ids
* Omit WHERE and GROUP BY clauses when saving query
* Select new query on add in OverlayTechnologies
* Add click outside to dash graph menu, style menu also
* Change context menu from ... to a caret
More consistent with the rest of the UI, better affordance
* Hide graph context menu in presentation mode
Don’t want people editing a dashboard from presentation mode
* Move graph refreshing spinner so it does not overlap with context menu
* Wire up Cell Menu to Overlay Technologies
* Correct empty dashboard type
* Refactor dashboard spec fixtures
* Test syncDashboardCell reducer
* Remove Delete button from graph dropdown menu (for now)
* Update changelog
2017-03-24 00:12:33 +00:00
}
2017-04-20 15:33:47 +00:00
// TemplateQuery is used to retrieve choices for template replacement
type TemplateQuery struct {
2017-04-20 23:23:59 +00:00
Command string ` json:"influxql" ` // Command is the query itself
2017-04-20 19:30:17 +00:00
DB string ` json:"db,omitempty" ` // DB is optional and if empty will not be used.
RP string ` json:"rp,omitempty" ` // RP is a retention policy and optional; if empty will not be used.
Measurement string ` json:"measurement" ` // Measurement is the optinally selected measurement for the query
TagKey string ` json:"tagKey" ` // TagKey is the optionally selected tag key for the query
2017-04-22 02:06:24 +00:00
FieldKey string ` json:"fieldKey" ` // FieldKey is the optionally selected field key for the query
2017-04-20 15:33:47 +00:00
}
2016-10-25 15:20:06 +00:00
// Response is the result of a query against a TimeSeries
type Response interface {
MarshalJSON ( ) ( [ ] byte , error )
}
// Source is connection information to a time-series data store.
type Source struct {
2017-03-30 16:48:04 +00:00
ID int ` json:"id,string" ` // ID is the unique ID of the source
2017-01-05 01:35:07 +00:00
Name string ` json:"name" ` // Name is the user-defined name for the source
Type string ` json:"type,omitempty" ` // Type specifies which kinds of source (enterprise vs oss)
Username string ` json:"username,omitempty" ` // Username is the username to connect to the source
Password string ` json:"password,omitempty" ` // Password is in CLEARTEXT
2017-07-15 01:02:13 +00:00
SharedSecret string ` json:"sharedSecret,omitempty" ` // ShareSecret is the optional signing secret for Influx JWT authorization
2017-01-05 01:35:07 +00:00
URL string ` json:"url" ` // URL are the connections to the source
2017-02-07 23:57:51 +00:00
MetaURL string ` json:"metaUrl,omitempty" ` // MetaURL is the url for the meta node
2017-01-05 01:35:07 +00:00
InsecureSkipVerify bool ` json:"insecureSkipVerify,omitempty" ` // InsecureSkipVerify as true means any certificate presented by the source is accepted.
Default bool ` json:"default" ` // Default specifies the default source for the application
Telegraf string ` json:"telegraf" ` // Telegraf is the db telegraf is written to. By default it is "telegraf"
2017-10-25 18:56:08 +00:00
Organization string ` json:"organization" ` // Organization is the organization ID that resource belongs to
2017-11-29 22:32:41 +00:00
Role string ` json:"role,omitempty" ` // Not Currently Used. Role is the name of the minimum role that a user must possess to access the resource.
2016-10-25 15:20:06 +00:00
}
// SourcesStore stores connection information for a `TimeSeries`
type SourcesStore interface {
// All returns all sources in the store
All ( context . Context ) ( [ ] Source , error )
// Add creates a new source in the SourcesStore and returns Source with ID
Add ( context . Context , Source ) ( Source , error )
// Delete the Source from the store
Delete ( context . Context , Source ) error
// Get retrieves Source if `ID` exists
Get ( ctx context . Context , ID int ) ( Source , error )
// Update the Source in the store.
Update ( context . Context , Source ) error
}
2018-01-09 23:15:12 +00:00
// DBRP represents a database and retention policy for a time series source
2017-09-07 23:02:52 +00:00
type DBRP struct {
DB string ` json:"db" `
RP string ` json:"rp" `
}
2016-11-03 00:59:25 +00:00
// AlertRule represents rules for building a tickscript alerting task
type AlertRule struct {
2017-09-07 23:02:52 +00:00
ID string ` json:"id,omitempty" ` // ID is the unique ID of the alert
TICKScript TICKScript ` json:"tickscript" ` // TICKScript is the raw tickscript associated with this Alert
Query * QueryConfig ` json:"query" ` // Query is the filter of data for the alert.
Every string ` json:"every" ` // Every how often to check for the alerting criteria
Alerts [ ] string ` json:"alerts" ` // Alerts name all the services to notify (e.g. pagerduty)
AlertNodes [ ] KapacitorNode ` json:"alertNodes,omitempty" ` // AlertNodes define additional arguments to alerts
Message string ` json:"message" ` // Message included with alert
Details string ` json:"details" ` // Details is generally used for the Email alert. If empty will not be added.
Trigger string ` json:"trigger" ` // Trigger is a type that defines when to trigger the alert
TriggerValues TriggerValues ` json:"values" ` // Defines the values that cause the alert to trigger
Name string ` json:"name" ` // Name is the user-defined name for the alert
Type string ` json:"type" ` // Represents the task type where stream is data streamed to kapacitor and batch is queried by kapacitor
DBRPs [ ] DBRP ` json:"dbrps" ` // List of database retention policy pairs the task is allowed to access
Status string ` json:"status" ` // Represents if this rule is enabled or disabled in kapacitor
Executing bool ` json:"executing" ` // Whether the task is currently executing
Error string ` json:"error" ` // Any error encountered when kapacitor executes the task
Created time . Time ` json:"created" ` // Date the task was first created
Modified time . Time ` json:"modified" ` // Date the task was last modified
LastEnabled time . Time ` json:"last-enabled,omitempty" ` // Date the task was last set to status enabled
2016-11-03 00:59:25 +00:00
}
// TICKScript task to be used by kapacitor
type TICKScript string
2016-11-01 00:19:32 +00:00
2016-11-03 00:59:25 +00:00
// Ticker generates tickscript tasks for kapacitor
type Ticker interface {
// Generate will create the tickscript to be used as a kapacitor task
Generate ( AlertRule ) ( TICKScript , error )
2016-11-01 00:19:32 +00:00
}
2016-11-04 00:44:28 +00:00
// TriggerValues specifies the alerting logic for a specific trigger type
type TriggerValues struct {
2017-05-05 22:00:04 +00:00
Change string ` json:"change,omitempty" ` // Change specifies if the change is a percent or absolute
Period string ` json:"period,omitempty" ` // Period length of time before deadman is alerted
Shift string ` json:"shift,omitempty" ` // Shift is the amount of time to look into the past for the alert to compare to the present
Operator string ` json:"operator,omitempty" ` // Operator for alert comparison
Value string ` json:"value,omitempty" ` // Value is the boundary value when alert goes critical
RangeValue string ` json:"rangeValue" ` // RangeValue is an optional value for range comparisons
2016-11-10 17:27:42 +00:00
}
// Field represent influxql fields and functions from the UI
type Field struct {
2017-10-16 15:56:12 +00:00
Value interface { } ` json:"value" `
2017-10-11 19:45:01 +00:00
Type string ` json:"type" `
Alias string ` json:"alias" `
Args [ ] Field ` json:"args,omitempty" `
2016-11-10 17:27:42 +00:00
}
// GroupBy represents influxql group by tags from the UI
type GroupBy struct {
Time string ` json:"time" `
Tags [ ] string ` json:"tags" `
2016-11-03 22:27:58 +00:00
}
2017-05-02 20:08:51 +00:00
// DurationRange represents the lower and upper durations of the query config
type DurationRange struct {
Upper string ` json:"upper" `
Lower string ` json:"lower" `
}
2017-11-10 19:06:48 +00:00
// TimeShift represents a shift to apply to an influxql query's time range
type TimeShift struct {
2017-11-21 18:37:07 +00:00
Label string ` json:"label" ` // Label user facing description
Unit string ` json:"unit" ` // Unit influxql time unit representation i.e. ms, s, m, h, d
Quantity string ` json:"quantity" ` // Quantity number of units
2017-11-10 19:06:48 +00:00
}
2016-11-03 22:27:58 +00:00
// QueryConfig represents UI query from the data explorer
type QueryConfig struct {
2016-11-10 17:27:42 +00:00
ID string ` json:"id,omitempty" `
Database string ` json:"database" `
Measurement string ` json:"measurement" `
RetentionPolicy string ` json:"retentionPolicy" `
Fields [ ] Field ` json:"fields" `
Tags map [ string ] [ ] string ` json:"tags" `
GroupBy GroupBy ` json:"groupBy" `
AreTagsAccepted bool ` json:"areTagsAccepted" `
2017-09-05 22:28:47 +00:00
Fill string ` json:"fill,omitempty" `
2017-04-07 22:32:10 +00:00
RawText * string ` json:"rawText" `
2017-05-02 20:08:51 +00:00
Range * DurationRange ` json:"range" `
2017-11-10 19:06:48 +00:00
Shifts [ ] TimeShift ` json:"shifts" `
2016-11-03 22:27:58 +00:00
}
2017-02-09 04:18:23 +00:00
// KapacitorNode adds arguments and properties to an alert
type KapacitorNode struct {
2017-02-09 06:10:23 +00:00
Name string ` json:"name" `
Args [ ] string ` json:"args" `
Properties [ ] KapacitorProperty ` json:"properties" `
2017-02-09 04:18:23 +00:00
// In the future we could add chaining methods here.
}
// KapacitorProperty modifies the node they are called on
type KapacitorProperty struct {
Name string ` json:"name" `
Args [ ] string ` json:"args" `
}
2016-10-25 15:20:06 +00:00
// Server represents a proxy connection to an HTTP server
type Server struct {
2017-10-20 03:48:31 +00:00
ID int // ID is the unique ID of the server
SrcID int // SrcID of the data source
Name string // Name is the user-defined name for the server
Username string // Username is the username to connect to the server
Password string // Password is in CLEARTEXT
URL string // URL are the connections to the server
InsecureSkipVerify bool // InsecureSkipVerify as true means any certificate presented by the server is accepted.
Active bool // Is this the active server for the source?
2017-11-14 08:05:18 +00:00
Organization string // Organization is the organization ID that resource belongs to
2016-10-25 15:20:06 +00:00
}
// ServersStore stores connection information for a `Server`
type ServersStore interface {
// All returns all servers in the store
All ( context . Context ) ( [ ] Server , error )
// Add creates a new source in the ServersStore and returns Server with ID
Add ( context . Context , Server ) ( Server , error )
// Delete the Server from the store
Delete ( context . Context , Server ) error
// Get retrieves Server if `ID` exists
Get ( ctx context . Context , ID int ) ( Server , error )
// Update the Server in the store.
Update ( context . Context , Server ) error
}
// ID creates uniq ID string
type ID interface {
// Generate creates a unique ID string
Generate ( ) ( string , error )
}
2017-02-17 22:35:56 +00:00
const (
2017-02-19 06:54:52 +00:00
// AllScope grants permission for all databases.
AllScope Scope = "all"
// DBScope grants permissions for a specific database
DBScope Scope = "database"
2017-02-17 22:35:56 +00:00
)
2017-02-17 22:03:49 +00:00
// Permission is a specific allowance for User or Role bound to a
// scope of the data source
type Permission struct {
2017-02-19 06:54:52 +00:00
Scope Scope ` json:"scope" `
Name string ` json:"name,omitempty" `
Allowed Allowances ` json:"allowed" `
2017-02-17 22:03:49 +00:00
}
// Permissions represent the entire set of permissions a User or Role may have
type Permissions [ ] Permission
2017-02-19 06:54:52 +00:00
// Allowances defines what actions a user can have on a scoped permission
type Allowances [ ] string
// Scope defines the location of access of a permission
type Scope string
2016-10-25 15:20:06 +00:00
// User represents an authenticated user.
2016-09-12 19:43:01 +00:00
type User struct {
2017-11-02 15:59:53 +00:00
ID uint64 ` json:"id,string,omitempty" `
Name string ` json:"name" `
Passwd string ` json:"password,omitempty" `
Permissions Permissions ` json:"permissions,omitempty" `
Roles [ ] Role ` json:"roles,omitempty" `
Provider string ` json:"provider,omitempty" `
Scheme string ` json:"scheme,omitempty" `
SuperAdmin bool ` json:"superAdmin,omitempty" `
2016-11-17 23:57:46 +00:00
}
2017-10-18 19:45:06 +00:00
// UserQuery represents the attributes that a user may be retrieved by.
// It is predominantly used in the UsersStore.Get method.
2017-11-09 15:55:18 +00:00
//
// It is expected that only one of ID or Name, Provider, and Scheme will be
// specified, but all are provided UserStores should prefer ID.
2017-10-18 18:17:42 +00:00
type UserQuery struct {
ID * uint64
Name * string
Provider * string
2017-10-19 18:17:40 +00:00
Scheme * string
2017-10-18 18:17:42 +00:00
}
2016-11-17 23:57:46 +00:00
// UsersStore is the Storage and retrieval of authentication information
2017-11-09 15:55:18 +00:00
//
// While not necessary for the app to function correctly, it is
// expected that Implementors of the UsersStore will take
// care to guarantee that the combinartion of a users Name, Provider,
// and Scheme are unique.
2016-11-17 23:57:46 +00:00
type UsersStore interface {
2017-02-17 21:13:51 +00:00
// All lists all users from the UsersStore
All ( context . Context ) ( [ ] User , error )
2016-11-17 23:57:46 +00:00
// Create a new User in the UsersStore
Add ( context . Context , * User ) ( * User , error )
// Delete the User from the UsersStore
Delete ( context . Context , * User ) error
2017-02-17 19:37:00 +00:00
// Get retrieves a user if name exists.
2017-10-18 18:17:42 +00:00
Get ( ctx context . Context , q UserQuery ) ( * User , error )
2016-11-17 23:57:46 +00:00
// Update the user's permissions or roles
Update ( context . Context , * User ) error
2017-11-30 17:55:59 +00:00
// Num returns the number of users in the UsersStore
Num ( context . Context ) ( int , error )
2016-09-12 19:43:01 +00:00
}
2017-03-24 16:58:57 +00:00
// Database represents a database in a time series source
2017-03-22 09:53:19 +00:00
type Database struct {
2017-03-23 11:56:36 +00:00
Name string ` json:"name" ` // a unique string identifier for the database
Duration string ` json:"duration,omitempty" ` // the duration (when creating a default retention policy)
Replication int32 ` json:"replication,omitempty" ` // the replication factor (when creating a default retention policy)
ShardDuration string ` json:"shardDuration,omitempty" ` // the shard duration (when creating a default retention policy)
2017-03-23 10:06:59 +00:00
}
2017-03-24 16:58:57 +00:00
// RetentionPolicy represents a retention policy in a time series source
2017-03-23 10:06:59 +00:00
type RetentionPolicy struct {
2017-03-23 11:56:36 +00:00
Name string ` json:"name" ` // a unique string identifier for the retention policy
Duration string ` json:"duration,omitempty" ` // the duration
Replication int32 ` json:"replication,omitempty" ` // the replication factor
ShardDuration string ` json:"shardDuration,omitempty" ` // the shard duration
2017-03-24 17:03:38 +00:00
Default bool ` json:"isDefault,omitempty" ` // whether the RP should be the default
2017-03-22 09:53:19 +00:00
}
2017-03-24 16:58:57 +00:00
// Databases represents a databases in a time series source
2017-03-22 09:53:19 +00:00
type Databases interface {
2017-03-23 11:56:36 +00:00
// All lists all databases
AllDB ( context . Context ) ( [ ] Database , error )
2017-03-22 20:27:36 +00:00
Connect ( context . Context , * Source ) error
2017-03-23 06:21:21 +00:00
CreateDB ( context . Context , * Database ) ( * Database , error )
2017-03-23 08:04:35 +00:00
DropDB ( context . Context , string ) error
2017-03-23 10:06:59 +00:00
AllRP ( context . Context , string ) ( [ ] RetentionPolicy , error )
2017-03-23 11:27:53 +00:00
CreateRP ( context . Context , string , * RetentionPolicy ) ( * RetentionPolicy , error )
2017-03-23 13:13:41 +00:00
UpdateRP ( context . Context , string , string , * RetentionPolicy ) ( * RetentionPolicy , error )
2017-03-23 11:51:08 +00:00
DropRP ( context . Context , string , string ) error
2017-03-22 09:53:19 +00:00
}
2017-03-22 08:40:30 +00:00
2018-01-09 23:15:12 +00:00
// Annotation represents a time-based metadata associated with a source
type Annotation struct {
Name string ` json:"name" ` // Name is the unique annotation group identifier
Type string ` json:"type" ` // Type describes the kind of annotation
Time int64 ` json:"time,string" ` // Time is the time in nanoseconds since epoch of the start of the annotation
Duration int64 ` json:"duration_ns,string" ` // Duration is the duration in nanoseconds of the annotation
Text string ` json:"text" ` // Text is the associated user-facing text describing the annotation
}
// AnnotationStore represents storage and retrieval of annotations
type AnnotationStore interface {
All ( context . Context ) ( [ ] Annotation , error ) // All lists all Annotations
Add ( context . Context , Annotation ) ( Annotation , error ) // Add creates a new annotation in the store
Delete ( context . Context , Annotation ) error // Delete removes the annotation from the store
Get ( ctx context . Context , id string ) ( Annotation , error ) // Get retrieves an annotation
Update ( context . Context , Annotation ) error // Update replaces annotation
}
2016-12-08 00:31:22 +00:00
// DashboardID is the dashboard ID
type DashboardID int
// Dashboard represents all visual and query data for a dashboard
type Dashboard struct {
2017-10-25 18:00:06 +00:00
ID DashboardID ` json:"id" `
Cells [ ] DashboardCell ` json:"cells" `
Templates [ ] Template ` json:"templates" `
Name string ` json:"name" `
2017-10-25 18:56:08 +00:00
Organization string ` json:"organization" ` // Organization is the organization ID that resource belongs to
2016-12-08 00:31:22 +00:00
}
2017-07-20 18:39:19 +00:00
// Axis represents the visible extents of a visualization
type Axis struct {
2017-08-02 17:07:27 +00:00
Bounds [ ] string ` json:"bounds" ` // bounds are an arbitrary list of client-defined strings that specify the viewport for a cell
LegacyBounds [ 2 ] int64 ` json:"-" ` // legacy bounds are for testing a migration from an earlier version of axis
Label string ` json:"label" ` // label is a description of this Axis
2017-08-24 18:42:14 +00:00
Prefix string ` json:"prefix" ` // Prefix represents a label prefix for formatting axis values
Suffix string ` json:"suffix" ` // Suffix represents a label suffix for formatting axis values
Base string ` json:"base" ` // Base represents the radix for formatting axis values
Scale string ` json:"scale" ` // Scale is the axis formatting scale. Supported: "log", "linear"
2017-07-19 14:27:21 +00:00
}
2017-11-21 18:16:23 +00:00
// CellColor represents the encoding of data into visualizations
type CellColor struct {
ID string ` json:"id" ` // ID is the unique id of the cell color
Type string ` json:"type" ` // Type is how the color is used. Accepted (min,max,threshold)
Hex string ` json:"hex" ` // Hex is the hex number of the color
Name string ` json:"name" ` // Name is the user-facing name of the hex color
Value string ` json:"value" ` // Value is the data value mapped to this color
}
2016-12-08 00:31:22 +00:00
// DashboardCell holds visual and query information for a cell
type DashboardCell struct {
2017-11-21 18:16:23 +00:00
ID string ` json:"i" `
X int32 ` json:"x" `
Y int32 ` json:"y" `
W int32 ` json:"w" `
H int32 ` json:"h" `
Name string ` json:"name" `
Queries [ ] DashboardQuery ` json:"queries" `
Axes map [ string ] Axis ` json:"axes" `
Type string ` json:"type" `
CellColors [ ] CellColor ` json:"colors" `
2016-12-08 00:31:22 +00:00
}
2016-12-09 03:28:40 +00:00
// DashboardsStore is the storage and retrieval of dashboards
type DashboardsStore interface {
2016-12-20 20:22:53 +00:00
// All lists all dashboards from the DashboardStore
2016-12-14 07:56:26 +00:00
All ( context . Context ) ( [ ] Dashboard , error )
2016-12-08 00:31:22 +00:00
// Create a new Dashboard in the DashboardStore
2016-12-15 21:37:11 +00:00
Add ( context . Context , Dashboard ) ( Dashboard , error )
2016-12-14 06:57:52 +00:00
// Delete the Dashboard from the DashboardStore if `ID` exists.
2016-12-15 21:37:11 +00:00
Delete ( context . Context , Dashboard ) error
2016-12-08 00:31:22 +00:00
// Get retrieves a dashboard if `ID` exists.
2016-12-15 21:37:11 +00:00
Get ( ctx context . Context , id DashboardID ) ( Dashboard , error )
2016-12-08 00:31:22 +00:00
// Update replaces the dashboard information
2016-12-15 21:37:11 +00:00
Update ( context . Context , Dashboard ) error
2016-12-08 00:31:22 +00:00
}
2016-09-12 19:43:01 +00:00
// Cell is a rectangle and multiple time series queries to visualize.
type Cell struct {
2017-07-24 22:30:53 +00:00
X int32 ` json:"x" `
Y int32 ` json:"y" `
W int32 ` json:"w" `
H int32 ` json:"h" `
I string ` json:"i" `
Name string ` json:"name" `
Queries [ ] Query ` json:"queries" `
Axes map [ string ] Axis ` json:"axes" `
Type string ` json:"type" `
2016-09-12 19:43:01 +00:00
}
2016-10-06 04:26:39 +00:00
// Layout is a collection of Cells for visualization
type Layout struct {
2017-12-05 22:28:33 +00:00
ID string ` json:"id" `
Application string ` json:"app" `
Measurement string ` json:"measurement" `
Autoflow bool ` json:"autoflow" `
Cells [ ] Cell ` json:"cells" `
2016-09-12 19:43:01 +00:00
}
2017-10-24 22:50:11 +00:00
// LayoutsStore stores dashboards and associated Cells
type LayoutsStore interface {
2016-09-29 22:07:35 +00:00
// All returns all dashboards in the store
2016-10-06 04:26:39 +00:00
All ( context . Context ) ( [ ] Layout , error )
2017-10-24 22:50:11 +00:00
// Add creates a new dashboard in the LayoutsStore
2016-10-06 04:26:39 +00:00
Add ( context . Context , Layout ) ( Layout , error )
2016-09-12 19:43:01 +00:00
// Delete the dashboard from the store
2016-10-06 04:26:39 +00:00
Delete ( context . Context , Layout ) error
// Get retrieves Layout if `ID` exists
2016-10-10 22:00:27 +00:00
Get ( ctx context . Context , ID string ) ( Layout , error )
2016-09-12 19:43:01 +00:00
// Update the dashboard in the store.
2016-10-06 04:26:39 +00:00
Update ( context . Context , Layout ) error
2016-09-29 22:07:35 +00:00
}
2017-10-20 14:10:38 +00:00
// Organization is a group of resources under a common name
type Organization struct {
2017-12-18 22:07:40 +00:00
ID string ` json:"id" `
2017-11-03 13:51:41 +00:00
Name string ` json:"name" `
// DefaultRole is the name of the role that is the default for any users added to the organization
2017-11-02 22:32:13 +00:00
DefaultRole string ` json:"defaultRole,omitempty" `
2017-11-11 02:23:41 +00:00
// Public specifies whether users must be explicitly added to the organization.
2017-11-10 19:21:55 +00:00
// It is currently only used by the default organization, but that may change in the future.
2017-11-11 02:31:28 +00:00
Public bool ` json:"public" `
2017-10-20 14:10:38 +00:00
}
2017-11-01 16:30:42 +00:00
// OrganizationQuery represents the attributes that a organization may be retrieved by.
2017-10-20 15:13:13 +00:00
// It is predominantly used in the OrganizationsStore.Get method.
2017-11-01 16:30:42 +00:00
// It is expected that only one of ID or Name will be specified, but will prefer ID over Name if both are specified.
2017-10-20 15:13:13 +00:00
type OrganizationQuery struct {
2017-11-01 16:30:42 +00:00
// If an ID is provided in the query, the lookup time for an organization will be O(1).
2017-12-18 22:07:40 +00:00
ID * string
2017-11-01 16:30:42 +00:00
// If Name is provided, the lookup time will be O(n).
2017-10-20 15:13:13 +00:00
Name * string
}
2017-10-20 14:10:38 +00:00
// OrganizationsStore is the storage and retrieval of Organizations
2017-11-02 17:04:41 +00:00
//
// While not necessary for the app to function correctly, it is
// expected that Implementors of the OrganizationsStore will take
// care to guarantee that the Organization.Name is unqiue. Allowing
// for duplicate names creates a confusing UX experience for the User.
2017-10-20 14:10:38 +00:00
type OrganizationsStore interface {
2017-11-01 16:30:42 +00:00
// Add creates a new Organization.
// The Created organization is returned back to the user with the
// ID field populated.
2017-10-20 14:10:38 +00:00
Add ( context . Context , * Organization ) ( * Organization , error )
// All lists all Organizations in the OrganizationsStore
All ( context . Context ) ( [ ] Organization , error )
// Delete removes an Organization from the OrganizationsStore
Delete ( context . Context , * Organization ) error
// Get retrieves an Organization from the OrganizationsStore
2017-10-20 15:13:13 +00:00
Get ( context . Context , OrganizationQuery ) ( * Organization , error )
2017-10-20 14:10:38 +00:00
// Update updates an Organization in the OrganizationsStore
Update ( context . Context , * Organization ) error
2017-11-02 20:47:45 +00:00
// CreateDefault creates the default organization
CreateDefault ( ctx context . Context ) error
// DefaultOrganization returns the DefaultOrganization
DefaultOrganization ( ctx context . Context ) ( * Organization , error )
2017-10-20 14:10:38 +00:00
}
2017-12-13 01:06:57 +00:00
// AuthConfig is the global application config section for auth parameters
type AuthConfig struct {
2017-12-13 22:49:49 +00:00
// SuperAdminNewUsers should be true by default to give a seamless upgrade to
// 1.4.0 for legacy users. It means that all new users will by default receive
// SuperAdmin status. If a SuperAdmin wants to change this behavior, they
// can toggle it off via the Chronograf UI, in which case newly authenticating
// users will simply receive whatever role they would otherwise receive.
SuperAdminNewUsers bool ` json:"superAdminNewUsers" `
2017-12-13 01:06:57 +00:00
}
// Config is the global application Config for parameters that can be set via
// API, with different sections, such as Auth
type Config struct {
Auth AuthConfig ` json:"auth" `
}
// ConfigStore is the storage and retrieval of global application Config
type ConfigStore interface {
2017-12-13 18:38:01 +00:00
// Initialize creates the initial configuration
Initialize ( context . Context ) error
2017-12-13 01:06:57 +00:00
// Get retrieves the whole Config from the ConfigStore
Get ( context . Context ) ( * Config , error )
// Update updates the whole Config in the ConfigStore
Update ( context . Context , * Config ) error
}
2017-12-16 09:01:14 +00:00
// BuildInfo is sent to the usage client to track versions and commits
type BuildInfo struct {
Version string
Commit string
}
2017-12-16 22:09:37 +00:00
// BuildStore is the storage and retrieval of Chronograf build information
2017-12-16 09:01:14 +00:00
type BuildStore interface {
2017-12-16 20:27:24 +00:00
Get ( context . Context ) ( BuildInfo , error )
Update ( context . Context , BuildInfo ) error
2017-12-16 09:01:14 +00:00
}
2018-01-03 19:52:40 +00:00
2018-01-09 23:15:12 +00:00
// Environment is the set of front-end exposed environment variables
2018-01-03 19:52:40 +00:00
// that were set on the server
type Environment struct {
TelegrafSystemInterval time . Duration ` json:"telegrafSystemInterval" `
}