From ef92659856f4f4a8b4381f662981ec7bde3b81f3 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 16 Jul 2019 15:31:10 -0600 Subject: [PATCH 001/258] added doubleExponentialMovingAverate() function, resolves #329 --- .../transformations/aggregates/doubleema.md | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md new file mode 100644 index 000000000..12f7ecc6a --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md @@ -0,0 +1,67 @@ +--- +title: doubleEMA() function +description: > + The `doubleEMA()` or `doubleExponentialMovingAverage()` function calculates the + exponential moving average of values grouped into `n` number of points, + giving more weight to recent data at double the rate of `exponentialMovingAverage()`. +menu: + v2_0_ref: + name: doubleEMA + parent: built-in-aggregates +weight: 501 +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() +--- + +The `doubleEMA()` or `doubleExponentialMovingAverage()` function calculates the +exponential moving average (EMA) of values grouped into `n` number of points, +giving more weight to recent data at double the rate of +[`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/). + +_**Function type:** Aggregate_ + +```js +doubleExponentialMovingAverage( + n: 5, + columns: ["_value"] +) + +// OR + +doubleEMA( + n: 5, + columns: ["_value"] +) +``` + +##### Double exponential moving average rules: +- A double exponential moving average is defined as `doubleEMA = 2 * EMA_N - EMA of EMA_N`. + - `EMA` is an exponential moving average. + - `N = n` is the period used to calculate the EMA. +- A true double exponential moving average requires at least `2 * n - 1` values. + If not enough values exist to calculate the double EMA, it returns a `NaN` value. +- `doubleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). + +## Parameters + +### n +The number of points to average. + +_**Data type:** Integer_ + +### columns +Columns to operate on. _Defaults to `["_value"]`_. + +_**Data type:** Array of Strings_ + +## Examples + +#### Calculate a five point double exponential moving average +```js +from(bucket: "example-bucket"): + |> range(start: -12h) + |> doubleExponentialMovingAverage(n: 5) +``` From 481652c9d908084a514b69b3644aca44e860ee75 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 16 Jul 2019 15:34:26 -0600 Subject: [PATCH 002/258] added related links to moving average functions --- .../built-in/transformations/aggregates/movingaverage.md | 2 ++ .../built-in/transformations/aggregates/timedmovingaverage.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md index 60c08af83..1af19070a 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md @@ -9,6 +9,8 @@ menu: weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md index acaedcbe8..1809552ac 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md @@ -10,6 +10,8 @@ menu: weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- From 1dc00f2ec8f7d5e577f4c80907788688603fcd56 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 23 Jul 2019 15:42:48 -0600 Subject: [PATCH 003/258] added new date package functions --- .../flux/functions/date/microsecond.md | 31 +++++++++ .../flux/functions/date/millisecond.md | 31 +++++++++ .../flux/functions/date/nanosecond.md | 31 +++++++++ .../reference/flux/functions/date/quarter.md | 31 +++++++++ .../reference/flux/functions/date/truncate.md | 57 ++++++++++++++++ .../reference/flux/functions/date/week.md | 31 +++++++++ .../visualization-types/single-stat.md | 65 ------------------- 7 files changed, 212 insertions(+), 65 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/date/microsecond.md create mode 100644 content/v2.0/reference/flux/functions/date/millisecond.md create mode 100644 content/v2.0/reference/flux/functions/date/nanosecond.md create mode 100644 content/v2.0/reference/flux/functions/date/quarter.md create mode 100644 content/v2.0/reference/flux/functions/date/truncate.md create mode 100644 content/v2.0/reference/flux/functions/date/week.md delete mode 100644 content/v2.0/visualize-data/visualization-types/single-stat.md diff --git a/content/v2.0/reference/flux/functions/date/microsecond.md b/content/v2.0/reference/flux/functions/date/microsecond.md new file mode 100644 index 000000000..6a1226250 --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/microsecond.md @@ -0,0 +1,31 @@ +--- +title: date.microsecond() function +description: > + The `date.microsecond()` function returns the microsecond of a specified time. + Results range from `[0-999999]`. +menu: + v2_0_ref: + name: date.microsecond + parent: Date +weight: 301 +--- + +The `date.microsecond()` function returns the microsecond of a specified time. +Results range from `[0-999999]`. + +_**Function type:** Transformation_ + +```js +import "date" + +date.microsecond(t: 2019-07-17T12:05:21.012934584Z) + +// Returns 12934 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ diff --git a/content/v2.0/reference/flux/functions/date/millisecond.md b/content/v2.0/reference/flux/functions/date/millisecond.md new file mode 100644 index 000000000..cc3645240 --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/millisecond.md @@ -0,0 +1,31 @@ +--- +title: date.millisecond() function +description: > + The `date.millisecond()` function returns the millisecond of a specified time. + Results range from `[0-999999]`. +menu: + v2_0_ref: + name: date.millisecond + parent: Date +weight: 301 +--- + +The `date.millisecond()` function returns the millisecond of a specified time. +Results range from `[0-999]`. + +_**Function type:** Transformation_ + +```js +import "date" + +date.millisecond(t: 2019-07-17T12:05:21.012934584Z) + +// Returns 12 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ diff --git a/content/v2.0/reference/flux/functions/date/nanosecond.md b/content/v2.0/reference/flux/functions/date/nanosecond.md new file mode 100644 index 000000000..21f42bdd7 --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/nanosecond.md @@ -0,0 +1,31 @@ +--- +title: date.nanosecond() function +description: > + The `date.nanosecond()` function returns the nanosecond of a specified time. + Results range from `[0-999999999]`. +menu: + v2_0_ref: + name: date.nanosecond + parent: Date +weight: 301 +--- + +The `date.nanosecond()` function returns the nanosecond of a specified time. +Results range from `[0-999999999]`. + +_**Function type:** Transformation_ + +```js +import "date" + +date.nanosecond(t: 2019-07-17T12:05:21.012934584Z) + +// Returns 12934584 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ diff --git a/content/v2.0/reference/flux/functions/date/quarter.md b/content/v2.0/reference/flux/functions/date/quarter.md new file mode 100644 index 000000000..87576ce4c --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/quarter.md @@ -0,0 +1,31 @@ +--- +title: date.quarter() function +description: > + The `date.quarter()` function returns the quarter of the year for a specified time. + Results range from `[1-4]`. +menu: + v2_0_ref: + name: date.quarter + parent: Date +weight: 301 +--- + +The `date.quarter()` function returns the quarter of the year for a specified time. +Results range from `[1-4]`. + +_**Function type:** Transformation_ + +```js +import "date" + +date.quarter(t: 2019-07-17T12:05:21.012Z) + +// Returns 3 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ diff --git a/content/v2.0/reference/flux/functions/date/truncate.md b/content/v2.0/reference/flux/functions/date/truncate.md new file mode 100644 index 000000000..c9f7db136 --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/truncate.md @@ -0,0 +1,57 @@ +--- +title: date.truncate() function +description: > + The `date.truncate()` function truncates a time to a specified unit. +menu: + v2_0_ref: + name: date.truncate + parent: Date +weight: 301 +--- + +The `date.truncate()` function truncates a time to a specified unit. + +_**Function type:** Transformation_ + +```js +import "date" + +date.truncate( + t: 2019-07-17T12:05:21.012Z + unit: 1s +) + +// Returns 2019-07-17T12:05:21.000000000Z +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ + +### unit +The unit time to truncate to. + +_**Data type:** Duration_ + +{{% note %}} +Only use `1` and the unit of time to specify the `unit`. +For example: `1s`, `1m`, `1h`. +{{% /note %}} + +## Examples +```js +import "date" + +date.truncate(t: "2019-06-03T13:59:01.000000000Z", unit: 1s) +// Returns 2019-06-03T13:59:01.000000000Z + +date.truncate(t: "2019-06-03T13:59:01.000000000Z", unit: 1m) +// Returns 2019-06-03T13:59:00.000000000Z + +date.truncate(t: "2019-06-03T13:59:01.000000000Z", unit: 1h) +// Returns 2019-06-03T13:00:00.000000000Z + +``` diff --git a/content/v2.0/reference/flux/functions/date/week.md b/content/v2.0/reference/flux/functions/date/week.md new file mode 100644 index 000000000..8e1bede7b --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/week.md @@ -0,0 +1,31 @@ +--- +title: date.week() function +description: > + The `date.week()` function returns the ISO week of the year for a specified time. + Results range from `[1-53]`. +menu: + v2_0_ref: + name: date.week + parent: Date +weight: 301 +--- + +The `date.week()` function returns the ISO week of the year for a specified time. +Results range from `[1-53]`. + +_**Function type:** Transformation_ + +```js +import "date" + +date.week(t: 2019-07-17T12:05:21.012Z) + +// Returns 29 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ diff --git a/content/v2.0/visualize-data/visualization-types/single-stat.md b/content/v2.0/visualize-data/visualization-types/single-stat.md deleted file mode 100644 index 10c49e303..000000000 --- a/content/v2.0/visualize-data/visualization-types/single-stat.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Single Stat visualization -list_title: Single stat -list_image: /img/2-0-visualizations-single-stat-example.png -description: > - The Single Stat view displays the most recent value of the specified time series as a numerical value. -weight: 205 -menu: - v2_0: - name: Single Stat - parent: Visualization types ---- - -The **Single Stat** view displays the most recent value of the specified time series as a numerical value. - -{{< img-hd src="/img/2-0-visualizations-single-stat-example.png" alt="Single stat example" />}} - -Select the **Single Stat** option from the visualization dropdown in the upper right. - -## Single Stat behavior -The Single Stat visualization displays a single numeric data point. -It uses the latest point in the first table (or series) returned by the query. - -{{% note %}} -#### Queries should return one table -Flux does not guarantee the order in which tables are returned. -If a query returns multiple tables (or series), the table order can change between query executions -and result in the Single Stat visualization displaying inconsistent data. -For consistent results, the Single Stat query should return a single table. -{{% /note %}} - -## Single Stat Controls -To view **Single Stat** controls, click the settings icon ({{< icon "gear" >}}) -next to the visualization dropdown in the upper right. - -- **Prefix**: Prefix to be added to the single stat. -- **Suffix**: Suffix to be added to the single stat. -- **Decimal Places**: The number of decimal places to display for the single stat. - - **Auto** or **Custom**: Enable or disable auto-setting. - -###### Colorized Thresholds -- **Base Color**: Select a base or background color from the selection list. -- **Add a Threshold**: Change the color of the single stat based on the current value. - - **Value is**: Enter the value at which the single stat should appear in the selected color. - Choose a color from the dropdown menu next to the value. -- **Colorization**: Choose **Text** for the single stat to change color based on the configured thresholds. - Choose **Background** for the background of the graph to change color based on the configured thresholds. - -## Single Stat examples - -### Show human-readable current value -The following example shows the current memory usage displayed has a human-readable percentage: - -###### Query memory usage percentage -```js -from(bucket: "example-bucket") - |> range(start: v.timeRangeStart, stop: v.timeRangeStop) - |> filter(fn: (r) => - r._measurement == "mem" and - r._field == "used_percent" - ) -``` - -###### Memory usage as a single stat -{{< img-hd src="/img/2-0-visualizations-single-stat-memor.png" alt="Graph + Single Stat Memory Usage Example" />}} From 22bcd1c9510e88b70a6ff024e0b905b997fcc3ec Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 23 Jul 2019 15:48:51 -0600 Subject: [PATCH 004/258] re-added single stat graph doc that was unintentially removed --- .../visualization-types/single-stat.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 content/v2.0/visualize-data/visualization-types/single-stat.md diff --git a/content/v2.0/visualize-data/visualization-types/single-stat.md b/content/v2.0/visualize-data/visualization-types/single-stat.md new file mode 100644 index 000000000..10c49e303 --- /dev/null +++ b/content/v2.0/visualize-data/visualization-types/single-stat.md @@ -0,0 +1,65 @@ +--- +title: Single Stat visualization +list_title: Single stat +list_image: /img/2-0-visualizations-single-stat-example.png +description: > + The Single Stat view displays the most recent value of the specified time series as a numerical value. +weight: 205 +menu: + v2_0: + name: Single Stat + parent: Visualization types +--- + +The **Single Stat** view displays the most recent value of the specified time series as a numerical value. + +{{< img-hd src="/img/2-0-visualizations-single-stat-example.png" alt="Single stat example" />}} + +Select the **Single Stat** option from the visualization dropdown in the upper right. + +## Single Stat behavior +The Single Stat visualization displays a single numeric data point. +It uses the latest point in the first table (or series) returned by the query. + +{{% note %}} +#### Queries should return one table +Flux does not guarantee the order in which tables are returned. +If a query returns multiple tables (or series), the table order can change between query executions +and result in the Single Stat visualization displaying inconsistent data. +For consistent results, the Single Stat query should return a single table. +{{% /note %}} + +## Single Stat Controls +To view **Single Stat** controls, click the settings icon ({{< icon "gear" >}}) +next to the visualization dropdown in the upper right. + +- **Prefix**: Prefix to be added to the single stat. +- **Suffix**: Suffix to be added to the single stat. +- **Decimal Places**: The number of decimal places to display for the single stat. + - **Auto** or **Custom**: Enable or disable auto-setting. + +###### Colorized Thresholds +- **Base Color**: Select a base or background color from the selection list. +- **Add a Threshold**: Change the color of the single stat based on the current value. + - **Value is**: Enter the value at which the single stat should appear in the selected color. + Choose a color from the dropdown menu next to the value. +- **Colorization**: Choose **Text** for the single stat to change color based on the configured thresholds. + Choose **Background** for the background of the graph to change color based on the configured thresholds. + +## Single Stat examples + +### Show human-readable current value +The following example shows the current memory usage displayed has a human-readable percentage: + +###### Query memory usage percentage +```js +from(bucket: "example-bucket") + |> range(start: v.timeRangeStart, stop: v.timeRangeStop) + |> filter(fn: (r) => + r._measurement == "mem" and + r._field == "used_percent" + ) +``` + +###### Memory usage as a single stat +{{< img-hd src="/img/2-0-visualizations-single-stat-memor.png" alt="Graph + Single Stat Memory Usage Example" />}} From ce94a620572c6ec3446761fec2172a3c4c558d83 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 23 Jul 2019 16:32:07 -0600 Subject: [PATCH 005/258] added relativeStrengthIndex function doc, resolves #339 --- .../aggregates/movingaverage.md | 10 -- .../aggregates/relativestrengthindex.md | 105 ++++++++++++++++++ 2 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md index ee4687b40..d95951548 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md @@ -52,16 +52,6 @@ from(bucket: "example-bucket"): |> movingAverage(n: 5) ``` -#### Calculate a ten point moving average -```js -movingAverage = (every, period, column="_value", tables=<-) => - tables - |> window(every: every, period: period) - |> mean(column: column) - |> duplicate(column: "_stop", as: "_time") - |> window(every: inf) -``` - #### Table transformation with a two point moving average ###### Input table: diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md new file mode 100644 index 000000000..36d0c7b0a --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md @@ -0,0 +1,105 @@ +--- +title: relativeStrengthIndex() function +description: > + The `relativeStrengthIndex()` function is a momentum indicator that compares the + magnitude of recent increases and decreases of values over a period of time period + to measure the speed and change of data movements. +menu: + v2_0_ref: + name: relativeStrengthIndex + parent: built-in-aggregates +weight: 501 +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#relative-strength-index, InfluxQL RELATIVE_STRENGTH_INDEX() +--- + +The `relativeStrengthIndex()` function is a momentum indicator that compares the +magnitude of recent increases and decreases of values over a period of time period +to measure thepeed and change of data movements. + +_**Function type:** Aggregate_ + +```js +relativeStrengthIndex( + n: 5, + columns: ["_value"] +) +``` + +##### Relative strength index rules: +- The general equation for calculating a relative strength index (RSI) is + `RSI = 100 - (100 / (1 + (AVG GAIN / AVG LOSS)))`. +- For the first value of the RSI, `AVG GAIN` and `AVG LOSS` are simple `n`-period averages. +- For subsequent calculations: + - `AVG GAIN` = `((PREVIOUS AVG GAIN) * (n - 1)) / n` + - `AVG LOSS` = `((PREVIOUS AVG LOSS) * (n - 1)) / n` +- `relativeStrengthIndex()` ignores `null` values. + +## Parameters + +### n +The sample size of the algorithm. + +_**Data type:** Integer_ + +### columns +Columns to operate on. _Defaults to `["_value"]`_. + +_**Data type:** Array of Strings_ + +## Examples + +#### Calculate a five point relative strength index +```js +from(bucket: "example-bucket"): + |> range(start: -12h) + |> relativeStrengthIndex(n: 5) +``` + +#### Table transformation with a ten point RSI + +###### Input table: +| _time | A | B | tag | +|:-----:|:----:|:----:|:---:| +| 0001 | 1 | 1 | tv | +| 0002 | 2 | 2 | tv | +| 0003 | 3 | 3 | tv | +| 0004 | 4 | 4 | tv | +| 0005 | 5 | 5 | tv | +| 0006 | 6 | 6 | tv | +| 0007 | 7 | 7 | tv | +| 0008 | 8 | 8 | tv | +| 0009 | 9 | 9 | tv | +| 0010 | 10 | 10 | tv | +| 0011 | 11 | 11 | tv | +| 0012 | 12 | 12 | tv | +| 0013 | 13 | 13 | tv | +| 0014 | 14 | 14 | tv | +| 0015 | 15 | 15 | tv | +| 0016 | 16 | 16 | tv | +| 0017 | 17 | null | tv | +| 0018 | 18 | 17 | tv | + +###### Query: +```js +// ... + |> relativeStrengthIndex( + n: 10, + columns: ["A", "B"] + ) +``` + +###### Output table: +| _time | A | B | tag | +|:-----:|:----:|:----:|:---:| +| 0011 | 100 | 100 | tv | +| 0012 | 100 | 100 | tv | +| 0013 | 100 | 100 | tv | +| 0014 | 100 | 100 | tv | +| 0015 | 100 | 100 | tv | +| 0016 | 90 | 90 | tv | +| 0017 | 81 | 90 | tv | +| 0018 | 72.9 | 81 | tv | From 9f2cd6bb510ea8b57db961d33a2ce9a8c803b1dd Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 24 Jul 2019 15:06:16 -0600 Subject: [PATCH 006/258] updated RSI function doc to address PR feedback --- .../aggregates/relativestrengthindex.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md index 36d0c7b0a..8ffb36750 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md @@ -1,9 +1,8 @@ --- title: relativeStrengthIndex() function description: > - The `relativeStrengthIndex()` function is a momentum indicator that compares the - magnitude of recent increases and decreases of values over a period of time period - to measure the speed and change of data movements. + The `relativeStrengthIndex()` function measures the relative speed and change of + values in an input table. menu: v2_0_ref: name: relativeStrengthIndex @@ -16,9 +15,8 @@ related: - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#relative-strength-index, InfluxQL RELATIVE_STRENGTH_INDEX() --- -The `relativeStrengthIndex()` function is a momentum indicator that compares the -magnitude of recent increases and decreases of values over a period of time period -to measure thepeed and change of data movements. +The `relativeStrengthIndex()` function measures the relative speed and change of +values in an input table. _**Function type:** Aggregate_ @@ -32,7 +30,7 @@ relativeStrengthIndex( ##### Relative strength index rules: - The general equation for calculating a relative strength index (RSI) is `RSI = 100 - (100 / (1 + (AVG GAIN / AVG LOSS)))`. -- For the first value of the RSI, `AVG GAIN` and `AVG LOSS` are simple `n`-period averages. +- For the first value of the RSI, `AVG GAIN` and `AVG LOSS` are averages of the `n` period. - For subsequent calculations: - `AVG GAIN` = `((PREVIOUS AVG GAIN) * (n - 1)) / n` - `AVG LOSS` = `((PREVIOUS AVG LOSS) * (n - 1)) / n` @@ -41,7 +39,7 @@ relativeStrengthIndex( ## Parameters ### n -The sample size of the algorithm. +The number of values to use to calculate the RSI. _**Data type:** Integer_ From 93d4b284f798e1c61052bb35f82fa2c0c9cab538 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 24 Jul 2019 15:56:13 -0600 Subject: [PATCH 007/258] added the flux runtime package, resolves #352 --- .../flux/functions/runtime/_index.md | 22 +++++++++++++++++++ .../flux/functions/runtime/version.md | 20 +++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/runtime/_index.md create mode 100644 content/v2.0/reference/flux/functions/runtime/version.md diff --git a/content/v2.0/reference/flux/functions/runtime/_index.md b/content/v2.0/reference/flux/functions/runtime/_index.md new file mode 100644 index 000000000..b940e379a --- /dev/null +++ b/content/v2.0/reference/flux/functions/runtime/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux runtime package +list_title: Runtime package +description: > + The Flux runtime package includes functions that provide information about the + current Flux runtime. Import the `runtime` package. +menu: + v2_0_ref: + name: Runtime + parent: Flux packages and functions +weight: 202 +v2.0/tags: [runtime, functions, package] +--- + +The Flux runtime package includes functions that provide information about the +current Flux runtime. Import the `runtime` package: + +```js +import "runtime" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/runtime/version.md b/content/v2.0/reference/flux/functions/runtime/version.md new file mode 100644 index 000000000..84333887b --- /dev/null +++ b/content/v2.0/reference/flux/functions/runtime/version.md @@ -0,0 +1,20 @@ +--- +title: runtime.version() function +description: The `runtime.version()` function returns the current Flux version. +menu: + v2_0_ref: + name: runtime.version + parent: Runtime +weight: 401 +--- + +The `runtime.version()` function returns the current Flux version. + +_**Function type:** Miscellaneous_ +_**Output data type:** String_ + +```js +import "runtime" + +runtime.version() +``` From 3c2c4dba2dfdcf1e3f7ea28fb11a589cba8b8c03 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 26 Jul 2019 10:59:45 -0600 Subject: [PATCH 008/258] initial changes for alpha-17 --- content/v2.0/get-started.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/v2.0/get-started.md b/content/v2.0/get-started.md index 8470f8564..5461219fb 100644 --- a/content/v2.0/get-started.md +++ b/content/v2.0/get-started.md @@ -27,7 +27,7 @@ This article describes how to get started with InfluxDB OSS. To get started with ### Download and install InfluxDB v2.0 alpha Download InfluxDB v2.0 alpha for macOS. -InfluxDB v2.0 alpha (macOS) +InfluxDB v2.0 alpha (macOS) ### Unpackage the InfluxDB binaries Unpackage the downloaded archive. @@ -36,7 +36,7 @@ _**Note:** The following commands are examples. Adjust the file paths to your ow ```sh # Unpackage contents to the current working directory -gunzip -c ~/Downloads/influxdb_2.0.0-alpha.16_darwin_amd64.tar.gz | tar xopf - +gunzip -c ~/Downloads/influxdb_2.0.0-alpha.17_darwin_amd64.tar.gz | tar xopf - ``` If you choose, you can place `influx` and `influxd` in your `$PATH`. @@ -44,7 +44,7 @@ You can also prefix the executables with `./` to run then in place. ```sh # (Optional) Copy the influx and influxd binary to your $PATH -sudo cp influxdb_2.0.0-alpha.16_darwin_amd64/{influx,influxd} /usr/local/bin/ +sudo cp influxdb_2.0.0-alpha.17_darwin_amd64/{influx,influxd} /usr/local/bin/ ``` {{% note %}} @@ -90,8 +90,8 @@ influxd --reporting-disabled ### Download and install InfluxDB v2.0 alpha Download the InfluxDB v2.0 alpha package appropriate for your chipset. -InfluxDB v2.0 alpha (amd64) -InfluxDB v2.0 alpha (arm) +InfluxDB v2.0 alpha (amd64) +InfluxDB v2.0 alpha (arm) ### Place the executables in your $PATH Unpackage the downloaded archive and place the `influx` and `influxd` executables in your system `$PATH`. @@ -100,10 +100,10 @@ _**Note:** The following commands are examples. Adjust the file names, paths, an ```sh # Unpackage contents to the current working directory -tar xvzf path/to/influxdb_2.0.0-alpha.16_linux_amd64.tar.gz +tar xvzf path/to/influxdb_2.0.0-alpha.17_linux_amd64.tar.gz # Copy the influx and influxd binary to your $PATH -sudo cp influxdb_2.0.0-alpha.16_linux_amd64/{influx,influxd} /usr/local/bin/ +sudo cp influxdb_2.0.0-alpha.17_linux_amd64/{influx,influxd} /usr/local/bin/ ``` {{% note %}} From 87ba42544a20be1043b9be162bd698af9fa5f54e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 26 Jul 2019 11:16:06 -0600 Subject: [PATCH 009/258] fixed bad frontmatter --- .../built-in/transformations/aggregates/movingaverage.md | 6 +----- .../transformations/aggregates/timedmovingaverage.md | 3 --- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md index 6691c7b02..742bce355 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md @@ -9,12 +9,8 @@ menu: weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ -<<<<<<< HEAD - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ -======= - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ ->>>>>>> flux-0.38 + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md index 2dec95128..1809552ac 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md @@ -11,10 +11,7 @@ weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ -<<<<<<< HEAD - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ -======= ->>>>>>> flux-0.38 - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- From 004a623107da9dfe698396f2466f9c91943e3891 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 26 Jul 2019 15:04:01 -0600 Subject: [PATCH 010/258] added tripleEMA(), udpated params on existing moving avg docs --- .../transformations/aggregates/doubleema.md | 46 ++++++------- .../aggregates/exponentialmovingaverage.md | 43 +++++------- .../aggregates/movingaverage.md | 37 ++++------ .../aggregates/timedmovingaverage.md | 1 + .../transformations/aggregates/tripleema.md | 68 +++++++++++++++++++ 5 files changed, 121 insertions(+), 74 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md index 12f7ecc6a..2c11353cf 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md @@ -1,9 +1,9 @@ --- title: doubleEMA() function description: > - The `doubleEMA()` or `doubleExponentialMovingAverage()` function calculates the - exponential moving average of values grouped into `n` number of points, - giving more weight to recent data at double the rate of `exponentialMovingAverage()`. + The `doubleEMA()` function calculates the exponential moving average of values + grouped into `n` number of points, giving more weight to recent data at double + the rate of `exponentialMovingAverage()`. menu: v2_0_ref: name: doubleEMA @@ -11,30 +11,20 @@ menu: weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#double-exponential-moving-average, InfluxQL DOUBLE_EXPONENTIAL_MOVING_AVERAGE() --- -The `doubleEMA()` or `doubleExponentialMovingAverage()` function calculates the -exponential moving average (EMA) of values grouped into `n` number of points, -giving more weight to recent data at double the rate of -[`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/). +The `doubleEMA()` function calculates the exponential moving average of values in +the `_value` column grouped into `n` number of points, giving more weight to recent +data at double the rate of [`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/). _**Function type:** Aggregate_ ```js -doubleExponentialMovingAverage( - n: 5, - columns: ["_value"] -) - -// OR - -doubleEMA( - n: 5, - columns: ["_value"] -) +doubleEMA(n: 5) ``` ##### Double exponential moving average rules: @@ -52,16 +42,22 @@ The number of points to average. _**Data type:** Integer_ -### columns -Columns to operate on. _Defaults to `["_value"]`_. - -_**Data type:** Array of Strings_ - ## Examples #### Calculate a five point double exponential moving average ```js from(bucket: "example-bucket"): |> range(start: -12h) - |> doubleExponentialMovingAverage(n: 5) + |> doubleEMA(n: 5) +``` + +## Function definition +```js +doubleEMA = (n, tables=<-) => + tables + |> exponentialMovingAverage(n:n) + |> duplicate(column:"_value", as:"ema") + |> exponentialMovingAverage(n:n) + |> map(fn: (r) => ({r with _value: 2.0 * r.ema - r._value})) + |> drop(columns: ["ema"]) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md index da132b4ab..4694eb75c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md @@ -1,8 +1,8 @@ --- title: exponentialMovingAverage() function description: > - The `exponentialMovingAverage()` function calculates the exponential moving average - of values grouped into `n` number of points, giving more weight to recent data. + The `exponentialMovingAverage()` function calculates the exponential moving average of values + in the `_value` column grouped into `n` number of points, giving more weight to recent data. menu: v2_0_ref: name: exponentialMovingAverage @@ -11,19 +11,18 @@ weight: 501 related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() --- -The `exponentialMovingAverage()` function calculates the exponential moving average -of values grouped into `n` number of points, giving more weight to recent data. +The `exponentialMovingAverage()` function calculates the exponential moving average of values +in the `_value` column grouped into `n` number of points, giving more weight to recent data. _**Function type:** Aggregate_ ```js -exponentialMovingAverage( - n: 5, - columns: ["_value"] -) +exponentialMovingAverage(n: 5) ``` ##### Exponential moving average rules: @@ -43,11 +42,6 @@ The number of points to average. _**Data type:** Integer_ -### columns -Columns to operate on. _Defaults to `["_value"]`_. - -_**Data type:** Array of Strings_ - ## Examples #### Calculate a five point exponential moving average @@ -60,23 +54,20 @@ from(bucket: "example-bucket"): #### Table transformation with a two point exponential moving average ###### Input table: -| _time | A | B | C | tag | -|:-----:|:----:|:----:|:----:|:---:| -| 0001 | 2 | null | 2 | tv | -| 0002 | null | 10 | 4 | tv | -| 0003 | 8 | 20 | 5 | tv | +| _time | tag | _value | +|:-----:|:---:|:------:| +| 0001 | tv | null | +| 0002 | tv | 10 | +| 0003 | tv | 20 | ###### Query: ```js // ... - |> exponentialMovingAverage( - n: 2, - columns: ["A", "B", "C"] - ) + |> exponentialMovingAverage(n: 2) ``` ###### Output table: -| _time | A | B | C | tag | -|:-----:|:----:|:----:|:----:|:---:| -| 0002 | 2 | 10 | 3 | tv | -| 0003 | 6 | 16.67| 4.33 | tv | +| _time | tag | _value | +|:-----:|:---:|:------:| +| 0002 | tv | 10 | +| 0003 | tv | 16.67 | diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md index 742bce355..5e8186c7e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md @@ -11,18 +11,17 @@ related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- -The `movingAverage()` function calculates the mean of values grouped into `n` number of points. +The `movingAverage()` function calculates the mean of values in the `_values` column +grouped into `n` number of points. _**Function type:** Aggregate_ ```js -movingAverage( - n: 5, - columns: ["_value"] -) +movingAverage(n: 5) ``` ##### Moving average rules: @@ -39,11 +38,6 @@ The number of points to average. _**Data type:** Integer_ -### columns -Columns to operate on. _Defaults to `["_value"]`_. - -_**Data type:** Array of Strings_ - ## Examples #### Calculate a five point moving average @@ -66,23 +60,20 @@ movingAverage = (every, period, column="_value", tables=<-) => #### Table transformation with a two point moving average ###### Input table: -| _time | A | B | C | D | tag | -|:-----:|:----:|:----:|:----:|:----:|:---:| -| 0001 | null | 1 | 2 | null | tv | -| 0002 | 6 | 2 | null | null | tv | -| 0003 | 4 | null | 4 | 4 | tv | +| _time | tag | _value | +|:-----:|:---:|:------:| +| 0001 | tv | null | +| 0002 | tv | 6 | +| 0003 | tv | 4 | ###### Query: ```js // ... - |> movingAverage( - n: 2, - columns: ["A", "B", "C", "D"] - ) + |> movingAverage(n: 2 ) ``` ###### Output table: -| _time | A | B | C | D | tag | -|:-----:|:----:|:----:|:----:|:----:|:---:| -| 0002 | 6 | 1.5 | 2 | null | tv | -| 0003 | 5 | 2 | 4 | 4 | tv | +| _time | tag | _value | +|:-----:|:---:|:------:| +| 0002 | tv | 6 | +| 0003 | tv | 5 | diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md index 1809552ac..d9b435213 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md @@ -12,6 +12,7 @@ related: - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md new file mode 100644 index 000000000..6618acab7 --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md @@ -0,0 +1,68 @@ +--- +title: tripleEMA() function +description: > + The `tripleEMA()` function calculates the exponential moving average of values + grouped into `n` number of points, giving more weight to recent data with less lag + than `exponentialMovingAverage()` and `doubleEMA()`. +menu: + v2_0_ref: + name: tripleEMA + parent: built-in-aggregates +weight: 501 +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() +--- + +The `tripleEMA()` function calculates the exponential moving average of values in +the `_value` column grouped into `n` number of points, giving more weight to recent +data with less lag than +[`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/) +and [`doubleEMA()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/). + +_**Function type:** Aggregate_ + +```js +tripleEMA(n: 5) +``` + +##### Triple exponential moving average rules: +- A triple exponential moving average is defined as `tripleEMA = (3 * EMA_1) - (3 * EMA_2) + EMA_3`. + - `EMA_1` is the exponential moving average of the original data. + - `EMA_2` is the exponential moving average of `EMA_1`. + - `EMA_3` is the exponential moving average of `EMA_2`. +- A true triple exponential moving average requires at least requires at least `3 * n - 2` values. + If not enough values exist to calculate the triple EMA, it returns a `NaN` value. +- `tripleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). + +## Parameters + +### n +The number of points to average. + +_**Data type:** Integer_ + +## Examples + +#### Calculate a five point triple exponential moving average +```js +from(bucket: "example-bucket"): + |> range(start: -12h) + |> tripleEMA(n: 5) +``` + +## Function definition +```js +tripleEMA = (n, tables=<-) => + tables + |> exponentialMovingAverage(n:n) + |> duplicate(column:"_value", as:"ema1") + |> exponentialMovingAverage(n:n) + |> duplicate(column:"_value", as:"ema2") + |> exponentialMovingAverage(n:n) + |> map(fn: (r) => ({r with _value: 3.0 * r.ema1 - 3.0 * r.ema2 + r._value})) + |> drop(columns: ["ema1", "ema2"]) +``` From 305e2e318c056560d0b274f10860750f7c52a1fe Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 26 Jul 2019 15:34:40 -0600 Subject: [PATCH 011/258] added the chandeMomentumOscillator function, resolves #360 --- .../aggregates/chandemomentumoscillator.md | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md new file mode 100644 index 000000000..18026638c --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md @@ -0,0 +1,109 @@ +--- +title: chandeMomentumOscillator() function +description: > + The `chandeMomentumOscillator()` function applies the technical momentum indicator + developed by Tushar Chande. +menu: + v2_0_ref: + name: chandeMomentumOscillator + parent: built-in-aggregates +weight: 501 +related: + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL CHANDE_MOMENTUM_OSCILLATOR() +--- + +The `chandeMomentumOscillator()` function applies the technical momentum indicator +developed by Tushar Chande. + +_**Function type:** Aggregate_ + +```js +chandeMomentumOscillator( + n: 10, + columns: ["_value"] +) +``` + +The Chande Momentum Oscillator (CMO) indicator calculates the difference between +the sum of all recent higher data points and the sum of all recent lower data points, +then divides the result by the sum of all data movement over a given time period. +It then multiplies the result by 100 and returns a value between -100 and +100. + +## Parameters + +### n +The period or number of points to use in the calculation. + +_**Data type: Integer**_ + +### columns +The columns to operate on. +Defaults to `["_value"]`. + +_**Data type: Array of Strings**_ + +## Examples + +#### Table transformation with a ten point Chande Momentum Oscillator + +###### Input table +| _time | _value | +|:-----:|:------:| +| 0001 | 1 | +| 0002 | 2 | +| 0003 | 3 | +| 0004 | 4 | +| 0005 | 5 | +| 0006 | 6 | +| 0007 | 7 | +| 0008 | 8 | +| 0009 | 9 | +| 0010 | 10 | +| 0011 | 11 | +| 0012 | 12 | +| 0013 | 13 | +| 0014 | 14 | +| 0015 | 15 | +| 0016 | 14 | +| 0017 | 13 | +| 0018 | 12 | +| 0019 | 11 | +| 0020 | 10 | +| 0021 | 9 | +| 0022 | 8 | +| 0023 | 7 | +| 0024 | 6 | +| 0025 | 5 | +| 0026 | 4 | +| 0027 | 3 | +| 0028 | 2 | +| 0029 | 1 | + +###### Query +```js +// ... + |> chandeMomentumOscillator(n: 10) +``` + +###### Output table +| _time | _value | +|:-----:|:------:| +| 0011 | 100 | +| 0012 | 100 | +| 0013 | 100 | +| 0014 | 100 | +| 0015 | 100 | +| 0016 | 80 | +| 0017 | 60 | +| 0018 | 40 | +| 0019 | 20 | +| 0020 | 0 | +| 0021 | -20 | +| 0022 | -40 | +| 0023 | -60 | +| 0024 | -80 | +| 0025 | -100 | +| 0026 | -100 | +| 0027 | -100 | +| 0028 | -100 | +| 0029 | -100 | From a9e553ed44f9a03be55d6a5a5f377f79bd09c0b1 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 26 Jul 2019 15:52:58 -0600 Subject: [PATCH 012/258] added keepFirst param to difference function --- .../transformations/aggregates/difference.md | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md index f864f6626..d7d45b091 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md @@ -17,7 +17,11 @@ _**Function type:** Aggregate_ _**Output data type:** Float_ ```js -difference(nonNegative: false, column: "_value") +difference( + nonNegative: false, + column: "_value", + keepFirst: false +) ``` ## Parameters @@ -34,6 +38,13 @@ Defaults to `"_value"`. _**Data type:** String_ +### keepFirst +Indicates if the first row should be kept. +If `true`, the difference will be `null`. +Defaults to `false`. + +_**Data type:** Boolean_ + ## Subtraction rules for numeric types - The difference between two non-null values is their algebraic difference; or `null`, if the result is negative and `nonNegative: true`; @@ -90,6 +101,20 @@ from(bucket: "example-bucket") | 0004 | 6 | tv | | 0005 | null | tv | + +#### With keepFirst set to true +```js +|> difference(nonNegative: false, keepfirst: true): +``` +###### Output table +| _time | _value | tag | +|:-----:|:------:|:---:| +| 0001 | null | tv | +| 0002 | null | tv | +| 0003 | -2 | tv | +| 0004 | 6 | tv | +| 0005 | null | tv | +
##### Related InfluxQL functions and statements: From b381781d19cba2024db4f0c8f7d80259668ccf0c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 29 Jul 2019 10:49:49 -0600 Subject: [PATCH 013/258] updated difference function doc to address PR feedback --- .../functions/built-in/transformations/aggregates/difference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md index d7d45b091..3e52efdba 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md @@ -39,7 +39,7 @@ Defaults to `"_value"`. _**Data type:** String_ ### keepFirst -Indicates if the first row should be kept. +Indicates the first row should be kept. If `true`, the difference will be `null`. Defaults to `false`. From f581191349306e5c4838ef44bdc2f40d66fd68d4 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 29 Jul 2019 10:56:30 -0600 Subject: [PATCH 014/258] added more details about the CMO algorithm calculation to address PR feedback --- .../transformations/aggregates/chandemomentumoscillator.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md index 18026638c..78b5a118b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md @@ -25,7 +25,8 @@ chandeMomentumOscillator( ``` The Chande Momentum Oscillator (CMO) indicator calculates the difference between -the sum of all recent higher data points and the sum of all recent lower data points, +the sum of all recent data points with values greater than the median value of the data set +and the sum of all recent data points with values lower than the median value of the data set, then divides the result by the sum of all data movement over a given time period. It then multiplies the result by 100 and returns a value between -100 and +100. From a2c9de850a849d73e16d1b09fb57542b49734d2e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 5 Aug 2019 13:21:51 -0600 Subject: [PATCH 015/258] added date.year function --- .../reference/flux/functions/date/year.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/date/year.md diff --git a/content/v2.0/reference/flux/functions/date/year.md b/content/v2.0/reference/flux/functions/date/year.md new file mode 100644 index 000000000..b2e2a80b4 --- /dev/null +++ b/content/v2.0/reference/flux/functions/date/year.md @@ -0,0 +1,29 @@ +--- +title: date.year() function +description: > + The `date.year()` function returns the year of a specified time. +menu: + v2_0_ref: + name: date.year + parent: Date +weight: 301 +--- + +The `date.year()` function returns the year of a specified time. + +_**Function type:** Transformation_ + +```js +import "date" + +date.year(t: 2019-07-17T12:05:21.012Z) + +// Returns 2019 +``` + +## Parameters + +### t +The time to operate on. + +_**Data type:** Time_ From ba7bcd645239cc53d4b4761e7909ca15a8cff2e8 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 14:11:46 -0600 Subject: [PATCH 016/258] added holtWinters function --- .../transformations/aggregates/doubleema.md | 2 +- .../aggregates/exponentialmovingaverage.md | 2 +- .../transformations/aggregates/holtwinters.md | 114 ++++++++++++++++++ .../aggregates/movingaverage.md | 2 +- .../aggregates/relativestrengthindex.md | 2 +- .../transformations/aggregates/tripleema.md | 2 +- 6 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md index 2c11353cf..88a99ef58 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md @@ -27,7 +27,7 @@ _**Function type:** Aggregate_ doubleEMA(n: 5) ``` -##### Double exponential moving average rules: +##### Double exponential moving average rules - A double exponential moving average is defined as `doubleEMA = 2 * EMA_N - EMA of EMA_N`. - `EMA` is an exponential moving average. - `N = n` is the period used to calculate the EMA. diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md index 4694eb75c..c543ab342 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md @@ -25,7 +25,7 @@ _**Function type:** Aggregate_ exponentialMovingAverage(n: 5) ``` -##### Exponential moving average rules: +##### Exponential moving average rules - The first value of an exponential moving average over `n` values is the algebraic mean of `n` values. - Subsequent values are calculated as `y(t) = x(t) * k + y(t-1) * (1 - k)`, where: diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md new file mode 100644 index 000000000..46829e1da --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md @@ -0,0 +1,114 @@ +--- +title: holtWinters() function +description: > + The `holtWinters()` function applies the Holt-Winters forecasting method to input tables. +aliases: + - /v2.0/reference/flux/functions/transformations/aggregates/holtwinters +menu: + v2_0_ref: + name: holtWinters + parent: built-in-aggregates +weight: 501 +related: + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#holt-winters, InfluxQL HOLT_WINTERS() +--- + +The `holtWinters()` function applies the Holt-Winters forecasting method to input tables. + +_**Function type:** Aggregate_ +_**Output data type:** Float_ + +```js +holtWinters( + n: 10, + seasonality: 4, + interval: 30d, + withFit: false, + timeColumn: "_time", + column: "_value", +) +``` + +The Holt-Winters method predicts [`n`](#n) seasonally-adjusted values for the +specified [`column`](#column) at the specified [`interval`](#interval). +For example, if `interval` is `6m` and `n` is `3`, results include three predicted +values six minutes apart. + +#### Seasonality +[`seasonality`](#seasonality) delimits the length of a seasonal pattern according to `interval`. +If your `interval` is `2m` and `s` is `3`, then the seasonal pattern occurs every +six minutes or every three data points. +If there is no seasonality in the data, set `seasonality` to `0`. + +#### Space values evenly in time +`holtWinters()` expects values evenly spaced in time. +To ensure this, it applies the following rules: + +- `interval` is used to divide the into buckets based time. +- If a bucket includes many values, the first value is used. +- If a bucket includes no values, a missing value (`null`) is added for that bucket. + +By default, `holtWinters()` uses the first value in each time bucket. +Use [`window()`](/v2.0/reference/flux/functions/built-in/transformations/window/) +and [selectors](/v2.0/reference/flux/functions/built-in/transformations/selectors/) +or [aggregates](/v2.0/reference/flux/functions/built-in/transformations/aggregates/), +or use [`aggregateWindow()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) +to specify other values to use in the `holtWinters()` calculation. + +#### Fitted model +The `holtWinters()` function applies the [Nelder-Mead optimization](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) +to include "fitted" data points in results when [`withFit`](#withfit) is set to `true`. + +#### Null timestamps +`holtWinters()` discards rows with `null` timestamps before running the Holt-Winters calculation. + +#### Null values +`holtWinters()` treats `null` values as missing data points and includes them in the Holt-Winters calculation. + + +## Parameters + +### n +The number of values to predict. + +_**Data type: Integer**_ + +### seasonality +The number of points in a season. +Defaults to `0`. + +_**Data type: Integer**_ + +### interval +The interval between two data points. + +_**Data type: Duration**_ + +### withFit +Return [fitted data](#fitted-model) in results. +Defaults to `false`. + +_**Data type: Boolean**_ + +### timeColumn +The time column to use. +Defaults to `"_time"`. + +_**Data type: String**_ + +### column +The column to operate on. +Defaults to `"_value"`. + +_**Data type: String**_ + +## Examples + +##### Use aggregateWindow to prepare data for holtWinters +```js +from(bucket: "example-bucket") + |> range(start: -7y) + |> filter(fn: (r) => r._field == "water_level") + |> aggregateWindow(every: 379m, fn: first). + |> holtWinters(n: 10, seasonality: 4, interval: 379m) +``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md index de1bc07ab..3ee8221c2 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md @@ -24,7 +24,7 @@ _**Function type:** Aggregate_ movingAverage(n: 5) ``` -##### Moving average rules: +##### Moving average rules - The average over a period populated by `n` values is equal to their algebraic mean. - The average over a period populated by only `null` values is `null`. - Moving averages skip `null` values. diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md index 8ffb36750..d8f08460b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md @@ -27,7 +27,7 @@ relativeStrengthIndex( ) ``` -##### Relative strength index rules: +##### Relative strength index rules - The general equation for calculating a relative strength index (RSI) is `RSI = 100 - (100 / (1 + (AVG GAIN / AVG LOSS)))`. - For the first value of the RSI, `AVG GAIN` and `AVG LOSS` are averages of the `n` period. diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md index 6618acab7..cb084a607 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md @@ -29,7 +29,7 @@ _**Function type:** Aggregate_ tripleEMA(n: 5) ``` -##### Triple exponential moving average rules: +##### Triple exponential moving average rules - A triple exponential moving average is defined as `tripleEMA = (3 * EMA_1) - (3 * EMA_2) + EMA_3`. - `EMA_1` is the exponential moving average of the original data. - `EMA_2` is the exponential moving average of `EMA_1`. From 6b1342916e4686e80a377ec32ef03d798f769076 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 14:52:36 -0600 Subject: [PATCH 017/258] marked date.year as draft --- content/v2.0/reference/flux/functions/date/year.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/v2.0/reference/flux/functions/date/year.md b/content/v2.0/reference/flux/functions/date/year.md index b2e2a80b4..d420ed839 100644 --- a/content/v2.0/reference/flux/functions/date/year.md +++ b/content/v2.0/reference/flux/functions/date/year.md @@ -7,6 +7,7 @@ menu: name: date.year parent: Date weight: 301 +draft: true --- The `date.year()` function returns the year of a specified time. From 8c9fd6a5245aad1ed24bc09a1d93019f771ed40a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 15:48:35 -0600 Subject: [PATCH 018/258] added flux 0.38.0 release notes --- content/v2.0/reference/release-notes/flux.md | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index ffb1490e1..f3c011dbc 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,37 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.37.2**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.38.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.38.0 [2019-08-06] + +### Features +- Update selectors to operate on time columns. +- Add `relativeStrengthIndex()` transformation. +- Add double and triple exponential average transformations (`doubleEMA()` and `tripleEMA()`). +- Add `holtWinters()` transformation. +- Add `keepFirst` parameter to `difference()`. +- DatePart equivalent functions. +- Add runtime package. +- Add and subtract duration literal arithmetic. +- Allow `keep()` to run regardless of nonexistent columns. + If all columns given are nonexistent, `keep()` returns an empty table. +- Scanner returns positioning. + +### Bug fixes +- Function resolver now keeps track of local assignments that may be evaluated at runtime. +- Fixed InfluxDB test errors. +- Add range to tests to pass in InfluxDB. +- Allow converting a duration to a duration. +- Catch integer overflow and underflow for literals. + +--- + ## v0.37.2 [2019-07-24] - _General cleanup of internal code._ From a04c0f344fb4ef1bc8e93717ad93d7d4fc53dc41 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 16:20:24 -0600 Subject: [PATCH 019/258] added selector info to aggregateWindow, resolves #371 --- .../transformations/aggregates/aggregatewindow.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md index c82f5ee3b..5127800f3 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md @@ -10,7 +10,8 @@ menu: weight: 501 --- -The `aggregateWindow()` function applies an aggregate function to fixed windows of time. +The `aggregateWindow()` function applies an aggregate or selector function +(any function with a `column` parameter) to fixed windows of time. _**Function type:** Aggregate_ @@ -25,7 +26,7 @@ aggregateWindow( ) ``` -As data is windowed into separate tables and aggregated, the `_time` column is dropped from each group key. +As data is windowed into separate tables and processed, the `_time` column is dropped from each group key. This function copies the timestamp from a remaining column into the `_time` column. View the [function definition](#function-definition). @@ -42,7 +43,7 @@ The [aggregate function](/v2.0/reference/flux/functions/built-in/transformations _**Data type:** Function_ {{% note %}} -Only aggregate functions with a `column` parameter (singular) work with `aggregateWindow()`. +Only aggregate and selector functions with a `column` parameter (singular) work with `aggregateWindow()`. {{% /note %}} ### column @@ -84,10 +85,10 @@ from(bucket: "example-bucket") fn: mean ) ``` -###### Specifying parameters of the aggregate function -To use `aggregateWindow()` aggregate functions that don't provide defaults for required parameters, -for the `fn` parameter, define an anonymous function with `columns` and `tables` parameters -that pipe-forwards tables into the aggregate function with all required parameters defined: +###### Specify parameters of the aggregate function +To use functions that don't provide defaults for required parameters with `aggregateWindow()`, +define an anonymous function with `column` and `tables` parameters that pipe-forward +tables into the aggregate or selector function with all required parameters defined: ```js from(bucket: "example-bucket") From 6a85f883b46daefb54c897429bfab7d439132cae Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 16:36:46 -0600 Subject: [PATCH 020/258] upated holtWinters doc to address PR feedback --- .../transformations/aggregates/holtwinters.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md index 46829e1da..7301ce089 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md @@ -36,24 +36,25 @@ values six minutes apart. #### Seasonality [`seasonality`](#seasonality) delimits the length of a seasonal pattern according to `interval`. -If your `interval` is `2m` and `s` is `3`, then the seasonal pattern occurs every -six minutes or every three data points. -If there is no seasonality in the data, set `seasonality` to `0`. +If your `interval` is `2m` and `seasonality` is `4`, then the seasonal pattern occurs every +eight minutes or every four data points. +If data doesn't have a seasonal pattern, set `seasonality` to `0`. #### Space values evenly in time `holtWinters()` expects values evenly spaced in time. -To ensure this, it applies the following rules: +To ensure `holtWinters()` values are spaced evenly in time, the following rules apply: -- `interval` is used to divide the into buckets based time. +- Data is grouped into time-based "buckets" determined by the `interval`. - If a bucket includes many values, the first value is used. - If a bucket includes no values, a missing value (`null`) is added for that bucket. -By default, `holtWinters()` uses the first value in each time bucket. -Use [`window()`](/v2.0/reference/flux/functions/built-in/transformations/window/) -and [selectors](/v2.0/reference/flux/functions/built-in/transformations/selectors/) -or [aggregates](/v2.0/reference/flux/functions/built-in/transformations/aggregates/), -or use [`aggregateWindow()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) -to specify other values to use in the `holtWinters()` calculation. +By default, `holtWinters()` uses the first value in each time bucket to run the Holt-Winters calculation. +To specify other values to use in the calculation, use: + +- [`window()`](/v2.0/reference/flux/functions/built-in/transformations/window/) + with [selectors](/v2.0/reference/flux/functions/built-in/transformations/selectors/) + or [aggregates](/v2.0/reference/flux/functions/built-in/transformations/aggregates/) +- [`aggregateWindow()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) #### Fitted model The `holtWinters()` function applies the [Nelder-Mead optimization](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) @@ -65,7 +66,6 @@ to include "fitted" data points in results when [`withFit`](#withfit) is set to #### Null values `holtWinters()` treats `null` values as missing data points and includes them in the Holt-Winters calculation. - ## Parameters ### n From bcf28c309dba7c28d53b6d481733713f525bd62c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 16:47:16 -0600 Subject: [PATCH 021/258] fixed difference params, resolves #369 --- .../transformations/aggregates/difference.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md index f864f6626..4f402e82d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md @@ -11,13 +11,13 @@ weight: 501 --- The `difference()` function computes the difference between subsequent records. -The user-specified column of numeric type is subtracted while others are kept intact. +The user-specified columns of numeric type are subtracted while others are kept intact. _**Function type:** Aggregate_ _**Output data type:** Float_ ```js -difference(nonNegative: false, column: "_value") +difference(nonNegative: false, columns: ["_value"]) ``` ## Parameters @@ -28,11 +28,11 @@ When set to `true`, if a value is less than the previous value, it is assumed th _**Data type:** Boolean_ -### column -The column to use to compute the difference. -Defaults to `"_value"`. +### columns +The columns to use to compute the difference. +Defaults to `["_value"]`. -_**Data type:** String_ +_**Data type:** Array of Strings_ ## Subtraction rules for numeric types - The difference between two non-null values is their algebraic difference; From 3f2282324b989edae2000c66ad069cd464f09779 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Aug 2019 17:06:06 -0600 Subject: [PATCH 022/258] updated description of telegraf filecount plugin --- data/telegraf_plugins.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/telegraf_plugins.yml b/data/telegraf_plugins.yml index 0449a6a2d..8ed2882a8 100644 --- a/data/telegraf_plugins.yml +++ b/data/telegraf_plugins.yml @@ -416,7 +416,7 @@ input: - name: Filecount id: filecount description: | - The Filecount input plugin counts files in directories that match certain criteria. + The Filecount input plugin reports the number and total size of files in directories that match certain criteria. link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/filecount/README.md introduced: 1.8.0 tags: [linux, macos, windows, systems] From 6992b34fb8396ae6272d0e86498ea630dba6ba44 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 7 Aug 2019 09:42:19 -0600 Subject: [PATCH 023/258] added hourSelection function, resolves #363 --- .../built-in/transformations/hourselection.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md b/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md new file mode 100644 index 000000000..ec870c037 --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md @@ -0,0 +1,53 @@ +--- +title: hourSelection() function +description: > + The `hourSelection()` function retains all rows with time values in a specified hour range. + Hours are specified in military time. +aliases: + - /v2.0/reference/flux/functions/transformations/hourSelection +menu: + v2_0_ref: + name: hourSelection + parent: built-in-transformations +weight: 401 +--- + +The `hourSelection()` function retains all rows with time values in a specified hour range. + +_**Function type:** Transformation_ + +```js +hourSelection( + start: 9, + stop: 15, + timeColumn: "_time" +) +``` + +## Parameters + +### start +The first hour of the hour range (inclusive). +Hours range from `[0-23]`. + +_**Data type:** Integer_ + +### stop +The last hour of the hour range (inclusive). +Hours range from `[0-23]`. + +_**Data type:** Integer_ + +### timeColumn +The column that contains the time value. +Default is `"_time"`. + +_**Data type:** String_ + +## Examples +```js +from(bucket:"example-bucket") + |> range(start:-90d) + |> filter(fn: (r) => r._measurement == "foot-traffic" ) + |> hourSelection(start: 9, stop: 17) +``` From 934ed4b6e8059b288e31063237723fa56a955aa3 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 7 Aug 2019 14:23:51 -0600 Subject: [PATCH 024/258] add example title to hourSelection example --- .../flux/functions/built-in/transformations/hourselection.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md b/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md index ec870c037..0b9b2f58b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md @@ -19,7 +19,7 @@ _**Function type:** Transformation_ ```js hourSelection( start: 9, - stop: 15, + stop: 17, timeColumn: "_time" ) ``` @@ -45,6 +45,8 @@ Default is `"_time"`. _**Data type:** String_ ## Examples + +##### Use only data from 9am to 5pm ```js from(bucket:"example-bucket") |> range(start:-90d) From 4ba04ad1b7237b6c01f81a53f77905764fd3233f Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 7 Aug 2019 17:12:57 -0600 Subject: [PATCH 025/258] added influxd report-tsi doc, resolves #359 --- .../reference/cli/influxd/inspect/_index.md | 13 +++--- .../cli/influxd/inspect/report-tsi.md | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 content/v2.0/reference/cli/influxd/inspect/report-tsi.md diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index 834a4a675..b7e37e496 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -16,12 +16,13 @@ influxd inspect [subcommand] ``` ## Subcommands -| Subcommand | Description | -|:---------- |:----------- | -| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | -| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | -| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | -| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | +| Subcommand | Description | +|:---------- |:----------- | +| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | +| [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | +| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | +| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | +| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | ## Flags | Flag | Description | diff --git a/content/v2.0/reference/cli/influxd/inspect/report-tsi.md b/content/v2.0/reference/cli/influxd/inspect/report-tsi.md new file mode 100644 index 000000000..126ff324f --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/report-tsi.md @@ -0,0 +1,45 @@ +--- +title: influxd inspect report-tsi +description: > + The `influxd inspect report-tsi` command analyzes Time Series Index (TSI) files + in a storage directory and reports the cardinality of data stored in the files. +v2.0/tags: [tsi, cardinality, inspect] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect report-tsi` command analyzes Time Series Index (TSI) files +in a storage directory and reports the cardinality of data stored in the files. +The report is divided into organization and bucket cardinalities. + +## Output details +`influxd inspect report-tsi` outputs the following: + +- All organizations and buckets in the index. +- The series cardinality within each organization and bucket. +- The time taken to read the index. + +When the `--measurements` flag is included, series cardinality is segmented in +the following ways: + +- Series cardinality for each organization. +- Series cardinality for each bucket. +- Series cardinality for each measurement. + +## Usage +```sh +influxd inspect report-tsi [flags] +``` + +## Flags +| Flag | Description | Input Type | +|:---- |:----------- |:----------:| +| `--bucket-id` | Process only data belonging to bucket ID. _Requires `org-id` flag to be set._ | string | +| `-h`, `--help` | Help for `report-tsi`. | | +| `-m`, `--measurements` | Segment cardinality by measurements. | | +| `-o`, `--org-id` | Process only data belonging to organization ID. | string | +| `--path` | Path to index. Defaults to `~/.influxdbv2/engine/index`. | string | +| `--series-file` | Path to series file. Defaults to `~/.influxdbv2/engine/_series`. | string | +| `-t`, `-top` | Limit results to the top n. | integer | From 063eaa057c18116753e8b9d9947067e0e23c0de2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 8 Aug 2019 09:53:33 -0600 Subject: [PATCH 026/258] updated influxd report-tsi to address PR feedback --- .../cli/influxd/inspect/report-tsi.md | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/content/v2.0/reference/cli/influxd/inspect/report-tsi.md b/content/v2.0/reference/cli/influxd/inspect/report-tsi.md index 126ff324f..630a38755 100644 --- a/content/v2.0/reference/cli/influxd/inspect/report-tsi.md +++ b/content/v2.0/reference/cli/influxd/inspect/report-tsi.md @@ -11,22 +11,21 @@ weight: 301 --- The `influxd inspect report-tsi` command analyzes Time Series Index (TSI) files -in a storage directory and reports the cardinality of data stored in the files. -The report is divided into organization and bucket cardinalities. +in a storage directory and reports the cardinality of data stored in the files +by organization and bucket. ## Output details `influxd inspect report-tsi` outputs the following: - All organizations and buckets in the index. - The series cardinality within each organization and bucket. -- The time taken to read the index. +- Time to read the index. -When the `--measurements` flag is included, series cardinality is segmented in -the following ways: +When the `--measurements` flag is included, series cardinality is grouped by: -- Series cardinality for each organization. -- Series cardinality for each bucket. -- Series cardinality for each measurement. +- organization +- bucket +- measurement ## Usage ```sh @@ -34,12 +33,12 @@ influxd inspect report-tsi [flags] ``` ## Flags -| Flag | Description | Input Type | -|:---- |:----------- |:----------:| -| `--bucket-id` | Process only data belonging to bucket ID. _Requires `org-id` flag to be set._ | string | -| `-h`, `--help` | Help for `report-tsi`. | | -| `-m`, `--measurements` | Segment cardinality by measurements. | | -| `-o`, `--org-id` | Process only data belonging to organization ID. | string | -| `--path` | Path to index. Defaults to `~/.influxdbv2/engine/index`. | string | -| `--series-file` | Path to series file. Defaults to `~/.influxdbv2/engine/_series`. | string | -| `-t`, `-top` | Limit results to the top n. | integer | +| Flag | Description | Input Type | +|:---- |:----------- |:----------:| +| `--bucket-id` | Process data for specified bucket ID. _Requires `org-id` flag to be set._ | string | +| `-h`, `--help` | View help for `report-tsi`. | | +| `-m`, `--measurements` | Group cardinality by measurements. | | +| `-o`, `--org-id` | Process data for specified organization ID. | string | +| `--path` | Specify path to index. Defaults to `~/.influxdbv2/engine/index`. | string | +| `--series-file` | Specify path to series file. Defaults to `~/.influxdbv2/engine/_series`. | string | +| `-t`, `-top` | Limit results to the top n. | integer | From 76dba6db644782cf372ffb80e539fbcc2a17ae4e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 9 Aug 2019 14:42:32 -0600 Subject: [PATCH 027/258] added flux tail function, resolves #374 --- .../built-in/transformations/limit.md | 21 ++++---- .../built-in/transformations/tail.md | 51 +++++++++++++++++++ 2 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/tail.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md b/content/v2.0/reference/flux/functions/built-in/transformations/limit.md index 8a216e38f..5c70399c7 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/limit.md @@ -1,6 +1,6 @@ --- title: limit() function -description: The `limit()` function limits the number of records in output tables to a fixed number (n). +description: The `limit()` function limits records in each output table to the first `n` records. aliases: - /v2.0/reference/flux/functions/transformations/limit menu: @@ -8,15 +8,17 @@ menu: name: limit parent: built-in-transformations weight: 401 +related: + - /v2.0/reference/flux/functions/built-in/transformations/tail/ + - https://docs.influxdata.com/influxdb/latest/query_language/data_exploration/#the-limit-and-slimit-clauses, InfluxQL LIMIT --- -The `limit()` function limits the number of records in output tables to a fixed number ([`n`](#n)). -One output table is produced for each input table. -Each output table contains the first `n` records after the first `offset` records of the input table. -If the input table has less than `offset + n` records, all records except the first `offset` ones are output. +The `limit()` function limits records in each output table to the first [`n`](#n) records. +The function produces one output table for each input table. +Each output table contains the first `n` records after the [`offset`](#offset). +If the input table has less than `offset + n` records, `limit()` outputs all records after the `offset`. -_**Function type:** Filter_ -_**Output data type:** Object_ +_**Function type:** Filter_ ```js limit(n:10, offset: 0) @@ -41,8 +43,3 @@ from(bucket:"example-bucket") |> range(start:-1h) |> limit(n:10, offset: 1) ``` - -
- -##### Related InfluxQL functions and statements: -[LIMIT](https://docs.influxdata.com/influxdb/latest/query_language/data_exploration/#the-limit-and-slimit-clauses) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/tail.md b/content/v2.0/reference/flux/functions/built-in/transformations/tail.md new file mode 100644 index 000000000..8f3c65246 --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/tail.md @@ -0,0 +1,51 @@ +--- +title: tail() function +description: The `tail()` function limits records in each output table to the last `n` records. +menu: + v2_0_ref: + name: tail + parent: built-in-transformations +weight: 401 +related: + - /v2.0/reference/flux/functions/built-in/transformations/limit/ +--- + +The `tail()` function limits records in each output table to the last [`n`](#n) records. +The function produces one output table for each input table. +Each output table contains the last `n` records before the [`offset`](#offset). +If the input table has less than `offset + n` records, `tail()` outputs all records before the `offset`. + +_**Function type:** Filter_ + +```js +tail(n:10, offset: 0) +``` + +## Parameters + +### n +The maximum number of records to output. + +_**Data type:** Integer_ + +### offset +The number of records to skip at the end of a table table before limiting to `n`. +Defaults to `0`. + +_**Data type:** Integer_ + +## Examples + +##### Output the last ten records in each table +```js +from(bucket:"example-bucket") + |> range(start:-1h) + |> tail(n:10) +``` + +##### Output the last ten records in each table +```js +from(bucket:"example-bucket") + |> range(start:-1h) + |> tail(n:5, offset: 1) +``` From 92c5413e96297aea05f17c41e50df675e562c096 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 9 Aug 2019 14:47:25 -0600 Subject: [PATCH 028/258] minor updates to limit and tail function docs --- .../functions/built-in/transformations/limit.md | 13 +++++++++---- .../functions/built-in/transformations/tail.md | 16 ++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md b/content/v2.0/reference/flux/functions/built-in/transformations/limit.md index 5c70399c7..b0e3b0741 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/limit.md @@ -1,6 +1,6 @@ --- title: limit() function -description: The `limit()` function limits records in each output table to the first `n` records. +description: The `limit()` function limits each output table to the first `n` records. aliases: - /v2.0/reference/flux/functions/transformations/limit menu: @@ -13,7 +13,7 @@ related: - https://docs.influxdata.com/influxdb/latest/query_language/data_exploration/#the-limit-and-slimit-clauses, InfluxQL LIMIT --- -The `limit()` function limits records in each output table to the first [`n`](#n) records. +The `limit()` function limits each output table to the first [`n`](#n) records. The function produces one output table for each input table. Each output table contains the first `n` records after the [`offset`](#offset). If the input table has less than `offset + n` records, `limit()` outputs all records after the `offset`. @@ -21,7 +21,10 @@ If the input table has less than `offset + n` records, `limit()` outputs all rec _**Function type:** Filter_ ```js -limit(n:10, offset: 0) +limit( + n:10, + offset: 0 +) ``` ## Parameters @@ -38,8 +41,10 @@ Defaults to `0`. _**Data type:** Integer_ ## Examples + +##### Output the first ten records in each table ```js from(bucket:"example-bucket") |> range(start:-1h) - |> limit(n:10, offset: 1) + |> limit(n:10) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/tail.md b/content/v2.0/reference/flux/functions/built-in/transformations/tail.md index 8f3c65246..330d90a68 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/tail.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/tail.md @@ -1,6 +1,6 @@ --- title: tail() function -description: The `tail()` function limits records in each output table to the last `n` records. +description: The `tail()` function limits each output table to the last `n` records. menu: v2_0_ref: name: tail @@ -10,7 +10,7 @@ related: - /v2.0/reference/flux/functions/built-in/transformations/limit/ --- -The `tail()` function limits records in each output table to the last [`n`](#n) records. +The `tail()` function limits each output table to the last [`n`](#n) records. The function produces one output table for each input table. Each output table contains the last `n` records before the [`offset`](#offset). If the input table has less than `offset + n` records, `tail()` outputs all records before the `offset`. @@ -18,7 +18,10 @@ If the input table has less than `offset + n` records, `tail()` outputs all reco _**Function type:** Filter_ ```js -tail(n:10, offset: 0) +tail( + n:10, + offset: 0 +) ``` ## Parameters @@ -42,10 +45,3 @@ from(bucket:"example-bucket") |> range(start:-1h) |> tail(n:10) ``` - -##### Output the last ten records in each table -```js -from(bucket:"example-bucket") - |> range(start:-1h) - |> tail(n:5, offset: 1) -``` From 187b95f8f0557221e266c38be8de685172ce8675 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 9 Aug 2019 16:36:40 -0600 Subject: [PATCH 029/258] added flux tripleExponentialDerivative, resolves #373 --- .../aggregates/tripleexponentialderivative.md | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md new file mode 100644 index 000000000..fcc4df79e --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -0,0 +1,66 @@ +--- +title: tripleExponentialDerivative() function +description: > + The `tripleExponentialDerivative()` function calculates a triple exponential + derivative of input tables using `n` points. +menu: + v2_0_ref: + name: tripleExponentialDerivative + parent: built-in-aggregates +weight: 501 +v2.0/tags: [technical analysis] +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-derivative, InfluxQL TRIPLE_EXPONENTIAL_DERIVATIVE() +--- + +The `tripleExponentialDerivative()` function calculates a triple exponential +derivative of input tables using `n` points. + +_**Function type:** Aggregate_ + +```js +tripleExponentialDerivative(n: 5) +``` + +Triple exponential derivative, commonly referred to as “TRIX,” is a momentum indicator and oscillator. +A triple exponential derivative is a triple exponential moving average of the log of data input over the period of time. +It prevents cycles shorter than the defined period from being considered by the indicator. +With `tripleExponentialDerivative()`, the period of time is determined by the time `n` points span. + +Triple exponential derivative oscillates around a zero line. +When used as a momentum **oscillator**, a positive value indicates an overbought market +and a negative value indicates an oversold market. +When used as a momentum **indicator**, a positive value suggests momentum is +increasing and a negative value suggests momentum is decreasing. + +##### Triple exponential moving average rules +- A triple exponential derivative is defined as: + - `TRIX[i] = ((EMA3[i] / EMA3[i - 1]) - 1) * 100`: + - `EMA_3 = EMA(EMA(EMA(data)))` +- If there are not enough values to calculate a triple exponential derivative, + the output `_value` is `NaN`; all other columns are the same as the _last_ record of the input table. +- The behavior of the exponential moving averages used for calculating the triple + exponential derivative is the same as [`exponentialMovingAverage`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/): + - `tripleExponentialDerivative` ignores `null` values and does not inlcude them in the calculation. + - It acts only on the `_value` column. + +## Parameters + +### n +The number of points to use in the calculation. + +_**Data type:** Integer_ + +## Examples + +#### Calculate a five point triple exponential derivative +```js +from(bucket: "example-bucket"): + |> range(start: -12h) + |> tripleExponentialDerivative(n: 5) +``` From de6666856d4aa47599cd089d068d6e1111d86ae7 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 9 Aug 2019 16:48:29 -0600 Subject: [PATCH 030/258] fixed codeblock whitespace wrapping --- assets/styles/layouts/article/_code.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/styles/layouts/article/_code.scss b/assets/styles/layouts/article/_code.scss index a7038a799..85a88cc2b 100644 --- a/assets/styles/layouts/article/_code.scss +++ b/assets/styles/layouts/article/_code.scss @@ -56,7 +56,7 @@ pre { padding: 0; font-size: .95rem; line-height: 1.5rem; - white-space: pre-wrap; + white-space: pre; } } From 733fc6f13cb2e6272c64adabc6eb0f5677b6d6e9 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 12 Aug 2019 08:52:13 -0600 Subject: [PATCH 031/258] updated tripleExponentialDerivative to address PR feedback --- .../aggregates/tripleexponentialderivative.md | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md index fcc4df79e..1f734698c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -2,7 +2,7 @@ title: tripleExponentialDerivative() function description: > The `tripleExponentialDerivative()` function calculates a triple exponential - derivative of input tables using `n` points. + derivative (TRIX) of input tables using `n` points. menu: v2_0_ref: name: tripleExponentialDerivative @@ -19,7 +19,8 @@ related: --- The `tripleExponentialDerivative()` function calculates a triple exponential -derivative of input tables using `n` points. +derivative ([TRIX](https://en.wikipedia.org/wiki/Trix_(technical_analysis)) of +input tables using `n` points. _**Function type:** Aggregate_ @@ -28,15 +29,16 @@ tripleExponentialDerivative(n: 5) ``` Triple exponential derivative, commonly referred to as “TRIX,” is a momentum indicator and oscillator. -A triple exponential derivative is a triple exponential moving average of the log of data input over the period of time. -It prevents cycles shorter than the defined period from being considered by the indicator. -With `tripleExponentialDerivative()`, the period of time is determined by the time `n` points span. +A triple exponential derivative uses the natural logarithm (log) of input data to +calculate a triple exponential moving average over the period of time. +The calculation prevents cycles shorter than the defined period from being considered by the indicator. +`tripleExponentialDerivative()` uses the time between `n` points to define the period. Triple exponential derivative oscillates around a zero line. -When used as a momentum **oscillator**, a positive value indicates an overbought market -and a negative value indicates an oversold market. -When used as a momentum **indicator**, a positive value suggests momentum is -increasing and a negative value suggests momentum is decreasing. +A positive momentum **oscillator** value indicates an overbought market; +a negative value indicates an oversold market. +A positive momentum **indicator** value indicates increasing momentum; +a negative value indicates decreasing momentum. ##### Triple exponential moving average rules - A triple exponential derivative is defined as: @@ -44,10 +46,9 @@ increasing and a negative value suggests momentum is decreasing. - `EMA_3 = EMA(EMA(EMA(data)))` - If there are not enough values to calculate a triple exponential derivative, the output `_value` is `NaN`; all other columns are the same as the _last_ record of the input table. -- The behavior of the exponential moving averages used for calculating the triple - exponential derivative is the same as [`exponentialMovingAverage`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/): - - `tripleExponentialDerivative` ignores `null` values and does not inlcude them in the calculation. - - It acts only on the `_value` column. +- The function behaves the same way as the [`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/) function: + - The function does not include `null` values in the calculation. + - The function acts only on the `_value` column. ## Parameters From 7e1f8d4184c781c439993cd02c3e5c423eb6d443 Mon Sep 17 00:00:00 2001 From: Nora Date: Tue, 13 Aug 2019 11:34:45 -0700 Subject: [PATCH 032/258] Changelog update for alpha 17 --- content/v2.0/reference/release-notes/influxdb.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content/v2.0/reference/release-notes/influxdb.md b/content/v2.0/reference/release-notes/influxdb.md index c6d4b103b..cf6c69286 100644 --- a/content/v2.0/reference/release-notes/influxdb.md +++ b/content/v2.0/reference/release-notes/influxdb.md @@ -8,6 +8,19 @@ menu: weight: 101 --- +## v2.0.0-alpha.17 [2019-08-13] + +### Features +- Optional gzip compression of the query CSV response. +- Add task types. +- When getting task runs from the API, runs will be returned in order of most recently scheduled first. + +### Bug Fixes +- Fix authentication when updating a task with invalid org or bucket. +- Update the documentation link for Telegraf. +- Fix to surface errors properly as task notifications on create. +- Fix limiting of get runs for task. +--- ## v2.0.0-alpha.16 [2019-07-25] ### Bug Fixes From e1792fcac5f5ca0893f3f83b56d54f3eadadcd00 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 13 Aug 2019 14:54:15 -0600 Subject: [PATCH 033/258] updated flux changelog with 0.39 --- .../reference/flux/functions/date/year.md | 1 - content/v2.0/reference/release-notes/flux.md | 26 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/flux/functions/date/year.md b/content/v2.0/reference/flux/functions/date/year.md index d420ed839..b2e2a80b4 100644 --- a/content/v2.0/reference/flux/functions/date/year.md +++ b/content/v2.0/reference/flux/functions/date/year.md @@ -7,7 +7,6 @@ menu: name: date.year parent: Date weight: 301 -draft: true --- The `date.year()` function returns the year of a specified time. diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index f3c011dbc..f30318764 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,37 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.38.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.39.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.39.0 [2019-08-13] + +### Breaking changes +- Implement the scanning components for string expressions. + +### Features +- Add `tail()` function. +- Add framework for `http.post()` function. +- Implement `deadman()` function. +- Time arithmetic functions. +- Alerts package. +- Add an experimental `group()` function with mode `extend`. +- Implement the scanning components for string expressions. +- Add `chandeMomentumOscillator()` function. +- Add `hourSelection()` function. +- Add `date.year()` function + +### Bug fixes +- Update object to use Invalid type instead of nil monotypes. +- Make it so the alerts package can be defined in pure Flux. +- Close connection after `sql.to()`. + +--- + ## v0.38.0 [2019-08-06] ### Features From a580a1d156c9b9a0ff346a61d70250b748c8c686 Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 14 Aug 2019 10:14:35 -0700 Subject: [PATCH 034/258] fix date --- content/v2.0/reference/release-notes/influxdb.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/influxdb.md b/content/v2.0/reference/release-notes/influxdb.md index cf6c69286..1b2f51762 100644 --- a/content/v2.0/reference/release-notes/influxdb.md +++ b/content/v2.0/reference/release-notes/influxdb.md @@ -8,7 +8,7 @@ menu: weight: 101 --- -## v2.0.0-alpha.17 [2019-08-13] +## v2.0.0-alpha.17 [2019-08-14] ### Features - Optional gzip compression of the query CSV response. From 9f8a66286e93aee3554db6ce1f3a30d0f59df787 Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 14 Aug 2019 10:18:53 -0700 Subject: [PATCH 035/258] Fix release note formatting --- content/v2.0/reference/release-notes/influxdb.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/v2.0/reference/release-notes/influxdb.md b/content/v2.0/reference/release-notes/influxdb.md index 1b2f51762..cc311538f 100644 --- a/content/v2.0/reference/release-notes/influxdb.md +++ b/content/v2.0/reference/release-notes/influxdb.md @@ -20,7 +20,9 @@ weight: 101 - Update the documentation link for Telegraf. - Fix to surface errors properly as task notifications on create. - Fix limiting of get runs for task. + --- + ## v2.0.0-alpha.16 [2019-07-25] ### Bug Fixes From c5ab4eb0d46104acc3dd71853878430784d0837f Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 14 Aug 2019 13:43:50 -0600 Subject: [PATCH 036/258] updated map functions that were using deprecated map shorthand --- content/v2.0/query-data/guides/custom-functions/_index.md | 2 +- .../reference/flux/functions/built-in/transformations/map.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/query-data/guides/custom-functions/_index.md b/content/v2.0/query-data/guides/custom-functions/_index.md index d72154420..06341d146 100644 --- a/content/v2.0/query-data/guides/custom-functions/_index.md +++ b/content/v2.0/query-data/guides/custom-functions/_index.md @@ -77,7 +77,7 @@ to modify each `_value`. // Function definition multByX = (tables=<-, x) => tables - |> map(fn: (r) => r._value * x) + |> map(fn: (r) => ({ r with _value: r._value * x})) // Function usage from(bucket: "example-bucket") diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/map.md b/content/v2.0/reference/flux/functions/built-in/transformations/map.md index b6c134a5c..c4b509bf9 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/map.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/map.md @@ -73,7 +73,7 @@ from(bucket:"example-bucket") r.cpu == "cpu-total" ) |> range(start:-12h) - |> map(fn: (r) => r._value * r._value) + |> map(fn: (r) => ({ r with _value: r._value * r._value})) ``` ###### Create a new table with new format From 49b6540a4ef1cb5312fff755a61634e81284f93a Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 14 Aug 2019 16:21:12 -0700 Subject: [PATCH 037/258] add queryd panic in holt-winters --- content/v2.0/reference/release-notes/flux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index f30318764..06c1aaeec 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -20,6 +20,8 @@ InfluxDB until the next InfluxDB v2.0 release._ ## v0.39.0 [2019-08-13] +> A queryd panic has been reported in `HoltWinters()`. We're working to resolve this issue as soon as possible. + ### Breaking changes - Implement the scanning components for string expressions. From 61de4312008c7e6be5c9285d87ecef478838adda Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 15 Aug 2019 14:42:22 -0600 Subject: [PATCH 038/258] fixed typo in logarithmicBin examples --- content/v2.0/query-data/guides/histograms.md | 2 +- .../reference/flux/functions/built-in/misc/logarithmicbins.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/query-data/guides/histograms.md b/content/v2.0/query-data/guides/histograms.md index 88fda21eb..fc87430a9 100644 --- a/content/v2.0/query-data/guides/histograms.md +++ b/content/v2.0/query-data/guides/histograms.md @@ -53,7 +53,7 @@ linearBins(start: 0.0, width: 10.0, count: 10) The [`logarithmicBins()` function](/v2.0/reference/flux/functions/built-in/misc/logarithmicbins) generates a list of exponentially separated floats. ```js -logarithmicBins(start: 1.0, factor: 2.0, count: 10, infinty: true) +logarithmicBins(start: 1.0, factor: 2.0, count: 10, infinity: true) // Generated list: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, +Inf] ``` diff --git a/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md b/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md index 5d6f7270c..039e74a56 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md +++ b/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md @@ -46,7 +46,7 @@ _**Data type:** Boolean_ ## Examples ```js -logarithmicBins(start: 1.0, factor: 2.0, count: 10, infinty: true) +logarithmicBins(start: 1.0, factor: 2.0, count: 10, infinity: true) // Generated list: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, +Inf] ``` From 75114735630dc7329ef9d9e6ba6d32bf5881e169 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 20 Aug 2019 11:07:44 -0600 Subject: [PATCH 039/258] updated flux changelog with v0.40.0 --- content/v2.0/reference/release-notes/flux.md | 33 +++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 06c1aaeec..e35b6646f 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,44 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.39.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.40.0 [2019-08-20] + +### Breaking changes +- Update compiler package to use true scope. +- Add `http` and `json` to prelude. + +### Features +- Add `alerts.check()` function. +- Add `alerts.notify` function. +- Add `kaufmansER()` and `kaufmansAMA()` functions. +- Add `experimental.to()` function. +- Add `experimental.set()` function to update entire object. +- Add `tripleExponentialDerivative()` function. +- Add `json.encode()` function. +- Add `mqtt.to()` function. +- Add `objectKeys()` function. +- Add Bytes type. +- Update compiler package to use true scope. +- Add http endpoint. +- Add post method implementation. +- String interpolation. + +### Bug fixes +- Avoid wrapping table errors in the CSV encoder. +- Remove irrelevant TODOs. +- `mode()` now properly considers nulls when calculating the mode. +- Add `http` and `json` to prelude. +- Rename all Flux test files to use `_test.flux`. + +--- + ## v0.39.0 [2019-08-13] > A queryd panic has been reported in `HoltWinters()`. We're working to resolve this issue as soon as possible. From 3a62b6a54f78c425e6c51caa2ca50799f2c09a69 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 20 Aug 2019 11:17:59 -0600 Subject: [PATCH 040/258] udpated holtwinters message in 0.39 changelog --- content/v2.0/reference/release-notes/flux.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index e35b6646f..204860d51 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -51,7 +51,9 @@ InfluxDB until the next InfluxDB v2.0 release._ ## v0.39.0 [2019-08-13] -> A queryd panic has been reported in `HoltWinters()`. We're working to resolve this issue as soon as possible. +{{% warn %}} +In Flux 0.39.0, `holtWinters()` can cause the query engine to panic. +{{% /warn %}} ### Breaking changes - Implement the scanning components for string expressions. From 970ff0889b0bd0967d479aae62e9014656d826b3 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 21 Aug 2019 09:54:21 -0600 Subject: [PATCH 041/258] added 0.40.1 to flux changelog --- content/v2.0/reference/release-notes/flux.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 204860d51..22269e241 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,20 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.1**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.40.1 [2019-08-21] + +### Bug fixes +- Use non-pointer receiver for `interpreter.function`. + +--- + ## v0.40.0 [2019-08-20] ### Breaking changes From 163037d5a1916e5198398a52f4bef6daeefb3bc6 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 22 Aug 2019 11:31:07 -0600 Subject: [PATCH 042/258] added flux 0.40.2 to changelog --- content/v2.0/reference/release-notes/flux.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 22269e241..1c96c5f0a 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,20 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.1**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.2**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.40.2 [2019-08-22] + +### Bug fixes +- Resolved `holtWinters()` panic. + +--- + ## v0.40.1 [2019-08-21] ### Bug fixes @@ -60,6 +67,7 @@ InfluxDB until the next InfluxDB v2.0 release._ {{% warn %}} In Flux 0.39.0, `holtWinters()` can cause the query engine to panic. +**Flux 0.40.2 resolves this panic.** {{% /warn %}} ### Breaking changes From 145513f3cb86f39205726a21788af8658477c2d6 Mon Sep 17 00:00:00 2001 From: Kelly Date: Thu, 22 Aug 2019 12:17:49 -0700 Subject: [PATCH 043/258] indent button to fix numbering --- content/v2.0/visualize-data/explore-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/visualize-data/explore-metrics.md b/content/v2.0/visualize-data/explore-metrics.md index 87da02a94..4937e90f5 100644 --- a/content/v2.0/visualize-data/explore-metrics.md +++ b/content/v2.0/visualize-data/explore-metrics.md @@ -28,7 +28,7 @@ See [Get started with Flux](/v2.0/query-data/get-started) to learn more about Fl 1. Click the **Data Explorer** icon in the sidebar. - {{< nav-icon "data-explorer" >}} + {{< nav-icon "data-explorer" >}} 2. Use the Flux builder in the bottom panel to select a bucket and filters such as measurement, field or tag. Alternatively, click **Script Editor** to manually edit the query. From a045b314e194f028e657f6a826b6df6639d9dfce Mon Sep 17 00:00:00 2001 From: Kelly Date: Thu, 22 Aug 2019 13:42:10 -0700 Subject: [PATCH 044/258] add links to java and C# client libraries #367 --- content/v2.0/reference/client-libraries.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/v2.0/reference/client-libraries.md b/content/v2.0/reference/client-libraries.md index 8d9eec75e..6c47537f3 100644 --- a/content/v2.0/reference/client-libraries.md +++ b/content/v2.0/reference/client-libraries.md @@ -18,5 +18,7 @@ These client libraries are in active development and may not be feature-complete This list will continue to grow as more client libraries are released. {{% /note %}} +- [C#](https://github.com/influxdata/influxdb-client-csharp) - [Go](https://github.com/influxdata/influxdb-client-go) +- [Java](https://github.com/influxdata/influxdb-client-java) - [JavaScript/Node.js](https://github.com/influxdata/influxdb-client-js) From 788fc297e7c5332e809d1beb1095b9763da5b9bb Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 22 Aug 2019 15:25:15 -0600 Subject: [PATCH 045/258] added flux kaufman functions, resolves #382 --- .../transformations/aggregates/kaufmansama.md | 52 +++++++++++++++++++ .../transformations/aggregates/kaufmanser.md | 42 +++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md new file mode 100644 index 000000000..26d6c1686 --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md @@ -0,0 +1,52 @@ +--- +title: kaufmansAMA() function +description: > + The `kaufmansAMA()` function calculates the Kaufman's Adaptive Moving Average (KAMA) + using values in an input table. +menu: + v2_0_ref: + name: kaufmansAMA + parent: built-in-aggregates +weight: 501 +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-adaptive-moving-average, InfluxQL KAUFMANS_ADAPTIVE_MOVING_AVERAGE() +--- + +The `kaufmansAMA()` function calculates the Kaufman's Adaptive Moving Average (KAMA) +using values in an input table. + +_**Function type:** Aggregate_ + +```js +kaufmansAMA( + n: 10, + columns: ["_value"] +) +``` + +Kaufman's Adaptive Moving Average is a trend-following indicator designed to account +for market noise or volatility. + +## Parameters + +### n +The period or number of points to use in the calculation. + +_**Data type: Integer**_ + +### column +The column to operate on. +Defaults to `"_value"`. + +_**Data type: String**_ + +## Examples +```js +from(bucket: "telegraf/autogen"): + |> range(start: -7d) + |> kaufmansAMA( + n: 10, + column: "_value" + ) +``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md new file mode 100644 index 000000000..b7952828d --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md @@ -0,0 +1,42 @@ +--- +title: kaufmansER() function +description: > + The `kaufmansER()` function calculates the Kaufman's Efficiency Ratio (KER) using + values in an input table. +menu: + v2_0_ref: + name: kaufmansER + parent: built-in-aggregates +weight: 501 +related: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama/ + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-efficiency-ratio, InfluxQL KAUFMANS_EFFICIENCY_RATIO() +--- + +The `kaufmansER()` function calculates the Kaufman's Efficiency Ratio (KER) using +values in an input table. +It operates only on the `_value` column. + +_**Function type:** Aggregate_ + +```js +kaufmansER(n: 10) +``` + +Kaufman's Efficiency Ratio indicator divides the absolute value of the +Chande Momentum Oscillator by 100 to return a value between 0 and 1. +Higher values represent a more efficient or trending market. + +## Parameters + +### n +The period or number of points to use in the calculation. + +_**Data type: Integer**_ + +## Examples +```js +from(bucket: "example-bucket") + |> range(start: -7d) + |> kaufmansER(n: 10) +``` From 9c5958bc21f0a33ee1fa543895814f0c238f79ba Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 22 Aug 2019 15:31:20 -0600 Subject: [PATCH 046/258] added aggregateWindow output details --- .../built-in/transformations/aggregates/aggregatewindow.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md index 613487875..435fa5030 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md @@ -30,6 +30,10 @@ As data is windowed into separate tables and processed, the `_time` column is dr This function copies the timestamp from a remaining column into the `_time` column. View the [function definition](#function-definition). +`aggregateWindow()` restores the original `_start` and `_stop` values of input data +and, by default, uses `_stop` to set the `_time` value for each aggregated window. +Each row in the output of `aggregateWindow` represents an aggregated window ending at `_time`. + ## Parameters {{% note %}} From b0d9574ac16169b2d5194277f7c08c7c9300c3b9 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 08:56:51 -0600 Subject: [PATCH 047/258] updated flux 0.40.0 changelog items --- content/v2.0/reference/release-notes/flux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 1c96c5f0a..5d7e5d90c 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -44,10 +44,10 @@ InfluxDB until the next InfluxDB v2.0 release._ - Add `kaufmansER()` and `kaufmansAMA()` functions. - Add `experimental.to()` function. - Add `experimental.set()` function to update entire object. +- Add `experimental.objectKeys()` function. - Add `tripleExponentialDerivative()` function. - Add `json.encode()` function. - Add `mqtt.to()` function. -- Add `objectKeys()` function. - Add Bytes type. - Update compiler package to use true scope. - Add http endpoint. From 9249899c6030129e24bb48aa6c172d890be45e5b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 09:25:36 -0600 Subject: [PATCH 048/258] added load data nav icon, removed orgs nav icon --- assets/styles/tools/_icomoon.scss | 13 +++++---- .../cloud/account-management/offboarding.md | 4 +-- .../use-telegraf/auto-config/_index.md | 25 +++++++++--------- layouts/shortcodes/nav-icon.html | 6 ++--- static/fonts/icomoon.eot | Bin 15860 -> 16216 bytes static/fonts/icomoon.svg | 1 + static/fonts/icomoon.ttf | Bin 15696 -> 16052 bytes static/fonts/icomoon.woff | Bin 15772 -> 16128 bytes 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/assets/styles/tools/_icomoon.scss b/assets/styles/tools/_icomoon.scss index dfd7c1f91..a3b4a64a2 100644 --- a/assets/styles/tools/_icomoon.scss +++ b/assets/styles/tools/_icomoon.scss @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('fonts/icomoon.eot?e8u66e'); - src: url('fonts/icomoon.eot?e8u66e#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?e8u66e') format('truetype'), - url('fonts/icomoon.woff?e8u66e') format('woff'), - url('fonts/icomoon.svg?e8u66e#icomoon') format('svg'); + src: url('fonts/icomoon.eot?9r9zke'); + src: url('fonts/icomoon.eot?9r9zke#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?9r9zke') format('truetype'), + url('fonts/icomoon.woff?9r9zke') format('woff'), + url('fonts/icomoon.svg?9r9zke#icomoon') format('svg'); font-weight: normal; font-style: normal; } @@ -33,6 +33,9 @@ .icon-ui-nav-chat:before { content: "\e941"; } +.icon-ui-disks:before { + content: "\e950"; +} .icon-ui-add-cell:before { content: "\e91f"; } diff --git a/content/v2.0/cloud/account-management/offboarding.md b/content/v2.0/cloud/account-management/offboarding.md index 34b3f6bc9..f2b9d6fb2 100644 --- a/content/v2.0/cloud/account-management/offboarding.md +++ b/content/v2.0/cloud/account-management/offboarding.md @@ -36,9 +36,9 @@ For details, see [Export a dashboard](v2.0/visualize-data/dashboards/export-dash **To save a Telegraf configuration:** -1. Click in the **Organizations** icon in the navigation bar. +1. Click in the **Settings** icon in the navigation bar. - {{< nav-icon "orgs" >}} + {{< nav-icon "settings" >}} 2. Select the **Telegraf** tab. A list of existing Telegraf configurations appears. 3. Click on the name of a Telegraf configuration. diff --git a/content/v2.0/write-data/use-telegraf/auto-config/_index.md b/content/v2.0/write-data/use-telegraf/auto-config/_index.md index aaca5632d..3001d429f 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/_index.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/_index.md @@ -25,33 +25,32 @@ for using Telegraf with InfluxDB v2.0._ ## Create a Telegraf configuration 1. Open the InfluxDB UI _(default: [localhost:9999](http://localhost:9999))_. -2. Click **Organizations** in the left navigation menu. +2. Click **Load Data** in the left navigation menu. - {{< nav-icon "orgs" >}} + {{< nav-icon "load data" >}} -3. Click on the name of your organization. -4. Click the **Telegraf** tab. -5. Click **{{< icon "plus" >}} Create Configuration**. -6. In the **Bucket** dropdown, select the bucket where Telegraf will store collected data. -7. Select one or more of the available plugin groups +3. Click the **Telegraf** tab. +4. Click **{{< icon "plus" >}} Create Configuration**. +5. In the **Bucket** dropdown, select the bucket where Telegraf will store collected data. +6. Select one or more of the available plugin groups (e.g. **System**, **Docker**, **Kubernetes**, **NGINX**, or **Redis**), and click **Continue**. {{% note %}} All Telegraf plugins are supported, but only a subset are configurable using the InfluxDB UI. To use plugins other than those listed, you must [manually configure Telegraf](/v2.0/write-data/use-telegraf/manual-config). {{% /note %}} -8. Review the list of **Plugins to Configure** for configuration requirements. +7. Review the list of **Plugins to Configure** for configuration requirements. Plugins listed with a {{< icon "check" >}} require no additional configuration. To configure a plugin or access plugin documentation, click the plugin name. -9. Provide a **Telegraf Configuration Name** and an optional **Telegraf Configuration Description**. -10. Click **Create and Verify**. -11. The **Test Your Configuration** page provides instructions for how to start +8. Provide a **Telegraf Configuration Name** and an optional **Telegraf Configuration Description**. +9. Click **Create and Verify**. +10. The **Test Your Configuration** page provides instructions for how to start Telegraf using the generated configuration. _See [Start Telegraf](#start-telegraf) below for detailed information about what each step does._ -12. Once Telegraf is running, click **Listen for Data** to confirm Telegraf is successfully +11. Once Telegraf is running, click **Listen for Data** to confirm Telegraf is successfully sending data to InfluxDB. Once confirmed, a **Connection Found!** message appears. -13. Click **Finish**. Your configuration name and the associated bucket name appears +12. Click **Finish**. Your configuration name and the associated bucket name appears in the list of Telegraf connections. ## Start Telegraf diff --git a/layouts/shortcodes/nav-icon.html b/layouts/shortcodes/nav-icon.html index f7a077c01..a3a7c3d9c 100644 --- a/layouts/shortcodes/nav-icon.html +++ b/layouts/shortcodes/nav-icon.html @@ -11,9 +11,9 @@ {{ else if eq $navIcon "tasks" }} {{ .Scratch.Set "icon" "calendar" }} {{ .Scratch.Set "title" "Tasks" }} -{{ else if or (eq $navIcon "organizations") (eq $navIcon "orgs") }} - {{ .Scratch.Set "icon" "organizations" }} - {{ .Scratch.Set "title" "Organizations" }} +{{ else if or (eq $navIcon "disks") (eq $navIcon "load data") (eq $navIcon "load-data") }} + {{ .Scratch.Set "icon" "disks" }} + {{ .Scratch.Set "title" "Load Data" }} {{ else if eq $navIcon "settings" }} {{ .Scratch.Set "icon" "wrench-2" }} {{ .Scratch.Set "title" "Settings" }} diff --git a/static/fonts/icomoon.eot b/static/fonts/icomoon.eot index a90f793ac75dec9c5d165c3fc092dc8e5f8cec8e..2ff522e19975fc4ef156699920faa3c53ec0d52b 100755 GIT binary patch delta 731 zcmexTeWQ*o!k&R)i`_&vGZueQuXz(4TIwg8PiAFcV3c8CV3?DhSX=<41%Uh=K$;^x zr!q~yv2{6+e}I9(QX(TYF-5j)WfcR1)eWG$Sq4ymFOOS-fx#N6he0JHx1>U$Py(pd z+61UaB_}^QQG9}`5(9%x1WR8B%H$Zv=EMddQwHcDW(FPxMh1nKRxj;eI==LI8SwJfE4^16UhR8z=>OmU z|3Nx{vJ7ald!e$7{~wF9h%<=&7yByqNi0)LOmwPfr)V3{RL04UOd^v5m{@_BWpgOg z5yN^G2H*dT%v+e57~~kN7$O+TfDTh)=VN4NlVubUmtzzcGd41}V>CCjWi(OOV^mjD z7BvD3i;93%DJy|RO-;ax(6ykdF-0>FC|eJ-2xbHmLzI6&nGz6`1^7orBeBDsoukEp zAllhEJOaV~w**ruvNlXMGZPPwmW+(TG6fkKEgm3&Wm>(`ResZFC4EqrV2CFYX`ANBn6$K1oj4K!ztUG{wg}lUE$<&!%oWFqrKtaZ~ zg8bqV24Al+UYVWH< z|Ns8~&%pTqu{eu3gV=wuuVNWuqM}noJ49Q7`WPoWGD&ZaWjbQGxzd!IO=i(CJ;Qi@ zo39MqEFgOrZZavB!sy8htj!rcHs7%3W}N)oW{#|qWS5kbbd2;a=?6e1j6m$cxQu}p Qq?~~XXs+<)&9+M!0l>^+_5c6? diff --git a/static/fonts/icomoon.svg b/static/fonts/icomoon.svg index e7dda9a20..f5ed6e65c 100755 --- a/static/fonts/icomoon.svg +++ b/static/fonts/icomoon.svg @@ -69,6 +69,7 @@ + diff --git a/static/fonts/icomoon.ttf b/static/fonts/icomoon.ttf index d59e5ca6cc5ebf032172434cc192b7c59cff8453..fb000be8e48fc19badfbaf3fa3d8885c02e21b49 100755 GIT binary patch delta 668 zcmcamwWW4~Lj7d($*c?vj4})i40F;Giwl6X0Fb`}NOPp;RHo@Swk`+q4=^xTN@S!a zrpT79tYToWx&f3o%K!@S<#9_eFjxciFsNkYmQ*MdN&wYbn*jBwN-@|?nYg3byaC9P z0lJ5ofro*SLE)vu9;3A2C$UU1 zG0~}_ouX|({frC@o2N0}H>_u2@cqxoyoH&GL5{(SA%dX{Xs;4GA0s=PETf3H9HY3H zv5~nQqq&(aqlvm6qq>^1s1aCLR0OO_SqUs^Y64b-t_4+%DVl*m*?OQwFe8{4qWlBO zlz^Ztz&|P)i5>3j94!t6(az4{5eW9bC74Q)wPCWEnRs}#WMmYUDagoZ@c=<263>{2 zM?pxChg(Qck%ya`M^R9Sn@3PcfrsbM8JKdA>a)lk2V@S4%;pkf9yXbIUZVc-{5D@1 zxLLrlajmO$fU{ifZ~Y3b90~d GAw~dyyqM-@(9Oejp_-?FtiAx{ zC*>wq6flG_u3%uW?f~)?@)C0;Q)hZ{{ssyF1sU54@{3Ctn1NCZwgwY-G)IGMkpjAh znSqOekwM|5)l2)AjxT*)-g>3?YQw92uMYkH`~N>kIZ%!PMQ$%tj`9CvaTaj~vHxOU z#WKW1MW={%h_(XFW1PH@QDXBp#^Z*YubObP$t*giXBf|K^Ob>{1#I3;CdE<^14K{$ zV`a|hvDw6$n{l$U%^X=J$u21==@{u<(hqaTx%uNM~ zMF2Inf$&T(&ff+3#U((OKbZKZTe1PDP=-N(fti5^=rM(tRxj;eI==LI88CSsqby^< z&O}@t{zxg-gF~fQm2H*dT%v+e57~~kN7$O+TfTk<4^D(ls z$uf$F%Q1?J85^0~F`Ap%GMcFCF{-O6iyDE2MMc1>l$F4urY2xT=vq+Kn4%d7l&uF^ z1T%t(A<93XObH0e0{o+*k=WtR&e7sP5bf+79)V#0TY{++SsNysnTdx-OGZXvnSzXr z77q|aBJqrQcoc*LdANlH6?wS1c@zbOxOoJH6nJ?4oPj9^sXmL$aX{vv$ZS4f%)=%# z&r8%lp5Nvx12+pWh8P%bwr Date: Fri, 23 Aug 2019 10:18:42 -0600 Subject: [PATCH 049/258] updated bucket, telegraf, and scraper workflows --- .../v2.0/organizations/buckets/create-bucket.md | 8 ++++---- .../v2.0/organizations/buckets/delete-bucket.md | 8 ++++---- .../v2.0/organizations/buckets/update-bucket.md | 14 +++++++------- .../v2.0/organizations/buckets/view-buckets.md | 6 +++--- content/v2.0/write-data/_index.md | 6 +++--- .../manage-scrapers/create-a-scraper.md | 8 ++++---- .../manage-scrapers/delete-a-scraper.md | 8 ++++---- .../manage-scrapers/update-a-scraper.md | 8 ++++---- .../use-telegraf/auto-config/_index.md | 2 +- .../auto-config/delete-telegraf-config.md | 8 +++----- .../auto-config/update-telegraf-config.md | 8 +++----- .../auto-config/view-telegraf-config.md | 6 +++--- static/img/2-0-telegraf-config-delete.png | Bin 35847 -> 0 bytes static/img/2-0-telegraf-config-update.png | Bin 31178 -> 0 bytes 14 files changed, 43 insertions(+), 47 deletions(-) delete mode 100644 static/img/2-0-telegraf-config-delete.png delete mode 100644 static/img/2-0-telegraf-config-update.png diff --git a/content/v2.0/organizations/buckets/create-bucket.md b/content/v2.0/organizations/buckets/create-bucket.md index 0572d2a70..ff8715cb3 100644 --- a/content/v2.0/organizations/buckets/create-bucket.md +++ b/content/v2.0/organizations/buckets/create-bucket.md @@ -14,14 +14,14 @@ to create a bucket. ## Create a bucket in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Click **{{< icon "plus" >}} Create Bucket** in the upper right. 4. Enter a **Name** for the bucket. -5. Select **How often to clear data?**: +5. Select **Delete Data older than**: Select **Never** to retain data forever. Select **Periodically** to define a specific retention policy. 5. Click **Create** to create the bucket. diff --git a/content/v2.0/organizations/buckets/delete-bucket.md b/content/v2.0/organizations/buckets/delete-bucket.md index 3622b684c..e1652ce12 100644 --- a/content/v2.0/organizations/buckets/delete-bucket.md +++ b/content/v2.0/organizations/buckets/delete-bucket.md @@ -14,13 +14,13 @@ to delete a bucket. ## Delete a bucket in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Hover over the bucket you would like to delete. -4. Click **Delete** and **Confirm** to delete the bucket. +4. Click **{{< icon "delete" >}} Delete Bucket** and **Delete** to delete the bucket. ## Delete a bucket using the influx CLI diff --git a/content/v2.0/organizations/buckets/update-bucket.md b/content/v2.0/organizations/buckets/update-bucket.md index f113d9ac7..76e5b11f7 100644 --- a/content/v2.0/organizations/buckets/update-bucket.md +++ b/content/v2.0/organizations/buckets/update-bucket.md @@ -23,23 +23,23 @@ If you change a bucket name, be sure to update the bucket in the above places as ## Update a bucket's name in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Hover over the name of the bucket you want to rename in the list. 4. Click **Rename**. 5. Review the information in the window that appears and click **I understand, let's rename my bucket**. -6. Update the bucket's name and click **Change Bucket Name**. +6. Update the bucket's name and click **Change Bucket Name**. ## Update a bucket's retention policy in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Click the name of the bucket you want to update from the list. 4. In the window that appears, edit the bucket's retention policy. 5. Click **Save Changes**. diff --git a/content/v2.0/organizations/buckets/view-buckets.md b/content/v2.0/organizations/buckets/view-buckets.md index 5d47f5211..2fd8049e9 100644 --- a/content/v2.0/organizations/buckets/view-buckets.md +++ b/content/v2.0/organizations/buckets/view-buckets.md @@ -11,11 +11,11 @@ weight: 202 ## View buckets in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Click on a bucket to view details. ## View buckets using the influx CLI diff --git a/content/v2.0/write-data/_index.md b/content/v2.0/write-data/_index.md index 53e5756bd..d5b856dd8 100644 --- a/content/v2.0/write-data/_index.md +++ b/content/v2.0/write-data/_index.md @@ -114,11 +114,11 @@ influx write -b bucketName -o orgName -p s @/path/to/line-protocol.txt ``` ## Write data in the InfluxDB UI -1. Click **Settings** in the left navigation menu. +1. Click **Load Data** in the left navigation menu. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Select the **Buckets** tab. +2. Select **Buckets**. 3. Hover over the bucket to write data to and click **{{< icon "plus" >}} Add Data**. 4. Select **Line Protocol**. _You can also [use Telegraf](/v2.0/write-data/use-telegraf/) or diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md index 75f521b0f..c4fcae5b7 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md @@ -13,17 +13,17 @@ weight: 301 Create a new scraper in the InfluxDB user interface (UI). ## Create a scraper in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Scrapers** tab. +2. Click **Scrapers**. 3. Click **{{< icon "plus" >}} Create Scraper**. 4. Enter a **Name** for the scraper. 5. Select a **Bucket** to store the scraped data. 6. Enter the **Target URL** to scrape. The default URL value is `http://localhost:9999/metrics`, which provides InfluxDB-specific metrics in the [Prometheus data format](https://prometheus.io/docs/instrumenting/exposition_formats/). -7. Click **Finish**. +7. Click **Create**. The new scraper will begin scraping data after approximately 10 seconds, then continue scraping in 10 second intervals. diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md index 646658dfc..4e5580729 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md @@ -13,11 +13,11 @@ weight: 303 Delete a scraper from the InfluxDB user interface (UI). ## Delete a scraper from the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Scrapers** tab. A listing of any existing scrapers appears with the - **Name**, **URL**, and **BUCKET** for each scraper. +2. Click **Scrapers**. A listing of any existing scrapers appears with the + **Name**, **URL**, and **Bucket** for each scraper. 3. Hover over the scraper you want to delete and click **Delete**. 4. Click **Confirm**. diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md index b6cf1c67c..25a163387 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md @@ -13,16 +13,16 @@ weight: 302 Update a scraper in the InfluxDB user interface (UI). {{% note %}} -Scraper **Target URLs** and **BUCKETS** can not be updated. +Scraper **Target URLs** and **Buckets** can not be updated. To modify either, [create a new scraper](/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper). {{% /note %}} ## Update a scraper in the InfluxDB UI -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Scrapers** tab. A list of existing scrapers appears. +2. Click **Scrapers**. A list of existing scrapers appears. 3. Hover over the scraper you would like to update and click the **{{< icon "pencil" >}}** that appears next to the scraper name. 4. Enter a new name for the scraper. Press Return or click out of the name field to save the change. diff --git a/content/v2.0/write-data/use-telegraf/auto-config/_index.md b/content/v2.0/write-data/use-telegraf/auto-config/_index.md index 3001d429f..64f426274 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/_index.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/_index.md @@ -29,7 +29,7 @@ for using Telegraf with InfluxDB v2.0._ {{< nav-icon "load data" >}} -3. Click the **Telegraf** tab. +3. Select **Telegrafs**. 4. Click **{{< icon "plus" >}} Create Configuration**. 5. In the **Bucket** dropdown, select the bucket where Telegraf will store collected data. 6. Select one or more of the available plugin groups diff --git a/content/v2.0/write-data/use-telegraf/auto-config/delete-telegraf-config.md b/content/v2.0/write-data/use-telegraf/auto-config/delete-telegraf-config.md index d68a54f60..9c4d62231 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/delete-telegraf-config.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/delete-telegraf-config.md @@ -12,16 +12,14 @@ weight: 303 To delete a Telegraf configuration: -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the left navigation menu. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Telegraf** tab. +2. Select **Telegraf**. 3. Hover over the configuration you want to delete, click the **{{< icon "trash" >}}** icon, and **Delete**. - {{< img-hd src="/img/2-0-telegraf-config-delete.png" />}} - {{% note %}} Deleting a Telegraf configuration does not affect _**running**_ Telegraf agents. However, if an agents stops, it needs a new configuration to start. diff --git a/content/v2.0/write-data/use-telegraf/auto-config/update-telegraf-config.md b/content/v2.0/write-data/use-telegraf/auto-config/update-telegraf-config.md index 1f001756f..aa26523eb 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/update-telegraf-config.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/update-telegraf-config.md @@ -17,13 +17,11 @@ of a Telegraf configuration created in the UI. You cannot modify Telegraf settings in existing Telegraf configurations through the UI. {{% /note %}} -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in left the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Telegraf** tab. +2. Select **Telegraf**. 3. Hover over the configuration you want to edit and click **{{< icon "pencil" >}}** to update the name or description. 4. Press Return or click out of the editable field to save your changes. - - {{< img-hd src="/img/2-0-telegraf-config-update.png" />}} diff --git a/content/v2.0/write-data/use-telegraf/auto-config/view-telegraf-config.md b/content/v2.0/write-data/use-telegraf/auto-config/view-telegraf-config.md index ffe46cb51..52b87b54f 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/view-telegraf-config.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/view-telegraf-config.md @@ -14,11 +14,11 @@ weight: 301 View Telegraf configuration information in the InfluxDB user interface (UI): -1. Click the **Settings** tab in the navigation bar. +1. Click **Load Data** in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load data" >}} -2. Click the **Telegraf** tab. +2. Click **Telegraf**. ### View and download the telegraf.conf To view the actual `telegraf.conf` associated with the configuration, diff --git a/static/img/2-0-telegraf-config-delete.png b/static/img/2-0-telegraf-config-delete.png deleted file mode 100644 index 287fb397e07618e3e6d99f92d540b4bf7867ec5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35847 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 diff --git a/static/img/2-0-telegraf-config-update.png b/static/img/2-0-telegraf-config-update.png deleted file mode 100644 index 936acd5f57554ff4459fcb7069e14f714a0de918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31178 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 From fa1ed75e5d60652b81976c9dbe64c82d688973d2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 10:32:29 -0600 Subject: [PATCH 050/258] updated screenshots --- static/img/2-0-dashboard-clone.png | Bin 62027 -> 64649 bytes static/img/2-0-dashboard-delete.png | Bin 60568 -> 61982 bytes static/img/2-0-data-explorer-save-as-task.png | Bin 102526 -> 127813 bytes static/img/2-0-data-explorer-ui.png | Bin 172217 -> 172948 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/2-0-dashboard-clone.png b/static/img/2-0-dashboard-clone.png index eb14ceb82164728a67daea48ad6efd79114fa65c..009ec04d62b1aa6258d690ea771d954d1fef182d 100644 GIT binary patch literal 64649 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 delta 61821 zcmZ^JMO56)6D>~g5G*(ZcZWc59VEfsJp^|d;D-ba!QBZS+#Q0;po6=+!{GM5|Kcs) z;`Ql8pFVYJaa-!vt%`U+gzO+vN2q+0!$K!Phl7K|k_Snv!NDOz;o#tN-XZ?CW0yC{ z8%NCu&sd|-44)v2fKSEyS^Bdiw}1pcr=S2AmyDnUAE&GY4?j1bgsgxdFSl%h4+7c$ zH4^;)8Z{zVQE_oe3rK$!6y%YW|Dc zaSDH`xb?BPA}6CIC#U7&6rrG?o0(sIdwb*L6!x*WOv@_svAp8o_(ENNlaTnv&Mw5l z!pF(^g_Tu+nVB~+@r{j5fRT}#i%U2m;f)@k=aiOK>*$7fc>QEx;4(I`{S}>BR@vPC zZzME4zPi3sSOjEe?ysfK^Zza4p;X8XBU4n^?EKY zF$+s4Igq-l+%LUv1<9#@9Gt*b-(7X}tOA0g!F~~OiP`=Ezfv;_gF|AAO6$HU>v@BL z(5AM2bq!-1TX%T{EmL!Qc3A^nUNLTNF;!K=miEE?qG~3KNCU&~jjerTBs9NcGuYS! zwRFttn|t{9CFld{K7W=<&nls$VE9yWR#M)OmtUcwY5JL8CFf5WiID5l&8#_=M+}_-wH+CP`^U09{C{tgNblfQ0a8Z7C^bCF!8n&Y`T_zpSeE zOty*IiW#+y|7hbzX|gw~YTKE0JQ-Ya*jS{cM1C+c^L#45p`>D@i|Xg+RrpkRG&~CB z=9Ulk5@Lp_R7g08l*S{9&!B|!yRVKM-w+@#1OU!E3PD4=JXwUt9Ae3 zuYX-qjFWaR&h7Uy3ayLUfZ~0p_O~eiOvkjt!^7Rf;vE0=CNSAS+Gp&7HH$2#_Gm=r z#n12kunSo!Kj)@|A@=XOh?k9GYiRVL@&aP9&g1a?uC5LVH{qxX7RGI4*ojP4hy#LZ zC2NRtNAezU_V>mCs zGHj0%R}F>Ce!io*0j^s6Uz$9puNI9OqlA7z&mvQ7x7)`nhvq$=9_D7Gg{&`>WdF~k8Jc2JylVw%UolS}w?&|=+T3P5#m#RU@{l*xvG6({ zLf9O@*^eDFIr-B)u5Ma}IcKPpx?h)1i-3t`Z?ZWmu-oFhN8DYftcNarMnvtfL$AL# zQ@V$CgCe4tF=9z&X~4u)RKL1+>$fbIZ*$eQRrssh%VKuxQ#|s^6)r}_ukG0nWNn|= zI;J~ik7eBGCZr+9^%ZnJrTcE`dKb4if2SBBuWLypu-i;NLgk8agDTSF#yH=WRv_J7 zg@5_WFZbCkJ`81^E~BQo2E2)br62ptY&TNMrIj7%b2|m|tw**Rrbb}jpba7KmMzCA z#T(&{6m5xg%8-=1xZz^kvqfK=BXP8f}6ecoMR8ob?r0KEX(X^ zb-OYn&lA9b%R%~TRm!w)*=RG|8!#}+8vKG&IrZ*Llk>}k(os84maJFjv8IXXrpH$i zx8#zpak9Nx8_18*(^tQ;l`@{HQ~PsXdjALiU}o zayq8ZE;ig5GUNA~2if+?Rz60#cZon(#pbXa}3!sSZ-~R z$&0!b{*LN*Yn66f>aP^plHPVr)weYrE?I3#T}~`z)2Fj~__qghn9U^o$L@JI!G|3p zipey)S4X<0x(=4^=Sxh?S;jJ3l6mEKMseW34$(w4`Xiiq;BU zeYzV1tS0=QmK>@ulYnWF@zbF*2;YIL(TSr`n@5x4Qi*vuriQmN9&_8s*rG+DG`@o4CjBya3x*ha%BE&8L&IHwqT& zCflR6Q@yhMZOzxe*^LgRKEwJv&TT4UXJ)p7P5O6*6amKFYC4zAW29ccinMI@ze8({v^>`>^PBiUh@ZW9 z*bfeb)Vs|m19LlmCFKd^T`9${tl4@#Mmr=;;&trm^bVTy_D!0hyGyalWAi+%%R&m* z;Q3j0^{VIe)MDLrqrYR`g>#%M=+*zOKRql|LakjOxje^0O|7@k{N>-RvzMYx|6aHA z#RQxbT_3k$#@37RcdQfFD({tM$(9`MZ znE}JX=jOD9o%ESFeJsKs8^5vrZw|KN26@Et>(Vn@EQu4I@{BBE*fr@yXfR-Brn@Kn zkf!!MV6D{0@J!vKl|;|`PG9~i`q+08-CWecpTVaEbbM54_K;MWPf=N&G3nc~j4^&W z3g!D|-S+s9ZOi0%va744xUE~4J$*e=Y5&Y`0Y(HOiOWb<2>pt6I zV3Xz*x$nMOXE|S{??qX)u~^>t`>eFE%<*LxaBsSNYOc+Wr)dWp)Ef&_39qm-V>MZ5 zh-dk@wK-Bg8T)8w?4G;#8_+I}ue9?TVx6lRDu$mvltC)xTbHt9vv)Nwe_RnK_uk^L z+@7%{cxwA+Ki0Jx9`EjJ84YHK%2h2JwnvoRKAs_9@J{fYS!WG)7&IOioF8sSr__1@ zm#q!Vvjp4jqH?ZnZDJzgtk4?oW?|JqL+se=tQ6e?%6wsj#L%VSTGs$B;&-wFrA zDE+s37a%V`iQdLvINhVYyouNMJKLWp(rtVw(|4#}MyDn!x4fA-1g=}yIt^~FE?Eo9 zvJir0 z+?OqK177r^V$S7a_Zx%QJ5Q<44AFftmw0qyK_JP?fCKw!0Y)XIN1Bp#v9x!L!k*&^ z;!{|$vJsPrDIEPh;6#!4Bb9h-vbo;+nF$yL=^Ywud9^XQ`kb+MeCTR@%r*dmg`dg~ zeGlv*R>JD|cpr$=aDq4sTXnLoUByS&4Q_9k*h8I6x*X21LM3S>J7wL2unqx#T@Ixs zK|(>H)S01T6JX)XjX(Ff!1Xu&kr9q#bvuy!a2lV(#^&UPn&CGksEJ958uCAhN<+Is8Gzb z!b}QXKw4p2M?xh3LvN&6AU{vMiHeFQ0|H}-*zCYBh?_2kI^VSg3O=w5Q9cTrd<$g!vN={v|aImm9UL*r%xD!_t9X*ngAz?*^Z@Xtq; zpbm94EM&`@rY}`@jdtZM3eiT?C$2V<8}(LU(fGuF&}E+A$D*pnpWl#7MJC~&-dC)o zV>D(w{(mDD10Ki&44;5p{ZLTS0Kp7m$r#x6JAcV^AGfOs=TR>K-z;}(>F_eVW?~Hc zkBitsw_w$^+~!dgnf?NyC&b^_nhT?%WjiA2woUmLx}M!FNqM~215k{b z0opk?)(|^)wtWXp1hvir>SN2@hLI8v!b(laLp!1pB2Zh(UM1kM5w%k->&oauyF*Hg z5=m1b*^6wi1Zg3b4BZIFK&wkn?Iy}~XS6ZpR~63C$*U5tGf{1X#b%&BJic=Au&tiv zq!?b;h!!`hhZ3t4&F{Yjxlv*8`mk22;SRMl?4kwpmuk#!m6116;T4<+i!mn{phXZX zY~yJxvC{^#q5w%}xRwNS87Nw$U4L^*1GnU?#DB)};JN7!(W2aqNi26pr zhmbkX9{cIl^fyY%QE5qd`QIPv1gt;A6WFzox8LDIC#gI^e9Ar>74?tsLetbBOcUlZ zoLGUjsXKnSZFhvU(RjTeMhWB^1jz!&DBo!-y#or9&qwRQO zvZ*&sa)G$%cEdy;3-DLEkwzycMES3|SD420Uu88*SR%F*lEnse`MIm6hlS>fuTTiN zn8LeN{Zs=HHq{o?i$VgRUMk77r0|#v0x{gytSGEHbNO+t*P#ui5o2JbtVlGCb;ana z9SRsG!in?W?2j`9$=Fxzimr|SO5k>`GPpIIi-CB)cUmq9BBh}p78BC3Ol*-uqqvF{ z)ON}i3=1m+ezCRG=*mW}GCMn)=2m7&jN}Pk^e6Mrk!{l_UV7z%o?I0FwWfz*Eos-R z!^_wN?Kuj6jh1u4etaTDnrA8@ZFKI_^|@^%M%Qcoqt1HJAk79=EeI8RSpO4WCp)Hv zatpviP_RE$v|WCCpC59B#<*aNpB*%+P_hGMTwr%Mp15PWI|CvVPSr%XV`gMI?}7F!cp3eH=Hkeo$T{3y1nRx;?y zH5wD5J`qXgPW(-aU?3Oct1Vw$IG=wXeN!J7DW>-a%&8pzpP%mCWl)1}<+80(9Yl2@ z4PKX$Zg-*<`oAG;Ms9vWR8@2|ZAsY3Bqgs0SPG+{#b+fk(h~03PjTLYR)79@$8!U! z`~%$O^LVqUoV^2K=!>58%l~TI10$PF;oO@qW=go;E&PzTp`rPe|1lEhj<_)zRCrsx zH59-MHVy-q66q4%BN!pzJ zr@@$byMR^$X0&gy5wEu(uF0If{^7tR*3hSh#RTxAH-7m7?Vla83{!@Wx2{=#PtxlsSJ$FI3LTZ;-7pCrTQs8#0SGrs#Vu&xbA_wspm`fR=y;y% zPj=uTv)q{n)P;Oiu@(lBFS0>nx1uLx(9KPMuQBiBY?_W94_{dTuNSdiECxjHMWd*t zaR1~D^R0dYZD`YmZ*XrX5G3c$Incale~9Y0qsT>o?xM>`DQIJi{KQCw+rg<(FaFk% zLL=0DEdstB9TK}ep{^e1dRc2;{WWeT%hU$@gFeE|ScDt`3;pVskftW`A!&wB{PjYG zcUS!H*9lD5EeAE3Df>L(aTB1+=|a22f=}+8@t62tg@BJ@JFTs)X`+pSx*C_l{1^Pe zJ<)pX8SfJu{uLlmwV{5rwP?N^yz4nwOaMl{7;)cF2u48q>`oL z9(icoA`nxAxP$Zo%?|qISBG4awReo3d2H7Fa*`T1Yi>WF31>0aN7ZJY zTYkVKdm9%Qhz1q;KnEi+*vtF9on-da6qNiiejlz@N>S!Krmi?vg)l5?WSG+;Zqrf=_Te zb#BUZ zi1p`V%S52yP4gW)(hRE0$6{$es@|(W%u(W!>GLk!}Yr^=y1iPn>c;B0hu-?Wl8F|Rw=IBF7?XX4R4l3^xWi7U5DV~O~LM!U{ zK1aQ&F_==lVq;iEd<62CY^I2esGDHsx6vnrX9R33Ams$c_4v2N~~gSfNgkjZxDEFew&VXNhoqi%Q)&jvat4ula4WR1xX6t!XE z+ZimhygM5w_(kR7>#JE)@N~}ljWTjpJVAPL zx(&^71~ZMiY8Q-Jy&r0wOgTKJ8~seNP7eBGY%y9%rHht#)|Yi9!F5LjGnpAlg%+7y zvbnWX`W6@lvE4llo0&@c3zlv?i^ydJZAL%)PttTPYPuCzD^DJB_}H-<0e!2Gtq3e5 z>=1LwfNDxciO118RFtwmb~1_7g61a%o}0HvQN0P%4N(z4>=}zcygKrmBiDSpzQv3}RtgYC)o>LYs9p8qLKK|{L zrV_?~#3oVTqfwM&q#*NgfYU)C^ z;KC=c?yW-towVAbX#{^jdvQtMCrINpb6C92o9W-B#(c0>%qJ;K&2Ys+huaD=-4ezC zR{Zn&^d}X9*b9WRWiM(=2a%H8Ia^jUDgWKzoOe#}-m#)H)Pt?8$!jsTd!tct8&6eW zhG@^O*_f*I+k`q8P!s(*nE;)Gsr?qZmLI=6Ey-Nht__+#ta%HR8e#ikUL~$L;h~%0 z_=D~zQBM_eis2fIwig<;$S|w+88~mgdztm?HguJ(c#1=}dPB`+07h_9_SM?3!@ciB zlcjK9S+Cl}$m2^tOHpQ?OLhZFU4C5Q~a3%2PL+9QzU_ce^DmHzV=lf z?tI)_`J6>wB}j9SW2kIV2g5g#GYZuc;%$Ka#uPZW`uCvX)swdiZuSD0IcfKvp-LRnuHrJl+jX&9|V?sUG=9h#rbFUODPVR$punyA_i-Qfk-U#_(xtDF} zKa1c&ox91}z}0S(tI2HLUEO;f|1f*&s^)<@G68%%EZo`h*Eq*HB}issx?>;is&gau zx&m&;>LRy2!b6?bpF*AlB0^M?A#vh@>jOBcbVz>Y&k4_h!RLN@ z90fhKd#qU!t-!MXXO;$W-(#RL zII3ODo4V_O;1MDvN4d6AHV-lN=3(;#T%Q*PHrgwg+Q~XD2t0~|M^kri$0oSPo?EO1 z&TlBe$+XS54qa{9RUNNVu--j#iL=i6xlwX?i*>{k(JF)cT3Lu$?5n`*P}gtC)|^l` z;8HQg@#4j%qGBS3ybe68$7pg`3kaT3>g#{;r;6~`S36DewH|=B4d?y%hPoJuuJzNf zfVV2xY_fKv&K}F;w72+&`{8+Ru7~Msfw(WFZcBTC2v+myFSS@vX|InpV%(tpvx1+) zgSwBiAA}h^+x14Ex@SUoI$4Jze{C;&Fh2?w^kPJ@a1>j%oDQoPi!ny^rvU3D@yE;N zJs32rPdWKRJ}?s#k?CVokHreui|DQWN3D+wfA=czohS)g74@smMHYX;cB|?mG;Y^l zYdOPA*H5~})YhFiJ`VR=U8AFDghq;3lU*3--UdJLq_0yJWpE^H* z_A8tmY>(43KSfLW2qErJlmW2)Go8FUx@{9$YLT%;(WNP3438r1*7kw~*AuN4isg^Q zYjnn&$rnx))ibjvW4|RdyXM*bGUpGtq(P5n#1TfB1{8((nRQMhvxTwaa3ZFC_ksA( zELISXZmY?Gk)Gnjj0JjG2pR_hG_7ED&X$ttuN2PD4Obd4B)kh74f%Wv~r=V%QYuunNleHeU zZ*<;zFK;@ELlqP3$ld${>pu-%GW=�?%omn4 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 diff --git a/static/img/2-0-dashboard-delete.png b/static/img/2-0-dashboard-delete.png index aa19cd67d78ec25c9e4b26f9e7726729fbe1e79e..21ebfb33fbe227654e6e0d2a08ebafe7dd529b94 100644 GIT binary patch delta 61648 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�T&EVvr(%BS^9Z0hlYfSG_tTJZRh!DhS&H^I*#zZ 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 delta 60194 zcmV)CK*GPCoT`>cM}dQm92z4`O<2Xp z&Ot&=$;{HNvAcG7gr=#pH8w%0thIZ7iD_$f{iT*JMO<86XmdbB{(tM~gNBeQDl}_Z z%q5J)p-V|~b$}{ZcSJ-||G1{Sz{>u?wK6e1{)J>*Izs)*#bjl0Y;Aarkee?rI#E(w zpP{RY_VPbB6fQzfHxI;BRD@$bjx3GD8h8!Ft|Jl+*L{qoB#7Rn4Zg6{Q zK0_&Ml=)#*BBknCT7PEL*WD~EHatB@nVh92fU~r?!n(f49vmdNP)xkC`2Y0tC55^> zGd?*dEzQu@vbMmZrm!X^FeN1~Ffco2Xmeg*YqL*FB$3TcH$W&hMK85 zdj8VQEKzMCtn^M#ThY|pCvu-eMN~&fQ#?6YdSvnWWLZ;GUzM4sn46_BE;&CxOaGL2 zG&Da$JaAPsI{TfKEiE|z`S_cjsWCT1oSvrruB0m?D)jRH|NZ=(psKI2xc`i8{DWh& zw!KkPVf}<;uYa<=9vvk}L3wsz=Ku2Wnw_XBUxFowzap&lDJ?m`!^)VNqWGCeUcJTWmod1UZ0FGd|4 zB>IA49UUYwFg-UkP$I4NCnqsRMo};@JbPvG`d?G}U{rc!@-Ziv!@PC}2s~;aH92_Jb9wsp{Jt-+Or3wdd008B(Nklv^p z<;YQ#iv%Jlmyo{(@D4GYaEXxth1ZQ)1qI1bv!YAlVPq46hGkvDaPkaE0SK$v7^)hgOo0A2&UpJ$=7s0fx)$B)yMxGe}2Ph95@rwAGo+~VCd5oIDWtX z{tRE642A$>0}AQIA76UZ`e&f(3b)S-46gN!Qs7&r!fzs1HS;$42~M5-@1N@0VqZ#r zo$CU-5(=cXAaIZ`u4=14gss`ln-5*vY=0!R9V}v>MXvtHukkDItB#}a2^xq~j9g5^{uqs;Ov~A3C_;C?>C^s`x{t4{T>JQQT2afB{aFty!gz0YV6Vy*{plFBwP_~l+%Xm75 zc&6KTIP<)!m464rWib=jVNM{ic=3lsx2t8p`(IRf|6QF!7}`8^rU3`T zQ?9;dyhEjR2Sb(LuHR_j%&1$wjVDUx+ zX89bP@m-DYuyF@EZ`H6lUNEc>>$Di5y$AC#%eJ7f0&{)|A&b3~D=<+;pU%!2&<{aenXP}NA9puWl`T2q144ZrM zha2NMD)c5@ZEiSc-?yqX~mw`CK88}-lc6{x2UTIO+(U8j4Z_T$=nKpSGal9V|b7)iuMPH^zBr^vTs% zb$$+zPmt7i-=?lvrms9b4drK`m2O|7O$LfQ2o&u*P~@NQ_Z1t$0)nkHk?J96M%kQ847Bzu>e7|G{ z7_vMJhG2!`e-%Bt{(MS$JP3^QbfEs+m~U9#zD`*V41Z<4ER7z|&iw>> zDpp{maQVZh7B?Q7eh3q1G@Jq-*O<3q%t@|+gg)jgJE09KkRO(^-@vX&Qf

_l{@aCurjStp;)Ume1TeJnvim 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 DMF(T_ diff --git a/static/img/2-0-data-explorer-save-as-task.png b/static/img/2-0-data-explorer-save-as-task.png index a36e18a09acbabfdfdd1d07c4066fcd36d0d0b1a..18b296af5bce071635a5d14a6765fbcafde9289c 100644 GIT binary patch literal 127813 zcmbrlWk4HI*DhM2IHiWT!o2PYGDPmaig}hv2y^6(;hap(o#EEi__`@)VS54vNrY(Ne?Y{*OirONhIhIPIgQ|I-B!R88%FDF(a#SD+q4#^q%J z<>KMw<^qBKSBImW?aK-NouLAGUP=O@55s|9ztW03WRp zk%L&dgKWTV%5vhgj}lI62Wt^tVQFq&0YQElIe7sd9(iFQSp{BsSzZ}gAt7N|9yyu+ z<|>0--7LUXHvi3a_}^T<|0`ES*2Tuc4dS8$fjIql_B8DwZV*>{2$Wh@_CMJYre;>N zuyO$ZN67M@0RNZ0HZBexHr5I*5D@kMh>(cG|G^3&egF?ZR)`P4CoA+H52X17c!l|d zcm=p+0Nips+_eA2wf;YN|6g4G|4%O0qcL3nN$>wF-Ty6mtfBu5|5x!o9{jKJw*f!a zyvt*8Kai$1J+7H2nyNbTV)}*j^qj&%3K`j@64vFC=0C;s5H-hBvW_)90~7T0?2@LX zz`kp7qarc$QfZAJk|w1O4-XQSW$j%38SJXI{-b(e>J#!h0@cpx3u+!eNCn< zyAZSdDPdC~3WLfy*2rig28PDKP(NB4R&m=3Y0V##GfOfK)vPRhIe8^wCM5uXRBC3S z^p8MWd$;_h+tZr|uBuBGR(?6BT5*%&`D3(QJW6Fe-Ug79I zTHLglQ_xsJQH!?ZWNd7TiHSQRDvgnmo0XN1j+TuRl-AWdN>g^h#;r(A%_44Ing%bH zw)>?vo6E+=uR5E{%`L{n%p;}u7?}$xgJS7V2q~RHK_O`#Nh?|!7HOSADg7d8?LsNt zLMg*yX}uyT{bFuz5h*Q%)T2-vA#G61#K?8>aK^waDy{p7M9|Z*Nk38^!TOJBWql-oF!bv}Na6IYknt#SDyGj7;1TR^>FbtWs9xbo3mmQ{NPtW2JN- z)p9U1^U%?;(a^Bc(Xlf!a?#SVF){J5u<+5-bI{VVGB9w`(6BHwKVE*Bg@hFJ$O$5! zJl!i)mXp@;n%`?ScB1Uf5D>G+#o$tXcH8|``R}x*0;iKfls#V*t)UMG3xe=F=qsM` z1!I)C_Vf1O$^*IZDnn-)1A}f4zbnd4^(&TyX{Gx3w;gX?pI}i-alhSTn|S_;JC(a_ zkWeYKdA*zP1d-ReQzol_d6rkw)M&R=6fwL#;ijMS&1c7(P`8xe{N-2zfn_=41JIAr zvDCT%CEH9~A3AjT@9q_aGy0V&XCQ!|N3O2z+%5CI;yej}ww?>h3piPlbo+8&p|-pj zG>>5{AUBf;V(g=gwKmrV)ULH*7z#Q+nfVJ57@bzdSm^e5bQ*k)_WMSNwI$Tv($C%A zdg~d#?Qk;O^Zd>?lU@5>WBI{q?cvw9vx!1$h(>D`?ZVlh4WIQNHG~~BOW4ELM?rP< zPuBMw>6U|mp{srAlZSzQwl&}QfFy>qhZM4`ocDkHZEgm*4L>TJ3`>Tr$=;9teOMI| zR8N~g;a4QE2t;Xci}U>v=xo8V>zf2uoga{iwEBVs4O?ypz*QXCNSMmic+FC$H6;yD zvF{H1T2fVlPDuWK;*hAy+Uwm+OiauoJs#xWd{6?M?m4jDX`j(hLh3?lh9EwHy^}Dz zML8g1LTKDVDgZoiDDHRd!5fAG`a&H=(LX`G>rRwyL^JsK_2r!+lVkUI|_a zDa3nfRN4)vsjj43>%iS}CwjO96i4wshjTrr)TMv@ZQwO6)!YeI^21ewTu){w1*MKT z@zFHJi^i$Xm==EO?1!cVva}J^Q}a8oZr_s|b=$OWJ~0e1SIS`easlAX)3(lhGRGRy zlsAP_6(c+ODvbI>tylN%p!XQaiw5MNXzI2JVgEW;KDEtaJWGFOKY?~p58@8xx}Z@^ zKY-k-LJd02oR41b_N>?8I$Cb?hg2<0xMgj(sD@<8G3>)2-2S$TiMCiG?g z3RK??4BLlDy)e-S&GCX1(@R!Tv_8hpiw z^#?BGuU+2jPInbuv$XeiPoK`O_@o(2@xuFUA!>cXS16re`LYS)3;1=LPg>jGCXC<6 z^-6_W+Ee_NStZHm1N>p-eAcCWblBQ=5AQJ~Pv+F8!Ed1oG&}fM3{TA#QXX8crMxJF zxg>o@;u-8l{vHn*Mt=5x)<1%YH}Xw)d5`^?`^XaIbPvF>^{1>FVZ90q91z5+mI#%= zwDW)Z#kBd&X#;DXYTGPBa1ge#<$X};)1qI+rG%B+rA|#|EqxLeSF7f|sgpjwIDY3J zFBA}tfZ76uJVHfYjh5}NyS{TLpKHN@*_XXIEwO%=>PIMT1Y;eU<$~(h{e9pQ)=$3_E9Hw!7Thc)F*Y&wzk|9Y<_u7vYGmfS10wlil3H zBmaUE0wTAq)^^|B+OD2ql+)omWp%9Z2*ge#JpW)SF_H?4b1kC$(CeJ#B&wdVaP=!7 z>znOqZx2ovjBfA6gd1g7g45``_xG0ZNBjfJTbI;9>{a&z)P}rD_2d~$gLdUH#0LWY zVdWHz3-Jk1p@9v|xv%(;@QR#v8|*kYA6v|8$`?&5HSK_&y}mONTz@`{S9bA(`-oi} z{)5lAWMp>n!!)H$!4nuS6`ARI4JgSTm%I>m?5i#Eyde-qp<=SPfZB3Y3=jzHo1A7g z?sVu_QJBVL=B1^`A3TP0_Fe}88l2QPwR^WN?5|f8(2pV?tKG_FY zL+ui>BY8qSk2?(qkZ(qMXwc3@EP;e4orwQjkrK{Yab%vp95o z;;v6LUmoSIZ$`fetFBYQ4$zn7e%pz3+#c2%>GA0tob+y=>PxnU_{Hw$I0H@|fCFPf zR-)W;G_b(Fvl%}h_pMzT5%hT%E66hOF_e$1^;$#m_&W2;nC90XR9`K?|0XIbMLRHW zL(WCL=ybRNxYnWubjd@9%lT^#!Gp!HF=kgdHcxFpgP%#p#t;DoBD9W(Q$d(~1(e*c zrs4WhQP@E88I_fL@(&_RK|U{EC^^|XP^?z1hwqVqVKht|S2}c;s6_zw$0^gb)?r}T z7D47Ki|}|sQNTypWBaOd+V-6)Y-SHpwyHkARCd;UG|HSCC8|#-;iq6vac!JvtsGZANI3382ce3q<-K5xI?;g zaajIhZ=Z1!EXV-IYk|Cscc9#kaEe@Q%E}%q-Va_m9`)#%pS{F}E07kJf5=lCedt!` zS;S^XbFEpf*lxX_<6j@16ewq`|6t}CK6)G^tNR4_^V3H=Y|&j&3dfjl`^53nOzBy7 z3U8uor9y1{{r#(?2Xa+F$>9`vXvSFi-Q+EkcKRbx7@rc^T>W&i4<rV84FjSOf7%pOemTWg@N~ zo`Bg94SF-9b@4kCbP%j}f$&#Ri)W#K7a1|w)hoj}p3zUtzk}ziyc5kgXQn6=-BLDq6*d%FaJp!s^K&CqVKGI6YT5{ak+iY% z)lO@mwRPX*>{nHSx`e?VXEqdovzyLa{t*yod4Kw)v# zaWM@%n2HvJiXt)G)Ln=@Y)+C^I%)-lsy#+WP$%WU)(KI0HvylAVDPT<;&29~6}Xcw zcnQX=3MMpciQp4NRN#;b25Y|M7U@{UoV|NeRSOr=!W86oN#YZ3jN)nFvrgo$OWRoQL6|t9V$kFmm zMR+k(%TAV5agIWJca|T(!OhpnPyPnm6Hca>DgYCqFq9a2MLTV3 z+qnSpijs(((;QObEzNFW8@w+QxVorXS;XV`-GmbJ= zcs=A``PL8{+>j(~nKZa&n}#D8V~w$(KWG&HHcMgWu&M(T?OAqy+>Aszw*-h8 z2uO@vzuf^li7~bmuHVHN^paP)-OmnPE%Qw4P|-i`IfNC?>$k1yGI|tRdMg$cREj58 zFh6_tl;mh8yA*I_(ia51vuS=MwTDXHht%=leP`Wbvm${ypys3$G>W< zSqkYpO1~H2Bd)At%j!4H^I5=#e=yA7+r@oaM>c|-4xJW=nP1?hh#6p+kDXUhEKm;S6H1x;R9lPHovk_K)bsKk#Cq(0)cYzc0Z#bFQe|}Gxe`^o+-yb$;k$&P$Xacix{pea7M`py} zOMGKIyLj|u3i-L<$U`@HUe`gK1QFJBuf>sF#HK@O=%4HX* zL10+_qV^?ImmKQYjfgOeZ+2VMHSviUTi3TGkbXyjqzdgJ%)c#%E}PDYrV(2Oh^%>J<@Ob@#1>~%w9GrhAn}Hh zS^@E2vm{Y`P}Eb9-N9mMvg(gRc-xB;j5LZX$!_)Hw803qJQQX3BesS5=Ey?id#0gF z_=Ef%2F7iR*leB98#1y2d5id$`f};w;S<$=uchBtOD%(JK4svGojB6oryTXnu79g+|PtVtjm;4rqH;T}vlQu`F#Q)GUr&k>&(x zQiA_hRLHG5uBrAsc4)8xhLYrND6`}Bi#(jbr;#EX;x0KLb>l2XZ3qPi3_aN(AQZEA!Us5#bqwo zw~er}Po!@{Cz%3nyr%_8HCSC5Y2cmo%3>{USTKP6);y1NNVQN7JpHAeA8^zABej2P z-@XDo>!T)VxGAjq_=2CH+R_jOjy8e3`#hS+Kr}r)`n(Py97s{{)Zkrg*i*v^{lClQb}6wxP!P0zf2uE-&^-3#=hOaqB-KigkrUY{eMbg)_+&NXHd!itWSA{YOr*It zrtJbxAO$e^VD9}I-dv}ZGRe0d@`C5ISwM}p4I#oiF7m{%%8Pl!7p)__N}_Bm+4z5a z)OZ2&Yhux-AGcCtc=n?S*t-d)0Mg;{Ev0GmnK}BMkqMlpBu)oGrFr-?tZn`D%Cw~m zQ!1^mr43uP;Q73(6ku6m+F{}mz$oU(IuyqS%1W`T>sF7fobE|tU>S^nX5yc;DuoyL zRllJHAliB2yLByFWwVBV{Z6Zi{A-sI*LTBcuPIIu5ntg<6w3i$-i02=<5$~dnznwg zrdsx^$SKr(O-{)x$=Mc($^Kldq+tab)0v-0ue<{(synyhrBBtc#>zNIo2PJedH1n3 zq!`%ik$cZ5u{z*sEhf-MZ1M6tX0HPIXGtNXM&~Zi)7MrIbcoL5BS@%H=$L7{jZkkQ zLjrp2cN+hb4-;lcg(;4AMDKBKGasKTSzRXBSzd>UHg?bRXB)wZ9{M-!#5(&%t#?#< z&I~%!oLh)a0z*~fOlU%3jv)3N>2=n(Fdpp;5~+Cgv> zs^ml!pn!Sx$E1V!1A)_9S5W8IE8F;K|h&t;}g}6KC@-hb%7xLug zI3FqF1W8oYiB{%ygvwi42=wRD{izqf>?g6ScYUw*e|0xf9jcUO=ES^r5QHUz&nfL& zYO}d#s@t)n>#x@T`umoXv{G{-FHRxP4~D5JFE8|~O{i>4-6#2%y29_39=n9U?O8M^ z{`rAYN}x3~S@%Ya5{WlPAVsyYe~v3_N}@VcvHWtL*i`D)8$Ss8sij{7ztDbIAgXAU zpAyOtC~h@Vwjfh=MZ+Sdv`GbHrB8nI%*WxY9sPFx7MB*bSZ#wgae(W+rX{G-ymd(J zbIIfpQ4Qc9uBF<*rPPR{NBqsD&RE1p)KVtXoNGl8tHy3a`BVdCYng;7V)eu2$yGAg ztOc#W`jsofLrDfN>9mRGe7$*9vfh)jaM&2pi?lMPXDJ2$Hb(rkR!-_V12bgXToD(@ zSZe#q;Ba0tmr!Dkd>qkDoYo1^kTw>GsUqTb()Scqid-*klft z{5Enh|W=T#1l$aGIv9oV_y&+;)_UNIFd?Ueix*$d??j%2QZmhQ9%b=JHVqq@kek9K7E z$-`9f+Z;?@v9AE7hgTRH7X5k7CciQ-PWjWc0<8%2+6U?xnR>`7MhFy`I_iic%4%EKqtrE<;Yw+Kai5&8YNxT4!?MS#8g`fP`c&;uj_M zkLovHm|z4C@hfJ*gqd@u zZ$}G?nsjunSw@DoN&HwDIIC-ciWJ13T(CI;Y*HuQn*H%%={gAhomx}hLh5LAp%qq5 zaNa{NC$kR%I0+N9M7(+Vm7G$=p?`vgfCrBi-5P~r2YH*z@7pOS8O(o77^q@QOgZgR z(h6DlM9dD7;jKN38?S!GE6}qTJei74g!7=wB)4?)#Kjv*ntov@2Uo+e^d|2e`Zv-^ z+QXD0`m*htwzA0!y~!*W{)WeQyLuHp++omLa@RcII zXBQ4>IO*gPFshNXvTCJG#7EoF{ny2WrqAHgVleqpt>^kxxhj;5Ucqt$qr6nP3?!-% z-{rM5oUs2<%LU9rHAhFb=uzC1M=t21aMs-BqlWD&R9*lgl-A24ao6aJZDcZsKDg_- zKNV)1&rfIAuF18yF{;mbQKRvK;nVdL)ba#_w2+Zub2-e)%nZKIpUJrW6l_#qum%3p z`vM@|VC_YC7q#iL`VdGGUWbJ-TI&2`{}n~(K@ZvDA4{HWefGjri(LmHWpA&wHhsKZ z7g>NX{*;h^DM8pYq4R?vqIoL39#io5fcP5of-D-OWDjL7ozhtW1z&cz&8(Kt*ucLG zv)qHS9$v(NWj?LNm(yI~O!pX2Y9kqgIqiffV~K^RBy00?9H2uw?XQ!G)9D8dFL~WW zM;2p$9d28R8d#n1yh3ik<0;`($^Fouku;2BZhP6#QGw555Bq;rmma zK{l-tV!wsU5xWECqqFw0hTU0^){~VNzj#eim|Br0I8*COkqdi#3msWU$-FmHws=@yt9S` zDoUJ<-^g&7m``dj8 zs+Ue>|2%~ckP&iNs~=fgaHo& z6b^S0BLODEE}5SN_3N_AYtSiz_q&1j*MWF=B{vq$+;>%sleKM!Fb8n6Y#>L>yn``jjVlIz)a%k5C`@bZ5D+25XXORS~ZrS4E( zA&;%rd5X85g@TkNC#UKY>}#m!U8fttkKTz1}h7 zu2y9w)m8bfgQA`)7+=NrNOnftiYdC5y?t5|fyi`dQ0Thk5kW7pIP zfXIhBe^k%RD8OIfV{=;OI+WvZwBsJnlumMg&e?rn&Z7)%x%ph=QcJuiC!s;-P)gPQnY`FfKc*;zr~9 z8jiNGGtX^fMpZB`TR&$U{7+D+?|8s%kiX!c3}A))Mw&OB>GfLA4kWZ!zNQZO*;X7~ zUA7Smq0%$~iondQtJ6=e@+Lg^)EVVrt}1@i>}-B5WmF9ttru+LtBX}0=KGFp|I%_k zVb_I5uPOlls1kM8sEFL(sdPt`#MC@?@pehjsrPnaabJwHKn%KYBy4aZuHKG1Z#%E&KLzhTe(_Q)Ic;u&#K)S^*2QtaArED zn$%lfWKVFYD4s4HMm8B{lfJQuy|TCah?N)`*=Fx|(ZG?~#YvRR{5^WnX}oT5O*I1n z0fTBK8%Ye3{8gsa1rIV<+LqBmr4Uv+d4W|u%c)RHjyLOmCNlxoi^-RLGroa-lD@{L zJS9!0u~W#M-4+(3kJ$p3+{Qw?vHuaSV#u*KP4}3JaZE=CG zJ4}-f;Ph|qli#R;Q@h_u`y-aN_*Stp7s#g0)zX@`1qPSYsN630b%FwdM7W&#&N!07 z2CxKC3K>zKrey+wS^nj(gqjZIg#!;3n%~c7&DVJ1D*H}ppPQ8J3j>=dfx`Q`?1eS- z`@?-QTd95Fdy{XxeBxr7&BM!e_xWrws>`Or8 zlubQGHa81-4h+>ko-C)Zlo+6WrFGR(#@jGGItNG~;X0+HNl568EHenO4Jgd znHFqA*^|t-)>wQaT^{i7C*1i=>^?YPtalQ{j%I*XcWS?$$i4!dWFC*9+gyBvr(NbL zs>Sh)Lw5^(w3`fooEt?dBLgX8Vy6RC^_vxA!5Kc~ivxlx>L zBG{~_&OoUA3&VR)HIk^I#W`&6rr}WM-e8!2eN?bsz8ixI1@&bk^uc{`s!JlkCj8Z- zN`7YcqvQG=h#^KbrY+4t%$s%x*ezw^-7Q5#okte7Q(D z)65Di1+I{dc{#T4;WkqFMrcdISHzm_p6!>BezX&&r<5HBvZ}PFlGVT=VRZJ1AL_p2 z_Pg`x^j1B8y4V44l#knDBCdWLsO_L)8%ferb$y=6x>g7Q46nR)zBFsZb@Sf ziIAD|iAYBoGln--ZbR1NjBzSXRDKq!xs%ncI!zuLAsw2nU;WcCKYl5-;%nKQy>1)} z;<+1sY|X8?2w5pLT?i!e6-Y49FUWLcsF}X~cFyLX;0jAoc>q7F`he~<*<*jlCj(VIaIYwM|JkqcX5KH3<*?T+hpOzHE2G>)w&E3HXP4ovrl?of>|s+h)A-<6i!j+X+sm;%=4L*+HssFA}ebmcyHduFI;yZ-0GQ@+=Io z314gtUfjplL?h>KN-8W0hoAadxt=x)i(sj|{Pkk^LSjuc^@H1|1ijCo;kFimttkH+ zcq%_`w&u}=fBlUJu9H#YL!?Mv&Y{E=4wX_P=JuOK`r+}Vv(tizA(Vx6%zJW)fcqma zViA8?rr@El=BAu2>?IRa^! zg0<*K+cyrE5_8&R@Vk5psQyD;yccMxYQSimr^+D3<8lh@wGiw6a(mtvwV3>p3jGIv zY}gCgFm)F5y|uZorcRbC`9E4Bn&a$icmlVWKZ)aHGS+9l+pUg?Ro#CrQ|8s9z_9h`JBwBC)tstj- z_225fovrkNB#oe&c2YYS{n)-O1SmW8#8ou=QPil&kg+>*v`7p7we9t^0tO0Rx*ts( zZu*SuZjp2me09Ab~an7JT15hnIa=&>5+`qLi zu-bu~s9pPzq>bHqGlF1j5CZeAiDb-PKW@ZWEZFRICEE;{{rjEdkb*-d}a6_{iA^LG`zpczA3W|D2w~4exbCHJ3O3#E1P!qpq;&=UAt?RPj2y z8vq59oL3nIHBXeiZ;bgS+sgl4>*Zu*8M8(HAJ~_9?;7VunXCDZX13sFqWfAGt`1`@ z0n9p=!Ley_^qc0kslQf>FO4!yLCt*}#{qB$U$CMZ@67kGMZp$@`^FZt?;Nn1;a?wS zRFgu)eCTG7BUo850j=JP{+?~#JkX#MwOF|_MG>AiIz$9QP%>{^u0%Ihc9xlbHnO}k zlf?qlpSb!Y$n##N;@zD`~#RAHf0jn3D?tueD*Ce&%DoE6{=+!_vjz&+>nPHJ^X~vNA3^(=Lts z!&*^c$Z>5dM?&Kxs%*n~5vu)0xRDcqQmOng))2Y>rj8?gV)!^K<$SVX1H$G;{@UNvO$iWao_}`N z;_paDLM5B}_Q147-$1=#=?sY|^^_`l&AK=;{Yvj*4I$FJlR2Z}4j*1QSXuC$%oCes zPg(tPKr+ClWZ+gX`qDY1tP5?wcp!lTvbue?4Kge1XD?hlglX1o7H_)&0!{UAcI)K( zy}kkedCZYDk{oJ)mgi3VRZC@XFMDvObe@YaxU>0NF8-Oy_~Ge`y8d-K^pl(Mhaj)1 zvHv&jTARFPj$G8jfXu|_G&2MN=JVlaF=8dP_(C^S#h7<8>*r;AA`l)LZcWwDYi&R9p1*dj)4i1In!oT-jR zl!aaahu6XZ)xdDGyvMcbg{fF!m9aC4&J+w|E|+|KU#@KH>e^B;4lnka6JMR{o*A@Y~yIa4c}Frki8s z*b{x=G=5Feq8D%wx_oUDMt>UT;J%xR88h^>OQXpCF8FdFw4r5k!j*s9L41DVROys#Z(AZ}d%{tz`NtIczNnQdG5NTo z`Z)+dk$Ja{GujSF3?D_W~O&7;BLnlpS=QY0ovwso~p}$0ea$ zd;-{$+2ne%v_!W%qPRKOx&AsqhILO>Zl?#|xCY$pm1{^ydfnt~p9upA4Xo!j`(C30 zsypMZ8n-`B*X+v(gk-n?#D}t#{LzVSHKj$7&}Czx@P(jLmbp(1$M?LiMCV&J?0Jv2 z{VxFZWoLfOJ8vcowWO?`XDFaS?RV}E@1?WM4*$7A#u~5`)hOBh(LP()`4L<;COW8p z!^a$Z{dG5*w~>m2i4$n8r;6)5-TqT|xTZGyL6HkYN?dMcWghT!uRDx)Dxu=0cbb;! zbl1q#&THfqQ&~3NuS^_J=6n2&R$1HDx`xkD9!ER=m(6!${+IqtB}7smy~`ZG=pJ%? z*A5cHbW>uA`o^U5^OLl`LwV0A{NR^qr&W1cxx8#U8iyJ$MVC{R{kgp(1jaM<0E%&h zl#XJ}`4n4N(1_A#4cWa7s@A7Fg|OA&t`!^pQ)|cSFW0#Ldbf~L?a&bB!n}2R+YqS@ zuD6ZgEf1<>yG6K*78w8FGyK$enL7;`+@UPSZLX;H*rkkZ=DAbLX=;cH6Wh70<=VSM z*y2Z4)}_#2q-w#lXrZU3?&t;U_M)s-j~hivA(!JL#+=rRtJOFZZtaiioUb54$?N=0 zb<vT!#eIy=J-$CG+h4s=(w4_+TS~1YM20vMwSa!jUYzWkhk-9=^N3}HI0*hM@ zFXz(n4)_b3`H1?CpQ$S1C5VyUf12f`T@bZZD(>ATWgIgY=tI9AEmU2&CjdT%?Mf7VCe zJuxH)nceGvU1J*){$@qN;iE5%18z^feg{PUY}&eI>Yu50Bnv2c->qI&_pS7zM)x+P zER%BJ=k*NR1&{F|_G-xZyR6b<%K9ICO(vUI*8@ab5b{R&#@Ez|FYP$!vf8`5XXh_g z_Fy~UC75RcFMMGwK*uC>$-Sh< z^?ntjyX!;1YgbCg>MM$D#@wsr&kb28?RBW!^;I<_bH9~h)D#`0Hu-IxGtMr&JLK6F z^Tba$QV>V!rRwLH4S%xok1GZ$(jvh+2Ddex9M;L%7S?l|PT9P6Gtt2lutc>Fi`^sw zGUv#aSFZH9312VH>!HaXKWa55lS?V0a~ zU#kgvTXkzL^KH#-g)ANcy>&uT111i>7};hDsX-`R*))>EyMG<2?7})`?3hkkp=@Fp zneeX?RKVN|1p=H=E~N<>R|{_%He-kuEbuB$WbLiJ{g?6edc!Vp%+%Rdgarn{R)?Dx}| z=Tnx?lzbaa3yC%L?DxgVbKx+)585||@9^AL7Yht!3LJtMl#GUFBwEiW(XvPZztKul{=BO}VI&r!bqq%f#JKis%0{O%^ zfH!~Kgg2ln*~l2O*LQebUpj1DXtzMM>Vw2QRSfT^BR#)~xvWL#(D)kKqP=cOmu56F z7~F`_vH`zUUg{JAPyO?Yt~fqD8@K@f+SVund!iOlqCTaLsN;iU%ec_%kTCx@);LSW zjn~;trNs%^yQZGC<*ganf%NCarW%VPUj*@5+$MQK8%_jd5ZXJ_DzgjUw}2KI=dO+9 zsMy#k|9R2_k&ZuJtxPl6W~S3no59b^0l=I;YD<$_2+2Pcpm(qXc&&p*RK^D$WN*0O zJBZ&c6O$(zZ7<&7iT@9;Q3o1)mSSEgrfE;S6$M{vCgdsjDdec(6C&jcjCp+7$|zA2 zwy6)F4Z)}QR`?!@H^_$bO`%w*)Ig2%{+rCOw$nXYUpBsbZUK%BgiDZ2AoElf4{JJ& zjloaJ)46XLKfFXm9OK=&s#$Ig76vyCQrD#bn*(Y|J{2AE9Ng$lrPtnbPWS{FRD=@U zlJMHhaFtj$1k`QYEVUQuP6We9NieH<#*wPiiQg=6AyUn zVAO4N>vqH9Z)!g?`&~EJ)0y$tA1CU?Q(92(f-gJcNBC~m(C=!FZbtzLt%Ft?rcIPg z|8(sZ6bJWTPuFxGSiTrt_Q9$s-eubGWXtN&q6~VzV8EYk;~L~I*Avg^)54K1bKib@ z*cupU-~U1Q+9x&aiwjDqAK5o5`JIiq&vbQ%ELe9Qy1Vb;b$coB&@=&2ITQ&Id4W4K zw6yAnv7Ug#{TVOi71h?enIQ1m=KwM>kLJ|hqKa(mK&X|S;%}5UfvU`VD;&R^#kmm zAS|1d_l;rFB%E*GB>!lP#+FU4q#Cx73=_JTo_%`}AUb+uWZ-~#jr0;xvC2Yxc9i_o z_}F;-5{S@7$z#20nR1P~*nk8?4?)A!d!mqBGXbw*pWPjXIu$_;sP}hx89v(*wh=Zt zlH*4aiBn;;4UE%l6KT^;CMi|D4ow=wfMasDw28)4gCFAX?Xl&N-Q&6#d)k*ktEbVc z=qye__$ga7@5Y;^6hjB{c4ln&#wGGi<&Cgfz?rE?O%ClmlM{zCT()>Uw16h{!LOr3s5!%M;?6C{}0 zYhCQK=F*Gsq0X*&0M&h}u7@=krrA=*!)w+_2^pkCQLIDMcMz-GoQaZn6M8ti$pt1tGf&@^`KbT?w#h!o!ZB+#wvB7l zXgYtm%(u7Uq+EY|z2tU9VSU{U`z7^L;qNGmngY`4`#S%Vx{YTUzzr!dk=xPO!|HYy zVfFf-g_gSRRxC)^Z~pOG{3M>LsX;EQw7*=fB$)TNlW%DJa@iBYS^k8nHxstpWJ~@F zI`Awl@ojez$7f&@(Ihpk)DX|*qbxCQF#Qq1yeEs}ut;F}_H8}3mMaAX@aQTGlME=$ zOTTd$K0zVu{(|e3Xj;eBdBbD-I*ozwq6$j;f(o{JACdJFXb-l;m)HFcRNzs?CZazn% zSh`T#`per7RrHVlB_WyQJyP)ckn?bM=|m{$&FGlruQ_j?66BL~$M?~9cl0i_kZlDk zB37>h1!dWWE9KR8;MnY@38#xCYvtAg)T{b>j)wbvz03`fJ;7hYcr1iX4Gms4CVB^? ztOrDcPG$6>?_?j!I!DF4ca}F303SXJc^%9(3#F8OuMZTyTEoM-3`m!4nDagQmjp5K zt&WdcRsqg5O5dU`*{TkL806_0gT0nwEivKbGhp#vp6O_Lf4$Vsu8YUf&et1p-yj&D zlGckEje@h%FITl}qq;r3R)|*#*pXFrJrYE&jbg3rzw1&`eti}+tw6Zk9&rlZ z-2P)TJ{yo?VZt*F=>Lqn3x2f%Da3Vve9EcAj5e}oO`S*yn_{$aDa}6oC#WKOqB4zR z(mJoc`R_Lw>hR@ofuCB{?CE+idUwTR27oEr8aD3ssmwVoss4c2PCv*WuT^k9Z)o;i zzyx;q{J#@R?J*>2=HTfh00ZTePvm!sTE-R*v=e*w0UaA>etHw8_}2tsHd1mx_(nw0 zc!q1!)y79%bL{r1Ku-STrrhViqBW}MWXRr~L4LdWzStq4v^}4cG&xrs)EHGm5 z3npaGC7&X`35|Wy zg35xj<`>kch2}D0oc@`AoqIcp!Qm} z9&N7oLe-jT0X=by=Xz_fo)$#@5Zce_^J=~~>=tlgSp)H*3v?x@-b>pp=^Xv|-&W2_ zb&u=Ec2=mt7@!ND4S+6q&Ydt(5`tUni)ZwQ8Je{65Bny)`3?17`Ua0~H(HTFGvfwWvkaEu^>5)AQ1S5! z-77FCGZeQf+c-y|y^UeaLSQ*X_9kOanes+H*mu-cvi2p^fLo0fmU!*J|E64voaYEz z(+i+0?l(aA8bUQJUYmK3@q8g;;e5U5*1H^NZ%t}kSX@}hXdriqdeChmMj`iOo9PCP z`g+mmCkMLna{rw^Wm}@CVEK)KbnsC%H=4*&G)`%DHv}{s7P%K(lOt!s2bBL6f52bw zo)1)Z#!z0_p<`Day6;{=Wu*j@>(W(EeV2UHYeLvtqrvsJu?EZ4d!D7UY%VV}1NPQ@ zetBVKdD(JR0e_EmsnzVy(81GyF1c^tSoR2o&l9%pgKuTvc|w@())*V(09R`+&#x@1 z+S|%JwWM}0YC~0ffC8MOBem_iX_;WFa|7s-`vA6%4jpSFbfU!tMa~h_{Rqn`janE} z^tam5GIItI!{Wj+<#Jt#>vw&}Ds&}+ZcSMU+3Vr&j=hvn(&Bx4L)n)m*xOiRO!T$T z*w^6Q0yb#Aw|TUcs@mK9Lem^o%c)}k%#R73(1v0aGUzNbf{w5n_y%e_dlm;EDwcs07EnB?YkZ&PuWo~52 zMPTa%Wo*?aJnZ!*BTy0E=2w(#y$g%Vo!Gl~NHfv!1o*y7i>3Z)NX zpKqx6?7HKM`G{;ZV=vd>#=_d0lFpLGF=Qtr2Vc|e6u#;1lbs5(%IUTVopyaL=xz#K z8#LCTGzpz`8;0(9S7?*8q4ss!;Q8K`nzXkCF)Z*X27iP6sL0qV_VkJ~aX2bi8;XgklajMZJAta}5QWuiJ)HD!rjGcbJ)pd;@wXx>lU4*lL5 z=aIuTkjJsu)7s*~B6j2~+1v60brk7#<5KSK)k^ zSw@_yeJ&7qTU-n^P6^miLqijC)F99~OO+K1A>_97K!LJCXRe233nP?au{N>%K^Iw2 zJ2^t3>)RQtym=X+jlDG}e`~O)1>|r0&NnE$VLGHxM}P~>=bPI8Zk&5Q}&ln;<6ziy=p|-TV zxUjUKI)*GQq;@5fUc(pc*2GX(u~Rca*VdMA?XBOTgL6myx^t&~CptK|vfj3o{&T_` z1v_cqO=PHREUMRaewMOzsI+zQb0=e0PRubg&!^zfb{qD-^^IUmMhptd^Oh)ZyfGec zDl)!t{#GN*ZGn(B0dGy}8WOUcW?JcrF*UDKS_E{5-jr5z?bUhb>Patr@gW2kb*KF} z^=vrH+#&%J>t>KsPu`=`c7YrL??v&@sqfXi&+C>oE3nPtJbnzw``kk(^*dkqyfqpa zx6okuL-y5{7F5#$<#E(CWWLK1o^&+48Z0?Uf}!K(1rsc*YhXYwu9CGyN=ckV-os}? zJ8(1+&`H>u;cq>CM|FGGhYc4x;bse^x!)SQR)g)cHF9tVKS+p#K5v)^De!+|>}_6J zPN^MrskuTer|JjrzZbJC_}2S?#**x{slS2vC0=&vz_c9U<&be6W>;!&^ku9Y5}QQC zaSFkklLQxuZD+>_F$=QLx^pKV56n62HGc=_r)Bi^K#n!t^6{*d5)$_#`dVm6-#6y@ zMiU~@1V}s~(mZqQ4YW7d8rGg}v{n@?(_3v#ySiZu&M~4!5oIp^H%|7E>rVU8wbeOC z7j7LB?5Zcrb%rn)x6NB+=})jlqAnm$Ss|yUm!Jz$YblGT7ricw$&4Y*#d+BeAXDGW zET>gi{;J$>-fRw@P3>-P_;t$Ds;b9Z5gbbm*19P)Ii_UOF>69PF_K&yU3Dz6JGP&_ zr9H0}-wWslkAtE*dos@Wjj%^&Osk^A|q!JHZSLf@c>1E%LwC)vjXn>Z}1~yCg(XoLnj%sgB^m-H7dY2Z_ zdfL=bqu5$6LkED|YL~tq0gAE)i7H3>alQDmKyJMb3Mvg@%Ht#2qaUyG+Y+!Jr zGF4r(J?1Dr9$MB%b402;h2gB8Re*XNYB}bm)>Mn2jHkqKUyyU1$x)!~-2=_zc)8F0 zPm;0m505})$;f3l&NPByN$pA|7GWVTfuoVpFg;D2uB= zn*9~@EHV1Wgz{@fD8=HG+d-}R#;A_t%0GR~kP6Xl79oq`6hXB)#5#gy1lgt#+7SBY zrWgWpAe^NG1;<&w3$pa%f674FdL{+UWOiw%?XG z?X9^O%J5qmRu@#=-#MUtG$bRo{kM!$~*Dsg;57AN2f zk!wz1*d#(5TRus*qnl0gAJ5K_4QD5j!A*Ufpx)K9%J1Z@6=IAO&elydS>!FsIv+57 z8==74%cB+=6y6wvJI}SZr4>rwme|l-#C{i6n(G7;V@C+4p?y6>=3DF8+vtw1%xzjm z`wNu=BIlMlLauYr{w=h0-5YdGn~t8-gkubm^%%oK8%F+tLDUq3B}(1sNDys~Qn)#W zdQovFrswBL4PLf$t z$E(&!r8V^oKe$BC1R1{z< zsSAZAF(-4eW%aFIPYyr$9ja-Zdm#to@HH!xH41K|(a9LzB=R!~WOM8nlZbb7vl8-< z>`nd7%<5ZD*f5fMz|e@I@r;1J-Ug*U%V2NMNtWQu2n(>IUaN24pJ=m`1}pHWh4U;y z(pYVNX?|g8d0u2hTE>n57n&6#H*~6|f`Z$YS7YY19MtnUpP9#+nkjly+_1o{q;qpj zWJ8kzCvL)KKnPqQxXn#*CWod6LF#x5m26O=rA6CTymc55$`dQ$mTO3nu?+!_&?&N65N*KZ-qPP@cw{Uzg5)wjpcZvFGJk z(&E~+w{0xq6n#R3@^*fV^^_$YL&)69;sR-}LPz~)a@JVTZS`UKes5Z@ZC#3Lj;+S1 z>5iBQVM>T?6vZZK`xI%~BqMcVK)(^Rno=7n<9u@h)g}eYo5X$S$C=ihyo@cqu^-3Y z);rL;fp40+2j=XJB@3a^rfe2_%4#-c+Z6rYXbur877j46hCtFbV9J(CW}2;PYSCB> zaq|1+W}6fo9pa}(BN-s$EVGw#^=)#Nd+AQjF|Z>jHajOZxk={Uh89%ZRv1hK9m9t+^-cg927o^}p=DBmrX+y>>G zoHol_p+Z%ous1m+?Fa_syJA3bmXZo8lmhCO*YBtpE9AQTm4Z8)gil zIYUI$0u5UrfVWspTU@(VFk@nn&h((YjSq3PCfGfPSbZ@$S|T}k==~lX-aC0TBZ#qNU{R8WkL9ovLTG9POT0}xp zB!yRTE2ouk3}HDHIYY#EjYVWh)4~$=ys+H#tM9rM{BG#*%t9JKJE;TjB-;EqypiF^ zXnSgldON(;19;PFx`iBE!?5`Hd*av^qp%wbZ?bVJqOK-cyaC~H4@KZjN^NsAq;yW$ z5-7YO+TqXUrsSUJ@YiChQBqHk@;Scc9;s@3@zNsJ3Sd#T=i>Y#i z34y}f&R3qJ7;|GZjeKRXH!V>v^t(}tZZ}RJp$zV5WZOh|tFy-G?A+9B;QKK<`Ot64 z@MD5(|3)Y7nVe#Q@@OcXo15ejT#UW(D12shr9Qsgo*L6QrNuafQ_nIGj-{*b>_0Uc zIp-Mm=G1ir$DGeHq)vnN_o-FFlMWec!T5cFw*5o>aBi?57Q3Ii>k51Iy_$ z=6~x(Cbb1d$XW;5*EQClNy%BA!W(Iq?s}AbKUt)4nw~j`x7$LE({nwH_3YY75H?i0 zx(aXYW?be0!d%!US%4NMM7oE-+Y?iBb8~YX_b{IuZ+Rk1L-sbsObXndFv(p-CL@hg z=Gym|;B2P@23FUwj0kwE$2Cqfg0edFtU>jO|H1FZ?xuY-Dl}xw0-r_8>5`H$goQ0E zE#^bvfHPTs9WGz6MywUnTlV2xI0i9_7eH3;Rgq>YUua|M6#! zJa^b3CwVZkj=~#RcjN^}g|`#uUU~14b0^Z8r$u;6;>RoS)Maog=yco4v%k;AHiBp( za)I$T>Kww^o9s$viE+7RVgE5*-!LzxeGOK+o`5c3Yz1nw_%v>H0dI8Xa1SFK7nvIN z>9h28fBOa3 z-cYD}82#OtbcYRDuD!*e{~P@KsqodQAIEd+d0&)Ly>iFJ^`VNUfVacPanWP%r0}@P zyHqK&Tc-}NP|(!?ArVvjuASa&+wclX_ zir1@N3iAYw(t;^_bK2P(P7!```p%taC}d9`OlFz_TZh- z)94IGSG|A7*-z*TgSSslUVQ4#e)j7}6i9m^qDawg&+QsLMSgK20p1*GIpy&QEY-&> zO9R5#8)Jd3>iTVz$Se7S)!#G#w4HJE-iG z4h}`$Yp|@n$y6b#1+_-Az0EI4%jqIZ8PY5f%b{~NQz%181N~YEifC{3cJ}rNs^}+9 zTpMMi)E9g=>>!W^dfsU-Et}$r`)|m1YvX#+wFOc25k66#)?YM0H z?@Tr`q-sn$Plspx#DJ@+(9Xz87KxZZoP4)1%_{5sQ+o_a1!~ zz4bY~JuWF4g{gxSqNqz4?&3N2zK_0fZvP`YCA`t?cJZS~cq4m!3W1W5$U3ua>^w(? z_oxR(YU6YcJ>Di~MG8xnG=#G^>``Ivo}WLAtG)tq^dVm+-bi-QJewBY5xW@ghiTQA2J<1Kp_#fPTrq{HSrvjYVa> zFP+YgqxLp>M7Y|Lm-NIVOgeii3Et={`?$oclL(N{J|_0COKunariVTn(cYeu4#wm_ zS=!qq%XBmwc)pQ&#@+~6J@Mmz_!kajv$Ie9mYEqInwy;E@b>T={$f%jM54A+gg2+% zr-hKr_h`Ekjl7|&6M;8%og>ygM!(s~JQJK>&n_p$@2%VXJHg=jZ$da&}qIqE{SJVQe=m3ycrvlsAJ0M|Os~H|_=n76^sJdityd6oo z#kptSe~#Nk-#Pslf0-G))m3<_3*M|ot{#X7$_5qQIOcOvUpqnw@0wVrV7mJ<`V=G;krPC@&b z2Mf<#%6iB;vW^}Ih2H5BEwre-G5$ua4CfmxcL)!umyJ`_vCQ(KQ5)JI%pJoGd_6agIGe!bQXZ>PxH_zKG8 z1Q~a7L_11J%nfNckZ^W`#eAI#;LSnPDSh9sy@yuTr+S!Pwd>@GEXR<^$yu4Fmvydy z?zDX$KP zFo&12ZQT)v1!hPyFj?~)rESl=6!GS*GqA(nb1Zgvm$45>dmfE6IVdH(AMERIkdpQm zRPC+Nh%h%~Z!3|$7FHO8E2JN^a$$D7H?`MZmw+9v2!;wmlHC{bYkrVBYT>z^j|o5A zQPP@v@8V0(p#XM*5R#Ke-y!JrSd8}8bL89&)}W>Bx985CWd3m!4Nks5{at%b)Fr%8 z=-YYjNKYu{lpba0{zpD#2H!z%d8%gJDWM)8xwl`O@r_n#39Gc2}Fp-slS!WDGeydPi}+N2q%0 zQ@-xm7^;O3@U-=xjlsy*Wxkq~kXpmEN}G&3yd@(uzDz zHaPeQ`mVkoV>x~A8d>uCNv4*)f8$dc;D9sNC}(-(@at5H3gFFol&!=g~!ascf z=?_G{H>7tDV_GC^*Un+oLJ*V{QTv|i5stV{=;}mF3(<9tQ#$*~H8tk+D7{SY?LU!{ z__JWk0c>g19f+516*wl?ETiOY+X!#lCNhUKY8X$y81y8A+259$1>4qM3X_A5rp8RG z(V%qQ!l1^|Nu^sCFZMMxYol}R@Muzwi(SfwqlZt({fs_78to&M{yV%Y20KO{-zCCf z={CC_carn|ilABAA@i(gTk@p5n6wv380)n8=_lq`&Z9Z>^L_e*4@CA$-l*jUg;~}$ zAjWycsFUq>jcbP!ojRNo;dP^j+fqz9hfk#T@O(#GYfjN~K_>+!XzN$4;;oPz+MubH z-m>=2F!r{M`@Kmf*Ql|Wg%EqA`dca3?UiRa$?);+4o_<^xrVU-<>++HsgwOjtAiEC zUe_`r(e5N;Z&Ql}86N8mZyFCeB2w0XyX*wnuIs(6mWT|`?^*s)TYnJ7+a?7 z)n)?fxX$_MY5}T<8UQ=mA5@|j+F+G`YBWTO z-i9K-v5X<}f%e8CP(zkeC}{2QG7-8JYelWD&S~YghPJZKJAX`uUjLzOUDIWC=~vf- zsd^DQ6Ek2Jese5~5o2krLk0YjeE{-CsOV3DHbLh^_x7T5`#FrtLL+R@OMSkAIjJig zU5qcmLlca+KUmktKs^`GP?Et&XM_B2X2Mws=BBVXroAm;AI^c_TXPW;BDK1n&{mz+ z1uEMc2zaZ9yUDuar1rj9*F&UwzNT1A;yD9~rxLbVkrRn`4>KwJM0kE)-YwQF>s4!t z(>X@{ST1tjS!$f+)QO#OQcp2ImOI9#1^vdUfg=c%^!`Bh-aT8%jf%ZxQR2qGYslT2 zhlJOgu$*p?pYYLBrrFpEra>%&_)TPlxH5ER1b*(`o#KO2 z*QYV{l!mO6`HDMPz$nZE6s9IwK1z{7gm-ny0#YaECMAKJ65V4>vBs(FjRvi*Nc(1U zG^(9=5Dc3nOz5Ec9JL_+IRx|PApX6IjI9FCnk_6u*P;FzH8;v*J z#yMP#ySyolQ&itN+1}3A4u`V#4My98EelbqEijizR!<;Z+2~czporPvinzp~YD)CA zz&f2*TBVGa%}pspj=RWVmN?e+DISXvB(9h8~vuOL%o*y^9$8$)R3t+w^ID* zAou$Rw$B}e-&=^eH5hwaoJan~ll8Kwg@k->6*X9)7^Q~No0?!+I;}n?yjbn69s)O~ zm;#n)0C035!AaVolNcVW1Z4?NUhMId8wTct4Hd1am@kPpRi~sc2;$i!_Xy!l(@ECv z*4*5rolD^qg2d#Wol1yiw)cKP-uQ3G_ohIZl22n>G;V>hH`dANe9(UUt>@)YPn~z_i99TRm-Rd#S5E+6wH5d~&d?@>|JtnV zj9wTLIAgiM=vNZEkW>v}I}XH)@smok?4=Zo@ttb6Ii#40K5G)!lomK=S{* z=g}&1ByLV%PH#a31ND2Oy_`zz?a+ep7gUaY>kk@$W(2JdIx$!S`wXDq54?($>Sx)j;kIHobffv_D+aYHIIkjj2% zIHBX%ILmzJn4ieh$J*Sh-nN-`3pCC;qZ)m3XkwnW4yF10d0RnOPADH(*hiqejVYPm zsNWmLDoFN*fAh^s>yX^F4(Jhalg?y2bf)d~xtW=u?!>&njy8Nb?F$`K2z1gKb$?); z%nMu-(F)vNFdI0-@p$_nSV0D>3g?kY(R?K=?+;-Qx4I2BmVw(&8$<2vn*bYy8oN+- zCjnrdv_jw3EVlhqC}KepxCXbJ&dZD;^Ozo~sa=ym2Wkc{*Y8>d7#x&ky-GfgrVLci zsTn!?tuv>9L8C7If2=yRF|QDAXJCEOBOROL1_f-GqDD7~9h-_SoVk2Ai$PrkE-_n?V#Zu8%#f*!RtNudEYy*VHM4P-k#<;Kw7IXVmS?SH+1X8I8$ypU1VK3N4jy& zR-amFcx&tmsF$h;iq;&R_Jd0=-5q;_Q-r!W`Y7Ne$Z>S|r;nK{+blYU%&~lLETcH% zb*weYTdJbJ=Skl24EAGBJ8PI?-QBZzt&jgn`yA^D9JL;{k7Qqwdb@Q;JAp$H^(i|| z1LSx*p#<&OZfaW15^_k}#w@4})*;~7SnUw)7;7oe-e}AM;d2|;2`WZMh*_3%1k-K3 z)NLSpKM=nigw}_b8JutHI$?+LWx{XI?D~-3B#;Y7AIY55w^pO^YrxU!*|_?LkAEjU zJ`mq96aoF+m<4q<=!k*qZIq+UaixweVu?rSkAL^^ACd}LFGA29t@f#URGZJf7xxT# zh2J*_O?#Q|N#U^-`L>B2abqagoA7@__NH`{wZu9CT#Tl(v|xJ#qf~f$#&t;8Tg$l4 z0JWoMEA?AeRDzdfnAdql>xNX!NmSZQ=$#Ye^6R8TzB)Rj(n&Q~IB{oHH=(R`JvYL% zqy_Dko%)>|Q47^sOIsQV%3EEmup6*F-W=swLs(97+Bls@TdBg{=>NrL0o_ZrezuI- z=$5sGw6?m59;R4*!N>~RYC8|mxAdlaWz};+Qwj!z{p*|@ekgHf#r$zx^>(yTX_JCd zbv;U^gPV18Q_6+t^Wr5uvn|EzAcq##D)Q`md9=7v_=r-2YoQsk8u*f{zPx;#5@w5gNM9_yxM zZ$rq`NVJ5NdrcxTpxYZUoKcEis+FPl(yZ%PNOPxnlMK8>ag$Fy6A|(BLGA|4GW6 zfl*aE6hOl_t)APC%YN#_Ux=LEB2HGhWt9Fc`us$n!NlhlG?$ad&(nK%vPVdMZ-7r{ z?4y-j28jILW3Frl<%NuErc=g7;Ptjm8Eeg@raE8(k)@P$mWH|(Y-FaDZ1>zLFYRTk zWR<~Y$@l7jNZsshH5Bk1y@hIcLOpFu=T06jXB<|lbG9k_s~a6_uWd!mFlY;k?Grk# z8G?=9DA1;44r$cpm*#29l>3EnFSz+;4vUOU>r0j;)HAo7npti=<1$0mv06s^gT&^k zHGeG|(F>+w6sE9RH&FtU+&;>4qrs+W%6)7lKA*NNiCO#eGRtW6u7JJ=gx0x3&TAr$ zFM6jB`M+Vd-Y==xCM>7(=m$5yRISCwIEcR0m9{D`-+6)-e{=L-Jtr+Hv@K(Atk$m^sVNcMKyGg!^BV!HYSqsUPmzf~~O-q5%pyOZGz z4*Oc542}(`#4XM*t?0FzL1UX(4G;3^2awu!uYLqu`|=X>x4joqgsgflMp93AcBq@< zh?A2bIk5s<^3igrfr-Lf-N{GpLO;8(_f}C|DbE4*KT3UQ)aIat2DPtL!KHxxV|k*49L#C2XQYU$-C zry$Q&1G`t=>a$z!2QrV{vh#F$=Ff{~bi7uvqhq$-#$`o+yDT$?%r6DbZ}XJ8&4>Kn zy!&-XcE;phXd#UzDxZ4*& zUkk|OmWrmWV1O?tLu<*XhPMl>YfT+dMd~Zx~V?&eYf75GYd%XRh zqybQP>v@SzarRb~76D}`ZLJsu0g{g6m87gdsXANo5xnyBEU5O^AbtmVR3}JMB{ND1 zIqw1Jy^By-RZTilEACo&rR&(9_Exa1u}$i3vY*p!W3@%f*OtDN*?OBxl)o(*_wp3` zL3r!gMW!xr_NL{vR<%EoXGwV|Rb2qDEUR3p3SY-;sL)M%CfF(^lzg?o+)u9Bd)Z2k zT4)Q(YBYGpkoh2E$P%@r9x`PMkj&nC9$8n|+pZV(?>zF-=XC9pr%#WLo_pnyi+eXN zTs(5)^ojq$U+sGGm7S;GxMftsc^lQ(Gm~m!NMduMc8NK*XV=cw(morn5U&FrZU}-E zfHfOpF`lKxPrURq1AU$XiR}kSJ*O({yinjbkbOs>1YQqWduNtY#@x7bNQ3oK&pVF^ zf=(%)YwBu4ken{B#k99idwQM~+8b~_*Yo=OWSiqXJ&(Rl=UzGS9xgphe|L~=abwiJ zb_IpH`bbSF2qkN68M;oZtW<)~Mf#{X&zNI+7CWYc?DK^UE8VR?SSxH5-gkRySTNHA zb9c3r_c?*ky8wC11=8bfTPXUJ#heCF3(Ru5cu21XZDrs+1+$AiJ&)}b?2TgAjgth^ zj$hcgew@M>1Gb*WD9*h?es%a$I!8I5wYn-x^MF*2BiDMZe0;+zT+3?v9zyb&L0UbS z#phb(>1BorQ?l08GUlwU5`5EIsVvFUdT&k6_KXrT5Mxb|`zDq(M5 zu-+9!+`=MuRd1TeIDVw?_LrT6qzTLE$)2A58yll!<{+}S8y7Z4DV9CE`R0@4>&=Z# zGPnQpO$u`Fr`7;apc6843uSuu($Hq@Dzmdd!*ha!+7pyo5ehR(&w%+tT4MH?>kRS7 zg2?%|Of38m-G>gd&y_46((V^17D~{$ww?~Vfi%mjd53<`D&5iyMc>nyP5>J*es9cn znqWBveOSPa<6(nbx(gyOM@YK(O-Mzc*H~MIxi1T^K?qr%DzJe%b|##1Z63*;qtX2<)nU_ zUL33UOzsw3FQndq?imB*x|Wd5|2>OOY{1@-xowLCW)b%GS@X+9sl6?J#zGg2(l$a; zDmn^pZy|o6<&-WPed^r){RG%fA$ue6wtkAXN;ep=ZM;L;try8~gwnhsDJvu80m$2d zpjqm_vO7?;-N|B1Sv?EaDOw)SO4)Qepo8>uj;$j12P!y+il3F7>j^>aOPxMAN< zre#u7cy^Cn%x}-UCiT)i*u0?BU=kIYtq?-VI!i{KuBwaW#uY>9du^55-tY{W7nEX= z2Mbr7v$qD9;H3Um`;s|^1W^k#`CD_zAenJu7p{W6Z9K#9imUD8^Jk@7hA3nlOcP-_$v$u`S8whXj{KqGs_Vm0#mfwi7x9c3VSutW#spfo~Tg#z3_B$q6oh?f@znz{w93j8jafG;%}OtNp$-XllPL* zPU<>@H}ZXg!P~~?Zyo`o@!ty=}hU z)AQUjFYIKIsB!F#&h;EWcW!6T@m<#2@K8{#fK(Mo+h)~@*?X%~8RS}S8MWbd&A|1n79r4aA`>BT(J+L12i+z*nktmoNy&V!f~roCO}zHi%T z1S-w{M%f#UQ}~VadLvUbcW+c{%hjIuxb}8^eJ^!xd*}K(4_Y8?)RQ6YttGU#jkk_) z%fcfUO12{E>LXr3s}`7atfuIJt&MDJFU0F|U1zO>yw)+u)F5@OeEF^uT+h^@ve%WT ze}bW|40`)viM%|M=OlkeglX4GyaTPoXNDhFO@-75I&+TpwLq1)r9+E{>}W}ny<7fA*=Kp2s%h+1qvh9ZK$QoVrz_y$dqyRItq)OR>=DmatAw+1J7sgu8v# zY?=z-E!_*U{<-64oy1$CZ(4TbG`hs)I~0J`CP_vJj~9J>J+lWc{e|=l%Wm<$fffLR z4M!fYZO@SBm-#CrC?`QeNtJD@_VGj0G>%n)qvvDHz&6SiVzyx?An$CoX?#>Acj%DB&-o>B@~tPL!bpseQ& zOxHr-_eNRVw#$;iq2Jq=vT?e&M05AXSWZ3j&cr}tn=FeVY#4XoX3v_l(YY?6!J>uK zGqcjRGLH%6Sndi~@GOow&Kue+y{W&00{1TGHTMdi`-Zhn7`=k`6q34e-lpUX5owWX zzxk5(lNGj{M*QA3qA{J2r?Ca5y>3~p>+Nz(Pvdtv8V%Co+)DLngG^=t;d|w^%&wQ0 z!EGVAoT`izl8s*J~yjOc;8(K}b zZDRyZX6~(hv8blA{EAHBm`9*)<-Yay6XQX#eL#Go9%u)igxe9XMVh>xpz}hcRv1wJ zD_deS)GGuayrO{IG6E#1n>p09R=Qhl{&WBu(4nV?LCO`)=L`(V?@Sq=Af076XGrbP zSIlRDFs_0QM=d!*UJ4GgQ>OK+N17OW9{=Q z*fSJ(rK^IDVobf1s|cQ*I{-24ZQHi7Z9#`JES)7~ZeJ`a+S?+HLOrB$ie8ZmX-48b%Gv4HfFCp6HZoR>n+{$**Z9vsg;$_qL5iEo|feYQI^UU;0cshI~Qhz9P-jFT2!bL91yAMwiaOZPKg!e2Yue zrjJkuG`N=LGA{~@P~KIq4objkxmp_fSEt+UJIoJRc;86J;Q9=J0o?#6NRWuX8hz(WI z`JUEw^Ge|VEse&0!7jBu+x`KS8LPCCJ7gIIp`cc#-EpI-G!>T=U_(hnzD?<^zDD@k z(r2F?5>X3_ysxa}3uvPqo#W<#ZGsGTAE~sxC-ny9g|)TVR~B0K&I0V;7Xe+#Io&+z zX9X#)7usj!<@2*^X>aMp!!lU7wrS6CZj%{Ux$pVolT51Q#C{@*_LZ^G2przFNxSLg zM(qnsVEG#kZ=W^4n4e$z&Ei+OzE!rZeu)u+o@HAVi^cD+S^xz z!7Z|3o_@YMl&HPsYfHDa&jalY{$ry8?Iu<&)Gih7Q_7MgX8AKLWN z7QJQlxEI1nELuJ3oa==zykop0!*h>b`wM$-rFKUi&qY}`&XlzXYEyoV_3+*@!9?qtI|*-W@VL~Io|k&!zUw;Wskh^! zJxr+QdeZ8}UTX5IdQtpxvTs}6Xdg~-{B@kj{v7=aseeIp)Vg`DQ(gPub)$0D^WLD? z7i}-Y8BfI)+$e0g20q4jglEpzFOjnTL z8=4+Jq+npsemT}W=1C+Wd+-O}=M9718E59yy=tvqm#SLTJu`B8)au*1)T*lWuiyXo zzkz6Ca|Cja6T<-~iPb205=&ea&<-d$Zqj^rC!qR5laO8kUJ@+vk-163Xrqh&i>LdaZPpr&k&CrntA$_xNYcy^&_USW46R-G;k9e-WSoI3%MAAc%D< z`>Iw+;~{`!bMitpi6Cc^5#@JxypnH(N&wDx7H~XzlI)J_F>+HTwQFMCoFrIR)!WW{^SBbU&DaQz`Ms_GVP$pw_v@N_TlxJxise>4 zJ>0*(Eu`+ZJJpZwPP<2U0(*?-7*QYHhE{d!TEFkECSU-%2Ydkio7kPmS@y-1e=D@W z+fDXWlGiIO<&^VpGc)3KYKdaE^;KO7aP{=>SMHsz=H9BTUh`DI&wso3ec$ysSoh($ zIRYEnZLwu{zw}slg6-%Yv=NSV-tJ^tEVur4p2Ig~*>{XW;qGoTN-@0F50fcK74V?8Z51ckhJA0YsMvdX3vV&8qtGHPwU{Jw4{W zervRp3{PiC@f!1V(|&KK@A2vjH#Tl8SO1ZbZADA{_uI6yJMKx=-LI?Pgcg4$OFUy@Y{w84d&){V zvwUw~7|SV(IbCP?&DZ-paS(5l>A~&<2g~PF-Mycp-Ep>{yRUDnwkPZ6zV99!d2&FO zm~KJ5jrzC!XKmzysoN24?vdP^6X!4g{_Cwx zRpeBPxc}hqrq+ciL5VkJH~quX@9))=04tTC<>)O2P0^jmuy^<3*6p@FnireD2Z*8D zZliA@CJtf|jR#)z=uby66xv_l1 z6TJ!X*6f>5W2@P}1H7|8$g^?rN?w{>cRWMnesk2ZVBPV{tB1vTrM;W{n9N}n=&jC@ zdV^aOHjVjI=IotX>Gl4w{>73>XGzi9%I}x*`tCxb47Jf)cmIq@H}sf^We_x)Ayy1`O%LnTg>+Z9;)}2Iax|8qg?#{lO7Z17f^g(ZpL2v)*nK7i8 z73u$)>aDJ<8t!dfM4whq1oR?NbA;6{4q(=+6qI1QxmOjd9_aOFt_d7M6E5*rV!>S@O zKdxChy4~-LAla{~58%qFU(v-vA|zovW$7$esCv4t^S!NbW%Ztu-y3Pmy*yB;YyL&sa_V@DHJzy8Q)1Z)bjpdZoT24vM?``I-&9@Z)rfSqPzqeHzz4cgX zB*wknpc<`s{^t$zzWP}!-Y#6Za^-^4)kYcQ$F4khs%iThEoD{rAj_(lbFf+Zptp$qsL@;LL2f?( z4KT-5*!B7ouRFTyNKH zRNbNLo}^4*vZR9fM^d94@#YZu-lX@N=HO)u3AxW@E#_xUi6KVOOydfUi*c9>jmdG3t@ zw%+O9Wy@&alP=$_deX&d7geNB+y?%Kj*P`2&{2Oh= z*v2fHkA3&R%+iA{q(+A>0`Tg72gFm=*RIztO$#?jx%?qT*(8&Zmp!I>>lCf6Xv-<% z-BwPoo^G~TEG#$2oPNTk85eO>yuCtS{=}rvKYhNlNafQvJJ){61q~H@|Gx9zTp0b1 z{dbn)Jo@t34}VOzqUejhy!RI-BcByK-j!ee(*v{hvr=xp_fJgNeWj$=KR?MnvhB`Q zk#nPscv#iJ)|Si20JY35G@2`LH=HvX_Xvk|bdy_8<&)bQ zSRufBy?ZNPhzG@Se^|e_^!xRyf`3(oxyr@cU#Nh&uyc)ylLr^L7&-rooijh7FI;4u z+CbZTkEMsMq@r&-MDYI(+x4JkoOWN4{)`}RGK z#H4BA9K~+e=%<&d%=>odhfJDqE%Os5W#+hed!GLM!v{=?(VxFZwa&Y9bBjCw>#{#Cinl@| z{@-zp<78E&?g71(_S~lUU6bA2AckP~3Mb*unf_U3`P57rh$#C0C zKY1XyHY(oc>cpFP<2j7oYiSENTyiLZgy-%)R zE8b9vfTMDVTTKP`HZ!xS{oh#3=@-4#C0$Bpo&EiOrOY}}_biGx-p)lqnn}b(HNhvP z(0f1y)c2`;y7J50&#{*)ua1bfoyB9XGnw|@{Lb8;u3UNS^2v+M=;%M&!4@TaJ?wEg{xD@N|Qxrb-dh!|meM9ZR1{@s{k?rt?5~K_^4%bs};}z6rP9_0y}p_0!t#?er>R;#P|E zUEX@S;3(dh&&A`xmjC#;@JRcRe)HOhc$G=DyH~=ySIFaMS^wOzS69xN5T5F(cQ#=^oT6;$Ci&i#OC@D<#E3fC9bg ze7&kt)>3bEecfv~9-7P#|o9zEVYnpaG_ z6OaILZ?A5f1NzSSa${Zhp%)1gJLJQaad%7)t(3(H7-NQN2oxs%c;k3FB-@S5hZqZ5m z2kl$(H|W>`y(u}fAY}|$9+64bb7s@x-3*4C;%IHvBqQ&!bV&F7xwm9@cf42LbrEmf zgNrn}-vznQo%|Jy)na=Pnbq!opD31Tft0Xqs07RXm#~`72m&kV*Ey|m%jmX7Z{0l}-ch6YxP9!p`%I42a5vpOyyblyZ1!`~n0+N= zyW!%^`H!Ktnavz_W7g9tmco+d>orje6v5?_kuNB#1*t6QT&J8)psTO`_{Wd$Jx%6& z@P8yyoUx(DM*CO0S!Cdd{}=5ZIV z`fPZ&8T)mr_XUeGH3^Z}`}KP(ExEUSWo`>hh1POTe5bKlq;Bg*Zcx`>6FnfK+MQUV zn{ZwG#HS7Dt;8cvqc^);7DsOb7N=k=ry^>BDyKD8in3<|di(C!+M4g3aN;jc>YDv# zXz-x2x(9Ib>_0|ge=oe<9R`(3qlRYGpf^-)T9~mNd*4#xt+#%9 zWk8?e(OY5fD1yuBxujJ8MOyboH^^=~%V{YS*8Rs#^pD400!r5nx)1l{ne>Sj_hz08 zq>20AoH11vxL_0Sc$NC4)pg5q$~@mzZfun23nBiN)5-LB_aNLh`+uT!_wnJn`+lst zz6`_oTiA4`OxS$p<<`6GoK*L}WJtYCWU2k%nB{b3u+&%LttXhcl@bZ5CFn+j<+OWH zWX}E+b@leL0C)3)9{75|X^zQv%E2fW*>y*6&CfFCja8}d@hYd`3OuasI&>*Og4 zMQ`2jh|H?oew?tbJGKkx?uRkn3!Sk0u+HBJT$g8^Q>UaJOezu0y&1vALr!P7<&?@Z zWm)L0_gCmQ>kPeZQIxi|te(hvU-EPoZxMWpy8CJHyWfq8eV~Y+?miVj2Q8LhkJ`&D zr^J#iq$qDl?ladaXY!ePm6|%m?WVd?){@Hj<|I3<)Rs)VeH*dYyZd#fd3(nNh>M3v zWJX3i-S3F(`7S@cWwKeh~J^vWgONen=DKlvebTO4b0u)Y46UsF-CSf?qL zJcZ@7m@#CNWen+k(Yv=Uxwj?e0k>*LEs&a==aw(rJZ;nbw-dSi{UFaC9_@5r+cvus zAN20z?(c5YGj;cTup*u2TP{l6aod9Sd$ZG7&TR5>fK!8|(@XRz{oW{gTOag#D}&`N zzrX*RAb;`<9nb`9GH=HH2}1p9-TDd82mzIUqk#eDlU zlWw~=J>?HaZ}hRbX{o5f@2$_PEr4@dD_PIcx^Tq1~ z`aN*GRuDE%KxKy~_C~&Ua{Ztr4KpPPx|XEw07>oSsy-p8Uju^r1r)|QV2FKhgW#cR z`YG|;-mh`>!YL73Bvr=(rgM{c*FLhyC5i8Hl$0;}pr#Q?)x8J`$DLo$vZYQ25zBJQ z(A%aJmNg^&-UQdyQ|OK2I2L!hR0v%~3(aBm^Oao#{6$vT_aJ0?w?dIkqB-%r(xm>{ zlNPsd;(V}Ck(Sgp4m4j2sNEj;3M$Y%a*69vssT>4N8-7Td(VsZ;=YImK+t$5u2ZIn zB$GP%KJweVXF3o1Br_K4W|xxTOxudZy)pc@(yP#MQ7!*AzgRZvpu8_Y-DF6B_wXk{ z(yQ^;#Qz{MbONuObS4Rq83 z#c@l0`q!(qQ;-Hb25I<=@)Ftak5s&O+oK+TI{aSohn%H zI@Me6+vzO77_h7%_iEBvE-V*|02X;VF4M)f8>QPIqchj1s~au;MM^%`@`9wMo&Gw$ z({sUjn}xRL+Nc|&abH92xscue3!`IQHx?*=+=W){n?xV@_C2Yamx1jeV`{5+yGZFh z=zG1yYYYf49AgX%O2~n4fTqr?j-Z=i}EA~i=PE|?K*ML{tU5g>}&pJQn0Mi}Z1=@H^~rKGIq zB=;u7niYRK#jK|5s{@7J?hP1r`(mjXCDcoPQjOTWq<5L5_Bu}Uc}dAJQO&A|%G$C} ze+`6G_6-SGc^5+Z2IcyK#9iT|psA2mzNR0>fbd9r)I;QPY7m@3E~s5Qoqi*YV~V`) z)eZOYUMQCp0Z$W*WfgR036a*hr<;s9WlUUu<#Yr0HY#sXF!L0;Vv)9M85ube8tW=f z3cOOl8eWc4k!Q~mKO{jK_S>i)2Qqe)LB^+7Y>f6bai7mrG>%jiYKCKyP}M5TjbwXLK@HvX~U6` zB8o#*{Tl;)#8??EE;ZgUy^!ca$Q&UK=sP9{Mw&S=5^4Mvs`_suNW+OaSDK%w^u8nu z%OT@Q40_8Yv$VOlo{n1R_fFIQPcy%_jgl2*BfqW$$$b9!+Rw7<~&J&J$?i4zazW<@70kc#s>Ua|^F<&>vx2dQFmb>@#(jbPPl&^&=27@#i`xmKiD~Y&bN5lcu7EBa&rkuZ* zSlvkl9wY%6XQLIrM5@OEwPk`s#}GALE%6^c)8`wcJz6JCBZ8vn1Sp~wfdu!qIb$Lh zw1Ar$toQEqRup>cE%jH|SE|!ljy_3cl3=eVa@>y8oU8B~X>RvI{yVf#lQLlR`wiE& zHhdSdO?iTNvQ?Lcw65>kj9tLKsL*y4d~S7qk~;E>bBq5irk;o_XTNc zJE^@c-}zL23{rW03-06JJZBqH=`Pr>%QN|y1s%1}TkkE=r>?bdx;N;Z7JhHqA32P> zi2sMi?fVmC{X^dCIcoH9*Q{<8+Cm~+RYf(Ya?N8L{afK3f3@4K(7$z z(MDDF(eY?0?z-H}jPZQ4;!jyn)@pxsATx%n-|Mkj3o>c}d2>RIoXA2{f2oBEUTR_7 zyx>OR8b~aQA*tSuM6xtHwQV7uU!l!)k(d_l);??~nxCBYPSgu#ky)ERp1yaeKIP2jR`u{=*M}TU6 zBP5t}aN)QXa@^U58)p*4Igw^=iNxT2ytp)n?KV8xMSOX_X0D6G;15x8&X54kwB^`s zwCO`aJkr#9jyv(W_ZMnDFI0{TDL+nudo#(%dws^e8Ov$E$0AVsV~Z_A0rDSB8b7)2 zN1Ay9GL<}SX z*469@ah@L$XHGu*%to^}B8jMp)LGk6!}y>!+68fr;TagswBRjl$6xOi!aN!V}UqrkNkN#5)sjOqE~dl5C9sv z4&*Q&P&>XV3MV!ewy+Yxe z;oevVk(I#~-EoUHg1?F54~6$Z z>33E0eRESqoaXqqslifzwYT0^=xv3fH&$^WC*euW>f5~HeLlBXva-A~J$C2 znw~yi`0eYn)6{Q10PJVziYMe%}c3c2q||5&hv?vwj-^HrgO-Dv8oI6vhUV3V+b}eukFKnN%Jh zHIDak!DOoVx2ZlwZY<}Uw4AOCI1@K$oYctWQvZ79xRf~O&oqj+q9diHCZr1=OWKom(+3vvlD+h`x6MXFOCdS4N8cXEk!OCl6+fwEeMg2gi# zJtt~5nURgMh=sB+4=x6?Z4lx2UTfA0En-SgTlDr^qFc9{Nu zE6MB6QoPmZ?OePSI0G);O1A&t@Y%y>kI>V+$=-ZY#Q_NMR?a=xTojoM--eob2zQQ= zkU0EY$+a5}vgRD({K)tEky{(xuVG`P-$+Bdh`MeP$R~z#yzcz8H<#zoCbHbb_n{`f zkCcxO8SlNbfr?{1lXHBVQR&~NC|+ZjO+_s%4OryD7d=ZyM@@QqwTJmBDsVoe`(L21 zFXn%%B0*6Vm42ip@`jL6 zAJg1(*_4o(QE>~Kf_v+;T)mQeV=NqtK<)Xh1XXC~)#>TuU$ggzZ{0e zu1WOv&AVrhTs$MTUA%hu$cd}-{Fpahx_IQ`NrB!@UApud`~BFZOJ}w;db{@0*&~Nv zol~oXIKL2Y{M;Y1^E`izzrXp?i6d`bJok5l-d?

C#+@MXw4ikk~8q_?{%TmATHE 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 O0000`s literal 102526 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 diff --git a/static/img/2-0-data-explorer-ui.png b/static/img/2-0-data-explorer-ui.png index 795806152173582542c82f638c8db485c243fc69..68be51f6eea2593a5a0c06730198ef555233fb01 100644 GIT binary patch literal 172948 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

tj< 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 Ty4^2=g51=UwUmA-Scd%{QT9@6 literal 172217 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 wLHKo%h@fvjv-SHq^$FK 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 Date: Fri, 23 Aug 2019 10:37:46 -0600 Subject: [PATCH 051/258] initial changes for alpha-18 --- content/v2.0/get-started.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/v2.0/get-started.md b/content/v2.0/get-started.md index 5461219fb..539d98f6c 100644 --- a/content/v2.0/get-started.md +++ b/content/v2.0/get-started.md @@ -27,7 +27,7 @@ This article describes how to get started with InfluxDB OSS. To get started with ### Download and install InfluxDB v2.0 alpha Download InfluxDB v2.0 alpha for macOS. -InfluxDB v2.0 alpha (macOS) +InfluxDB v2.0 alpha (macOS) ### Unpackage the InfluxDB binaries Unpackage the downloaded archive. @@ -36,7 +36,7 @@ _**Note:** The following commands are examples. Adjust the file paths to your ow ```sh # Unpackage contents to the current working directory -gunzip -c ~/Downloads/influxdb_2.0.0-alpha.17_darwin_amd64.tar.gz | tar xopf - +gunzip -c ~/Downloads/influxdb_2.0.0-alpha.18_darwin_amd64.tar.gz | tar xopf - ``` If you choose, you can place `influx` and `influxd` in your `$PATH`. @@ -44,7 +44,7 @@ You can also prefix the executables with `./` to run then in place. ```sh # (Optional) Copy the influx and influxd binary to your $PATH -sudo cp influxdb_2.0.0-alpha.17_darwin_amd64/{influx,influxd} /usr/local/bin/ +sudo cp influxdb_2.0.0-alpha.18_darwin_amd64/{influx,influxd} /usr/local/bin/ ``` {{% note %}} @@ -90,8 +90,8 @@ influxd --reporting-disabled ### Download and install InfluxDB v2.0 alpha Download the InfluxDB v2.0 alpha package appropriate for your chipset. -InfluxDB v2.0 alpha (amd64) -InfluxDB v2.0 alpha (arm) +InfluxDB v2.0 alpha (amd64) +InfluxDB v2.0 alpha (arm) ### Place the executables in your $PATH Unpackage the downloaded archive and place the `influx` and `influxd` executables in your system `$PATH`. @@ -100,10 +100,10 @@ _**Note:** The following commands are examples. Adjust the file names, paths, an ```sh # Unpackage contents to the current working directory -tar xvzf path/to/influxdb_2.0.0-alpha.17_linux_amd64.tar.gz +tar xvzf path/to/influxdb_2.0.0-alpha.18_linux_amd64.tar.gz # Copy the influx and influxd binary to your $PATH -sudo cp influxdb_2.0.0-alpha.17_linux_amd64/{influx,influxd} /usr/local/bin/ +sudo cp influxdb_2.0.0-alpha.18_linux_amd64/{influx,influxd} /usr/local/bin/ ``` {{% note %}} From 705102b023964d5fdcb85f1d50894d5f8d5637a4 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 10:44:13 -0600 Subject: [PATCH 052/258] updated kaufmansER to address PR feedback --- .../functions/built-in/transformations/aggregates/kaufmanser.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md index b7952828d..5f77fc1d6 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md @@ -15,7 +15,7 @@ related: The `kaufmansER()` function calculates the Kaufman's Efficiency Ratio (KER) using values in an input table. -It operates only on the `_value` column. +The function operates on the `_value` column. _**Function type:** Aggregate_ From bc80960930c43cc8b8ed5d23ecf9eb3eeb07dcd5 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 13:09:38 -0600 Subject: [PATCH 053/258] added influxd inspect verify-seriesfile command, resolves #326 --- .../reference/cli/influxd/inspect/_index.md | 15 +++++------ .../cli/influxd/inspect/verify-seriesfile.md | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 content/v2.0/reference/cli/influxd/inspect/verify-seriesfile.md diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index b7e37e496..a084789d6 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -16,13 +16,14 @@ influxd inspect [subcommand] ``` ## Subcommands -| Subcommand | Description | -|:---------- |:----------- | -| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | -| [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | -| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | -| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | -| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | +| Subcommand | Description | +|:---------- |:----------- | +| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | +| [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | +| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | +| [verify-seriesfile](/v2.0/reference/cli/influxd/inspect/verify-seriesfile/) | Verify the integrity of series files | +| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | +| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | ## Flags | Flag | Description | diff --git a/content/v2.0/reference/cli/influxd/inspect/verify-seriesfile.md b/content/v2.0/reference/cli/influxd/inspect/verify-seriesfile.md new file mode 100644 index 000000000..28563678f --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/verify-seriesfile.md @@ -0,0 +1,25 @@ +--- +title: influxd inspect verify-seriesfile +description: > + The `influxd inspect verify-seriesfile` command verifies the integrity of series files. +v2.0/tags: [inspect] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect verify-seriesfile` command verifies the integrity of series files. + +## Usage +```sh +influxd inspect verify-seriesfile [flags] +``` + +## Flags +| Flag | Description | Input Type | +|:---- |:----------- |:----------:| +| `-c`, `--c` | Number of workers to run concurrently (defaults to 8). | integer | +| `-h`, `--help` | Help for `verify-seriesfile`. | | +| `--series-file` | Path to series file (defaults to `~/.influxdbv2/engine/_series`). | string | +| `-v`, `--verbose` | Enable verbose output. | | From c90edd4a25027c9ab5bb36cb6813a14aafe2de88 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 15:49:11 -0600 Subject: [PATCH 054/258] added the influxd inspect dumpwal command, resolves #302 --- .../reference/cli/influxd/inspect/_index.md | 1 + .../reference/cli/influxd/inspect/dumpwal.md | 68 +++++++++++++++++++ .../cli/influxd/inspect/export-blocks.md | 2 +- .../cli/influxd/inspect/verify-tsm.md | 2 +- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 content/v2.0/reference/cli/influxd/inspect/dumpwal.md diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index a084789d6..04500ddaa 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -18,6 +18,7 @@ influxd inspect [subcommand] ## Subcommands | Subcommand | Description | |:---------- |:----------- | +| [dumpwal](/v2.0/reference/cli/influxd/inspect/dumpwal/) | Output TSM data from WAL files | | [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | | [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | | [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | diff --git a/content/v2.0/reference/cli/influxd/inspect/dumpwal.md b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md new file mode 100644 index 000000000..bc1747239 --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md @@ -0,0 +1,68 @@ +--- +title: influxd inspect dumpwal +description: > + The `influxd inspect dumpwal` command outputs data from WAL files. +v2.0/tags: [wal, inspect] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect dumpwal` command outputs data from Write Ahead Log (WAL) files. +Given a list of file path globs (patterns which match `.wal` file paths), +the command parses and prints out entries in each file. + +## Usage +```sh +influxd inspect dumpwal [flags] +``` + +## Output details +The `--find-duplicates` flag determines the output of `influxd inspect dumpwal` command. + +**Without `--find-duplicates`**, the command outputs the following for each file +that matches the specified [globbing patterns](#globbing-patterns): + +- The file name +- For each entry in a file: + - The type of the entry (`[write]` or `[delete-bucket-range]`) + - The formatted entry contents + +**With `--find-duplicates`**, the command outputs the following for each file +that matches the specified [globbing patterns](#globbing-patterns): + +- The file name +- A list of keys in the file with out of order timestamps + +## Arguments + +### Globbing patterns +Globbing patterns provide partial paths used to match file paths and names. + +##### Example globbing patterns +```sh +# Match any file or folder starting with "foo" +foo* + +# Match any file or folder starting with "foo" and ending with .txt +foo*.txt + +# Match any file or folder ending with "foo" +*foo + +# Match foo/bar/baz but not foo/bar/bin/baz +foo/*/baz + +# Match foo/baz and foo/bar/baz and foo/bar/bin/baz +foo/**/baz + +# Matches cat but not can or c/t +/c?t +``` + +## Flags +| Flag | Description | +|:---- |:----------- | +| `--find-duplicates` | Ignore dumping entries; only report keys in the WAL that are out of order. | +| `-h`, `--help` | Help for `dumpwal`. | diff --git a/content/v2.0/reference/cli/influxd/inspect/export-blocks.md b/content/v2.0/reference/cli/influxd/inspect/export-blocks.md index dbd848b26..18f187d30 100644 --- a/content/v2.0/reference/cli/influxd/inspect/export-blocks.md +++ b/content/v2.0/reference/cli/influxd/inspect/export-blocks.md @@ -3,7 +3,7 @@ title: influxd inspect export-blocks description: > The `influxd inspect export-blocks` command exports all blocks in one or more TSM1 files to another format for easier inspection and debugging. -v2.0/tags: [wal, inspect] +v2.0/tags: [inspect] menu: v2_0_ref: parent: influxd inspect diff --git a/content/v2.0/reference/cli/influxd/inspect/verify-tsm.md b/content/v2.0/reference/cli/influxd/inspect/verify-tsm.md index cd8ad2f4b..e2c5cac84 100644 --- a/content/v2.0/reference/cli/influxd/inspect/verify-tsm.md +++ b/content/v2.0/reference/cli/influxd/inspect/verify-tsm.md @@ -3,7 +3,7 @@ title: influxd inspect verify-tsm description: > The `influxd inspect verify-tsm` command analyzes a set of TSM files for inconsistencies between the TSM index and the blocks. -v2.0/tags: [wal, inspect] +v2.0/tags: [tsm, inspect] menu: v2_0_ref: parent: influxd inspect From e9af5484cbfcdb6363888df82d65b88f371725cd Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 16:12:52 -0600 Subject: [PATCH 055/258] added influxd inspect dump-tsi command, resolves #403 --- .../reference/cli/influxd/inspect/_index.md | 1 + .../reference/cli/influxd/inspect/dump-tsi.md | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 content/v2.0/reference/cli/influxd/inspect/dump-tsi.md diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index a084789d6..e15d52dcd 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -18,6 +18,7 @@ influxd inspect [subcommand] ## Subcommands | Subcommand | Description | |:---------- |:----------- | +| [dump-tsi](/v2.0/reference/cli/influxd/inspect/dump-tsi/) | Output low level TSI information | | [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | | [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | | [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | diff --git a/content/v2.0/reference/cli/influxd/inspect/dump-tsi.md b/content/v2.0/reference/cli/influxd/inspect/dump-tsi.md new file mode 100644 index 000000000..a15bc1020 --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/dump-tsi.md @@ -0,0 +1,33 @@ +--- +title: influxd inspect dump-tsi +description: > + The `influxd inspect dump-tsi` command outputs low-level information about `tsi1` files. +v2.0/tags: [tsi, inspect] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect dump-tsi` command outputs low-level information about +Time Series Index (`tsi1`) files. + +## Usage +```sh +influxd inspect dump-tsi [flags] +``` + +## Flags +| Flag | Description | Input Type | +|:---- |:----------- |:----------:| +| `-h`, `--help` | Help for `dump-tsi`. | | +| `--index-path` | Path to data engine index directory (defaults to `~/.influxdbv2/engine/index`). | string | +| `--measurement-filter` | Regular expression measurement filter. | string | +| `--measurements` | Show raw measurement data. | | +| `--series` | Show raw series data. | | +| `--series-path` | Path to series file (defaults to `~/.influxdbv2/engine/_series`). | string | +| `--tag-key-filter` | Regular expression tag key filter. | string | +| `--tag-keys` | Show raw tag key data. | | +| `--tag-value-filter` | Regular expression tag value filter. | string | +| `--tag-value-series` | Show raw series data for each value. | | +| `--tag-values` | Show raw tag value data. | | From 083e6763a8fd710643450c7bc3e0d4ca771f0d6c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 16:32:02 -0600 Subject: [PATCH 056/258] updated dumpwal command to address PR feedback --- content/v2.0/reference/cli/influxd/inspect/dumpwal.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/v2.0/reference/cli/influxd/inspect/dumpwal.md b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md index bc1747239..d5221fca4 100644 --- a/content/v2.0/reference/cli/influxd/inspect/dumpwal.md +++ b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md @@ -10,7 +10,7 @@ weight: 301 --- The `influxd inspect dumpwal` command outputs data from Write Ahead Log (WAL) files. -Given a list of file path globs (patterns which match `.wal` file paths), +Given a list of file path globs (patterns that match `.wal` file paths), the command parses and prints out entries in each file. ## Usage @@ -19,7 +19,7 @@ influxd inspect dumpwal [flags] ``` ## Output details -The `--find-duplicates` flag determines the output of `influxd inspect dumpwal` command. +The `--find-duplicates` flag determines the `influxd inspect dumpwal` output. **Without `--find-duplicates`**, the command outputs the following for each file that matches the specified [globbing patterns](#globbing-patterns): @@ -33,7 +33,7 @@ that matches the specified [globbing patterns](#globbing-patterns): that matches the specified [globbing patterns](#globbing-patterns): - The file name -- A list of keys in the file with out of order timestamps +- A list of keys with timestamps in the wrong order in the file ## Arguments From 3db50eb5bb018b957f64da62e54cf40a0459e115 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 23 Aug 2019 16:37:21 -0600 Subject: [PATCH 057/258] minor update to dumpwal command --- content/v2.0/reference/cli/influxd/inspect/dumpwal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/cli/influxd/inspect/dumpwal.md b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md index d5221fca4..854226983 100644 --- a/content/v2.0/reference/cli/influxd/inspect/dumpwal.md +++ b/content/v2.0/reference/cli/influxd/inspect/dumpwal.md @@ -33,7 +33,7 @@ that matches the specified [globbing patterns](#globbing-patterns): that matches the specified [globbing patterns](#globbing-patterns): - The file name -- A list of keys with timestamps in the wrong order in the file +- A list of keys with timestamps in the wrong order ## Arguments From 629668847d6565eff41d4e12abce1e123b784301 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 09:35:13 -0600 Subject: [PATCH 058/258] added flux bytes type, resolves #392 --- content/v2.0/reference/flux/language/types.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/language/types.md b/content/v2.0/reference/flux/language/types.md index 486140d6c..495e6450a 100644 --- a/content/v2.0/reference/flux/language/types.md +++ b/content/v2.0/reference/flux/language/types.md @@ -105,7 +105,12 @@ The string type is nullable. An empty string is **not** a _null_ value. {{% /note %}} -The length of a string is its size in bytes, not the number of characters, since a single character may be multiple bytes. +The length of a string is its size in bytes, not the number of characters, +since a single character may be multiple bytes. + +### Bytes types +A _bytes type_ represents a sequence of byte values. +The bytes type name is `bytes`. ## Regular expression types A _regular expression type_ represents the set of all patterns for regular expressions. From 09c9dbc766b546cf5c7520d3cbc617f4e635346a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 09:44:39 -0600 Subject: [PATCH 059/258] update flux string interpolation documentation, resolves #409 --- .../reference/flux/language/lexical-elements.md | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/content/v2.0/reference/flux/language/lexical-elements.md b/content/v2.0/reference/flux/language/lexical-elements.md index ee588967b..d19fb807b 100644 --- a/content/v2.0/reference/flux/language/lexical-elements.md +++ b/content/v2.0/reference/flux/language/lexical-elements.md @@ -269,8 +269,7 @@ String literals support several escape sequences. \t U+0009 horizontal tab \" U+0022 double quote \\ U+005C backslash -\{ U+007B open curly bracket -\} U+007D close curly bracket +\${ U+0024 U+007B dollar sign and opening curly bracket ``` Additionally, any byte value may be specified via a hex encoding using `\x` as the prefix. @@ -281,7 +280,7 @@ byte_value = `\` "x" hex_digit hex_digit . hex_digit = "0" … "9" | "A" … "F" | "a" … "f" . unicode_value = unicode_char | escaped_char . escaped_char = `\` ( "n" | "r" | "t" | `\` | `"` ) . -StringExpression = "{" Expression "}" . +StringExpression = "${" Expression "}" . ``` {{% note %}} @@ -316,16 +315,11 @@ To include the literal curly brackets within a string they must be escaped. ```js n = 42 -"the answer is {n}" // the answer is 42 -"the answer is not {n+1}" // the answer is not 43 -"openinng curly bracket \{" // openinng curly bracket { -"closing curly bracket \}" // closing curly bracket } +"the answer is ${n}" // the answer is 42 +"the answer is not ${n+1}" // the answer is not 43 +"dollar sign opening curly bracket \${" // dollar sign opening curly bracket ${ ``` -{{% note %}} -[IMPL#251](https://github.com/influxdata/platform/issues/251) Add string interpolation support -{{% /note %}} - ### Regular expression literals A _regular expression literal_ represents a regular expression pattern, enclosed in forward slashes. From 7bce63d485d1fc5713b437de603130078ed22818 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 09:59:47 -0600 Subject: [PATCH 060/258] various flux updates, resolves #397 --- .../functions/built-in/transformations/aggregates/mode.md | 3 ++- content/v2.0/reference/flux/language/expressions.md | 4 ++++ content/v2.0/reference/flux/language/statements.md | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md index ef3916c57..7ad9cfdd8 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md @@ -19,7 +19,8 @@ _**Function type:** Aggregate_ mode(column: "_value") ``` -Multiple modes are returned in a sorted table. +If there are multiple modes, it returns all of them in a sorted table. +Mode only considers non-null values. If there is no mode, `mode()` returns `null`. ##### Supported data types diff --git a/content/v2.0/reference/flux/language/expressions.md b/content/v2.0/reference/flux/language/expressions.md index 28392fb47..1dc60a210 100644 --- a/content/v2.0/reference/flux/language/expressions.md +++ b/content/v2.0/reference/flux/language/expressions.md @@ -269,4 +269,8 @@ PostfixOperator = MemberExpression | IndexExpression . ``` +{{% warn %}} +Dividing by 0 or using the mod operator with a divisor of 0 will result in an error. +{{% /warn %}} + _Also see [Flux Operators](/v2.0/reference/flux/language/operators)._ diff --git a/content/v2.0/reference/flux/language/statements.md b/content/v2.0/reference/flux/language/statements.md index 5ae6b94c0..e3335228b 100644 --- a/content/v2.0/reference/flux/language/statements.md +++ b/content/v2.0/reference/flux/language/statements.md @@ -119,6 +119,7 @@ duration // duration of time time // time string // utf-8 encoded string regexp // regular expression +bytes // sequence of byte values type // a type that itself describes a type ``` From 1d3aacf247d2538d843bc53efd5f40c2d6e01fd0 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 10:15:56 -0600 Subject: [PATCH 061/258] added flux truncateTimeColumn function, resolves #411 --- .../transformations/truncatetimecolumn.md | 52 +++++++++++++++++++ .../reference/flux/functions/date/truncate.md | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md b/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md new file mode 100644 index 000000000..65c2416a1 --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md @@ -0,0 +1,52 @@ +--- +title: truncateTimeColumn() function +description: > + The `truncateTimeColumn()` function truncates all input table `_time` values to a specified unit. +menu: + v2_0_ref: + name: truncateTimeColumn + parent: built-in-transformations +weight: 401 +related: + - /v2.0/reference/flux/functions/date/truncate/ +--- + +The `truncateTimeColumn()` function truncates all input table `_time` values to a specified unit. + +_**Function type:** Transformation_ + +```js +truncateTimeColumn(unit: 1s) +``` + +## Parameters + +### unit +The unit of time to truncate to. + +_**Data type:** Duration_ + +{{% note %}} +Only use `1` and the unit of time to specify the `unit`. +For example: `1s`, `1m`, `1h`. +{{% /note %}} + +## Examples + +##### Truncate all time values to seconds +```js +from(bucket:"example-bucket") + |> range(start:-1h) + |> truncateTimeColumn(unit: 1s) +``` + +## Function definition +```js +import "date" + +truncateTimeColumn = (unit, tables=<-) => + tables + |> map(fn: (r) => ({ + r with _time: date.truncate(t: r._time, unit:unit }) + ) +``` diff --git a/content/v2.0/reference/flux/functions/date/truncate.md b/content/v2.0/reference/flux/functions/date/truncate.md index c9f7db136..960bd999a 100644 --- a/content/v2.0/reference/flux/functions/date/truncate.md +++ b/content/v2.0/reference/flux/functions/date/truncate.md @@ -32,7 +32,7 @@ The time to operate on. _**Data type:** Time_ ### unit -The unit time to truncate to. +The unit of time to truncate to. _**Data type:** Duration_ From ae3a4e34848fab75e1ffd094dddad21e1d5263dd Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 10:19:12 -0600 Subject: [PATCH 062/258] fixed truncateTimeColumn function definition --- .../functions/built-in/transformations/truncatetimecolumn.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md b/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md index 65c2416a1..164091a53 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md @@ -47,6 +47,7 @@ import "date" truncateTimeColumn = (unit, tables=<-) => tables |> map(fn: (r) => ({ - r with _time: date.truncate(t: r._time, unit:unit }) + r with _time: date.truncate(t: r._time, unit:unit) + }) ) ``` From 78fbe07eb177b53a01a2e7fab5c42eb3326787d9 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 13:42:27 -0600 Subject: [PATCH 063/258] removed outdated implementation notes --- .../v2.0/reference/flux/language/assignment-scope.md | 10 ---------- content/v2.0/reference/flux/language/packages.md | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/content/v2.0/reference/flux/language/assignment-scope.md b/content/v2.0/reference/flux/language/assignment-scope.md index 99e03231a..2b20f7ce8 100644 --- a/content/v2.0/reference/flux/language/assignment-scope.md +++ b/content/v2.0/reference/flux/language/assignment-scope.md @@ -8,12 +8,6 @@ menu: weight: 202 --- -{{% note %}} -This document is a living document and may not represent the current implementation of Flux. -Any section that is not currently implemented is commented with a **[IMPL#XXX]** where -**XXX** is an issue number tracking discussion and progress towards implementation. -{{% /note %}} - An assignment binds an identifier to a variable, option, or function. Every identifier in a program must be assigned. @@ -32,10 +26,6 @@ Note that the package clause is not an assignment. The package name does not appear in any scope. Its purpose is to identify the files belonging to the same package and to specify the default package name for import declarations. -{{% note %}} -[IMPL#247](https://github.com/influxdata/platform/issues/247) Add package/namespace support. -{{% /note %}} - ## Variable assignment A variable assignment creates a variable bound to an identifier and gives it a type and value. A variable keeps the same type and value for the remainder of its lifetime. diff --git a/content/v2.0/reference/flux/language/packages.md b/content/v2.0/reference/flux/language/packages.md index ce7d0f459..a04d6173c 100644 --- a/content/v2.0/reference/flux/language/packages.md +++ b/content/v2.0/reference/flux/language/packages.md @@ -13,12 +13,6 @@ menu: weight: 207 --- -{{% note %}} -This document is a living document and may not represent the current implementation of Flux. -Any section that is not currently implemented is commented with a **[IMPL#XXX]** where -**XXX** is an issue number tracking discussion and progress towards implementation. -{{% /note %}} - Flux source is organized into packages. A package consists of one or more source files. Each source file is parsed individually and composed into a single package. @@ -41,10 +35,6 @@ All files in the same package must declare the same package name. When a file does not declare a package clause, all identifiers in that file will belong to the special `main` package. -{{% note %}} -[IMPL#247](https://github.com/influxdata/platform/issues/247) Add package/namespace support. -{{% /note %}} - ### Package main The `main` package is special for a few reasons: From fe3bda6990fca0f0dc1107108f675d9786e629db Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 15:06:40 -0600 Subject: [PATCH 064/258] added flux JSON package, resolves #393 --- .../reference/flux/functions/json/_index.md | 22 +++++++++ .../reference/flux/functions/json/encode.md | 47 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/json/_index.md create mode 100644 content/v2.0/reference/flux/functions/json/encode.md diff --git a/content/v2.0/reference/flux/functions/json/_index.md b/content/v2.0/reference/flux/functions/json/_index.md new file mode 100644 index 000000000..ca7b8a82f --- /dev/null +++ b/content/v2.0/reference/flux/functions/json/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux JSON package +list_title: JSON package +description: > + The Flux JSON package provides functions for working with JSON. + Import the `json` package. +menu: + v2_0_ref: + name: JSON + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, json, package] +--- + +JSON Flux functions provide tools for working with JSON. +Import the `json` package: + +```js +import "json" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/json/encode.md b/content/v2.0/reference/flux/functions/json/encode.md new file mode 100644 index 000000000..50ca8f783 --- /dev/null +++ b/content/v2.0/reference/flux/functions/json/encode.md @@ -0,0 +1,47 @@ +--- +title: json.encode() function +description: The `json.encode()` function converts a value into JSON bytes +menu: + v2_0_ref: + name: json.encode + parent: JSON +weight: 202 +--- + +The `json.encode()` function converts a value into JSON bytes. + +_**Function type:** Type conversion_ + +```js +import "json" + +json.encode(v: "some value") +``` + +The function encodes [Flux types](/v2.0/reference/flux/language/types/) in the following manner: + +- It encodes `time` values using [RFC3339](https://tools.ietf.org/html/rfc3339). +- It encodes `duration` values in number of milliseconds since the epoch. +- It encodes `regexp` values as their string representation. +- It encodes `bytes` values as base64-encoded strings. +- It cannot encode `function` values and will produce an error. + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### Encode all values in a column in JSON bytes +```js +import "json" + +from(bucket: "example-bucket") + |> range(start: -1h) + |> map(fn: (r) => ({ + r with _value: json.encode(v: r._value) + })) +``` From c2a3986572a854991bdb95b26a8a0772d07378b0 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 15:14:48 -0600 Subject: [PATCH 065/258] added bytes type conversion function, updated type conversion examples, resolves #414 --- .../transformations/type-conversions/bool.md | 5 ++-- .../transformations/type-conversions/bytes.md | 30 +++++++++++++++++++ .../type-conversions/duration.md | 5 ++-- .../transformations/type-conversions/float.md | 5 ++-- .../transformations/type-conversions/int.md | 5 ++-- .../type-conversions/string.md | 5 ++-- .../transformations/type-conversions/time.md | 5 ++-- .../transformations/type-conversions/uint.md | 5 ++-- 8 files changed, 44 insertions(+), 21 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md index 9d1f16127..e2124006c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "system" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "system" ) |> map(fn:(r) => ({ r with responsive: bool(v: r.responsive) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md new file mode 100644 index 000000000..c4bf8212e --- /dev/null +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md @@ -0,0 +1,30 @@ +--- +title: bytes() function +description: The `bytes()` function converts a single value to bytes. +menu: + v2_0_ref: + name: bytes + parent: built-in-type-conversions +weight: 502 +--- + +The `bytes()` function converts a single value to bytes. + +_**Function type:** Type conversion_ +_**Output data type:** Bytes_ + +```js +bytes(v: "1m") +``` + +## Parameters + +### v +The value to convert. + +## Examples +```js +from(bucket: "sensor-data") + |> range(start: -1m) + |> map(fn:(r) => ({ r with _value: bytes(v: r._value) })) +``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md index 02c669b8b..bb3a79a28 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "system" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "system" ) |> map(fn:(r) => ({ r with uptime: duration(v: r.uptime) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md index 7e7251dd1..c077410db 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "camera" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "camera" ) |> map(fn:(r) => ({ r with aperature: float(v: r.aperature) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md index ed495fc21..4085a88ce 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "camera" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "camera" ) |> map(fn:(r) => ({ r with exposures: int(v: r.exposures) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md index b3c092602..4c892b569 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "system" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "system" ) |> map(fn:(r) => ({ r with model_number string(v: r.model_number) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md index fd6afb49e..1bd9c324a 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "system" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "system" ) |> map(fn:(r) => ({ r with timestamp: time(v: r.timestamp) })) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md index 68ade7713..1c72dcc67 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md @@ -25,8 +25,7 @@ The value to convert. ## Examples ```js from(bucket: "sensor-data") - |> filter(fn:(r) => - r._measurement == "camera" and - ) + |> range(start: -1m) + |> filter(fn:(r) => r._measurement == "camera" ) |> map(fn:(r) => ({ r with exposures: uint(v: r.exposures) })) ``` From de40dd131e92785e0c9d080675d4d0e83ae734b8 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 15:20:40 -0600 Subject: [PATCH 066/258] added missing period in json.encode page description --- content/v2.0/reference/flux/functions/json/encode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/json/encode.md b/content/v2.0/reference/flux/functions/json/encode.md index 50ca8f783..77752072c 100644 --- a/content/v2.0/reference/flux/functions/json/encode.md +++ b/content/v2.0/reference/flux/functions/json/encode.md @@ -1,6 +1,6 @@ --- title: json.encode() function -description: The `json.encode()` function converts a value into JSON bytes +description: The `json.encode()` function converts a value into JSON bytes. menu: v2_0_ref: name: json.encode From 7fbf960f12c24c81bfa6a5ffc1c9352ef02b0436 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 15:24:06 -0600 Subject: [PATCH 067/258] updated string interpolation docs --- .../reference/flux/language/lexical-elements.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/v2.0/reference/flux/language/lexical-elements.md b/content/v2.0/reference/flux/language/lexical-elements.md index d19fb807b..fa6a11af5 100644 --- a/content/v2.0/reference/flux/language/lexical-elements.md +++ b/content/v2.0/reference/flux/language/lexical-elements.md @@ -283,12 +283,6 @@ escaped_char = `\` ( "n" | "r" | "t" | `\` | `"` ) . StringExpression = "${" Expression "}" . ``` -{{% note %}} -To be added: TODO: With string interpolation `string_lit` is not longer a lexical token as part of a literal, but an entire expression in and of itself. - -[IMPL#252](https://github.com/influxdata/platform/issues/252) Parse string literals. -{{% /note %}} - ##### Examples of string literals ```js @@ -300,12 +294,12 @@ To be added: TODO: With string interpolation `string_lit` is not longer a lexica ``` String literals are also interpolated for embedded expressions to be evaluated as strings. -Embedded expressions are enclosed in curly brackets (`{}`). +Embedded expressions are enclosed within the literals `${` and `}` respectively. The expressions are evaluated in the scope containing the string literal. The result of an expression is formatted as a string and replaces the string content between the brackets. All types are formatted as strings according to their literal representation. A function `printf` exists to allow more precise control over formatting of various types. -To include the literal curly brackets within a string they must be escaped. +To include the literal `${` within a string, it must be escaped. {{% note %}} [IMPL#248](https://github.com/influxdata/platform/issues/248) Add printf function. @@ -320,6 +314,10 @@ n = 42 "dollar sign opening curly bracket \${" // dollar sign opening curly bracket ${ ``` +{{% note %}} +[IMPL#1775](https://github.com/influxdata/flux/issues/1775) Interpolate arbitrary expressions in string literals +{{% /note %}} + ### Regular expression literals A _regular expression literal_ represents a regular expression pattern, enclosed in forward slashes. From e3f8173314b03afa45e889e15fe048ba925d738a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 26 Aug 2019 15:43:47 -0600 Subject: [PATCH 068/258] updates to json.encode to address PR feedback --- content/v2.0/reference/flux/functions/json/encode.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/v2.0/reference/flux/functions/json/encode.md b/content/v2.0/reference/flux/functions/json/encode.md index 77752072c..640241b34 100644 --- a/content/v2.0/reference/flux/functions/json/encode.md +++ b/content/v2.0/reference/flux/functions/json/encode.md @@ -18,13 +18,13 @@ import "json" json.encode(v: "some value") ``` -The function encodes [Flux types](/v2.0/reference/flux/language/types/) in the following manner: +This function encodes [Flux types](/v2.0/reference/flux/language/types/) as follows: -- It encodes `time` values using [RFC3339](https://tools.ietf.org/html/rfc3339). -- It encodes `duration` values in number of milliseconds since the epoch. -- It encodes `regexp` values as their string representation. -- It encodes `bytes` values as base64-encoded strings. -- It cannot encode `function` values and will produce an error. +- `time` values in [RFC3339](https://tools.ietf.org/html/rfc3339) format +- `duration` values in number of milliseconds since the epoch +- `regexp` values as their string representation +- `bytes` values as base64-encoded strings +- `function` values are not encoded and produce an error ## Parameters From 1d382b625f539767a5e3d36557f24cf49acb91d0 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 27 Aug 2019 08:08:09 -0600 Subject: [PATCH 069/258] WIP mqtt.to documentation --- .../reference/flux/functions/mqtt/_index.md | 22 ++++ .../v2.0/reference/flux/functions/mqtt/to.md | 110 ++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/mqtt/_index.md create mode 100644 content/v2.0/reference/flux/functions/mqtt/to.md diff --git a/content/v2.0/reference/flux/functions/mqtt/_index.md b/content/v2.0/reference/flux/functions/mqtt/_index.md new file mode 100644 index 000000000..384e4e692 --- /dev/null +++ b/content/v2.0/reference/flux/functions/mqtt/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux MQTT package +list_title: MQTT package +description: > + The Flux MQTT package provides functions for working with MQTT protocol. + Import the `mqtt` package. +menu: + v2_0_ref: + name: MQTT + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, mqtt, package] +--- + +MQTT Flux functions provide tools for working with Message Queuing Telemetry Transport (MQTT) protocol. +Import the `mqtt` package: + +```js +import "mqtt" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/mqtt/to.md b/content/v2.0/reference/flux/functions/mqtt/to.md new file mode 100644 index 000000000..6fbb68fee --- /dev/null +++ b/content/v2.0/reference/flux/functions/mqtt/to.md @@ -0,0 +1,110 @@ +--- +title: mqtt.to() function +description: > + The `mqtt.to()` function outputs data to an MQTT broker using MQTT protocol. +menu: + v2_0_ref: + name: mqtt.to + parent: MQTT +weight: 202 +--- + +The `mqtt.to()` function outputs data to an MQTT broker using MQTT protocol. + +_**Function type:** Output_ + +```js +import "mqtt" + +mqtt.to( + broker: "tcp://localhost:8883", + topic: "example-topic", + message: "", + qos: 0, + clientid: "flux-mqtt", + username: "username", + password: "password", + name: "name-example", + timeout: 1s, + timeColumn: "_time", + tagColumns: ["tag1", "tag2"], + valueColumns: ["_value"] +) +``` + +## Parameters + +### broker +The MQTT broker connection string. + +_**Data type: String**_ + +### topic +The MQTT topic to send data to. + +_**Data type: String**_ + +### message +placeholder + +_**Data type: String**_ + +### qos +The [MQTT Quality of Service (QoS)](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901103) level. +Values range from `[0-2]`. + +_**Data type: Integer**_ + +### clientid +The MQTT client ID. + +_**Data type: String**_ + +### username +The username to send to the MQTT Broker. + +_**Data type: String**_ + +### password +The password to send to the MQTT Broker. + +_**Data type: String**_ + +### name +placeholder + +_**Data type: String**_ + +### timeout +placeholder +Defaults to `1s` + +_**Data type: Duration**_ + +### timeColumn +placeholder +Defaults to `"_time"`. + +_**Data type: String**_ + +### tagColumns +placeholder +Defaults to `[]`. + +_**Data type: Array of strings**_ + +### valueColumns +placeholder +Defaults to `["_value"]`. + +_**Data type: Array of strings**_ + + +## Examples + +### Send data to an MQTT endpoint +```js +import "mqtt" + +// ... +``` From 621f137f6376b7954097454a8a952c279ca1c38c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 27 Aug 2019 08:33:33 -0600 Subject: [PATCH 070/258] WIP monitor package --- .../flux/functions/monitor/_index.md | 22 +++++++++++ .../reference/flux/functions/monitor/check.md | 38 +++++++++++++++++++ .../flux/functions/monitor/deadman.md | 38 +++++++++++++++++++ .../reference/flux/functions/monitor/from.md | 36 ++++++++++++++++++ .../reference/flux/functions/monitor/logs.md | 36 ++++++++++++++++++ .../flux/functions/monitor/notify.md | 36 ++++++++++++++++++ 6 files changed, 206 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/monitor/_index.md create mode 100644 content/v2.0/reference/flux/functions/monitor/check.md create mode 100644 content/v2.0/reference/flux/functions/monitor/deadman.md create mode 100644 content/v2.0/reference/flux/functions/monitor/from.md create mode 100644 content/v2.0/reference/flux/functions/monitor/logs.md create mode 100644 content/v2.0/reference/flux/functions/monitor/notify.md diff --git a/content/v2.0/reference/flux/functions/monitor/_index.md b/content/v2.0/reference/flux/functions/monitor/_index.md new file mode 100644 index 000000000..abb196eed --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux Monitor package +list_title: Monitor package +description: > + The Flux Monitor package provides tools for monitoring and alerting. + Import the `influxdata/influxdb/monitor` package. +menu: + v2_0_ref: + name: Monitor + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, monitor, alerts, package] +--- + +Monitor Flux functions provide tools for monitoring and alerting. +Import the `influxdata/influxdb/monitor` package: + +```js +import "influxdata/influxdb/monitor" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/monitor/check.md b/content/v2.0/reference/flux/functions/monitor/check.md new file mode 100644 index 000000000..b44af1657 --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/check.md @@ -0,0 +1,38 @@ +--- +title: monitor.check() function +description: The `monitor.check()` function ... +menu: + v2_0_ref: + name: monitor.check + parent: Monitor +weight: 202 +--- + +The `monitor.check()` function ... + +_**Function type:** Type conversion_ + +```js +import "influxdata/influxdb/monitor" + +monitor.check(...) +``` + + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### ... +```js +import "influxdata/influxdb/monitor" + +from(bucket: "example-bucket") + |> range(start: -1h) + |> monitor.check(...) +``` diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/functions/monitor/deadman.md new file mode 100644 index 000000000..7f7d29e10 --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/deadman.md @@ -0,0 +1,38 @@ +--- +title: monitor.deadman() function +description: The `monitor.deadman()` function ... +menu: + v2_0_ref: + name: monitor.deadman + parent: Monitor +weight: 202 +--- + +The `monitor.deadman()` function ... + +_**Function type:** Type conversion_ + +```js +import "influxdata/influxdb/monitor" + +monitor.deadman(...) +``` + + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### ... +```js +import "influxdata/influxdb/monitor" + +from(bucket: "example-bucket") + |> range(start: -1h) + |> monitor.deadman(...) +``` diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/functions/monitor/from.md new file mode 100644 index 000000000..ae77376d8 --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/from.md @@ -0,0 +1,36 @@ +--- +title: monitor.from() function +description: The `monitor.from()` function ... +menu: + v2_0_ref: + name: monitor.from + parent: Monitor +weight: 202 +--- + +The `monitor.from()` function ... + +_**Function type:** Type conversion_ + +```js +import "influxdata/influxdb/monitor" + +monitor.from(...) +``` + + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### ... +```js +import "influxdata/influxdb/monitor" + +monitor.from(...) +``` diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/functions/monitor/logs.md new file mode 100644 index 000000000..aa45f7e04 --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/logs.md @@ -0,0 +1,36 @@ +--- +title: monitor.logs() function +description: The `monitor.logs()` function ... +menu: + v2_0_ref: + name: monitor.logs + parent: Monitor +weight: 202 +--- + +The `monitor.logs()` function ... + +_**Function type:** Type conversion_ + +```js +import "influxdata/influxdb/monitor" + +monitor.logs(...) +``` + + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### ... +```js +import "influxdata/influxdb/monitor" + +monitor.logs(...) +``` diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/functions/monitor/notify.md new file mode 100644 index 000000000..3f777c78e --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/notify.md @@ -0,0 +1,36 @@ +--- +title: monitor.notify() function +description: The `monitor.notify()` function ... +menu: + v2_0_ref: + name: monitor.notify + parent: Monitor +weight: 202 +--- + +The `monitor.notify()` function ... + +_**Function type:** Type conversion_ + +```js +import "influxdata/influxdb/monitor" + +monitor.notify(...) +``` + + +## Parameters + +### v +The value to convert. + +_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ + +## Examples + +### ... +```js +import "influxdata/influxdb/monitor" + +monitor.notify(...) +``` From 31e669f5903dd232d0632de0e83754b25f89279b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 27 Aug 2019 14:27:51 -0600 Subject: [PATCH 071/258] WIP updated monitor.from and monitor.notify functions --- .../reference/flux/functions/monitor/from.md | 52 +++++++++++++++---- .../flux/functions/monitor/notify.md | 34 ++++++++---- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/functions/monitor/from.md index ae77376d8..110d9a123 100644 --- a/content/v2.0/reference/flux/functions/monitor/from.md +++ b/content/v2.0/reference/flux/functions/monitor/from.md @@ -1,6 +1,7 @@ --- title: monitor.from() function -description: The `monitor.from()` function ... +description: > + The `monitor.from()` function retrieves check statuses stored in the `_monitoring` bucket. menu: v2_0_ref: name: monitor.from @@ -8,29 +9,62 @@ menu: weight: 202 --- -The `monitor.from()` function ... +The `monitor.from()` function retrieves check statuses stored in the `_monitoring` bucket. -_**Function type:** Type conversion_ +_**Function type:** Input_ ```js import "influxdata/influxdb/monitor" -monitor.from(...) +monitor.from( + start: -1h, + stop: now(), + fn: (r) => true +) ``` ## Parameters -### v -The value to convert. +### start +The oldest time to include in results. -_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ +Relative start times are defined using negative durations. +Negative durations are relative to now. +Absolute start times are defined using timestamps. + +_**Data type:** Duration | Time_ + +### stop +The newest time to include in the results. +Defaults to `now()`. + +Relative stop times are defined using negative durations. +Negative durations are relative to now. +Absolute stop times are defined using timestamps. + +_**Data type:** Duration | Time_ + +{{% note %}} +Flux only honors [RFC3339 timestamps](/v2.0/reference/flux/language/types#timestamp-format) +and ignores dates and times provided in other formats. +{{% /note %}} + +### fn +A single argument predicate function that evaluates `true` or `false`. +Records or rows (`r`) that evaluate to `true` are included in output tables. +Records that evaluate to _null_ or `false` are not included in output tables. + +_**Data type:** Function_ ## Examples -### ... +### View critical check statuses from the last hour ```js import "influxdata/influxdb/monitor" -monitor.from(...) +monitor.from( + start: -1h, + fn: (r) => r._level == "crit" +) ``` diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/functions/monitor/notify.md index 3f777c78e..c1dc0fd0a 100644 --- a/content/v2.0/reference/flux/functions/monitor/notify.md +++ b/content/v2.0/reference/flux/functions/monitor/notify.md @@ -1,6 +1,8 @@ --- title: monitor.notify() function -description: The `monitor.notify()` function ... +description: > + The `monitor.notify()` function sends a notification to an endpoint and logs it + in the `notifications` measurement in the `_monitoring` bucket. menu: v2_0_ref: name: monitor.notify @@ -8,29 +10,43 @@ menu: weight: 202 --- -The `monitor.notify()` function ... +The `monitor.notify()` function sends a notification to an endpoint and logs it +in the `notifications` measurement in the `_monitoring` bucket. _**Function type:** Type conversion_ ```js import "influxdata/influxdb/monitor" -monitor.notify(...) +monitor.notify( + endpoint: , + data: {} +) ``` - ## Parameters -### v -The value to convert. +### endpoint +A function that constructs and sends the notification to an endpoint. -_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ +_**Data type:** Function_ + +### data +The data object to send to the endpoint. +Defaults to `{}`. + +_**Data type:** Object_ ## Examples -### ... +### Send a notification to Slack ```js import "influxdata/influxdb/monitor" +import "slack" -monitor.notify(...) +endpoint = slack.endpoint(name: "slack", channel: "#flux") + +from(bucket: "system") + |> range(start: -5m) + |> monitor.notify(endpoint: endpoint) ``` From dcf34b5aed46db7845bccca23a0a4a0810a03b7d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 28 Aug 2019 09:42:43 -0600 Subject: [PATCH 072/258] documented the mqtt.to function, resolves #362 --- .../reference/flux/functions/mqtt/_index.md | 1 + .../v2.0/reference/flux/functions/mqtt/to.md | 48 +++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/content/v2.0/reference/flux/functions/mqtt/_index.md b/content/v2.0/reference/flux/functions/mqtt/_index.md index 384e4e692..2b53b4519 100644 --- a/content/v2.0/reference/flux/functions/mqtt/_index.md +++ b/content/v2.0/reference/flux/functions/mqtt/_index.md @@ -10,6 +10,7 @@ menu: parent: Flux packages and functions weight: 202 v2.0/tags: [functions, mqtt, package] +draft: true --- MQTT Flux functions provide tools for working with Message Queuing Telemetry Transport (MQTT) protocol. diff --git a/content/v2.0/reference/flux/functions/mqtt/to.md b/content/v2.0/reference/flux/functions/mqtt/to.md index 6fbb68fee..d91664b98 100644 --- a/content/v2.0/reference/flux/functions/mqtt/to.md +++ b/content/v2.0/reference/flux/functions/mqtt/to.md @@ -7,6 +7,7 @@ menu: name: mqtt.to parent: MQTT weight: 202 +draft: true --- The `mqtt.to()` function outputs data to an MQTT broker using MQTT protocol. @@ -19,7 +20,7 @@ import "mqtt" mqtt.to( broker: "tcp://localhost:8883", topic: "example-topic", - message: "", + message: "Example message", qos: 0, clientid: "flux-mqtt", username: "username", @@ -45,13 +46,20 @@ The MQTT topic to send data to. _**Data type: String**_ ### message -placeholder +The message or payload to send to the MQTT broker. +The default payload is all output tables. + +{{% note %}} +When you specify a message, the function sends only the message string to the MQTT broker. +It does not send any output tables. +{{% /note %}} _**Data type: String**_ ### qos The [MQTT Quality of Service (QoS)](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901103) level. Values range from `[0-2]`. +Default is `0`. _**Data type: Integer**_ @@ -61,50 +69,60 @@ The MQTT client ID. _**Data type: String**_ ### username -The username to send to the MQTT Broker. +The username to send to the MQTT broker. +This is only necessary when the MQTT broker requires authentication. _**Data type: String**_ ### password -The password to send to the MQTT Broker. +The password to send to the MQTT broker. +This is only necessary when the MQTT broker requires authentication. _**Data type: String**_ ### name -placeholder +The name for the MQTT message _(Optional)_. _**Data type: String**_ ### timeout -placeholder -Defaults to `1s` +The MQTT connection timeout. +Default is `1s` _**Data type: Duration**_ ### timeColumn -placeholder -Defaults to `"_time"`. +The column to use as time values in the output line protocol. +Default is `"_time"`. _**Data type: String**_ ### tagColumns -placeholder -Defaults to `[]`. +The columns to use as tag sets in the output line protocol. +Default is `[]`. _**Data type: Array of strings**_ ### valueColumns -placeholder -Defaults to `["_value"]`. +The columns to use as field values in the output line protocol. +Default is `["_value"]`. _**Data type: Array of strings**_ - ## Examples ### Send data to an MQTT endpoint ```js import "mqtt" -// ... +from(bucket: "example-bucket") + |> range(start: -5m) + |> filter(fn: (r) => r._measurement == "airSensor") + |> mqtt.to( + broker: "tcp://localhost:8883", + topic: "air-sensors", + clientid: "sensor-12a4", + tagColumns: ["sensorID"], + valueColumns: ["_value"] + ) ``` From 5fc3d439472c50cb4687e7f36b0708b6999a7405 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 28 Aug 2019 10:41:41 -0600 Subject: [PATCH 073/258] updated mqtt.to to address PR feedback --- content/v2.0/reference/flux/functions/mqtt/to.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/content/v2.0/reference/flux/functions/mqtt/to.md b/content/v2.0/reference/flux/functions/mqtt/to.md index d91664b98..e67566895 100644 --- a/content/v2.0/reference/flux/functions/mqtt/to.md +++ b/content/v2.0/reference/flux/functions/mqtt/to.md @@ -47,11 +47,11 @@ _**Data type: String**_ ### message The message or payload to send to the MQTT broker. -The default payload is all output tables. +The default payload is an output table. +If there are multiple output tables, it sends each table as a separate MQTT message. {{% note %}} -When you specify a message, the function sends only the message string to the MQTT broker. -It does not send any output tables. +When you specify a message, the function sends the message string only (no output table). {{% /note %}} _**Data type: String**_ @@ -70,24 +70,26 @@ _**Data type: String**_ ### username The username to send to the MQTT broker. -This is only necessary when the MQTT broker requires authentication. +Username is only required if the broker requires authentication. +If you provide a username, you must provide a [password](#password). _**Data type: String**_ ### password The password to send to the MQTT broker. -This is only necessary when the MQTT broker requires authentication. +Password is only required if the broker requires authentication. +If you provide a password, you must provide a [username](#username). _**Data type: String**_ ### name -The name for the MQTT message _(Optional)_. +_(Optional)_ The name for the MQTT message. _**Data type: String**_ ### timeout The MQTT connection timeout. -Default is `1s` +Default is `1s`. _**Data type: Duration**_ From 428faa0ee89e5085441499cf21727f26a3704391 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 29 Aug 2019 08:59:38 -0600 Subject: [PATCH 074/258] WIP added monitor.logs, working on monitor.deadman --- .../flux/functions/monitor/_index.md | 2 +- .../flux/functions/monitor/deadman.md | 15 ++++-- .../reference/flux/functions/monitor/logs.md | 50 +++++++++++++++---- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/_index.md b/content/v2.0/reference/flux/functions/monitor/_index.md index abb196eed..3e0af6b67 100644 --- a/content/v2.0/reference/flux/functions/monitor/_index.md +++ b/content/v2.0/reference/flux/functions/monitor/_index.md @@ -12,7 +12,7 @@ weight: 202 v2.0/tags: [functions, monitor, alerts, package] --- -Monitor Flux functions provide tools for monitoring and alerting. +Monitor Flux functions provide tools for monitoring and alerting with InfluxDB. Import the `influxdata/influxdb/monitor` package: ```js diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/functions/monitor/deadman.md index 7f7d29e10..ead39c1f2 100644 --- a/content/v2.0/reference/flux/functions/monitor/deadman.md +++ b/content/v2.0/reference/flux/functions/monitor/deadman.md @@ -1,23 +1,30 @@ --- title: monitor.deadman() function -description: The `monitor.deadman()` function ... +description: > + The `monitor.deadman()` function detects when a group stops reporting data. menu: v2_0_ref: name: monitor.deadman parent: Monitor weight: 202 +cloud_all: true --- -The `monitor.deadman()` function ... +The `monitor.deadman()` function detects when a group stops reporting data. +It takes a stream of tables and reports which groups or series are +observed before time `t`, but not after. -_**Function type:** Type conversion_ +_**Function type:** Transformation_ ```js import "influxdata/influxdb/monitor" -monitor.deadman(...) +monitor.deadman(t: -3m) ``` +`monitor.deadman()` retains the most recent row from each input table. +It adds a `dead` column to output tables. +If a group or series and sets it to `true` if the row's gro ## Parameters diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/functions/monitor/logs.md index aa45f7e04..018cf0c47 100644 --- a/content/v2.0/reference/flux/functions/monitor/logs.md +++ b/content/v2.0/reference/flux/functions/monitor/logs.md @@ -1,6 +1,7 @@ --- title: monitor.logs() function -description: The `monitor.logs()` function ... +description: > + The `monitor.logs()` function retrieves notification events stored in the `_monitoring` bucket. menu: v2_0_ref: name: monitor.logs @@ -8,29 +9,58 @@ menu: weight: 202 --- -The `monitor.logs()` function ... +The `monitor.logs()` function retrieves notification events stored in the `_monitoring` bucket. -_**Function type:** Type conversion_ +_**Function type:** Input_ ```js import "influxdata/influxdb/monitor" -monitor.logs(...) +monitor.logs( + start: -1h, + stop: now(), + fn: (r) => true +) ``` - ## Parameters -### v -The value to convert. +### start +The oldest time to include in results. -_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ +Relative start times are defined using negative durations. +Negative durations are relative to now. +Absolute start times are defined using timestamps. + +_**Data type:** Duration | Time_ + +### stop +The newest time to include in the results. +Defaults to `now()`. + +Relative stop times are defined using negative durations. +Negative durations are relative to now. +Absolute stop times are defined using timestamps. + +_**Data type:** Duration | Time_ + +{{% note %}} +Flux only honors [RFC3339 timestamps](/v2.0/reference/flux/language/types#timestamp-format) +and ignores dates and times provided in other formats. +{{% /note %}} + +### fn +A single argument predicate function that evaluates `true` or `false`. +Records or rows (`r`) that evaluate to `true` are included in output tables. +Records that evaluate to _null_ or `false` are not included in output tables. + +_**Data type:** Function_ ## Examples -### ... +### Query notification events from the last hour ```js import "influxdata/influxdb/monitor" -monitor.logs(...) +monitor.logs(start: -1h) ``` From 34a184c7aa5b2a8532ff264cb68e4cd37acf0356 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 29 Aug 2019 09:23:29 -0600 Subject: [PATCH 075/258] various flux function fixes --- .../flux/functions/built-in/misc/intervals.md | 1 + .../transformations/aggregates/histogramquantile.md | 2 +- .../built-in/transformations/aggregates/increase.md | 13 +++++++------ .../built-in/transformations/aggregates/quantile.md | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/misc/intervals.md b/content/v2.0/reference/flux/functions/built-in/misc/intervals.md index d36acade3..9d585b9c0 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/intervals.md +++ b/content/v2.0/reference/flux/functions/built-in/misc/intervals.md @@ -8,6 +8,7 @@ menu: name: intervals parent: built-in-misc weight: 401 +draft: true --- The `intervals()` function generates a set of time intervals over a range of time. diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md index 7b135a9d8..84edae201 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md @@ -75,7 +75,7 @@ _**Data type:** String_ The assumed minimum value of the dataset. When the quantile falls below the lowest upper bound, interpolation is performed between `minValue` and the lowest upper bound. When `minValue` is equal to negative infinity, the lowest upper bound is used. -Defaults to `0`. +Defaults to `0.0`. _**Data type:** Float_ diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md index b948fb865..b7fabe52c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md @@ -10,7 +10,8 @@ menu: weight: 501 --- -The `increase()` function calculates the total non-negative difference between values in a table. +The `increase()` function calculates the total non-negative difference between +subsequent values in a table. A main use case is tracking changes in counter values which may wrap over time when they hit a threshold or are reset. In the case of a wrap/reset, we can assume that the absolute delta between two @@ -20,16 +21,16 @@ _**Function type:** Aggregate_ _**Output data type:** Float_ ```js -increase(column: "_values") +increase(columns: ["_value"]) ``` ## Parameters -### column -The column for which the increase is calculated. -Defaults to `"_value"`. +### columns +The columns for which the increase is calculated. +Defaults to `["_value"]`. -_**Data type:** Strings_ +_**Data type:** Array of strings_ ## Examples ```js diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md index c9c41436e..a322e83c7 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md @@ -66,7 +66,7 @@ A selector method that returns the data point for which at least `q` points are ### compression Indicates how many centroids to use when compressing the dataset. A larger number produces a more accurate result at the cost of increased memory requirements. -Defaults to 1000. +Defaults to `1000.0`. _**Data type:** Float_ From e5ed4171afe37238763f40a43e8f6330660153cf Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 29 Aug 2019 09:25:55 -0600 Subject: [PATCH 076/258] minor update to increase function doc --- .../functions/built-in/transformations/aggregates/increase.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md index b7fabe52c..1865d9a6e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md @@ -11,7 +11,7 @@ weight: 501 --- The `increase()` function calculates the total non-negative difference between -subsequent values in a table. +subsequent values. A main use case is tracking changes in counter values which may wrap over time when they hit a threshold or are reset. In the case of a wrap/reset, we can assume that the absolute delta between two @@ -27,7 +27,7 @@ increase(columns: ["_value"]) ## Parameters ### columns -The columns for which the increase is calculated. +The columns to use in the operation. Defaults to `["_value"]`. _**Data type:** Array of strings_ From 7f55dcf9f028f16aaf373f40ef4809a58b07abc6 Mon Sep 17 00:00:00 2001 From: Kelly Date: Thu, 29 Aug 2019 10:47:51 -0700 Subject: [PATCH 077/258] add page for Monitor data and receive alerts --- content/v2.0/cloud/monitor-alert/_index.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/_index.md diff --git a/content/v2.0/cloud/monitor-alert/_index.md b/content/v2.0/cloud/monitor-alert/_index.md new file mode 100644 index 000000000..256bf725e --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/_index.md @@ -0,0 +1,15 @@ +--- +title: Monitor data and receive alerts +seotitle: Monitor data and receive alerts in InfluxDB Cloud +description: > + Monitor and receive alerts on your time series data by creating checks, notification rules, and notification endpoints. +menu: + v2_0: + name: Monitor and alert +weight: 3 +v2.0/tags: [monitor, alert, checks, notification rules, notification endpoints] +--- + +Monitor and receive alerts on your time series data by creating checks, notification rules, and notification endpoints. + +{{< children >}} From 302b9b0171decb77f09b0faf0ca5e509b06a4699 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 29 Aug 2019 16:55:19 -0600 Subject: [PATCH 078/258] finshed deadman and check functions, resolves #377 --- .../flux/functions/monitor/_index.md | 8 +- .../reference/flux/functions/monitor/check.md | 80 ++++++++++++++++--- .../flux/functions/monitor/deadman.md | 22 ++--- .../reference/flux/functions/monitor/from.md | 2 +- .../reference/flux/functions/monitor/logs.md | 2 +- .../flux/functions/monitor/notify.md | 8 +- 6 files changed, 90 insertions(+), 32 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/_index.md b/content/v2.0/reference/flux/functions/monitor/_index.md index 3e0af6b67..bc57feadb 100644 --- a/content/v2.0/reference/flux/functions/monitor/_index.md +++ b/content/v2.0/reference/flux/functions/monitor/_index.md @@ -1,12 +1,12 @@ --- -title: Flux Monitor package -list_title: Monitor package +title: Flux InfluxDB Monitor package +list_title: InfluxDB Monitor package description: > - The Flux Monitor package provides tools for monitoring and alerting. + The Flux Monitor package provides tools for monitoring and alerting with InfluxDB. Import the `influxdata/influxdb/monitor` package. menu: v2_0_ref: - name: Monitor + name: InfluxDB Monitor parent: Flux packages and functions weight: 202 v2.0/tags: [functions, monitor, alerts, package] diff --git a/content/v2.0/reference/flux/functions/monitor/check.md b/content/v2.0/reference/flux/functions/monitor/check.md index b44af1657..67f6198ba 100644 --- a/content/v2.0/reference/flux/functions/monitor/check.md +++ b/content/v2.0/reference/flux/functions/monitor/check.md @@ -1,38 +1,94 @@ --- title: monitor.check() function -description: The `monitor.check()` function ... +description: > + The `monitor.check()` function performs a check against input data and assigns an `ok`, + `info`, `warn` or `crit`level to each row based on user-specified predicate functions. menu: v2_0_ref: name: monitor.check - parent: Monitor + parent: InfluxDB Monitor weight: 202 --- -The `monitor.check()` function ... +The `monitor.check()` function performs a check against input data and assigns an `ok`, +`info`, `warn` or `crit` level to each row based on user-specified predicate functions. +The function stores statuses in the `_level` column and writes all check results to the +`statuses` measurement in the `_monitoring` bucket. -_**Function type:** Type conversion_ +_**Function type:** Transformation_ ```js import "influxdata/influxdb/monitor" -monitor.check(...) +monitor.check( + crit: (r) => r._value > 90.0, + warn: (r) => r._value > 80.0, + info: (r) => r._value > 60.0, + ok: (r) => r._value <= 20.0, + messageFn: (r) => "The current level is ${r._level}", + data: {} +) ``` - ## Parameters -### v -The value to convert. +### crit +Predicate function that determines `crit` status. +Default is `(r) => false`. -_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ +_**Data type:** Function_ + +### warn +Predicate function that determines `warn` status. +Default is `(r) => false`. + +_**Data type:** Function_ + +### info +Predicate function that determines `info` status. +Default is `(r) => false`. + +_**Data type:** Function_ + +### ok +Predicate function that determines `ok` status. +Default is `(r) => true`. + +_**Data type:** Function_ + +### messageFn +A function that constructs a message to append to each row. +The message is stored in the `_message` column. + +_**Data type:** Function_ + +### data +Data to append to the to output data. +**InfluxDB populates check data.** + +_**Data type:** Object_ ## Examples -### ... +### Monitor disk usage ```js import "influxdata/influxdb/monitor" -from(bucket: "example-bucket") +from(bucket: "telegraf") |> range(start: -1h) - |> monitor.check(...) + |> filter(fn: (r) => + r._measurement == "disk" and + r._field = "used_percent" + ) + |> monitor.check( + crit: (r) => r._value > 90.0, + warn: (r) => r._value > 80.0, + info: (r) => r._value > 70.0, + ok: (r) => r._value <= 60.0, + messageFn: (r) => + if r._level == "crit" then "Critical alert!! Disk usage is at ${r._value}%!" + else if r._level == "warn" then "Warning! Disk usage is at ${r._value}%." + else if r._level == "info" then "Disk usage is at ${r._value}%." + else "Things are looking good." + ) ``` diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/functions/monitor/deadman.md index ead39c1f2..1ae8286ff 100644 --- a/content/v2.0/reference/flux/functions/monitor/deadman.md +++ b/content/v2.0/reference/flux/functions/monitor/deadman.md @@ -5,7 +5,7 @@ description: > menu: v2_0_ref: name: monitor.deadman - parent: Monitor + parent: InfluxDB Monitor weight: 202 cloud_all: true --- @@ -22,24 +22,26 @@ import "influxdata/influxdb/monitor" monitor.deadman(t: -3m) ``` -`monitor.deadman()` retains the most recent row from each input table. -It adds a `dead` column to output tables. -If a group or series and sets it to `true` if the row's gro +`monitor.deadman()` retains the most recent row from each input table and adds a `dead` column. +It sets `dead` to `true` if the record appears before time `t`. +It sets `dead` to `false` if the group appears after time `t`. ## Parameters -### v -The value to convert. +### t +The time threshold for the deadman check. -_**Data type:** Boolean | Duration | Float | Integer | String | Time | UInteger_ +_**Data type:** Time_ ## Examples -### ... +### Detect if a host hasn't reported in the last five minutes ```js import "influxdata/influxdb/monitor" +import "experimental" from(bucket: "example-bucket") - |> range(start: -1h) - |> monitor.deadman(...) + |> range(start: -10m) + |> group(columns: ["host"]) + |> monitor.deadman(t: experimental.subDuration(d: 5m, from: now() )) ``` diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/functions/monitor/from.md index 110d9a123..540006923 100644 --- a/content/v2.0/reference/flux/functions/monitor/from.md +++ b/content/v2.0/reference/flux/functions/monitor/from.md @@ -5,7 +5,7 @@ description: > menu: v2_0_ref: name: monitor.from - parent: Monitor + parent: InfluxDB Monitor weight: 202 --- diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/functions/monitor/logs.md index 018cf0c47..1ed8ad486 100644 --- a/content/v2.0/reference/flux/functions/monitor/logs.md +++ b/content/v2.0/reference/flux/functions/monitor/logs.md @@ -5,7 +5,7 @@ description: > menu: v2_0_ref: name: monitor.logs - parent: Monitor + parent: InfluxDB Monitor weight: 202 --- diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/functions/monitor/notify.md index c1dc0fd0a..ac671fcf6 100644 --- a/content/v2.0/reference/flux/functions/monitor/notify.md +++ b/content/v2.0/reference/flux/functions/monitor/notify.md @@ -6,14 +6,14 @@ description: > menu: v2_0_ref: name: monitor.notify - parent: Monitor + parent: InfluxDB Monitor weight: 202 --- The `monitor.notify()` function sends a notification to an endpoint and logs it in the `notifications` measurement in the `_monitoring` bucket. -_**Function type:** Type conversion_ +_**Function type:** Output_ ```js import "influxdata/influxdb/monitor" @@ -32,8 +32,8 @@ A function that constructs and sends the notification to an endpoint. _**Data type:** Function_ ### data -The data object to send to the endpoint. -Defaults to `{}`. +Data to append to output data. +**InfluxDB populates notification data.** _**Data type:** Object_ From cb74dbffe37b091ab8dd95fd8ccc7b30e2bc23d1 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 30 Aug 2019 09:09:33 -0600 Subject: [PATCH 079/258] updated monitor package docs to address PR feedback --- .../built-in/transformations/range.md | 26 +++++++++---------- .../flux/functions/monitor/_index.md | 2 +- .../reference/flux/functions/monitor/check.md | 15 ++++++----- .../flux/functions/monitor/deadman.md | 7 +++-- .../reference/flux/functions/monitor/from.md | 21 +++++++-------- .../reference/flux/functions/monitor/logs.md | 21 +++++++-------- .../flux/functions/monitor/notify.md | 2 +- 7 files changed, 43 insertions(+), 51 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/range.md b/content/v2.0/reference/flux/functions/built-in/transformations/range.md index bb7a142b4..371cce541 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/range.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/range.md @@ -26,26 +26,24 @@ range(start: -15m, stop: now()) ## Parameters ### start -Specifies the oldest time to be included in the results. +The earliest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. -Relative start times are defined using negative durations. -Negative durations are relative to now. -Absolute start times are defined using timestamps. - -_**Data type:** Duration or Timestamp_ +_**Data type:** Duration | Time_ ### stop -Specifies the newest time to be included in the results. Defaults to `now`. +The latest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. +Defaults to `now()`. -Relative stop times are defined using negative durations. -Negative durations are relative to now. -Absolute stop times are defined using timestamps. - -_**Data type:** Duration or Timestamp_ +_**Data type:** Duration | Time_ {{% note %}} -Flux only honors [RFC3339 timestamps](/v2.0/reference/flux/language/types#timestamp-format) -and ignores dates and times provided in other formats. +Time values in Flux must be in [RFC3339 format](/v2.0/reference/flux/language/types#timestamp-format). {{% /note %}} ## Examples diff --git a/content/v2.0/reference/flux/functions/monitor/_index.md b/content/v2.0/reference/flux/functions/monitor/_index.md index bc57feadb..12271be11 100644 --- a/content/v2.0/reference/flux/functions/monitor/_index.md +++ b/content/v2.0/reference/flux/functions/monitor/_index.md @@ -12,7 +12,7 @@ weight: 202 v2.0/tags: [functions, monitor, alerts, package] --- -Monitor Flux functions provide tools for monitoring and alerting with InfluxDB. +The Flux monitor package provides tools for monitoring and alerting with InfluxDB. Import the `influxdata/influxdb/monitor` package: ```js diff --git a/content/v2.0/reference/flux/functions/monitor/check.md b/content/v2.0/reference/flux/functions/monitor/check.md index 67f6198ba..ce8de7b7f 100644 --- a/content/v2.0/reference/flux/functions/monitor/check.md +++ b/content/v2.0/reference/flux/functions/monitor/check.md @@ -1,8 +1,8 @@ --- title: monitor.check() function description: > - The `monitor.check()` function performs a check against input data and assigns an `ok`, - `info`, `warn` or `crit`level to each row based on user-specified predicate functions. + The `monitor.check()` function function checks input data and assigns a level + (`ok`, `info`, `warn`, or `crit`) to each row based on predicate functions. menu: v2_0_ref: name: monitor.check @@ -10,10 +10,8 @@ menu: weight: 202 --- -The `monitor.check()` function performs a check against input data and assigns an `ok`, -`info`, `warn` or `crit` level to each row based on user-specified predicate functions. -The function stores statuses in the `_level` column and writes all check results to the -`statuses` measurement in the `_monitoring` bucket. +The `monitor.check()` function function checks input data and assigns a level +(`ok`, `info`, `warn`, or `crit`) to each row based on predicate functions. _**Function type:** Transformation_ @@ -30,6 +28,9 @@ monitor.check( ) ``` +`monitor.check()` stores statuses in the `_level` column and writes results +to the `statuses` measurement in the `_monitoring` bucket. + ## Parameters ### crit @@ -63,7 +64,7 @@ The message is stored in the `_message` column. _**Data type:** Function_ ### data -Data to append to the to output data. +Data to append to the output. **InfluxDB populates check data.** _**Data type:** Object_ diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/functions/monitor/deadman.md index 1ae8286ff..08a030398 100644 --- a/content/v2.0/reference/flux/functions/monitor/deadman.md +++ b/content/v2.0/reference/flux/functions/monitor/deadman.md @@ -11,8 +11,7 @@ cloud_all: true --- The `monitor.deadman()` function detects when a group stops reporting data. -It takes a stream of tables and reports which groups or series are -observed before time `t`, but not after. +It takes a stream of tables and reports if groups have been observed since time `t`. _**Function type:** Transformation_ @@ -23,8 +22,8 @@ monitor.deadman(t: -3m) ``` `monitor.deadman()` retains the most recent row from each input table and adds a `dead` column. -It sets `dead` to `true` if the record appears before time `t`. -It sets `dead` to `false` if the group appears after time `t`. +If a record appears **after** time `t`, `monitor.deadman()` sets `dead` to `false`. +Otherwise, `dead` is set to `true`. ## Parameters diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/functions/monitor/from.md index 540006923..2c97ed710 100644 --- a/content/v2.0/reference/flux/functions/monitor/from.md +++ b/content/v2.0/reference/flux/functions/monitor/from.md @@ -27,27 +27,24 @@ monitor.from( ## Parameters ### start -The oldest time to include in results. - -Relative start times are defined using negative durations. -Negative durations are relative to now. -Absolute start times are defined using timestamps. +The earliest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. _**Data type:** Duration | Time_ ### stop -The newest time to include in the results. +The latest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. Defaults to `now()`. -Relative stop times are defined using negative durations. -Negative durations are relative to now. -Absolute stop times are defined using timestamps. - _**Data type:** Duration | Time_ {{% note %}} -Flux only honors [RFC3339 timestamps](/v2.0/reference/flux/language/types#timestamp-format) -and ignores dates and times provided in other formats. +Time values in Flux must be in [RFC3339 format](/v2.0/reference/flux/language/types#timestamp-format). {{% /note %}} ### fn diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/functions/monitor/logs.md index 1ed8ad486..5b13f9c14 100644 --- a/content/v2.0/reference/flux/functions/monitor/logs.md +++ b/content/v2.0/reference/flux/functions/monitor/logs.md @@ -26,27 +26,24 @@ monitor.logs( ## Parameters ### start -The oldest time to include in results. - -Relative start times are defined using negative durations. -Negative durations are relative to now. -Absolute start times are defined using timestamps. +The earliest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. _**Data type:** Duration | Time_ ### stop -The newest time to include in the results. +The latest time to include in results. +Use a relative duration or absolute time. +For example, `-1h` or `2019-08-28T22:00:00Z`. +Durations are relative to `now()`. Defaults to `now()`. -Relative stop times are defined using negative durations. -Negative durations are relative to now. -Absolute stop times are defined using timestamps. - _**Data type:** Duration | Time_ {{% note %}} -Flux only honors [RFC3339 timestamps](/v2.0/reference/flux/language/types#timestamp-format) -and ignores dates and times provided in other formats. +Time values in Flux must be in [RFC3339 format](/v2.0/reference/flux/language/types#timestamp-format). {{% /note %}} ### fn diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/functions/monitor/notify.md index ac671fcf6..e596600fd 100644 --- a/content/v2.0/reference/flux/functions/monitor/notify.md +++ b/content/v2.0/reference/flux/functions/monitor/notify.md @@ -32,7 +32,7 @@ A function that constructs and sends the notification to an endpoint. _**Data type:** Function_ ### data -Data to append to output data. +Data to append to the output. **InfluxDB populates notification data.** _**Data type:** Object_ From 6ea36fe096dc4eeb82d6c953eec02aa1114a1043 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 30 Aug 2019 09:27:48 -0600 Subject: [PATCH 080/258] corrected deadman t param value --- content/v2.0/reference/flux/functions/monitor/deadman.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/functions/monitor/deadman.md index 08a030398..6f52a49a1 100644 --- a/content/v2.0/reference/flux/functions/monitor/deadman.md +++ b/content/v2.0/reference/flux/functions/monitor/deadman.md @@ -18,7 +18,7 @@ _**Function type:** Transformation_ ```js import "influxdata/influxdb/monitor" -monitor.deadman(t: -3m) +monitor.deadman(t: 2019-08-30T12:30:00Z) ``` `monitor.deadman()` retains the most recent row from each input table and adds a `dead` column. From 5b193f8362a1f748fb9e86652aaf8409847ce720 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 30 Aug 2019 09:37:02 -0600 Subject: [PATCH 081/258] updated monitor.notify endpoint param example --- content/v2.0/reference/flux/functions/monitor/notify.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/functions/monitor/notify.md index e596600fd..5f7dfec22 100644 --- a/content/v2.0/reference/flux/functions/monitor/notify.md +++ b/content/v2.0/reference/flux/functions/monitor/notify.md @@ -19,7 +19,7 @@ _**Function type:** Output_ import "influxdata/influxdb/monitor" monitor.notify( - endpoint: , + endpoint: endpoint, data: {} ) ``` From 40b6ef86a2a8947fd3eba8f62fb2f110c1cdc90e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 30 Aug 2019 16:36:08 -0600 Subject: [PATCH 082/258] added http package, resolves #389 --- .../reference/flux/functions/http/_index.md | 22 +++++++ .../reference/flux/functions/http/post.md | 63 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/http/_index.md create mode 100644 content/v2.0/reference/flux/functions/http/post.md diff --git a/content/v2.0/reference/flux/functions/http/_index.md b/content/v2.0/reference/flux/functions/http/_index.md new file mode 100644 index 000000000..d8d589f6c --- /dev/null +++ b/content/v2.0/reference/flux/functions/http/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux HTTP package +list_title: HTTP package +description: > + The Flux HTTP package provides functions ... + Import the `http` package. +menu: + v2_0_ref: + name: HTTP + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, http, package] +--- + +The Flux HTTP package provides functions ... +Import the `http` package: + +```js +import "http" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/http/post.md b/content/v2.0/reference/flux/functions/http/post.md new file mode 100644 index 000000000..4a143fc39 --- /dev/null +++ b/content/v2.0/reference/flux/functions/http/post.md @@ -0,0 +1,63 @@ +--- +title: http.post() function +description: The `http.post()` function submits an HTTP POST request to the specified URL with headers and data. +// The HTTP status code is returned. +menu: + v2_0_ref: + name: http.post + parent: HTTP +weight: 202 +--- + +The `http.post()` function submits an HTTP POST request to the specified URL with +headers and data and returns the HTTP status code. + +_**Function type:** Output_ + +```js +import "http" + +http.post( + url: "http://localhost:9999/", + headers: {x:"a", y:"b", z:"c"}, + data: bytes(v: "body") +) +``` + +## Parameters + +### url +The URL to POST to. + +_**Data type:** String_ + +### headers +Headers to include with the POST request. + +_**Data type:** Object_ + +### data +The data body to include with the POST request. + +_**Data type:** Bytes_ + +## Examples + +### ... +```js +import "json" +import "http" + +lastReported = + from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "statuses") + |> last() + |> map(fn: (r) => { return {status: r._status} }) + +http.post( + url: "http://myawsomeurl.com/api/notify", + headers: {Authorization: "Bearer mySuPerSecRetTokEn"}, + data: bytes(v: lastReported) +) +``` From 5d02e0d9473c27b57bc266ba373da07d812988e6 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 3 Sep 2019 10:27:39 -0600 Subject: [PATCH 083/258] added Telegraf 1.12 plugins and updated telegraf version --- data/telegraf_plugins.yml | 591 ++++++++++++++++++++++---------------- data/versions.yaml | 2 +- 2 files changed, 352 insertions(+), 241 deletions(-) diff --git a/data/telegraf_plugins.yml b/data/telegraf_plugins.yml index 8ed2882a8..01a64fb04 100644 --- a/data/telegraf_plugins.yml +++ b/data/telegraf_plugins.yml @@ -5,12 +5,22 @@ ############## %%%%%% %% %% %% %%%% %% %%%% ############## input: + - name: AMQP Consumer + id: amqp_consumer + description: | + The AMQP Consumer input plugin provides a consumer for use with AMQP 0-9-1, + a prominent implementation of this protocol + being RabbitMQ. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/amqp_consumer/README.md + introduced: 1.3.0 + tags: [linux, macos, windows, messaging] + - name: ActiveMQ id: activemq description: | The ActiveMQ input plugin gathers queues, topics, and subscriber metrics using the ActiveMQ Console API. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/activemq/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/activemq/README.md introduced: 1.8.0 tags: [linux, macos, windows, messaging] @@ -19,7 +29,7 @@ input: description: | The Aerospike input plugin queries Aerospike servers and gets node statistics and statistics for all configured namespaces. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/aerospike/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/aerospike/README.md introduced: 0.2.0 tags: [linux, macos, windows, data-stores] @@ -27,7 +37,7 @@ input: id: cloudwatch description: | The Amazon CloudWatch Statistics input plugin pulls metric statistics from Amazon CloudWatch. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cloudwatch/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cloudwatch/README.md introduced: 0.12.1 tags: [linux, macos, windows, cloud] @@ -36,25 +46,16 @@ input: description: | The Amazon Kinesis Consumer input plugin reads from a Kinesis data stream and creates metrics using one of the supported [input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kinesis_consumer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kinesis_consumer/README.md introduced: 1.10.0 tags: [linux, macos, windows, cloud, messaging] - - name: AMQP Consumer - id: amqp_consumer - description: | - The AMQP Consumer input plugin provides a consumer for use with AMQP 0-9-1, - a prominent implementation of this protocol being RabbitMQ. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/amqp_consumer/README.md - introduced: 1.3.0 - tags: [linux, macos, windows, messaging] - - name: Apache Aurora id: aurora description: | The Aurora input plugin gathers metrics from [Apache Aurora](https://aurora.apache.org/) schedulers. For monitoring recommendations, see [Monitoring your Aurora cluster](https://aurora.apache.org/documentation/latest/operations/monitoring/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/aurora/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/aurora/README.md introduced: 1.7.0 tags: [linux, macos, windows, applications, containers] @@ -70,7 +71,7 @@ input: option must be enabled in order to collect all available fields. For information about how to configure your server reference, see the [module documentation](https://httpd.apache.org/docs/2.4/mod/mod_status.html#enable). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/apache/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/apache/README.md introduced: 1.8.0 tags: [linux, macos, windows, servers, web] @@ -82,7 +83,7 @@ input: [Consumer Group](http://godoc.org/github.com/wvanbergen/kafka/consumergroup) is used to talk to the Kafka cluster so multiple instances of Telegraf can read from the same topic in parallel. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kafka_consumer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kafka_consumer/README.md introduced: 0.2.3 tags: [linux, macos, windows, messaging] @@ -91,7 +92,7 @@ input: description: | The Apache Mesos input plugin gathers metrics from Mesos. For more information, please check the [Mesos Observability Metrics](http://mesos.apache.org/documentation/latest/monitoring/) page. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mesos/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mesos/README.md introduced: 0.10.3 tags: [linux, macos, windows, containers] @@ -100,7 +101,7 @@ input: id: solr description: | The Apache Solr input plugin collects stats using the MBean Request Handler. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/solr/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/solr/README.md introduced: 1.5.0 tags: [linux, macos, windows, data-stores] @@ -112,7 +113,7 @@ input: Using `XML=true` returns XML data. See the [Apache Tomcat documentation](https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Server_Status) for details on these statistics. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/tomcat/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tomcat/README.md introduced: 1.4.0 tags: [linux, macos, windows, servers, web] @@ -124,7 +125,7 @@ input: > This plugin is experimental. Its data schema may be subject to change based on > its main usage cases and the evolution of the OpenTracing standard. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/zipkin/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/zipkin/README.md introduced: 1.4.0 tags: [linux, macos, windows, networking] @@ -133,15 +134,23 @@ input: description: | The Apache Zookeeper input plugin collects variables output from the `mntr` command [Zookeeper Admin](https://zookeeper.apache.org/doc/current/zookeeperAdmin.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/zookeeper/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/zookeeper/README.md introduced: 0.2.0 tags: [linux, macos, windows, build-deploy] + - name: Apcupsd + id: apcupsd + description: | + The Apcupsd input plugin reads data from an apcupsd daemon over its NIS network protocol. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/apcupsd/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, systems] + - name: Bcache id: bcache description: | The Bcache input plugin gets bcache statistics from the `stats_total` directory and `dirty_data` file. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/bcache/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/bcache/README.md introduced: 0.2.0 tags: [linux, macos, windows, systems] @@ -150,15 +159,15 @@ input: description: | The Beanstalkd input plugin collects server stats as well as tube stats (reported by `stats` and `stats-tube` commands respectively). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/beanstalkd/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/beanstalkd/README.md introduced: 1.8.0 tags: [linux, macos, windows, messaging] - name: BIND 9 Nameserver Statistics id: bind description: | - The BIND 9 input plugin decodes JSON or XML statistics provided by BIND 9 nameservers. - links: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/bind/README.md + plugin decodes the JSON or XML statistics provided by BIND 9 nameservers. + links: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/bind/README.md introduced: 1.11.0 tags: [linux, macos, windows, netoworking] @@ -168,7 +177,7 @@ input: The Bond input plugin collects network bond interface status, bond's slaves interfaces status and failures count of bond's slaves interfaces. The plugin collects these metrics from `/proc/net/bonding/*` files. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/bond/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/bond/README.md introduced: 1.5.0 tags: [linux, macos, windows, networking] @@ -178,7 +187,7 @@ input: The Burrow input plugin collects Apache Kafka topic, consumer, and partition status using the [Burrow](https://github.com/linkedin/Burrow) [HTTP Endpoint](https://github.com/linkedin/Burrow/wiki/HTTP-Endpoint). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/burrow/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/burrow/README.md introduced: 1.7.0 tags: [linux, macos, windows, messaging] @@ -200,7 +209,7 @@ input: id: ceph description: | The Ceph Storage input plugin collects performance metrics from the MON and OSD nodes in a Ceph storage cluster. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ceph/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ceph/README.md introduced: 0.13.1 tags: [linux, macos, windows, data-stores] @@ -208,7 +217,7 @@ input: id: cgroup description: | The CGroup input plugin captures specific statistics per cgroup. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cgroup/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cgroup/README.md introduced: 1.0.0 tags: [linux, macos, windows, systems] @@ -216,27 +225,27 @@ input: id: chrony description: | The Chrony input plugin gets standard chrony metrics, requires chronyc executable. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/chrony/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/chrony/README.md introduced: 0.13.1 tags: [linux, macos, windows, networking, systems] - name: Cisco GNMI Telemetry id: cisco_telemetry_gnmi description: | - The Cisco GNMI Telemetry input plugin consumes telemetry data similar to the GNMI specification. + Cisco GNMI Telemetry is an input plugin that consumes telemetry data similar to the GNMI specification. This GRPC-based protocol can utilize TLS for authentication and encryption. This plugin has been developed to support GNMI telemetry as produced by Cisco IOS XR (64-bit) version 6.5.1 and later. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cisco_telemetry_gnmi/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cisco_telemetry_gnmi/README.md introduced: 1.11.0 tags: [linux, macos, windows, applications] - name: Cisco Model-driven Telemetry (MDT) id: cisco_telemetry_mdt description: | - The Cisco model-driven telemetry (MDT) input plugin consumes telemetry data from Cisco IOS XR, IOS XE and NX-OS platforms. + Cisco model-driven telemetry (MDT) is an input plugin that consumes telemetry data from Cisco IOS XR, IOS XE and NX-OS platforms. It supports TCP & GRPC dialout transports. GRPC-based transport can utilize TLS for authentication and encryption. Telemetry data is expected to be GPB-KV (self-describing-gpb) encoded. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cisco_telemetry_mdt/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cisco_telemetry_mdt/README.md introduced: 1.11.0 tags: [linux, macos, windows, applications] @@ -252,7 +261,7 @@ input: or `/proc/sys/net/netfilter` and will be prefixed with either `ip_` or `nf_`. This plugin reads the files specified in its configuration and publishes each one as a field, with the prefix normalized to `ip_`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/conntrack/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/conntrack/README.md introduced: 1.0.0 tags: [linux, macos, windows, networking] @@ -262,7 +271,7 @@ input: The Consul input plugin will collect statistics about all health checks registered in the Consul. It uses Consul API to query the data. It will not report the telemetry but Consul can report those stats already using StatsD protocol, if needed. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/consul/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/consul/README.md introduced: 1.0.0 tags: [linux, macos, windows, build-deploy, containers] @@ -270,7 +279,7 @@ input: id: couchbase description: | The Couchbase input plugin reads per-node and per-bucket metrics from Couchbase. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/couchbase/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/couchbase/README.md introduced: 0.12.0 tags: [linux, macos, windows, data-stores] @@ -278,7 +287,7 @@ input: id: couchdb description: | The CouchDB input plugin gathers metrics of CouchDB using `_stats` endpoint. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/couchdb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/couchdb/README.md introduced: 0.10.3 tags: [linux, macos, windows, data-stores] @@ -286,7 +295,7 @@ input: id: cpu description: | The CPU input plugin gathers metrics about cpu usage. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cpu/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cpu/README.md introduced: 0.1.5 tags: [linux, macos, windows, systems] @@ -294,7 +303,7 @@ input: id: disk description: | The Disk input plugin gathers metrics about disk usage by mount point. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/disk/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/disk/README.md introduced: 0.1.1 tags: [linux, macos, windows, systems] @@ -302,7 +311,7 @@ input: id: diskio description: | The DiskIO input plugin gathers metrics about disk IO by device. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/diskio/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/diskio/README.md introduced: 0.10.0 tags: [linux, macos, windows, systems] @@ -310,7 +319,7 @@ input: id: disque description: | The Disque input plugin gathers metrics from one or more [Disque](https://github.com/antirez/disque) servers. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/disque + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/disque introduced: 0.10.0 tags: [linux, macos, windows, messaging] @@ -318,7 +327,7 @@ input: id: dmcache description: | The DMCache input plugin provides a native collection for dmsetup-based statistics for dm-cache. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/dmcache/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/dmcache/README.md introduced: 1.3.0 tags: [linux, macos, windows, systems] @@ -327,7 +336,7 @@ input: description: | The DNS Query input plugin gathers DNS query times in milliseconds - like [Dig](https://en.wikipedia.org/wiki/Dig_(command)). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/dns_query/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/dns_query/README.md introduced: 1.4.0 tags: [linux, macos, windows, networking] @@ -337,25 +346,36 @@ input: The Docker input plugin uses the Docker Engine API to gather metrics on running Docker containers. The Docker plugin uses the [Official Docker Client](https://github.com/moby/moby/tree/master/client) to gather stats from the [Engine API](https://docs.docker.com/engine/api/v1.20/) library documentation. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/docker/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/docker/README.md introduced: 0.1.9 tags: [linux, macos, windows, build-deploy, containers] + - name: Docker Log + id: docker_log + description: | + The Docker Log input plugin uses the Docker Engine API to collect logs from running Docker containers. + The plugin uses the [Official Docker Client](https://github.com/moby/moby/tree/master/client) + to gather logs from the [Engine API](https://docs.docker.com/engine/api/v1.24/). + + > This plugin works only for containers with the local or `json-file` or `journald` logging driver. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/docker_log/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, build-deploy, containers, logging] + - name: Dovecot id: dovecot description: | The Dovecot input plugin uses the dovecot Stats protocol to gather metrics on configured domains. For more information, see the [Dovecot documentation](http://wiki2.dovecot.org/Statistics). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/dovecot/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/dovecot/README.md introduced: 0.10.3 tags: [linux, macos, windows, applications, web] - name: ECS id: ecs description: | - The ECS (Fargate compatible) input plugin uses the ECS v2 metadata and stats API - endpoints to gather stats on running containers in a Task. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ecs/README.md + ECS, Fargate compatible, input plugin which uses the ECS v2 metadata and stats API endpoints to gather stats on running containers in a Task. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ecs/README.md introduced: 1.11.0 tags: [linux, macos, windows, cloud, containers] @@ -365,7 +385,7 @@ input: The Elasticsearch input plugin queries endpoints to obtain [node](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-stats.html) and optionally [cluster-health](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html) or [cluster-stats](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html) metrics. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/elasticsearch/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/elasticsearch/README.md introduced: 0.1.5 tags: [linux, macos, windows, data-stores] @@ -375,7 +395,7 @@ input: The Exec input plugin parses supported [Telegraf input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input/) (InfluxDB Line Protocol, JSON, Graphite, Value, Nagios, Collectd, and Dropwizard into metrics. Each Telegraf metric includes the measurement name, tags, fields, and timestamp. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/exec/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/exec/README.md introduced: 0.1.5 tags: [linux, macos, windows] @@ -384,7 +404,7 @@ input: description: | The Fail2ban input plugin gathers the count of failed and banned IP addresses using [fail2ban](https://www.fail2ban.org/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/fail2ban/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/fail2ban/README.md introduced: 1.4.0 tags: [linux, macos, windows, networking, security] @@ -393,7 +413,7 @@ input: description: | The Fibaro input plugin makes HTTP calls to the Fibaro controller API to gather values of hooked devices. Those values could be true (`1`) or false (`0`) for switches, percentage for dimmers, temperature, etc. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/fibaro/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/fibaro/README.md introduced: 1.7.0 tags: [linux, macos, windows, iot] @@ -409,7 +429,7 @@ input: > To parse metrics from multiple files that are formatted in one of the supported > [input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input), > use the [Multifile input plugin](#multifile). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/file/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/file/README.md introduced: 1.8.0 tags: [linux, macos, windows, systems] @@ -417,7 +437,7 @@ input: id: filecount description: | The Filecount input plugin reports the number and total size of files in directories that match certain criteria. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/filecount/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/filecount/README.md introduced: 1.8.0 tags: [linux, macos, windows, systems] @@ -425,24 +445,33 @@ input: id: filestat description: | The Filestat input plugin gathers metrics about file existence, size, and other stats. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/filestat/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/filestat/README.md introduced: 0.13.0 tags: [linux, macos, windows, systems] + - name: Fireboard + id: fireboard + description: | + The Fireboard input plugin gathers real time temperature data from Fireboard thermometers. + To use this input plugin, sign up to use the [Fireboard REST API](https://docs.fireboard.io/reference/restapi.html). + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/fireboard/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, cloud, iot] + - name: Fluentd id: fluentd description: | The Fluentd input plugin gathers Fluentd server metrics from plugin endpoint provided by in_monitor plugin. This plugin understands data provided by `/api/plugin.json` resource (`/api/config.json` is not covered). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/fluentd/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/fluentd/README.md introduced: 1.4.0 tags: [linux, macos, windows, servers] - name: GitHub id: github description: | - The Github input plugin gathers repository information from GitHub-hosted repositories. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/github/README.md + Gathers repository information from GitHub-hosted repositories. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/github/README.md introduced: 1.11.0 tags: [linux, macos, windows, applications] @@ -451,8 +480,8 @@ input: description: | The Google Cloud PubSub input plugin ingests metrics from [Google Cloud PubSub](https://cloud.google.com/pubsub) and creates metrics - using one of the supported [input data formats](https://github.com/influxdata/telegraf/blob/release-1.11/docs/DATA_FORMATS_INPUT.md). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cloud_pubsub/README.md + using one of the supported [input data formats](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md). + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cloud_pubsub/README.md introduced: 1.10.0 tags: [linux, macos, windows, cloud, messaging] @@ -465,7 +494,7 @@ input: The intent of the plugin is to allow Telegraf to serve as an endpoint of the Google Pub/Sub 'Push' service. Google's PubSub service will only send over HTTPS/TLS so this plugin must be behind a valid proxy or must be configured to use TLS. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/cloud_pubsub_push/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/cloud_pubsub_push/README.md introduced: 1.10.0 tags: [linux, macos, windows, cloud, messaging] @@ -477,7 +506,7 @@ input: - multiple (e.g., `http://[graylog-server-ip]:12900/system/metrics/multiple`) - namespace (e.g., `http://[graylog-server-ip]:12900/system/metrics/namespace/{namespace}`) - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/graylog/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/graylog/README.md introduced: 1.0.0 tags: [linux, macos, windows, logging] @@ -486,7 +515,7 @@ input: description: | The HAproxy input plugin gathers metrics directly from any running HAproxy instance. It can do so by using CSV generated by HAproxy status page or from admin sockets. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/haproxy/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/haproxy/README.md introduced: 0.1.5 tags: [linux, macos, windows, networking, web] @@ -494,7 +523,7 @@ input: id: hddtemp description: | The Hddtemp input plugin reads data from `hddtemp` daemons. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/hddtemp/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/hddtemp/README.md introduced: 1.0.0 tags: [linux, macos, windows, systems] @@ -504,18 +533,18 @@ input: The HTTP input plugin collects metrics from one or more HTTP (or HTTPS) endpoints. The endpoint should have metrics formatted in one of the [supported input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input/). Each data format has its own unique set of configuration options which can be added to the input configuration. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/http/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/http/README.md introduced: 1.6.0 tags: [linux, macos, windows, servers, web] - name: HTTP JSON id: httpjson description: | - *Deprecated in Telegraf 1.6.0. Use the [HTTP input plugin](#http).* + _Deprecated in Telegraf 1.6.0. Use the [HTTP input plugin](#http)._ The HTTP JSON input plugin collects data from HTTP URLs which respond with JSON. It flattens the JSON and finds all numeric values, treating them as floats. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/httpjson/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/httpjson/README.md introduced: 0.1.6 deprecated: 1.6.0 tags: [linux, macos, windows, servers, web] @@ -526,7 +555,7 @@ input: The `http_listener` input plugin was renamed to [`influxdb_listener`](#influxdb_listener). The new name better describes the intended use of the plugin as a InfluxDB relay. For general purpose transfer of metrics in any format via HTTP, use [`http_listener_v2`](#http_listener_v2)instead. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/influxdb_listener/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/influxdb_listener/README.md introduced: 1.1.0 deprecated: 1.9.0 tags: [linux, macos, windows, servers, web] @@ -538,7 +567,7 @@ input: Messages are expected in the [InfluxDB Line Protocol input data format](https://docs.influxdata.com/telegraf/latest/data_formats/input/influx) ONLY (other [Telegraf input data formats](https://docs.influxdata.com/telegraf/latest//data_formats/input/) are not supported). This plugin allows Telegraf to serve as a proxy or router for the `/write` endpoint of the InfluxDB v2110 HTTP API. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/http_listener_v2/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/http_listener_v2/README.md introduced: 1.9.0 tags: [linux, macos, windows, servers, web] @@ -548,7 +577,7 @@ input: The HTTP Response input plugin gathers metrics for HTTP responses. The measurements and fields include `response_time`, `http_response_code`, and `result_type`. Tags for measurements include `server` and `method`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/http_response/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/http_response/README.md introduced: 0.12.1 tags: [linux, macos, windows, servers, web] @@ -557,7 +586,7 @@ input: description: | The Icinga 2 input plugin gather status on running services and hosts using the [Icinga 2 API](https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/icinga2-api). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/icinga2 + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/icinga2 introduced: 1.8.0 tags: [linux, macos, windows, networking, servers, systems] @@ -569,7 +598,7 @@ input: best practice and allows you to reduce the overhead associated with capturing and storing these metrics locally within the `_internal` database for production deployments. [Read more about this approach here](https://www.influxdata.com/blog/influxdb-debugvars-endpoint/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/influxdb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/influxdb/README.md introduced: 0.2.5 tags: [linux, macos, windows, data-stores] @@ -609,7 +638,7 @@ input: receive a `200 OK` response with message body `{"results":[]}` but they are not relayed. The output configuration of the Telegraf instance which ultimately submits data to InfluxDB determines the destination database. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/influxdb_listener/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/influxdb_listener/README.md introduced: 1.9.0 tags: [linux, macos, windows, data-stores] @@ -618,7 +647,7 @@ input: description: | The Interrupts input plugin gathers metrics about IRQs, including `interrupts` (from `/proc/interrupts`) and `soft_interrupts` (from `/proc/softirqs`). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/interrupts/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/interrupts/README.md introduced: 1.3.0 tags: [linux, macos, windows, systems] @@ -627,7 +656,7 @@ input: description: | The IPMI Sensor input plugin queries the local machine or remote host sensor statistics using the `ipmitool` utility. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ipmi_sensor/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ipmi_sensor/README.md introduced: 0.12.0 tags: [linux, macos, windows, iot] @@ -636,7 +665,7 @@ input: description: | The Ipset input plugin gathers packets and bytes counters from Linux `ipset`. It uses the output of the command `ipset save`. Ipsets created without the `counters` option are ignored. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ipset/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ipset/README.md introduced: 1.6.0 tags: [linux, macos, windows, networking, security, systems] @@ -645,7 +674,7 @@ input: description: | The IPtables input plugin gathers packets and bytes counters for rules within a set of table and chain from the Linux iptables firewall. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/iptables/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/iptables/README.md introduced: 1.1.0 tags: [linux, macos, windows, systems] @@ -654,7 +683,7 @@ input: description: | The IPVS input plugin uses the Linux kernel netlink socket interface to gather metrics about IPVS virtual and real servers. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ipvs/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ipvs/README.md introduced: 1.9.0 tags: [linux, macos, windows, systems] @@ -666,15 +695,15 @@ input: This plugin does not require a plugin on Jenkins and it makes use of Jenkins API to retrieve all the information needed. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/jenkins/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jenkins/README.md introduced: 1.9.0 tags: [linux, macos, windows, build-deploy] - name: Jolokia id: jolokia description: | - *Deprecated in Telegraf 1.5.0. Use the [Jolokia2 input plugin](#jolokia2_agent).* - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/jolokia/README.md + _Deprecated in Telegraf 1.5.0. Use the [Jolokia2 input plugin](#jolokia2_agent)._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jolokia/README.md introduced: 0.2.1 deprecated: 1.5.0 tags: [linux, macos, windows, networking] @@ -685,7 +714,7 @@ input: The Jolokia2 Agent input plugin reads JMX metrics from one or more [Jolokia](https://jolokia.org/) agent REST endpoints using the [JSON-over-HTTP protocol](https://jolokia.org/reference/html/protocol.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/jolokia2/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jolokia2/README.md introduced: 1.5.0 tags: [linux, macos, windows, networking] @@ -695,7 +724,7 @@ input: The Jolokia2 Proxy input plugin reads JMX metrics from one or more targets by interacting with a [Jolokia](https://jolokia.org/) proxy REST endpoint using the [Jolokia](https://jolokia.org/) [JSON-over-HTTP protocol](https://jolokia.org/reference/html/protocol.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/jolokia2/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jolokia2/README.md introduced: 1.5.0 tags: [linux, macos, windows, networking] @@ -706,7 +735,7 @@ input: of OpenConfig telemetry data from listed sensors using the Junos Telemetry Interface. Refer to [openconfig.net](http://openconfig.net/) for more details about OpenConfig and [Junos Telemetry Interface (JTI)](https://www.juniper.net/documentation/en_US/junos/topics/concept/junos-telemetry-interface-oveview.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/jti_openconfig_telemetry/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jti_openconfig_telemetry/README.md introduced: 1.7.0 tags: [linux, macos, windows, iot] @@ -714,7 +743,7 @@ input: id: kapacitor description: | The Kapacitor input plugin will collect metrics from the given Kapacitor instances. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kapacitor/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kapacitor/README.md introduced: 1.3.0 tags: [linux, macos, windows, applications] @@ -722,7 +751,7 @@ input: id: kernel description: | The Kernel input plugin gathers kernel statistics from `/proc/stat`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kernel/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kernel/README.md introduced: 0.11.0 tags: [linux, macos, windows, systems] @@ -730,7 +759,7 @@ input: id: kernel_vmstat description: | The Kernel VMStat input plugin gathers kernel statistics from `/proc/vmstat`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kernel_vmstat/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kernel_vmstat/README.md introduced: 1.0.0 tags: [linux, macos, windows, systems] @@ -739,7 +768,7 @@ input: description: | The Kibana input plugin queries the Kibana status API to obtain the health status of Kibana and some useful metrics. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kibana/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kibana/README.md introduced: 1.8.0 tags: [linux, macos, windows, applications] @@ -754,7 +783,7 @@ input: It is assumed that this plugin is running as part of a daemonset within a Kubernetes installation. This means that Telegraf is running on every node within the cluster. Therefore, you should configure this plugin to talk to its locally running kubelet. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kubernetes/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kubernetes/README.md introduced: 1.1.0 tags: [linux, macos, windows, build-deploy, containers] @@ -772,7 +801,7 @@ input: - pods (containers) - statefulsets - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/kube_inventory/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/kube_inventory/README.md introduced: 1.10.0 tags: [linux, macos, windows, build-deploy, containers] @@ -782,7 +811,7 @@ input: The LeoFS input plugin gathers metrics of LeoGateway, LeoManager, and LeoStorage using SNMP. See [System monitoring](https://leo-project.net/leofs/docs/admin/system_admin/monitoring/) in the [LeoFS documentation](https://leo-project.net/leofs/docs/) for more information. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/leofs/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/leofs/README.md introduced: 0.1.5 tags: [linux, macos, windows, systems, data-stores] @@ -791,7 +820,7 @@ input: description: | The Linux Sysctl FS input plugin provides Linux system level file (`sysctl fs`) metrics. The documentation on these fields can be found [here](https://www.kernel.org/doc/Documentation/sysctl/fs.txt). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/linux_sysctl_fs/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/linux_sysctl_fs/README.md introduced: 1.3.0 tags: [linux, macos, windows, systems] @@ -801,17 +830,26 @@ input: The Logparser input plugin streams and parses the given log files. Currently, it has the capability of parsing "grok" patterns from log files, which also supports regular expression (regex) patterns. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/logparser/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/logparser/README.md introduced: 1.0.0 tags: [linux, macos, windows, logging] + - name: Logstash + id: logstash + description: | + The Logstash input plugin reads metrics exposed by the [Logstash Monitoring API](https://www.elastic.co/guide/en/logstash/current/monitoring-logstash.html). + The plugin supports Logstash 5 and later. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/logstash/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, logging] + - name: Lustre2 id: lustre2 description: | Lustre Jobstats allows for RPCs to be tagged with a value, such as a job's ID. This allows for per job statistics. The Lustre2 input plugin collects statistics and tags the data with the `jobid`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/lustre2 + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/lustre2 introduced: 0.1.5 tags: [linux, macos, windows, systems] @@ -819,10 +857,18 @@ input: id: mailchimp description: | The Mailchimp input plugin gathers metrics from the `/3.0/reports` MailChimp API. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mailchimp + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mailchimp introduced: 0.2.4 tags: [linux, macos, windows, cloud, web] + - name: MarkLogic + id: marklogic + description: | + The MarkLogic input plugin gathers health status metrics from one or more MarkLogic hosts. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/marklogic/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, data-stores] + - name: Mcrouter id: mcrouter description: | @@ -831,7 +877,7 @@ input: developed and maintained by Facebook, for scaling memcached (http://memcached.org/) deployments. It's a core component of cache infrastructure at Facebook and Instagram where mcrouter handles almost 5 billion requests per second at peak. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mcrouter/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mcrouter/README.md introduced: 1.7.0 tags: [linux, macos, windows, networking] @@ -841,7 +887,7 @@ input: The Mem input plugin collects system memory metrics. For a more complete explanation of the difference between used and actual_used RAM, see [Linux ate my ram](https://www.linuxatemyram.com/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mem/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mem/README.md introduced: 0.1.5 tags: [linux, macos, windows, systems] @@ -849,7 +895,7 @@ input: id: memcached description: | The Memcached input plugin gathers statistics data from a Memcached server. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/memcached/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/memcached/README.md introduced: 0.1.2 tags: [linux, macos, windows, data-stores] @@ -858,7 +904,7 @@ input: description: | The Mesosphere DC/OS input plugin gathers metrics from a DC/OS cluster's [metrics component](https://docs.mesosphere.com/1.10/metrics/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/dcos/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/dcos/README.md introduced: 1.5.0 tags: [linux, macos, windows, containers] @@ -868,7 +914,7 @@ input: The Microsoft SQL Server input plugin provides metrics for your Microsoft SQL Server instance. It currently works with SQL Server versions 2008+. Recorded metrics are lightweight and use Dynamic Management Views supplied by SQL Server. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/sqlserver/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/sqlserver/README.md introduced: 0.10.1 tags: [linux, macos, windows, data-stores] @@ -877,7 +923,7 @@ input: description: | The Minecraft input plugin uses the RCON protocol to collect statistics from a scoreboard on a Minecraft server. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/minecraft/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/minecraft/README.md introduced: 1.4.0 tags: [linux, macos, windows, gaming] @@ -886,7 +932,7 @@ input: description: | The MongoDB input plugin collects MongoDB stats exposed by `serverStatus` and few more and create a single measurement containing values. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mongodb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mongodb/README.md introduced: 0.1.5 tags: [linux, macos, windows, data-stores] @@ -895,7 +941,7 @@ input: description: | The MQTT Consumer input plugin reads from specified MQTT topics and adds messages to InfluxDB. Messages are in the [Telegraf input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mqtt_consumer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mqtt_consumer/README.md introduced: 0.10.3 tags: [linux, macos, windows, messaging] @@ -909,7 +955,7 @@ input: > To parse metrics from a single file formatted in one of the supported > [input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input), > use the [file input plugin](#file). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/multifile/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/multifile/README.md introduced: 1.10.0 tags: [linux, macos, windows] @@ -917,7 +963,7 @@ input: id: mysql description: | The MySQL input plugin gathers the statistics data from MySQL servers. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/mysql/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mysql/README.md introduced: 0.1.1 tags: [linux, macos, windows, data-stores] @@ -928,7 +974,7 @@ input: Messages are expected in the [Telegraf input data formats](https://docs.influxdata.com/telegraf/latest/data_formats/input/). A Queue Group is used when subscribing to subjects so multiple instances of Telegraf can read from a NATS cluster in parallel. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nats_consumer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nats_consumer/README.md introduced: 0.10.3 tags: [linux, macos, windows, messaging] @@ -937,7 +983,7 @@ input: description: | The NATS Server Monitoring input plugin gathers metrics when using the [NATS Server monitoring server](https://www.nats.io/documentation/server/gnatsd-monitoring/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nats/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nats/README.md introduced: 1.6.0 tags: [linux, macos, windows, messaging] @@ -949,7 +995,7 @@ input: control their tanks based on various probes. The data is taken directly from the `/cgi-bin/status.xml` at the interval specified in the `telegraf.conf` configuration file. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/neptune_apex/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/neptune_apex/README.md introduced: 1.10.0 tags: [linux, macos, windows, iot] @@ -957,7 +1003,7 @@ input: id: net description: | The Net input plugin gathers metrics about network interface usage (Linux only). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/net/NET_README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/net/NET_README.md introduced: 0.1.1 tags: [linux, macos, networking] @@ -966,7 +1012,7 @@ input: description: | The Netstat input plugin gathers TCP metrics such as established, time-wait and sockets counts by using `lsof`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/net/NETSTAT_README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/net/NETSTAT_README.md introduced: 0.2.0 tags: [linux, macos, windows, networking, systems] @@ -975,7 +1021,7 @@ input: description: | The Network Response input plugin tests UDP and TCP connection response time. It can also check response text. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/net_response/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/net_response/README.md introduced: 0.10.3 tags: [linux, macos, windows, networking] @@ -983,7 +1029,7 @@ input: id: nginx description: | The NGINX input plugin reads NGINX basic status information (`ngx_http_stub_status_module`). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nginx/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nginx/README.md introduced: 0.1.5 tags: [linux, macos, windows, servers, web] @@ -997,7 +1043,7 @@ input: This is similar to the live activity monitoring of NGINX Plus. For module configuration details, see the [NGINX VTS module documentation](https://github.com/vozlt/nginx-module-vts#synopsis). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nginx_vts/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nginx_vts/README.md introduced: 1.9.0 tags: [linux, macos, windows, servers, web] @@ -1010,7 +1056,7 @@ input: Structures for NGINX Plus have been built based on history of [status module documentation](http://nginx.org/en/docs/http/ngx_http_status_module.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nginx_plus/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nginx_plus/README.md introduced: 1.5.0 tags: [linux, macos, windows, servers, web] @@ -1018,7 +1064,7 @@ input: id: nginx_plus_api description: | The NGINX Plus API input plugin gathers advanced status information for NGINX Plus servers. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nginx_plus_api/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nginx_plus_api/README.md introduced: 1.9.0 tags: [linux, macos, windows, servers, web] @@ -1035,7 +1081,7 @@ input: The status page displays the current status of all upstreams and servers as well as number of the failed and successful checks. This information can be exported in JSON format and parsed by this input. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nginx_plus_api/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nginx_plus_api/README.md introduced: 1.10.0 tags: [linux, macos, windows, servers, web] @@ -1043,7 +1089,7 @@ input: id: nsq description: | The NSQ input plugin collects metrics from NSQD API endpoints. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nsq + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nsq introduced: 1.0.0 tags: [linux, macos, windows, messaging] @@ -1052,7 +1098,7 @@ input: description: | The NSQ Consumer input plugin polls a specified NSQD topic and adds messages to InfluxDB. This plugin allows a message to be in any of the supported data_format types. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nsq_consumer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nsq_consumer/README.md introduced: 0.10.1 tags: [linux, macos, windows, messaging] @@ -1061,7 +1107,7 @@ input: description: | The Nstat input plugin collects network metrics from `/proc/net/netstat`, `/proc/net/snmp`, and `/proc/net/snmp6` files. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nstat/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nstat/README.md introduced: 0.13.1 tags: [linux, macos, windows, networking, systems] @@ -1069,7 +1115,7 @@ input: id: ntpq description: | The NTPq input plugin gets standard NTP query metrics, requires ntpq executable. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ntpq/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ntpq/README.md introduced: 0.11.0 tags: [linux, macos, windows, networking, systems] @@ -1079,7 +1125,7 @@ input: The NVIDIA SMI input plugin uses a query on the [NVIDIA System Management Interface (`nvidia-smi`)](https://developer.nvidia.com/nvidia-system-management-interface) binary to pull GPU stats including memory and GPU usage, temp and other. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/nvidia_smi/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nvidia_smi/README.md introduced: 1.7.0 tags: [linux, macos, windows, systems] @@ -1087,24 +1133,33 @@ input: id: openldap description: | The OpenLDAP input plugin gathers metrics from OpenLDAP's `cn=Monitor` backend. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/openldap/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/openldap/README.md introduced: 1.4.0 tags: [linux, macos, windows, data-stores] + - name: OpenNTPD + id: openntpd + description: | + The OpenNTPD input plugin gathers standard Network Time Protocol (NTP) query + metrics from OpenNTPD using the `ntpctl` command. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/openntpd/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, networking] + - name: OpenSMTPD id: opensmtpd description: | The OpenSMTPD input plugin gathers stats from [OpenSMTPD](https://www.opensmtpd.org/), a free implementation of the server-side SMTP protocol. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/opensmtpd/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/opensmtpd/README.md introduced: 1.5.0 tags: [linux, macos, windows, applications] - name: OpenWeatherMap id: openweathermap description: | - The OpenWeatherMap input plugins collects current weather and forecast data from OpenWeatherMap. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/openweathermap/README.md + Collect current weather and forecast data from OpenWeatherMap. + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/openweathermap/README.md introduced: 1.11.0 tags: [linux, macos, windows, applications] @@ -1115,7 +1170,7 @@ input: Currently it can retrive information about the state table: the number of current entries in the table, and counters for the number of searches, inserts, and removals to the table. The pf plugin retrieves this information by invoking the `pfstat` command. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/pf/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/pf/README.md introduced: 1.5.0 tags: [linux, macos, windows, networking, security] @@ -1124,7 +1179,7 @@ input: description: | The PgBouncer input plugin provides metrics for your PgBouncer load balancer. For information about the metrics, see the [PgBouncer documentation](https://pgbouncer.github.io/usage.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/pgbouncer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/pgbouncer/README.md introduced: 1.8.0 tags: [linux, macos, windows, data-stores] @@ -1133,7 +1188,7 @@ input: description: | The Phfusion 0Passenger input plugin gets Phusion Passenger statistics using their command line utility `passenger-status`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/passenger/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/passenger/README.md introduced: 0.10.1 tags: [linux, macos, windows, web] @@ -1141,7 +1196,7 @@ input: id: phpfpm description: | The PHP FPM input plugin gets phpfpm statistics using either HTTP status page or fpm socket. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/phpfpm/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/phpfpm/README.md introduced: 0.1.10 tags: [linux, macos, windows, servers, web] @@ -1150,7 +1205,7 @@ input: description: | The Ping input plugin measures the round-trip for ping commands, response time, and other packet statistics. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/ping/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/ping/README.md introduced: 0.1.8 tags: [linux, macos, windows, networking] @@ -1162,7 +1217,7 @@ input: [queues](http://www.postfix.org/QSHAPE_README.html#queues), it will report the queue length (number of items), size (bytes used by items), and age (age of oldest item in seconds). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/postfix/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/postfix/README.md introduced: 1.5.0 tags: [linux, macos, windows, services, web] @@ -1173,7 +1228,7 @@ input: It currently works with PostgreSQL versions 8.1+. It uses data from the built-in `pg_stat_database` and `pg_stat_bgwriter` views. The metrics recorded depend on your version of PostgreSQL. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/postgresql/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/postgresql/README.md introduced: 0.10.3 tags: [linux, macos, windows, data-stores] @@ -1182,7 +1237,7 @@ input: description: | This PostgreSQL Extensible input plugin provides metrics for your Postgres database. It has been designed to parse SQL queries in the plugin section of `telegraf.conf` files. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/postgresql_extensible + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/postgresql_extensible introduced: 0.12.0 tags: [linux, macos, windows, data-stores] @@ -1190,7 +1245,7 @@ input: id: powerdns description: | The PowerDNS input plugin gathers metrics about PowerDNS using UNIX sockets. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/powerdns/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/powerdns/README.md introduced: 0.10.2 tags: [linux, macos, windows, networking, web] @@ -1198,7 +1253,7 @@ input: id: powerdns_recursor description: | The PowerDNS Recursor input plugin gathers metrics about PowerDNS Recursor using UNIX sockets. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/powerdns_recursor/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/powerdns_recursor/README.md introduced: 1.11.0 tags: [linux, macos, windows, networking, web] @@ -1209,7 +1264,7 @@ input: and groups them by status (zombie, sleeping, running, etc.). On Linux, this plugin requires access to `procfs` (`/proc`); on other operating systems, it requires access to execute `ps`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/processes/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/processes/README.md introduced: 0.11.0 tags: [linux, macos, windows, systems] @@ -1229,7 +1284,7 @@ input: The Procstat input plugin will tag processes according to how they are specified in the configuration. If a pid file is used, a "pidfile" tag will be generated. On the other hand, if an executable is used an "exe" tag will be generated. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/procstat/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/procstat/README.md introduced: 0.2.0 tags: [linux, macos, windows, systems] @@ -1238,7 +1293,7 @@ input: description: | The Prometheus Format input plugin input plugin gathers metrics from HTTP servers exposing metrics in Prometheus format. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/prometheus/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/prometheus/README.md introduced: 0.2.1 tags: [linux, macos, windows, applications] @@ -1248,7 +1303,7 @@ input: The Puppet Agent input plugin collects variables outputted from the `last_run_summary.yaml` file usually located in `/var/lib/puppet/state/` Puppet Agent Runs. For more information, see [Puppet Monitoring: How to Monitor the Success or Failure of Puppet Runs](https://puppet.com/blog/puppet-monitoring-how-to-monitor-success-or-failure-of-puppet-runs) - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/puppetagent + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/puppetagent introduced: 0.2.0 tags: [linux, macos, windows, build-deploy] @@ -1257,7 +1312,7 @@ input: description: | The RabbitMQ input plugin reads metrics from RabbitMQ servers via the [Management Plugin](https://www.rabbitmq.com/management.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/rabbitmq/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/rabbitmq/README.md introduced: 0.1.5 tags: [linux, macos, windows, messaging] @@ -1267,7 +1322,7 @@ input: The Raindrops Middleware input plugin reads from the specified [Raindrops middleware](http://raindrops.bogomips.org/Raindrops/Middleware.html) URI and adds the statistics to InfluxDB. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/raindrops/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/raindrops/README.md introduced: 0.10.3 tags: [linux, macos, windows, servers, web] @@ -1280,7 +1335,7 @@ input: Additionally the plugin also calculates the hit/miss ratio (`keyspace_hitrate`) and the elapsed time since the last RDB save (`rdb_last_save_time_elapsed`). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/redis/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/redis/README.md introduced: 0.1.1 tags: [linux, macos, windows, data-stores] @@ -1289,7 +1344,7 @@ input: description: | The RethinkDB input plugin works with RethinkDB 2.3.5+ databases that requires username, password authorization, and Handshake protocol v1.0. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/rethinkdb + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/rethinkdb introduced: 0.1.3 tags: [linux, macos, windows, data-stores] @@ -1297,7 +1352,7 @@ input: id: riak description: | The Riak input plugin gathers metrics from one or more Riak instances. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/riak/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/riak/README.md introduced: 0.10.4 tags: [linux, macos, windows, data-stores] @@ -1307,7 +1362,7 @@ input: The Salesforce input plugin gathers metrics about the limits in your Salesforce organization and the remaining usage. It fetches its data from the limits endpoint of the Salesforce REST API. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/salesforce/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/salesforce/README.md introduced: 1.4.0 tags: [linux, macos, windows, applications, cloud] @@ -1316,7 +1371,7 @@ input: description: | The Sensors input plugin collects collects sensor metrics with the sensors executable from the `lm-sensor` package. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/sensors/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/sensors/README.md introduced: 0.10.1 tags: [linux, macos, windows, iot] @@ -1330,7 +1385,7 @@ input: The plugin detects and reports on various indicators of drive reliability, with the intent of enabling the anticipation of hardware failures. See [smartmontools](https://www.smartmontools.org/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/smart/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/smart/README.md introduced: 1.5.0 tags: [linux, macos, windows, systems] @@ -1338,7 +1393,7 @@ input: id: snmp description: | The SNMP input plugin gathers metrics from SNMP agents. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/snmp/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/snmp/README.md introduced: 0.10.1 tags: [linux, macos, windows, networking] @@ -1346,8 +1401,8 @@ input: id: snmp_legacy description: | The SNMP Legacy input plugin gathers metrics from SNMP agents. - *Deprecated in Telegraf 1.0.0. Use the [SNMP input plugin](#snmp).* - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/snmp_legacy/README.md + _Deprecated in Telegraf 1.0.0. Use the [SNMP input plugin](#snmp)._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/snmp_legacy/README.md introduced: 0.10.1 deprecated: 1.0.0 tags: [linux, macos, windows, networking] @@ -1358,7 +1413,7 @@ input: The Socket Listener input plugin listens for messages from streaming (TCP, UNIX) or datagram (UDP, unixgram) protocols. Messages are expected in the [Telegraf Input Data Formats](https://docs.influxdata.com/telegraf/latest/data_formats/input/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/socket_listener/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/socket_listener/README.md introduced: 1.3.0 tags: [linux, macos, windows, networking] @@ -1370,7 +1425,7 @@ input: > This plugin accesses APIs that are [chargeable](https://cloud.google.com/stackdriver/pricing#monitoring-costs). > You may incur costs. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/stackdriver/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/stackdriver/README.md introduced: 1.10.0 tags: [linux, macos, windows, cloud] @@ -1381,7 +1436,7 @@ input: `statsd` listener service while Telegraf is running. StatsD messages are formatted as described in the original [etsy statsd](https://github.com/etsy/statsd/blob/master/docs/metric_types.md) implementation. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/statsd/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/statsd/README.md introduced: 0.2.0 tags: [linux, macos, windows, applications] @@ -1394,7 +1449,7 @@ input: For more information about Linux swap spaces, see [All about Linux swap space](https://www.linux.com/news/all-about-linux-swap-space) - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/swap/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/swap/README.md introduced: 1.7.0 tags: [linux, macos, systems] @@ -1404,7 +1459,7 @@ input: The Syslog input plugin listens for syslog messages transmitted over [UDP](https://tools.ietf.org/html/rfc5426) or [TCP](https://tools.ietf.org/html/rfc5425). Syslog messages should be formatted according to [RFC 5424](https://tools.ietf.org/html/rfc5424). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/syslog/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/syslog/README.md introduced: 1.7.0 tags: [linux, macos, windows, logging, systems] @@ -1414,7 +1469,7 @@ input: The Sysstat input plugin collects [sysstat](https://github.com/sysstat/sysstat) system metrics with the sysstat collector utility `sadc` and parses the created binary data file with the `sadf` utility. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/sysstat + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/sysstat introduced: 0.12.1 tags: [linux, macos, windows, systems] @@ -1423,7 +1478,7 @@ input: description: | The System input plugin gathers general stats on system load, uptime, and number of users logged in. It is basically equivalent to the UNIX `uptime` command. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/system/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/system/README.md introduced: 0.1.6 tags: [linux, macos, windows, systems] @@ -1431,15 +1486,15 @@ input: id: tail description: | The Tail input plugin "tails" a log file and parses each log message. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/tail/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tail/README.md introduced: 1.1.2 tags: [linux, macos, windows, logging] - name: TCP Listener id: tcp_listener description: | - *Deprecated in Telegraf 1.3.0. Use the [Socket Listener input plugin](#socket_listener).* - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/tcp_listener/README.md + _Deprecated in Telegraf 1.3.0. Use the [Socket Listener input plugin](#socket_listener)._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tcp_listener/README.md introduced: 0.11.0 deprecated: 1.3.0 tags: [linux, macos, windows, networking, web] @@ -1449,7 +1504,7 @@ input: description: | The Teamspeak 3 input plugin uses the Teamspeak 3 ServerQuery interface of the Teamspeak server to collect statistics of one or more virtual servers. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/teamspeak/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/teamspeak/README.md introduced: 1.5.0 tags: [linux, macos, windows, applications, gaming] @@ -1458,7 +1513,7 @@ input: description: | The Telegraf v1.x input plugin collects metrics about the Telegraf v1.x agent itself. Note that some metrics are aggregates across all instances of one type of plugin. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/internal/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/internal/README.md introduced: 1.2.0 tags: [linux, macos, windows, applications] @@ -1466,7 +1521,7 @@ input: id: temp description: | The Temp input plugin collects temperature data from sensors. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/temp/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/temp/README.md introduced: 1.8.0 tags: [linux, macos, windows, iot] @@ -1476,7 +1531,7 @@ input: The Tengine Web Server input plugin gathers status metrics from the [Tengine Web Server](http://tengine.taobao.org/) using the [Reqstat module](http://tengine.taobao.org/document/http_reqstat.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/tengine/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/tengine/README.md introduced: 1.8.0 tags: [linux, macos, windows, servers, web] @@ -1484,7 +1539,7 @@ input: id: trig description: | The Trig input plugin inserts sine and cosine waves for demonstration purposes. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/trig + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/trig introduced: 0.3.0 tags: [linux, macos, windows] @@ -1494,15 +1549,15 @@ input: The Twemproxy input plugin gathers data from Twemproxy instances, processes Twemproxy server statistics, processes pool data, and processes backend server (Redis/Memcached) statistics. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/twemproxy + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/twemproxy introduced: 0.3.0 tags: [linux, macos, windows, servers, web] - name: UDP Listener id: udp_listener description: | - *Deprecated in Telegraf 1.3.0. use the [Socket Listener input plugin](#socket_listener).* - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/udp_listener/README.md + _Deprecated in Telegraf 1.3.0. use the [Socket Listener input plugin](#socket_listener)._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/udp_listener/README.md introduced: 0.11.0 deprecated: 1.3.0 tags: [linux, macos, windows, networking] @@ -1512,15 +1567,23 @@ input: description: | The Unbound input plugin gathers statistics from [Unbound](https://www.unbound.net/), a validating, recursive, and caching DNS resolver. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/unbound/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/unbound/README.md introduced: 1.5.0 tags: [linux, macos, windows, networking] + - name: uWSGI + id: uwsgi + description: | + The uWSGI input plugin gathers metrics about uWSGI using the [uWSGI Stats Server](https://uwsgi-docs.readthedocs.io/en/latest/StatsServer.html). + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/uwsgi/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, cloud] + - name: Varnish id: varnish description: | The Varnish input plugin gathers stats from [Varnish HTTP Cache](https://varnish-cache.org/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/varnish/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/varnish/README.md introduced: 0.13.1 tags: [linux, macos, windows, networking] @@ -1530,8 +1593,8 @@ input: The VMware vSphere input plugin uses the vSphere API to gather metrics from multiple vCenter servers (clusters, hosts, VMs, and data stores). For more information on the available performance metrics, see - [Common vSphere Performance Metrics](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/vsphere/METRICS.md). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/vsphere/README.md + [Common vSphere Performance Metrics](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/vsphere/METRICS.md). + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/vsphere/README.md introduced: 1.8.0 tags: [linux, macos, windows, containers] @@ -1541,17 +1604,17 @@ input: The Webhooks input plugin starts an HTTPS server and registers multiple webhook listeners. #### Available webhooks - - [Filestack](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/filestack/README.md) - - [GitHub](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/github/README.md) - - [Mandrill](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/mandrill/README.md) - - [Papertrail](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/papertrail/README.md) - - [Particle.io](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/particle/README.md) - - [Rollbar](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/rollbar) + - [Filestack](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/filestack/README.md) + - [GitHub](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/github/README.md) + - [Mandrill](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/mandrill/README.md) + - [Papertrail](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/papertrail/README.md) + - [Particle.io](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/particle/README.md) + - [Rollbar](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/rollbar) #### Add new webhooks If you need a webhook that is not supported, consider - [adding a new webhook](https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks#adding-new-webhooks-plugin). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/webhooks/README.md + [adding a new webhook](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks#adding-new-webhooks-plugin). + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/webhooks/README.md introduced: 1.0.0 tags: [linux, macos, windows, applications, web] @@ -1560,7 +1623,7 @@ input: description: | The Windows Performance Counters input plugin reads Performance Counters on the Windows operating sytem. **Windows only**. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/win_perf_counters/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/win_perf_counters/README.md introduced: 0.10.2 tags: [windows, systems] @@ -1568,7 +1631,7 @@ input: id: win_services description: | The Windows Services input plugin reports Windows services info. **Windows only**. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/win_services/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/win_services/README.md introduced: 1.4.0 tags: [windows, servers, systems] @@ -1577,7 +1640,7 @@ input: description: | The Wireless input plugin gathers metrics about wireless link quality by reading the `/proc/net/wireless` file. **This plugin currently supports Linux only**. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/wireless/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/wireless/README.md introduced: 1.9.0 tags: [linux, networking] @@ -1586,7 +1649,7 @@ input: description: | The X.509 Certificate input plugin provides information about X.509 certificate accessible using the local file or network connection. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/x509_cert/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/x509_cert/README.md introduced: 1.8.0 tags: [linux, macos, windows, networking] @@ -1598,7 +1661,7 @@ input: The ZFS input plugin provides metrics from your ZFS filesystems. It supports ZFS on Linux and FreeBSD. It gets ZFS statistics from `/proc/spl/kstat/zfs` on Linux and from `sysctl` and `zpool` on FreeBSD. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/inputs/zfs/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/inputs/zfs/README.md introduced: 0.2.1 tags: [linux, macos, windows, systems] @@ -1614,7 +1677,7 @@ output: id: cloudwatch description: | The Amazon CloudWatch output plugin send metrics to Amazon CloudWatch. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/cloudwatch/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/cloudwatch/README.md introduced: 0.10.1 tags: [linux, macos, windows, cloud] @@ -1625,7 +1688,7 @@ output: in the early stages of development. It will batch up all of the points into one `PUT` request to Kinesis. This should save the number of API requests by a considerable level. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/kinesis/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/kinesis/README.md introduced: 0.2.5 tags: [linux, macos, windows, cloud, messaging] @@ -1639,7 +1702,7 @@ output: If the point value being sent cannot be converted to a float64 value, the metric is skipped. Metrics are grouped by converting any `_` characters to `.` in the Point Name. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/amon/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/amon/README.md introduced: 0.2.1 tags: [linux, macos, windows, databases] @@ -1651,7 +1714,7 @@ output: Metrics are written to a topic exchange using `tag`, defined in configuration file as `RoutingTag`, as a routing key. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/amqp/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/amqp/README.md introduced: 0.1.9 tags: [linux, macos, windows, messaging] @@ -1660,7 +1723,7 @@ output: description: | The Apache Kafka output plugin writes to a [Kafka Broker](http://kafka.apache.org/07/quickstart.html) acting a Kafka Producer. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/kafka/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/kafka/README.md introduced: 0.1.7 tags: [linux, macos, windows, messaging] @@ -1669,7 +1732,7 @@ output: description: | The CrateDB output plugin writes to [CrateDB](https://crate.io/), a real-time SQL database for machine data and IoT, using its [PostgreSQL protocol](https://crate.io/docs/crate/reference/protocols/postgres.html). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/cratedb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/cratedb/README.md introduced: 1.5.0 tags: [linux, macos, windows, data-stores] @@ -1679,7 +1742,7 @@ output: The Datadog output plugin writes to the [Datadog Metrics API](http://docs.datadoghq.com/api/#metrics) and requires an `apikey` which can be obtained [here](https://app.datadoghq.com/account/settings#api) for the account. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/datadog/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/datadog/README.md introduced: 0.1.6 tags: [linux, macos, windows, applications, cloud] @@ -1688,7 +1751,7 @@ output: description: | The Discard output plugin simply drops all metrics that are sent to it. It is only meant to be used for testing purposes. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/discard/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/discard/README.md introduced: 1.2.0 tags: [linux, macos, windows] @@ -1698,15 +1761,23 @@ output: The Elasticsearch output plugin writes to Elasticsearch via HTTP using [Elastic](http://olivere.github.io/elastic/). Currently it only supports Elasticsearch 5.x series. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/elasticsearch/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/elasticsearch/README.md introduced: 0.1.5 tags: [linux, macos, windows, data-stores] + - name: Exec + id: exec + description: | + The Exec output plugin sends Telegraf metrics to an external application over `stdin`. + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/exec/README.md + introduced: 1.12.0 + tags: [linux, macos, windows, systems] + - name: File id: file description: | The File output plugin writes Telegraf metrics to files. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/file/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/file/README.md introduced: 0.10.3 tags: [linux, macos, windows, systems] @@ -1715,7 +1786,7 @@ output: description: | The Google PubSub output plugin publishes metrics to a [Google Cloud PubSub](https://cloud.google.com/pubsub) topic as one of the supported [output data formats](https://docs.influxdata.com/telegraf/latest/data_formats/output). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/cloud_pubsub/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/cloud_pubsub/README.md introduced: 1.10.0 tags: [linux, macos, windows, messaging, cloud] @@ -1723,7 +1794,7 @@ output: id: graphite description: | The Graphite output plugin writes to [Graphite](http://graphite.readthedocs.org/en/latest/index.html) via raw TCP. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/graphite/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/graphite/README.md introduced: 0.10.1 tags: [linux, macos, windows, data-stores] @@ -1731,7 +1802,7 @@ output: id: graylog description: | The Graylog output plugin writes to a Graylog instance using the `gelf` format. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/graylog/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/graylog/README.md introduced: 1.0.0 tags: [linux, macos, windows, logging] @@ -1740,18 +1811,16 @@ output: description: | The HTTP output plugin sends metrics in a HTTP message encoded using one of the output data formats. For `data_formats` that support batching, metrics are sent in batch format. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/http/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/http/README.md introduced: 1.7.0 tags: [linux, macos, windows, applications] - name: Health id: health description: | - The health output plugin provides an HTTP health check resource that can be configured - to return a failure status code based on the value of a metric. - When the plugin is healthy it returns a 200 response; when unhealthy it returns a 503 response. - The default state is healthy. One or more checks must fail in order for the resource to enter the failed state. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/health/README.md + The health plugin provides a HTTP health check resource that can be configured to return a failure status code based on the value of a metric. + When the plugin is healthy it will return a 200 response; when unhealthy it will return a 503 response. The default state is healthy, one or more checks must fail in order for the resource to enter the failed state. + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/health/README.md introduced: 1.11.0 tags: [linux, macos, windows, applications] @@ -1759,7 +1828,7 @@ output: id: influxdb description: | The InfluxDB v1.x output plugin writes to InfluxDB using HTTP or UDP. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/influxdb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/influxdb/README.md introduced: 0.1.1 tags: [linux, macos, windows, data-stores] @@ -1767,7 +1836,7 @@ output: id: influxdb_v2 description: | The InfluxDB v2 output plugin writes metrics to [InfluxDB 2.0](https://github.com/influxdata/influxdb). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/influxdb_v2/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/influxdb_v2/README.md introduced: 1.8.0 tags: [linux, macos, windows, data-stores] @@ -1781,7 +1850,7 @@ output: difference being that the type of stat (gauge, increment) is the first token, separated from the metric itself by whitespace. The increment type is only used if the metric comes in as a counter through `[[inputs.statsd]]`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/instrumental/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/instrumental/README.md introduced: 0.13.1 tags: [linux, macos, windows, applications] @@ -1791,7 +1860,7 @@ output: The Librato output plugin writes to the [Librato Metrics API](http://dev.librato.com/v1/metrics#metrics) and requires an `api_user` and `api_token` which can be obtained [here](https://metrics.librato.com/account/api_tokens) for the account. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/librato/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/librato/README.md introduced: 0.2.0 tags: [linux, macos, windows, cloud] @@ -1800,7 +1869,7 @@ output: description: | The Microsoft Azure Application Insights output plugin writes Telegraf metrics to [Application Insights (Microsoft Azure)](https://azure.microsoft.com/en-us/services/application-insights/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/application_insights/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/application_insights/README.md introduced: 1.7.0 tags: [linux, macos, windows, cloud, applications] @@ -1824,7 +1893,7 @@ output: as the Azure Monitor metric name. All field values are written as a summarized set that includes `min`, `max`, `sum`, and `count`. Tags are written as a dimension on each Azure Monitor metric. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/azure_monitor/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/azure_monitor/README.md introduced: 1.8.0 tags: [linux, macos, windows, cloud] @@ -1833,7 +1902,7 @@ output: description: | The MQTT Producer output plugin writes to the MQTT server using [supported output data formats](https://docs.influxdata.com/telegraf/latest/data_formats/output/). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/mqtt/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/mqtt/README.md introduced: 0.2.0 tags: [linux, macos, windows, messaging] @@ -1841,7 +1910,7 @@ output: id: nats description: | The NATS Output output plugin writes to a (list of) specified NATS instance(s). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/nats/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/nats/README.md introduced: 1.1.0 tags: [linux, macos, windows, messaging] @@ -1850,7 +1919,7 @@ output: description: | The NSQ output plugin writes to a specified NSQD instance, usually local to the producer. It requires a server name and a topic name. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/nsq/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/nsq/README.md introduced: 0.2.1 tags: [linux, macos, windows, messaging] @@ -1863,7 +1932,7 @@ output: To use HTTP mode, set `useHttp` to true in config. You can also control how many metrics are sent in each HTTP request by setting `batchSize` in config. See the [OpenTSDB documentation](http://opentsdb.net/docs/build/html/api_http/put.html) for details. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/opentsdb/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/opentsdb/README.md introduced: 0.1.9 tags: [linux, macos, windows, data-stores] @@ -1872,7 +1941,7 @@ output: description: | The Prometheus Client output plugin starts a [Prometheus](https://prometheus.io/) Client, it exposes all metrics on `/metrics` (default) to be polled by a Prometheus server. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/prometheus_client/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/prometheus_client/README.md introduced: 0.2.1 tags: [linux, macos, windows, applications, data-stores] @@ -1880,7 +1949,7 @@ output: id: riemann description: | The Riemann output plugin writes to [Riemann](http://riemann.io/) using TCP or UDP. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/riemann/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/riemann/README.md introduced: 1.3.0 tags: [linux, macos, windows, networking, systems] @@ -1889,7 +1958,7 @@ output: description: | The Riemann Legacy output plugin will be deprecated in a future release, see [#1878](https://github.com/influxdata/telegraf/issues/1878) for more details & discussion. - link: https://github.com/influxdata/telegraf/tree/release-1.11/plugins/outputs/riemann_legacy + link: https://github.com/influxdata/telegraf/tree/master/plugins/outputs/riemann_legacy introduced: 0.2.3 deprecated: 1.3.0 tags: [linux, macos, windows, applications] @@ -1899,7 +1968,7 @@ output: description: | The Socket Writer output plugin writes to a UDP, TCP, or UNIX socket. It can output data in any of the [supported output formats](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md). - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/socket_writer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/socket_writer/README.md introduced: 1.3.0 tags: [linux, macos, windows, networking] @@ -1915,17 +1984,16 @@ output: Metrics are grouped by the `namespace` variable and metric key, for example `custom.googleapis.com/telegraf/system/load5`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/stackdriver/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/stackdriver/README.md introduced: 1.9.0 tags: [linux, macos, windows, cloud] - name: Syslog id: syslog description: | - The syslog output plugin sends syslog messages transmitted over UDP or TCP or TLS, - with or without the octet counting framing. + The syslog output plugin sends syslog messages transmitted over UDP or TCP or TLS, with or without the octet counting framing. Syslog messages are formatted according to RFC 5424. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/syslog/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/syslog/README.md introduced: 1.11.0 tags: [linux, macos, windows, logging] @@ -1933,7 +2001,7 @@ output: id: wavefront description: | The Wavefront output plugin writes to a Wavefront proxy, in Wavefront data format over TCP. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/outputs/wavefront/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/outputs/wavefront/README.md introduced: 1.5.0 tags: [linux, macos, windows, applications, cloud] @@ -1950,7 +2018,7 @@ aggregator: description: | The BasicStats aggregator plugin gives `count`, `max`, `min`, `mean`, `s2`(variance), and `stdev` for a set of values, emitting the aggregate every period seconds. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/aggregators/basicstats/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/aggregators/basicstats/README.md introduced: 1.5.0 tags: [linux, macos, windows] @@ -1960,9 +2028,8 @@ aggregator: The final aggregator emits the last metric of a contiguous series. A contiguous series is defined as a series which receives updates within the time period in series_timeout. The contiguous series may be longer than the time interval defined by period. - This is useful for getting the final value for data sources that produce discrete time series, - such as procstat, cgroup, kubernetes, etc. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/aggregators/final/README.md + This is useful for getting the final value for data sources that produce discrete time series, such as procstat, cgroup, kubernetes, etc. + link: https://github.com/influxdata/telegraf/blob/master/plugins/aggregators/final/README.md introduced: 1.11.0 tags: [linux, macos, windows] @@ -1978,7 +2045,7 @@ aggregator: Like other Telegraf aggregator plugins, the metric is emitted every period seconds. Bucket counts, however, are not reset between periods and will be non-strictly increasing while Telegraf is running. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/aggregators/histogram/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/aggregators/histogram/README.md introduced: 1.4.0 tags: [linux, macos, windows] @@ -1987,7 +2054,7 @@ aggregator: description: | The MinMax aggregator plugin aggregates `min` and `max` values of each field it sees, emitting the aggregrate every period seconds. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/aggregators/minmax/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/aggregators/minmax/README.md introduced: 1.1.0 tags: [linux, macos, windows] @@ -2007,7 +2074,7 @@ aggregator: ValueCounter only works on fields of the type `int`, `bool`, or `string`. Float fields are being dropped to prevent the creating of too many fields. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/aggregators/valuecounter/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/aggregators/valuecounter/README.md introduced: 1.8.0 tags: [linux, macos, windows] @@ -2025,10 +2092,18 @@ processor: The Converter processor plugin is used to change the type of tag or field values. In addition to changing field types, it can convert between fields and tags. Values that cannot be converted are dropped. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/converter/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/converter/README.md introduced: 1.7.0 tags: [linux, macos, windows] + - name: Date + id: date + description: | + The Date processor plugin adds the metric timestamp as a human readable tag. + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/date/README.md + introduced: 1.12.0 + tags: [linux, macos, windows] + - name: Enum id: enum description: | @@ -2040,7 +2115,7 @@ processor: not contained in the value_mappings. The processor supports explicit configuration of a destination field. By default the source field is overwritten. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/enum/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/enum/README.md introduced: 1.8.0 tags: [linux, macos, windows] @@ -2063,7 +2138,7 @@ processor: Use case of this plugin encompass ensuring certain tags or naming conventions are adhered to irrespective of input plugin configurations, e.g., by `taginclude`. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/override/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/override/README.md introduced: 1.6.0 tags: [linux, macos, windows] @@ -2072,15 +2147,27 @@ processor: description: | The Parser processor plugin parses defined fields containing the specified data format and creates new metrics based on the contents of the field. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/parser/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/parser/README.md introduced: 1.8.0 tags: [linux, macos, windows] + - name: Pivot + id: pivot + description: | + The Pivot processor plugin rotates single-valued metrics into a multi-field metric. + This transformation often results in data that is easier to use with mathematical operators and comparisons. + It also flattens data into a more compact representation for write operations with some output data formats. + + _To perform the reverse operation use the [Unpivot](#unpivot) processor._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/pivot/README.md + introduced: 1.12.0 + tags: [linux, macos, windows] + - name: Printer id: printer description: | The Printer processor plugin simply prints every metric passing through it. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/printer/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/printer/README.md introduced: 1.1.0 tags: [linux, macos, windows] @@ -2089,7 +2176,7 @@ processor: description: | The Regex processor plugin transforms tag and field values using a regular expression (regex) pattern. If `result_key `parameter is present, it can produce new tags and fields from existing ones. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/regex/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/regex/README.md introduced: 1.7.0 tags: [linux, macos, windows] @@ -2097,7 +2184,7 @@ processor: id: rename description: | The Rename processor plugin renames InfluxDB measurements, fields, and tags. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/rename/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/rename/README.md introduced: 1.8.0 tags: [linux, macos, windows] @@ -2122,10 +2209,23 @@ processor: You can specify the `measurement`, `tag` or `field` that you want processed in each section and optionally a `dest` if you want the result stored in a new tag or field. You can specify lots of transformations on data with a single strings processor. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/strings/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/strings/README.md introduced: 1.8.0 tags: [linux, macos, windows] + - name: Tag Limit + id: tag_limit + description: | + The Tag Limit processor plugin preserves only a certain number of tags for any given metric + and chooses the tags to preserve when the number of tags appended by the data source is over the limit. + + This can be useful when dealing with output systems (e.g. Stackdriver) that impose + hard limits on the number of tags or labels per metric or where high levels of + cardinality are computationally or financially expensive. + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/tag_limit/README.md + introduced: 1.12.0 + tags: [linux, macos, windows] + - name: TopK id: topk description: | @@ -2143,6 +2243,17 @@ processor: Note that depending on the amount of metrics on each computed bucket, more than `K` metrics may be returned. - link: https://github.com/influxdata/telegraf/blob/release-1.11/plugins/processors/topk/README.md + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/topk/README.md introduced: 1.7.0 tags: [linux, macos, windows] + + - name: Unpivot + id: unpivot + description: | + The Unpivot processor plugin rotates a multi-field series into single-valued metrics. + This transformation often results in data that is easier to aggregate across fields. + + _To perform the reverse operation use the [Pivot](#pivot) processor._ + link: https://github.com/influxdata/telegraf/blob/master/plugins/processors/unpivot/README.md + introduced: 1.12.0 + tags: [linux, macos, windows] diff --git a/data/versions.yaml b/data/versions.yaml index ac8819176..74d5f45a4 100644 --- a/data/versions.yaml +++ b/data/versions.yaml @@ -1,2 +1,2 @@ stable_version: v2.0 -telegraf_version: 1.11.0 +telegraf_version: 1.12.0 From d4a568163dd16504a6a70a9442618ff715ed4558 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 3 Sep 2019 11:07:14 -0700 Subject: [PATCH 084/258] add notification-endpoints.md --- .../monitor-alert/notification-endpoints.md | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/notification-endpoints.md diff --git a/content/v2.0/cloud/monitor-alert/notification-endpoints.md b/content/v2.0/cloud/monitor-alert/notification-endpoints.md new file mode 100644 index 000000000..334e4a914 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-endpoints.md @@ -0,0 +1,80 @@ +--- +title: Create notification endpoints +description: > + Create notification endpoints to receive alerts on your time series data. + +weight: 101 +v2.0/tags: [monitor, checks] +menu: + v2_0: + name: Create notification endpoints + parent: Monitor and alert +related: + - /v2.0/monitor-alert/create-notification-rules/ + - /v2.0/monitor-alert/create-notification-endpoints/ +--- + +To receive notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . + +## Create a notification endpoint in the UI + +1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. +2. In the **Name** and **Description** fields, enter a name and description for the endpoint (description used on History page? anywhere else?). +3. From the **Destination** drop-down list, select a destination to send notifications: + - (Free plan) HTTP server + - (Pay as You Go plan) HTTP server, Slack, or PagerDuty +4. Enter the **URL** to notify, and then enter connection information: + + - For HTTP: + + a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} + + b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. + + c. In the **Content Template** field, enter {examples for each endpoint template}. + + - For Slack, enter your Slack authentication token in the **Token** field. + - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. + +5. Click **Create Notification Endpoint**. + +##### Example creating a Slack notification endpoint in line protocol + +```js +// To create the endpoint, run the following command with your secret key and Slack authorization token. + +vault kv put secret/111ab11111111111 SLACK_TOKEN=AABBCCDEEEeee + +Key Value +--- ----- +created_time 2019-08-28T18:39:06.766942315Z +deletion_time n/a +destroyed false +version 2 + +// To test your Slack notification endpoint, run the following command. + +curl http://localhost:9999/api/v2/query\?org\=my-org -XPOST -sS -H 'Authorization: Token my-token' -H 'accept:application/csv' -H 'content-type:application/vnd.flux' -d 'import "influxdata/influxdb/secrets" import "generate" x = secrets.get(key:"SLACK_TOKEN") from(bucket: "my-bucket") |> range(start: -5h) |> set(key:"secret", value: x) ' + +,result,table,_start,_stop,_time,_value,_field,_measurement,k,secret +,_result,0,2019-08-28T13:39:09.820375497Z,2019-08-28T18:39:09.820375497Z,2019-08-28T17:07:03Z,18739,v,m,v,AABBCCDEEEeee +``` + +##### Example creating a PagerDuty notification endpoint in line protocol + +```js +// To create the endpoint, run the following command with your authorization routing key. + +Enter example here...detail from v1 docs: +Routing Key: GUID of your PagerDuty Events API V2 integration, listed as “Integration Key”. +See Create a new service in the PagerDuty documentation details on getting an “Integration Key” (routing_key). +PagerDuty URL: URL used to POST a JSON body representing the event. This value should not be changed. Valid value is https://events.pagerduty.com/v2/enqueue. +metrics available for integration; api keys and application keys currently in use by organization + +// To test your PagerDuty notification endpoint, run the following command. + +See the PagerDuty Events API V2 Overview for details on the PagerDuty Events API and recognized event types (trigger, acknowledge, and resolve). + +```js +from(bucket: alertBucket) |> [conditions here] |> toPagerDuty() +``` \ No newline at end of file From 8250b6e260625f7c25cfac9276c105495aae7eed Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 3 Sep 2019 11:08:11 -0700 Subject: [PATCH 085/258] change check tag to notification endpoint --- content/v2.0/cloud/monitor-alert/notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-endpoints.md b/content/v2.0/cloud/monitor-alert/notification-endpoints.md index 334e4a914..e115e1782 100644 --- a/content/v2.0/cloud/monitor-alert/notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/notification-endpoints.md @@ -4,7 +4,7 @@ description: > Create notification endpoints to receive alerts on your time series data. weight: 101 -v2.0/tags: [monitor, checks] +v2.0/tags: [monitor, notification endpoints] menu: v2_0: name: Create notification endpoints From 81780e5714bd86c5486154d45144c8b90bad7d91 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 3 Sep 2019 12:17:12 -0600 Subject: [PATCH 086/258] fixed description of date package --- content/v2.0/reference/flux/functions/date/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/flux/functions/date/_index.md b/content/v2.0/reference/flux/functions/date/_index.md index adc7cb9b5..14d49900d 100644 --- a/content/v2.0/reference/flux/functions/date/_index.md +++ b/content/v2.0/reference/flux/functions/date/_index.md @@ -2,8 +2,8 @@ title: Flux date package list_title: Date package description: > - The Flux math package provides basic constants and mathematical functions. - Import the `math` package. + The Flux date package provides date and time constants and functions. + Import the `date` package. aliases: - /v2.0/reference/flux/language/built-ins/time-constants/ menu: From 4ebe98de16b2b5185bc770174b9f111759c1c830 Mon Sep 17 00:00:00 2001 From: Nora Date: Tue, 3 Sep 2019 13:44:41 -0700 Subject: [PATCH 087/258] Create notification-rules doc --- .../cloud/monitor-alert/notification-rules.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules.md new file mode 100644 index 000000000..9588a8770 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-rules.md @@ -0,0 +1,38 @@ +--- +title: Create notification rules +description: > + Create notification rules to receive alerts on your time series data. + +weight: 101 +v2.0/tags: [monitor, notification rules] +menu: + v2_0: + name: Create notification rules + parent: Monitor and alert +related: + - /v2.0/monitor-alert/create-notification-endpoints/ +--- + +To receive notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . + +## Create a notification rule in the UI + +1. On the **Monitoring and Alerting** page, next to **Notification Rules**, click **Create**. +2. In the **Name** and **Description** fields, enter a name and description for the endpoint (description used on History page? anywhere else?). +3. From the **Destination** drop-down list, select a destination to send notifications: + - (Free plan) HTTP server + - (Pay as You Go plan) HTTP server, Slack, or PagerDuty +4. Enter the **URL** to notify, and then enter connection information: + + - For HTTP: + + a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} + + b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. + + c. In the **Content Template** field, enter {examples for each endpoint template}. + + - For Slack, enter your Slack authentication token in the **Token** field. + - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. + +5. Click **Create Notification Endpoint**. From 8bb7c763ef21948223a06a1cd59e4835b50845a6 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 3 Sep 2019 15:13:17 -0700 Subject: [PATCH 088/258] add edits from Scott --- content/v2.0/cloud/monitor-alert/_index.md | 10 ++--- .../monitor-alert/notification-endpoints.md | 42 +++++++------------ 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/_index.md b/content/v2.0/cloud/monitor-alert/_index.md index 256bf725e..414f9481b 100644 --- a/content/v2.0/cloud/monitor-alert/_index.md +++ b/content/v2.0/cloud/monitor-alert/_index.md @@ -1,15 +1,15 @@ --- -title: Monitor data and receive alerts -seotitle: Monitor data and receive alerts in InfluxDB Cloud +title: Monitor data and send alerts +seotitle: Monitor data and send alerts description: > - Monitor and receive alerts on your time series data by creating checks, notification rules, and notification endpoints. + Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. menu: v2_0: name: Monitor and alert weight: 3 -v2.0/tags: [monitor, alert, checks, notification rules, notification endpoints] +v2.0/tags: [monitor, alert, checks, notification, endpoints] --- -Monitor and receive alerts on your time series data by creating checks, notification rules, and notification endpoints. +Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. {{< children >}} diff --git a/content/v2.0/cloud/monitor-alert/notification-endpoints.md b/content/v2.0/cloud/monitor-alert/notification-endpoints.md index e115e1782..1fb5b6632 100644 --- a/content/v2.0/cloud/monitor-alert/notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/notification-endpoints.md @@ -1,28 +1,27 @@ --- title: Create notification endpoints description: > - Create notification endpoints to receive alerts on your time series data. + Create notification endpoints to send alerts on your time series data. weight: 101 -v2.0/tags: [monitor, notification endpoints] +v2.0/tags: [monitor, notifications, endpoints] menu: v2_0: - name: Create notification endpoints parent: Monitor and alert related: - /v2.0/monitor-alert/create-notification-rules/ - /v2.0/monitor-alert/create-notification-endpoints/ --- -To receive notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . +To send notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . ## Create a notification endpoint in the UI 1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. -2. In the **Name** and **Description** fields, enter a name and description for the endpoint (description used on History page? anywhere else?). -3. From the **Destination** drop-down list, select a destination to send notifications: - - (Free plan) HTTP server - - (Pay as You Go plan) HTTP server, Slack, or PagerDuty +2. In the **Name** and **Description** fields, enter a name and description for the endpoint. +3. From the **Destination** drop-down list, select a destination endpoint to send notifications: + - (Free plan) HTTP + - (Pay as You Go plan) HTTP, Slack, or PagerDuty 4. Enter the **URL** to notify, and then enter connection information: - For HTTP: @@ -43,38 +42,25 @@ To receive notifications about changes in your data, start by setting up a notif ```js // To create the endpoint, run the following command with your secret key and Slack authorization token. -vault kv put secret/111ab11111111111 SLACK_TOKEN=AABBCCDEEEeee - -Key Value ---- ----- -created_time 2019-08-28T18:39:06.766942315Z -deletion_time n/a -destroyed false -version 2 +TBD // To test your Slack notification endpoint, run the following command. -curl http://localhost:9999/api/v2/query\?org\=my-org -XPOST -sS -H 'Authorization: Token my-token' -H 'accept:application/csv' -H 'content-type:application/vnd.flux' -d 'import "influxdata/influxdb/secrets" import "generate" x = secrets.get(key:"SLACK_TOKEN") from(bucket: "my-bucket") |> range(start: -5h) |> set(key:"secret", value: x) ' - -,result,table,_start,_stop,_time,_value,_field,_measurement,k,secret -,_result,0,2019-08-28T13:39:09.820375497Z,2019-08-28T18:39:09.820375497Z,2019-08-28T17:07:03Z,18739,v,m,v,AABBCCDEEEeee -``` +TBD ##### Example creating a PagerDuty notification endpoint in line protocol ```js // To create the endpoint, run the following command with your authorization routing key. -Enter example here...detail from v1 docs: -Routing Key: GUID of your PagerDuty Events API V2 integration, listed as “Integration Key”. -See Create a new service in the PagerDuty documentation details on getting an “Integration Key” (routing_key). -PagerDuty URL: URL used to POST a JSON body representing the event. This value should not be changed. Valid value is https://events.pagerduty.com/v2/enqueue. -metrics available for integration; api keys and application keys currently in use by organization +TBD +To obtain a PagerDuty routing_key, see PagerDuty documentation. Once you obtain your routing key, (add example with integration metrics, api and application keys). +Example using POST to send JSON body representing an event to PagerDuty URL. Note, URL should not change (once notification rule is set?). example PagerDuty URL: https://events.pagerduty.com/v2/enqueue. + // To test your PagerDuty notification endpoint, run the following command. -See the PagerDuty Events API V2 Overview for details on the PagerDuty Events API and recognized event types (trigger, acknowledge, and resolve). - +TBD ```js from(bucket: alertBucket) |> [conditions here] |> toPagerDuty() ``` \ No newline at end of file From 5f44999373a4083a8809f139ae8da1398b9aaadb Mon Sep 17 00:00:00 2001 From: Nora Date: Tue, 3 Sep 2019 15:25:07 -0700 Subject: [PATCH 089/258] updated steps --- .../cloud/monitor-alert/notification-rules.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules.md index 9588a8770..0369ef504 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules.md @@ -18,11 +18,21 @@ To receive notifications about changes in your data, start by setting up a notif ## Create a notification rule in the UI 1. On the **Monitoring and Alerting** page, next to **Notification Rules**, click **Create**. -2. In the **Name** and **Description** fields, enter a name and description for the endpoint (description used on History page? anywhere else?). -3. From the **Destination** drop-down list, select a destination to send notifications: +2. Complete the **About** section: + a. In the **Name** field, enter a name for the notification rule. + b. In the **Schedule Every** field, enter . + c. In the **Offset** field, enter . +3. In the **Conditions** section, build a condition using a combination of status and tag keys. + +Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) + +Select status from the drop-down list (one for is equal to or two for changes from). + + +4. From the **Destination** drop-down list, select a destination to send notifications: - (Free plan) HTTP server - (Pay as You Go plan) HTTP server, Slack, or PagerDuty -4. Enter the **URL** to notify, and then enter connection information: +5. Enter the **URL** to notify, and then enter connection information: - For HTTP: From 3b1b14993f5ff942265ff3f3220dfb1318291754 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 09:35:47 -0700 Subject: [PATCH 090/258] add monitor and alert definitions on glossary --- content/v2.0/reference/glossary.md | 45 +++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index b9be8986e..330b62d03 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -34,6 +34,12 @@ For a list of available aggregation functions, see [Flux built-in aggregate func Related entries: [function](#function), [selector](#selector), [transformation](#transformation) +### alert + +In data monitoring and alerting, an alert occurs when a [check](#check) results in a [check status](#check-status) that triggers a [notification rule](#notification-rule). + +Related entries: [notification bucket](#notification-bucket) + ## B ### bar graph @@ -92,6 +98,19 @@ A bucket is a named location where time series data is stored. All buckets have ## C +### check + +In data monitoring and alerting, a check analyzes query results to determine the current [check status](#check-status) and writes the check status to a [status bucket](#status-bucket). + +Related entries: [alerts](#alerts) + +### check status + +In data monitoring and alerting, a check status identifies: + +- Status level (OK, INFO, WARN, CRIT, or UNKNOWN) +- Check [tags](#tag) written to the [status bucket](#status-bucket) + ### CSV Comma-separated values (CSV) delimits text between commas to separate values. A CSV file stores tabular data (numbers and text) in plain text. Each line of the file is a data record. Each record consists of one or more fields, separated by commas. CSV file format is not fully standardized. @@ -523,6 +542,22 @@ An independent `influxd` process. Related entries: [server](#server) +### notification bucket + + In data monitoring and alerting, the notification bucket is where a [notification rule](#notification-rule) records the name of the [notification endpoint](#notification-endpoint), [notification message](notification-message), and [tags](#tag) in a [query](#query). + +### notification endpoint + + In data monitoring and alerting, the notification endpoint is the configuration describing how to call a 3rd party service (for example, Slack or Pagerduty). + +### notification message + +A templatized payload sent to the [notification endpoint](#notification-endpoint). + +### notification rule + + In data monitoring and alerting, a notification rule is a query on a [status bucket](#status-bucket) that returns the [check status](#check-status). When warranted by the conditions of the rule, the notification rule sends a [message] to a 3rd party using the [notification endpoint](#notification-endpoint) and stores a receipt in the [notification bucket](#notification-bucket). + ### now() The local server's nanosecond timestamp. @@ -617,7 +652,7 @@ Collect data from any accessible endpoint that provides data in the [Prometheus ### query -An operation that retrieves data from InfluxDB. +A Flux script that returns time series data, including [tags](#tag) and [timestamps](#timestamp). See [Query data in InfluxDB](/v2.0/query-data/). @@ -779,6 +814,14 @@ A visualization that displays points sharing a common X value as stacked rather Related entries: [bin](#bin) --> +### status bucket + + In data monitoring and alerting, a status bucket stores the current [check status](#check-status). + +### status graph + + In data monitoring and alerting, a status graph shows the [check status](#check-status) over time. + ### step-plot In InfluxDB 1.x, a [step-plot graph](https://docs.influxdata.com/chronograf/v1.7/guides/visualization-types/#step-plot-graph) displays time series data in a staircase graph. In InfluxDB 2.0, generate a similar graph using the step interpolation option for [line graphs](https://v2.docs.influxdata.com/v2.0/visualize-data/visualization-types/graph/#options). From 40077c6ec067b0ba4345bfb825de64a58c31c3c5 Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 4 Sep 2019 10:13:37 -0700 Subject: [PATCH 091/258] updated doc structure for notification rules --- .../cloud/monitor-alert/notification-rules/_index.md | 0 .../create-notification-rules.md} | 4 ++-- .../notification-rules/delete-notification-rules.md | 12 ++++++++++++ .../notification-rules/update-notfication-rules.md | 12 ++++++++++++ .../notification-rules/view-notification-rules.md | 12 ++++++++++++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/_index.md rename content/v2.0/cloud/monitor-alert/{notification-rules.md => notification-rules/create-notification-rules.md} (97%) create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md new file mode 100644 index 000000000..e69de29bb diff --git a/content/v2.0/cloud/monitor-alert/notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md similarity index 97% rename from content/v2.0/cloud/monitor-alert/notification-rules.md rename to content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 0369ef504..4fa322097 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -8,7 +8,7 @@ v2.0/tags: [monitor, notification rules] menu: v2_0: name: Create notification rules - parent: Monitor and alert + parent: Notification rules related: - /v2.0/monitor-alert/create-notification-endpoints/ --- @@ -26,7 +26,7 @@ To receive notifications about changes in your data, start by setting up a notif Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) -Select status from the drop-down list (one for is equal to or two for changes from). +Select status from the drop-down list (one for is equal to or two for changes from). 4. From the **Destination** drop-down list, select a destination to send notifications: diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md new file mode 100644 index 000000000..057609f41 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -0,0 +1,12 @@ +--- +title: Delete notification rules +description: > + Delete notification rules to receive alerts on your time series data. + +weight: 101 +v2.0/tags: [monitor, notification rules] +menu: + v2_0: + name: Delete notification rules + parent: Notification rules +--- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md new file mode 100644 index 000000000..90ac5bdce --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -0,0 +1,12 @@ +--- +title: Update notification rules +description: > + Update notification rules to receive alerts on your time series data. + +weight: 101 +v2.0/tags: [monitor, notification rules] +menu: + v2_0: + name: Update notification rules + parent: Notification rules +--- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md new file mode 100644 index 000000000..daeb19fe5 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md @@ -0,0 +1,12 @@ +--- +title: View notification rules +description: > + View notification rules to receive alerts on your time series data. + +weight: 101 +v2.0/tags: [monitor, notification rules] +menu: + v2_0: + name: View notification rules + parent: Notification rules +--- From 32df8cc162b0083f107fd193915eee701713d2c1 Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 4 Sep 2019 10:37:31 -0700 Subject: [PATCH 092/258] Update frontmatter --- .../cloud/monitor-alert/notification-rules/_index.md | 11 +++++++++++ .../notification-rules/create-notification-rules.md | 2 +- .../notification-rules/delete-notification-rules.md | 2 +- .../notification-rules/update-notfication-rules.md | 2 +- .../notification-rules/view-notification-rules.md | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md index e69de29bb..4c0585f39 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md @@ -0,0 +1,11 @@ +--- +title: Manage notification rules +description: > + Manage notification rules in InfluxDB. +weight: 101 +v2.0/tags: [monitor, notification, rules] +menu: + v2_0: + name: Manage notification rules + parent: Monitor and alert +--- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 4fa322097..7398621f2 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -8,7 +8,7 @@ v2.0/tags: [monitor, notification rules] menu: v2_0: name: Create notification rules - parent: Notification rules + parent: Manage notification rules related: - /v2.0/monitor-alert/create-notification-endpoints/ --- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md index 057609f41..b3e63eeaa 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -8,5 +8,5 @@ v2.0/tags: [monitor, notification rules] menu: v2_0: name: Delete notification rules - parent: Notification rules + parent: Manage notification rules --- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index 90ac5bdce..1bbde4224 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -8,5 +8,5 @@ v2.0/tags: [monitor, notification rules] menu: v2_0: name: Update notification rules - parent: Notification rules + parent: Manage notification rules --- diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md index daeb19fe5..c78682810 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md @@ -8,5 +8,5 @@ v2.0/tags: [monitor, notification rules] menu: v2_0: name: View notification rules - parent: Notification rules + parent: Manage notification rules --- From ebc0ec00e4799ba60283dd103a694eba7d2452af Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 4 Sep 2019 11:46:03 -0600 Subject: [PATCH 093/258] finished http package, resolves #389 --- .../reference/flux/functions/http/_index.md | 4 +- .../reference/flux/functions/http/endpoint.md | 58 +++++++++++++++++++ .../reference/flux/functions/http/post.md | 7 ++- 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/http/endpoint.md diff --git a/content/v2.0/reference/flux/functions/http/_index.md b/content/v2.0/reference/flux/functions/http/_index.md index d8d589f6c..575108bfb 100644 --- a/content/v2.0/reference/flux/functions/http/_index.md +++ b/content/v2.0/reference/flux/functions/http/_index.md @@ -2,7 +2,7 @@ title: Flux HTTP package list_title: HTTP package description: > - The Flux HTTP package provides functions ... + The Flux HTTP package provides functions for transferring data using the HTTP protocol. Import the `http` package. menu: v2_0_ref: @@ -12,7 +12,7 @@ weight: 202 v2.0/tags: [functions, http, package] --- -The Flux HTTP package provides functions ... +The Flux HTTP package provides functions for transferring data using the HTTP protocol. Import the `http` package: ```js diff --git a/content/v2.0/reference/flux/functions/http/endpoint.md b/content/v2.0/reference/flux/functions/http/endpoint.md new file mode 100644 index 000000000..67e117df5 --- /dev/null +++ b/content/v2.0/reference/flux/functions/http/endpoint.md @@ -0,0 +1,58 @@ +--- +title: http.endpoint() function +description: > + The `http.endpoint()` function sends output data to a an HTTP URL using the POST request method. +menu: + v2_0_ref: + name: http.endpoint + parent: HTTP +weight: 202 +--- + +The `http.endpoint()` function sends output data to a an HTTP URL using the POST request method. + +_**Function type:** Output_ + +```js +import "http" + +http.endpoint( + url: "http://localhost:1234/" +) +``` + +## Parameters + +### url +The URL to POST to. + +_**Data type:** String_ + +### mapFn +A function that builds the object used to generate the POST request. +The object must include `headers` and `data` key-value pairs. +_For more information, see [`http.post()`](/v2.0/reference/flux/functions/http/post/)_ + +{{% note %}} +_You should rarely need to override the default `mapFn` parameter. +To see the default `mapFn` value or for insight into possible overrides, view the +[`http.endpoint()` source code](https://github.com/influxdata/flux/blob/master/stdlib/http/http.flux)._ +{{% /note %}} + +_**Data type:** Function_ + +## Examples + +##### Send critical statuses to an HTTP endpoint +```js +import "monitor" +import "http" + +endpoint = http.endpoint(url: "http://myawsomeurl.com/api/notify") + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "statuses" and status == "crit") + |> map(fn: (r) => { return {status: r._status} }) + |> monitor.notify(endpoint: endpoint) +``` diff --git a/content/v2.0/reference/flux/functions/http/post.md b/content/v2.0/reference/flux/functions/http/post.md index 4a143fc39..214c15833 100644 --- a/content/v2.0/reference/flux/functions/http/post.md +++ b/content/v2.0/reference/flux/functions/http/post.md @@ -1,7 +1,8 @@ --- title: http.post() function -description: The `http.post()` function submits an HTTP POST request to the specified URL with headers and data. -// The HTTP status code is returned. +description: > + The `http.post()` function submits an HTTP POST request to the specified URL with headers and data. + The HTTP status code is returned. menu: v2_0_ref: name: http.post @@ -43,7 +44,7 @@ _**Data type:** Bytes_ ## Examples -### ... +##### Send the last reported status to a URL ```js import "json" import "http" From a5715e70570e86ff92522f11c8e07421d9e5fca2 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 10:58:47 -0700 Subject: [PATCH 094/258] remove api example placeholders --- content/v2.0/cloud/monitor-alert/notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-endpoints.md b/content/v2.0/cloud/monitor-alert/notification-endpoints.md index 1fb5b6632..c39b9f916 100644 --- a/content/v2.0/cloud/monitor-alert/notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/notification-endpoints.md @@ -13,7 +13,7 @@ related: - /v2.0/monitor-alert/create-notification-endpoints/ --- -To send notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . +To send notifications about changes in your data, start by setting up a notification endpoint in the UI or with the InfluxDB After setting up your notification endpoints, create notification rules and checks . ## Create a notification endpoint in the UI From f83fce7f1ff346e13a18c0b04779a40a4131f5d9 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:48:50 -0700 Subject: [PATCH 095/258] remove obsolete file --- .../monitor-alert/notification-endpoints.md | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 content/v2.0/cloud/monitor-alert/notification-endpoints.md diff --git a/content/v2.0/cloud/monitor-alert/notification-endpoints.md b/content/v2.0/cloud/monitor-alert/notification-endpoints.md deleted file mode 100644 index c39b9f916..000000000 --- a/content/v2.0/cloud/monitor-alert/notification-endpoints.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Create notification endpoints -description: > - Create notification endpoints to send alerts on your time series data. - -weight: 101 -v2.0/tags: [monitor, notifications, endpoints] -menu: - v2_0: - parent: Monitor and alert -related: - - /v2.0/monitor-alert/create-notification-rules/ - - /v2.0/monitor-alert/create-notification-endpoints/ ---- - -To send notifications about changes in your data, start by setting up a notification endpoint in the UI or with the InfluxDB After setting up your notification endpoints, create notification rules and checks . - -## Create a notification endpoint in the UI - -1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. -2. In the **Name** and **Description** fields, enter a name and description for the endpoint. -3. From the **Destination** drop-down list, select a destination endpoint to send notifications: - - (Free plan) HTTP - - (Pay as You Go plan) HTTP, Slack, or PagerDuty -4. Enter the **URL** to notify, and then enter connection information: - - - For HTTP: - - a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} - - b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - - c. In the **Content Template** field, enter {examples for each endpoint template}. - - - For Slack, enter your Slack authentication token in the **Token** field. - - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. - -5. Click **Create Notification Endpoint**. - -##### Example creating a Slack notification endpoint in line protocol - -```js -// To create the endpoint, run the following command with your secret key and Slack authorization token. - -TBD - -// To test your Slack notification endpoint, run the following command. - -TBD - -##### Example creating a PagerDuty notification endpoint in line protocol - -```js -// To create the endpoint, run the following command with your authorization routing key. - -TBD -To obtain a PagerDuty routing_key, see PagerDuty documentation. Once you obtain your routing key, (add example with integration metrics, api and application keys). -Example using POST to send JSON body representing an event to PagerDuty URL. Note, URL should not change (once notification rule is set?). example PagerDuty URL: https://events.pagerduty.com/v2/enqueue. - - -// To test your PagerDuty notification endpoint, run the following command. - -TBD -```js -from(bucket: alertBucket) |> [conditions here] |> toPagerDuty() -``` \ No newline at end of file From 57b84aa44ed1fa770fb411f2c7ea716dbaf361a3 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:54:27 -0700 Subject: [PATCH 096/258] add steps to get started with monitor and alert --- content/v2.0/cloud/monitor-alert/_index.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/_index.md b/content/v2.0/cloud/monitor-alert/_index.md index 414f9481b..602e87b54 100644 --- a/content/v2.0/cloud/monitor-alert/_index.md +++ b/content/v2.0/cloud/monitor-alert/_index.md @@ -10,6 +10,17 @@ weight: 3 v2.0/tags: [monitor, alert, checks, notification, endpoints] --- -Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. +Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. To get started, do the following: -{{< children >}} +1. [Create checks](...create-a-check) to monitor data for a specified check status. +2. (Optional) Send alerts on a specified check status by doing the following: + + a. [Create a notification endpoint](/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints). + + b. [Create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules). + +After creating your initial checks and notifications, adjust how you monitor data and alerts as needed. For more information, see: + +- [Manage checks](/v2.0/cloud/monitor-alert/manage-checks) +- [Manage notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules) +- [Manage notification endpoints](/v2.0/cloud/monitor-alert/manage-notification-endpoints) From e670523c160d1fc26485599b17fcaab2e0613e22 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:55:14 -0700 Subject: [PATCH 097/258] add topic for managing notification endpoints --- .../manage-notification-endpoints/_index.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md new file mode 100644 index 000000000..9c5ca7252 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md @@ -0,0 +1,17 @@ +--- +title: Manage notification endpoints +seotitle: Manage notification endpoints +list_title: Manage notification endpoints +description: > + Create, read, update, and delete endpoints in the InfluxDB UI. +v2.0/tags: [endpoints] +menu: + v2_0: + name: Manage notification endpoints + parent: Monitor and alert +weight: 102 +--- + +Notification endpoints store information to connect to a third party service. If you're using the Free plan, create an HTTP or Slack endpoint. If you're using the Pay as You Go plan, create a connection to a HTTP, Slack, or PagerDuty endpoint. + +{{< children >}} From 34f71785c09b067047321567e560176d2192b117 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:55:43 -0700 Subject: [PATCH 098/258] add how to create notification endpoints --- .../create-notification-endpoints.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md new file mode 100644 index 000000000..51cc9dfd4 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -0,0 +1,40 @@ +--- +title: Create notification endpoints +seotitle: Create notification endpoints +description: > + Create notification endpoints to send alerts on your time series data. + +v2.0/tags: [monitor, notifications, endpoints] +menu: + v2_0: + name: Create endpoints + parent: Manage notification endpoints +weight: 201 +related: + - /v2.0/cloud/monitor-alert/manage-notification-rules/ + - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ +--- + +To send notifications about changes in your data, start by setting up a notification endpoint to a third party service. After setting up notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/manage-checks/create-checks). + +## Create a notification endpoint in the UI + +1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. +2. In the **Name** and **Description** fields, enter a name and description for the endpoint. +3. From the **Destination** drop-down list, select a destination endpoint to send notifications: + - (Free plan) HTTP or Slack + - (Pay as You Go plan) HTTP, Slack, or PagerDuty +4. Enter the **URL** to notify, and then enter connection information: + + - For HTTP: + + a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} + + b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. + + c. In the **Content Template** field, enter {examples for each endpoint template}. + + - For Slack, enter your Slack authentication token in the **Token** field. + - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. + +5. Click **Create Notification Endpoint**. \ No newline at end of file From 3d3fc49a7d2431d51223878fb3be419bcf94fee1 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:56:40 -0700 Subject: [PATCH 099/258] add topic for updating notification endpoints --- .../update-notification-endpoints.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md new file mode 100644 index 000000000..d1a670377 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md @@ -0,0 +1,18 @@ +--- +title: Update notification endpoints +seotitle: Update notification endpoints +description: > + Update notification endpoints in the InfluxDB UI. +menu: + v2_0: + name: Update endpoints + parent: Manage notification endpoints +weight: 204 +related: + - /v2.0/cloud/monitor-alert/manage-notification-rules/ + - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ +--- + +To update information for a specified notification endpoint, complete the steps below. To update a notification endpoint for a specified notification rule, [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/) by selecting the updated notification endpoint. + +1. From 3a2acc1dd546f7d2bcfab2c9dfc846e5dc8b52af Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 13:57:00 -0700 Subject: [PATCH 100/258] add topic for deleting notfication endpoints --- .../delete-notification-endpoints.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md new file mode 100644 index 000000000..61824f840 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md @@ -0,0 +1,20 @@ +--- +title: Delete notification endpoints +seotitle: Delete notification endpoints +description: > + Delete a notification endpoint in the InfluxDB UI. + +v2.0/tags: [monitor, notifications, endpoints] +menu: + v2_0: + name: Delete endpoints + parent: Manage notification endpoints +weight: 201 +related: + - /v2.0/cloud/monitor-alert/manage-notification-rules/ + - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ +--- + +If notifications are no longer sent to an endpoint, complete the step below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. + +1. \ No newline at end of file From 767c67fe78e08e99fe4c485892ee66cb28bb0a67 Mon Sep 17 00:00:00 2001 From: Kelly Date: Wed, 4 Sep 2019 14:01:59 -0700 Subject: [PATCH 101/258] fix typo --- .../delete-notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md index 61824f840..809abf0eb 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md @@ -15,6 +15,6 @@ related: - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ --- -If notifications are no longer sent to an endpoint, complete the step below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. +If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. 1. \ No newline at end of file From 6f9893a7754974c5cfbe00fcf229e39a438ca998 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 4 Sep 2019 15:33:45 -0600 Subject: [PATCH 102/258] added the flux slack package, resolves #423 --- .../reference/flux/functions/http/endpoint.md | 9 +- .../reference/flux/functions/slack/_index.md | 22 ++++ .../flux/functions/slack/endpoint.md | 84 ++++++++++++ .../reference/flux/functions/slack/message.md | 123 ++++++++++++++++++ 4 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 content/v2.0/reference/flux/functions/slack/_index.md create mode 100644 content/v2.0/reference/flux/functions/slack/endpoint.md create mode 100644 content/v2.0/reference/flux/functions/slack/message.md diff --git a/content/v2.0/reference/flux/functions/http/endpoint.md b/content/v2.0/reference/flux/functions/http/endpoint.md index 67e117df5..b251070d5 100644 --- a/content/v2.0/reference/flux/functions/http/endpoint.md +++ b/content/v2.0/reference/flux/functions/http/endpoint.md @@ -30,8 +30,6 @@ _**Data type:** String_ ### mapFn A function that builds the object used to generate the POST request. -The object must include `headers` and `data` key-value pairs. -_For more information, see [`http.post()`](/v2.0/reference/flux/functions/http/post/)_ {{% note %}} _You should rarely need to override the default `mapFn` parameter. @@ -41,6 +39,13 @@ To see the default `mapFn` value or for insight into possible overrides, view th _**Data type:** Function_ +The returned object must include the following fields: + +- `headers` +- `data` + +_For more information, see [`http.post()`](/v2.0/reference/flux/functions/http/post/)_ + ## Examples ##### Send critical statuses to an HTTP endpoint diff --git a/content/v2.0/reference/flux/functions/slack/_index.md b/content/v2.0/reference/flux/functions/slack/_index.md new file mode 100644 index 000000000..82e48c738 --- /dev/null +++ b/content/v2.0/reference/flux/functions/slack/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux Slack package +list_title: Slack package +description: > + The Flux Slack package provides functions for sending data to Slack. + Import the `slack` package. +menu: + v2_0_ref: + name: Slack + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, slack, package] +--- + +The Flux Slack package provides functions for sending data to Slack. +Import the `slack` package: + +```js +import "slack" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/slack/endpoint.md b/content/v2.0/reference/flux/functions/slack/endpoint.md new file mode 100644 index 000000000..bee802fe6 --- /dev/null +++ b/content/v2.0/reference/flux/functions/slack/endpoint.md @@ -0,0 +1,84 @@ +--- +title: slack.endpoint() function +description: > + The `slack.endpoint()` function sends a message to Slack that includes output data. +menu: + v2_0_ref: + name: slack.endpoint + parent: Slack +weight: 202 +--- + +The `slack.endpoint()` function sends a message to Slack that includes output data. + +_**Function type:** Output_ + +```js +import "slack" + +slack.endpoint( + url: "https://slack.com/api/chat.postMessage", + token: "mySuPerSecRetTokEn" +) +``` + +## Parameters + +### url +The Slack API URL. +Defaults to `https://slack.com/api/chat.postMessage`. + +{{% note %}} +If using a Slack Webhook, the Webhook setup process provides the +[Webhook URL](https://api.slack.com/incoming-webhooks#create_a_webhook). +{{% /note %}} + +_**Data type:** String_ + +### token +The Slack API token used to interact with Slack. +Defaults to `""`. + +{{% note %}} +A token is only required if using the Slack chat.postMessage API. +{{% /note %}} + +_**Data type:** String_ + +### mapFn +A function that builds the object used to generate the POST request. + +{{% note %}} +_You should rarely need to override the default `mapFn` parameter. +To see the default `mapFn` value or for insight into possible overrides, view the +[`slack.endpoint()` source code](https://github.com/influxdata/flux/blob/master/stdlib/slack/slack.flux)._ +{{% /note %}} + +_**Data type:** Function_ + +The returned object must include the following fields: + +- `username` +- `channel` +- `workspace` +- `text` +- `iconEmoji` +- `color` + +_For more information, see [`slack.message()`](/v2.0/reference/flux/functions/slack/message/)_ + +## Examples + +##### Send critical statuses to a Slack endpoint +```js +import "monitor" +import "slack" + +endpoint = slack.endpoint(token: "mySuPerSecRetTokEn") + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "statuses" and status == "crit") + |> map(fn: (r) => { return {r with status: r._status} }) + |> monitor.notify(endpoint: endpoint) +``` diff --git a/content/v2.0/reference/flux/functions/slack/message.md b/content/v2.0/reference/flux/functions/slack/message.md new file mode 100644 index 000000000..a7a0cfbdf --- /dev/null +++ b/content/v2.0/reference/flux/functions/slack/message.md @@ -0,0 +1,123 @@ +--- +title: slack.message() function +description: > + The `slack.message()` function sends a single message to a Slack channel. + It work with either with the chat.postMessage API or with a Slack webhook. +menu: + v2_0_ref: + name: slack.message + parent: Slack +weight: 202 +--- + +The `slack.message()` function sends a single message to a Slack channel. +It will work either with the [chat.postMessage API](https://api.slack.com/methods/chat.postMessage) +or with a [Slack Webhook](https://api.slack.com/incoming-webhooks). + +_**Function type:** Output_ + +```js +import "slack" + +slack.message( + url: "https://slack.com/api/chat.postMessage", + token: "mySuPerSecRetTokEn", + username: "Fluxtastic", + channel: "#flux", + workspace: "", + text: "This is a message from the Flux slack.message() function.", + iconEmoji: "wave", + color: "good" +) +``` + +## Parameters + +### url +The Slack API URL. +Defaults to `https://slack.com/api/chat.postMessage`. + +{{% note %}} +If using a Slack Webhook, the Webhook setup process provides the +[Webhook URL](https://api.slack.com/incoming-webhooks#create_a_webhook). +{{% /note %}} + +_**Data type:** String_ + +### token +The Slack API token used to interact with Slack. +Defaults to `""`. + +{{% note %}} +A token is only required if using the Slack chat.postMessage API. +{{% /note %}} + +_**Data type:** String_ + +### username +The username to use when posting the message to a Slack channel. Required + +_**Data type:** String_ + +### channel +The name of channel in which to post the message. Required + +_**Data type:** String_ + +### workspace +The name of the Slack workspace to use if there are multiple. +Defaults to `""`. + +_**Data type:** String_ + +### text +The text to display in the Slack message. Required + +_**Data type:** String_ + +### iconEmoji +The name of emoji to use as the user avatar when posting the message to Slack. +Required + +_**Data type:** String_ + +{{% note %}} +#### Things to know about iconEmoji +- **Do not** enclose the name in colons `:` as you do in the Slack client. +- If using a Slack Webhook, the `iconEmoji` **will not** show as the avatar. +{{% /note %}} + +### color +The color to include with the message. +Required + +**Valid values include:** + +- `good` +- `warning` +- `danger` +- Any valid RGB hex color code. For example: `#439FE0`. + +_**Data type:** String_ + +## Examples + +##### Send the last reported status to Slack +```js +import "slack" + +lastReported = + from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "statuses") + |> last() + |> map(fn: (r) => { return {status: r._status} }) + +slack.message( + url: "https://slack.com/api/chat.postMessage", + token: "mySuPerSecRetTokEn", + username: "johndoe", + channel: "#system-status", + text: "The last reported status was \"${lastReported.status}\"." +) +``` From 3e3cf944e313447e2c9e50e0ec9af609d6dc6b39 Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 4 Sep 2019 15:00:12 -0700 Subject: [PATCH 103/258] Add steps for CRUD --- .../notification-rules/_index.md | 4 +- .../create-notification-rules.md | 43 +++++++++---------- .../delete-notification-rules.md | 7 ++- .../update-notfication-rules.md | 43 ++++++++++++++++++- .../view-notification-rules.md | 13 +++++- 5 files changed, 82 insertions(+), 28 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md index 4c0585f39..a48da3364 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md @@ -2,8 +2,8 @@ title: Manage notification rules description: > Manage notification rules in InfluxDB. -weight: 101 -v2.0/tags: [monitor, notification, rules] +weight: 20 +v2.0/tags: [manage, notification, rules] menu: v2_0: name: Manage notification rules diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 7398621f2..0159939a5 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -3,46 +3,43 @@ title: Create notification rules description: > Create notification rules to receive alerts on your time series data. -weight: 101 +weight: 201 v2.0/tags: [monitor, notification rules] menu: v2_0: name: Create notification rules parent: Manage notification rules -related: - - /v2.0/monitor-alert/create-notification-endpoints/ --- -To receive notifications about changes in your data, start by setting up a notification endpoint. After setting up your notification endpoints, create notification rules and checks . +Once you've set up checks and notification endpoints, create notification rules to alert you. For details, see and . -## Create a notification rule in the UI +## Create a new notification rule in the UI -1. On the **Monitoring and Alerting** page, next to **Notification Rules**, click **Create**. +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alert" >}} + + +2. Under **Notification Rules**, click **+Create**. 2. Complete the **About** section: a. In the **Name** field, enter a name for the notification rule. b. In the **Schedule Every** field, enter . c. In the **Offset** field, enter . 3. In the **Conditions** section, build a condition using a combination of status and tag keys. + a. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) + Select status from the drop-down list (one for is equal to or two for changes from). + b. Next to **AND When**, enter one or more tag key-value pairs to filter by. +4. In the **Message** section, select an endpoint to notify. +5. Click **Create Notification Rule**. -Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) +## Clone an existing notification rule in the UI -Select status from the drop-down list (one for is equal to or two for changes from). +1. Select the **Monitoring and Alerting** icon from the sidebar. -4. From the **Destination** drop-down list, select a destination to send notifications: - - (Free plan) HTTP server - - (Pay as You Go plan) HTTP server, Slack, or PagerDuty -5. Enter the **URL** to notify, and then enter connection information: + {{< nav-icon "alert" >}} - - For HTTP: - a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} - - b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - - c. In the **Content Template** field, enter {examples for each endpoint template}. - - - For Slack, enter your Slack authentication token in the **Token** field. - - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. - -5. Click **Create Notification Endpoint**. +2. Under **Notification Rules**, hover over the rule you want to clone. +3. Click the clone icon and select **Clone**. The cloned rule appears. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md index b3e63eeaa..129b35b23 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -3,10 +3,15 @@ title: Delete notification rules description: > Delete notification rules to receive alerts on your time series data. -weight: 101 +weight: 201 v2.0/tags: [monitor, notification rules] menu: v2_0: name: Delete notification rules parent: Manage notification rules --- + +## Delete a notification rule in the UI + +1. On the **Monitoring and Alerting** page, under **Notification Rules**, hover over an existing notification rule. +2. Click the delete icon, then click **Delete** to confirm. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index 1bbde4224..f491b2e97 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -3,10 +3,51 @@ title: Update notification rules description: > Update notification rules to receive alerts on your time series data. -weight: 101 +weight: 201 v2.0/tags: [monitor, notification rules] menu: v2_0: name: Update notification rules parent: Manage notification rules --- + +## Add a label to notification rules + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alert" >}} + + +2. Under **Notification Rules**, click **Add a label** next to the rule you want to add a label to. The **Add Labels** box opens. +3. To add an existing label, select the label from the list. +4. To create and add a new label: + - In the search field, enter the name of the new label. The **Create Label** box opens. + - In the **Description** field, enter an optional description for the label. + - Select a color from the for the label. + - Click **Create Label**. +5. To remove a label, hover over the label next to a rule and click the X. + + +## Disable notification rules + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alert" >}} + + +2. Under **Notification Rules**, find the rule you want to disable. +3. Click the blue toggle to disable the notification rule. + +## Update the name or description for notification rules + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alert" >}} + + +2. Under **Notification Rules**, hover over the name or description of a rule. +3. Click the pencil icon to edit the field. +4. Click outside of the field to save your changes. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md index c78682810..3bd3f44fa 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md @@ -3,10 +3,21 @@ title: View notification rules description: > View notification rules to receive alerts on your time series data. -weight: 101 +weight: 201 v2.0/tags: [monitor, notification rules] menu: v2_0: name: View notification rules parent: Manage notification rules --- + +## View the history for notification Rules + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alert" >}} + + +2. Under **Notification Rules**, hover over the rule you want to view history for and click the eye icon, then click **View History** to confirm. +3. In the table that appears, review the history of alerts sent with the notification rule. From 90ed3c0a1cf94f76200c292401d58e33038cdc49 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 4 Sep 2019 16:01:29 -0600 Subject: [PATCH 104/258] added alert icon and updated nav-icon shortcode --- assets/styles/tools/_icomoon.scss | 3 +++ layouts/shortcodes/nav-icon.html | 3 +++ static/fonts/icomoon.eot | Bin 16216 -> 16456 bytes static/fonts/icomoon.svg | 1 + static/fonts/icomoon.ttf | Bin 16052 -> 16292 bytes static/fonts/icomoon.woff | Bin 16128 -> 16368 bytes 6 files changed, 7 insertions(+) diff --git a/assets/styles/tools/_icomoon.scss b/assets/styles/tools/_icomoon.scss index a3b4a64a2..0ba91e342 100644 --- a/assets/styles/tools/_icomoon.scss +++ b/assets/styles/tools/_icomoon.scss @@ -27,6 +27,9 @@ .icon-ui-chat:before { content: "\e93a"; } +.icon-ui-bell:before { + content: "\e93b"; +} .icon-ui-cloud:before { content: "\e93f"; } diff --git a/layouts/shortcodes/nav-icon.html b/layouts/shortcodes/nav-icon.html index a3a7c3d9c..d87e0c133 100644 --- a/layouts/shortcodes/nav-icon.html +++ b/layouts/shortcodes/nav-icon.html @@ -11,6 +11,9 @@ {{ else if eq $navIcon "tasks" }} {{ .Scratch.Set "icon" "calendar" }} {{ .Scratch.Set "title" "Tasks" }} +{{ else if or (eq $navIcon "monitor") (eq $navIcon "alerts") (eq $navIcon "bell") }} + {{ .Scratch.Set "icon" "bell" }} + {{ .Scratch.Set "title" "Monitoring & Alerting" }} {{ else if or (eq $navIcon "disks") (eq $navIcon "load data") (eq $navIcon "load-data") }} {{ .Scratch.Set "icon" "disks" }} {{ .Scratch.Set "title" "Load Data" }} diff --git a/static/fonts/icomoon.eot b/static/fonts/icomoon.eot index 2ff522e19975fc4ef156699920faa3c53ec0d52b..b10672cf56d20e695867c36daedfac6ef5d8cc37 100755 GIT binary patch delta 551 zcmcanccOuj&BK9#VTt`jHZvB{E$ot$7ut$U3`rK;!N9<<2Z$4ra}x_DTTkYmctWQB z!m%J;1_s6h3=CEb8L5dWveUV87#OU9dBadQ$o~UW-&T-cT*AN% zlwq)M0m(BkvoP{cPGRh3w4VHd(OQ&IoI&iH*k`dUF>%ppqFtixK*fxc9hqb{$1uIu zuNV8z$h?u6iNTn`n}I=9U5^on^cmGa3^jFSC3ZeWb~b)SAj!wb&&VbsF2`uiD931Q zWM&S+W+v+Fib`tsjCPD5Y|UsSCJ&UBXB1;&-l)ta#33cmrOPQTR+IB)hjKV_By1J&@9K$TRM0m91z2%iuHOY3=CE`fa=ULfC7AZ+!727)&fAjN=9x;g+ieOP_4BI zP>)JZesZGt1XU#l2Ac?={FL0piUNjk#uY&R8z5gHFEKZDrWfaL1_oOmp!&9g{NfS@ zW}pm%-4u{K12YSwz~mIhZbqxg9~iAg8N~jJeHHs8mMJDCI#sk&v<;}3ak3+m%;p%T z_xhWSjV(E4=6Q+w$Mf5KW#DE38N_h2b+aanp4?$$&geP$fX$!D2W(d=M@g)bxF^{q mc}~hq>X;0NOqxs&10ztaC*v{(UXUIJCZOTMn-|+HWds0i(NgmO diff --git a/static/fonts/icomoon.svg b/static/fonts/icomoon.svg index f5ed6e65c..229d9fdc8 100755 --- a/static/fonts/icomoon.svg +++ b/static/fonts/icomoon.svg @@ -66,6 +66,7 @@ + diff --git a/static/fonts/icomoon.ttf b/static/fonts/icomoon.ttf index fb000be8e48fc19badfbaf3fa3d8885c02e21b49..70f0b78749a48536fe212022044729299083c94c 100755 GIT binary patch delta 600 zcmXw%O=uHQ5P)a0`OliQNq6&~*kqHK#xy_84`!3rwi2bO6e@^+pi6BVYSIMSLj_Ab zh=QJEv7&fURIDd!N>Na#7Y`o9lR@$3-HRxK)jBIUym>R<%)G~Y^WMhFgLWGb04#6` z7)VVXO=h@f`sWmRNqTm=A-5Dsu>hc#`0kv%*dn`|SgkS6)i2Dxe>1gsH~k{srUh48&BY};D9P|;H4luIyRmg0C1nC79vvY35WWfXf`eb>uklx@ z6qS4ERGy-)^8&vn+rkbq>x>2lp$ZU=4j_#rMpP#f4FwHWH0U{`*@_(MdmVn1(2s+e zd_mQGHfrb#Muu?+Rh2L!1SlOqLC>s*%r>JtU{07k?uk?~tIwszj$p zcH3AYk=q#_6MqgU^rGN#KJ*xTXDXBvUz&5BA*=VPM)fi`8a?EVCStCH8l|7 z5P+^P`0s|f&Z~6Dy z0Hg(g{2f4=BR!`wO~0{qIgo#Vfx%KDBQ-Hawrph;1B2BKpuAZIP=GIwTY`bX8mNas zB_p?_LZMIssMgv9s7ECyKiM%+e1fVH1A|QjP{EYk#EJrjaK;rt{u>})AulmEb*2~R zZw3Zi9-xM{g8bqVphJPcZVE`Aftf{M;(=~PtI0l$)}jnz|HZzFeGOVmG}-{va=Hw(xphMTRMHDUDRC)VbSo|9#4 x{!Es!U8x);u}b2eWS8VQDKn{KG8{5#GCkk`^JHAczzf#Q1hhbS^MBi=i~y`XR73y( diff --git a/static/fonts/icomoon.woff b/static/fonts/icomoon.woff index ac8bf730d5dcca27a39c47bb41eabedb900c395b..b043be6595959349c702c49438d5b476a0978824 100755 GIT binary patch delta 607 zcmZpu`%o`Z?(gQtz{mgu_8%Cy!Ss^J9~ng^F|kb45w72noSRs{z`&RRl$isX?BnW)}X*JdE9p){|#2T8lD@Gl+c? z`z)3vCN4Tnv`e&|fti63;&E1>-#4=|z0pfCL%7!Xw4|cXl!I=4#H+8>gqup#pwKu;vwB?kMWZxnh&u{aU zfg2R93=B7?K3)W)Cwo|%GkQ&Ku>Qlse2_tGa*fSO*))lBl5&zklK-Tfq*h5=$<)Z) Qk_D*;B_*%TcD9EY0hZ`|%m4rY delta 368 zcmexR-%uw~?(gQtz{mgu_6!W%Alh!rIm2GOwLU#U|?X(07}dO;mPKc zS<@4XfnrQ7Kt2Z)3#8{%rUAux7#J)iKv=)Ab$Lc=VhRI;wF*#;83@akt*pub3IfGq zfP9d+3SS<#L`H5&1yHO3Xb(_~QAMFp;y_M*GEkkL%@UxZDIhF9K~*U?u>xqZtp$*; z0LI~rEAkR^Q-NX;K#gr6JkyKwcR_w}3D6@C;OdxxEM^vg$vlkRj8>CpFj|W;i2WD) zD)vb%Q%p>Bs%WQZ8v`=~BgEsZK)-KhWqPN-`L>ZIr_4MrQU7>;o39MqEI?Bj7;d(1 z)`ZcM4Q$LAJtt?_{F$6#yHYYrVwJ=_$u7xrQf5-eWH@BfWO~41>$zFa?hqpYhILfN From 16aec833c49ee41f1f98eeb1b47df220db5c165e Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 4 Sep 2019 15:22:26 -0700 Subject: [PATCH 105/258] Updates to content and icons --- .../notification-rules/_index.md | 3 +++ .../create-notification-rules.md | 22 +++++++++--------- .../delete-notification-rules.md | 10 ++++++-- .../update-notfication-rules.md | 6 ++--- .../view-notification-rules.md | 23 ------------------- 5 files changed, 25 insertions(+), 39 deletions(-) delete mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md index a48da3364..8b01ccc8a 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md @@ -9,3 +9,6 @@ menu: name: Manage notification rules parent: Monitor and alert --- +The following articles provide information on managing your notification rules: + +{{< children >}} diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 0159939a5..c02ebaf14 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -11,27 +11,27 @@ menu: parent: Manage notification rules --- -Once you've set up checks and notification endpoints, create notification rules to alert you. For details, see and . +Once you've set up checks and notification endpoints, create notification rules to alert you. For details, see and . ## Create a new notification rule in the UI 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, click **+Create**. -2. Complete the **About** section: - a. In the **Name** field, enter a name for the notification rule. - b. In the **Schedule Every** field, enter . - c. In the **Offset** field, enter . -3. In the **Conditions** section, build a condition using a combination of status and tag keys. - a. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) +3. Complete the **About** section: + 1. In the **Name** field, enter a name for the notification rule. + 2. In the **Schedule Every** field, enter . + 3. In the **Offset** field, enter . +4. In the **Conditions** section, build a condition using a combination of status and tag keys. + 1. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) Select status from the drop-down list (one for is equal to or two for changes from). - b. Next to **AND When**, enter one or more tag key-value pairs to filter by. -4. In the **Message** section, select an endpoint to notify. -5. Click **Create Notification Rule**. + 2. Next to **AND When**, enter one or more tag key-value pairs to filter by. +5. In the **Message** section, select an endpoint to notify. +6. Click **Create Notification Rule**. ## Clone an existing notification rule in the UI diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md index 129b35b23..7fdd4e281 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -13,5 +13,11 @@ menu: ## Delete a notification rule in the UI -1. On the **Monitoring and Alerting** page, under **Notification Rules**, hover over an existing notification rule. -2. Click the delete icon, then click **Delete** to confirm. +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} + + +2. Under **Notification Rules**, find the rule you want to disable. +3. Click the delete icon, then click **Delete** to confirm. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index f491b2e97..c71ccfd34 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -16,7 +16,7 @@ menu: 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, click **Add a label** next to the rule you want to add a label to. The **Add Labels** box opens. @@ -34,7 +34,7 @@ menu: 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, find the rule you want to disable. @@ -45,7 +45,7 @@ menu: 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, hover over the name or description of a rule. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md deleted file mode 100644 index 3bd3f44fa..000000000 --- a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: View notification rules -description: > - View notification rules to receive alerts on your time series data. - -weight: 201 -v2.0/tags: [monitor, notification rules] -menu: - v2_0: - name: View notification rules - parent: Manage notification rules ---- - -## View the history for notification Rules - -1. Select the **Monitoring and Alerting** icon from the sidebar. - - - {{< nav-icon "alert" >}} - - -2. Under **Notification Rules**, hover over the rule you want to view history for and click the eye icon, then click **View History** to confirm. -3. In the table that appears, review the history of alerts sent with the notification rule. From b3f80a6d9eb1d89450929e62d27f61f518ac44bf Mon Sep 17 00:00:00 2001 From: Nora Date: Wed, 4 Sep 2019 15:27:14 -0700 Subject: [PATCH 106/258] Add missing definition --- .../notification-rules/create-notification-rules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index c02ebaf14..3a8b0228e 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -24,8 +24,8 @@ Once you've set up checks and notification endpoints, create notification rules 2. Under **Notification Rules**, click **+Create**. 3. Complete the **About** section: 1. In the **Name** field, enter a name for the notification rule. - 2. In the **Schedule Every** field, enter . - 3. In the **Offset** field, enter . + 2. In the **Schedule Every** field, enter how frequently the rule should run. + 3. In the **Offset** field, enter an offset time. For example, if a task is to run on the hour, a 10m offset will delay it to 10 minutes after the hour, but all time ranges defined in the task are relative to the specified execution time. 4. In the **Conditions** section, build a condition using a combination of status and tag keys. 1. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) Select status from the drop-down list (one for is equal to or two for changes from). From 146c01009780749af0e61a2494bbb279c0d8fde0 Mon Sep 17 00:00:00 2001 From: kelseiv <47797004+kelseiv@users.noreply.github.com> Date: Wed, 4 Sep 2019 17:51:00 -0700 Subject: [PATCH 107/258] Update create-notification-endpoints.md --- .../create-notification-endpoints.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 51cc9dfd4..52864ad7f 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -15,7 +15,7 @@ related: - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ --- -To send notifications about changes in your data, start by setting up a notification endpoint to a third party service. After setting up notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/manage-checks/create-checks). +To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/manage-checks/create-checks). ## Create a notification endpoint in the UI @@ -37,4 +37,4 @@ To send notifications about changes in your data, start by setting up a notifica - For Slack, enter your Slack authentication token in the **Token** field. - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. -5. Click **Create Notification Endpoint**. \ No newline at end of file +5. Click **Create Notification Endpoint**. From 3cc49e0cc36e687ddf033e7a9a95d4a37cc9b163 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 07:49:22 -0600 Subject: [PATCH 108/258] updated http and slack docs to address PR feedback --- .../reference/flux/functions/http/endpoint.md | 4 ++-- .../flux/functions/slack/endpoint.md | 7 ++++--- .../reference/flux/functions/slack/message.md | 19 ++++++++++--------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/content/v2.0/reference/flux/functions/http/endpoint.md b/content/v2.0/reference/flux/functions/http/endpoint.md index b251070d5..6b316bf27 100644 --- a/content/v2.0/reference/flux/functions/http/endpoint.md +++ b/content/v2.0/reference/flux/functions/http/endpoint.md @@ -1,7 +1,7 @@ --- title: http.endpoint() function description: > - The `http.endpoint()` function sends output data to a an HTTP URL using the POST request method. + The `http.endpoint()` function sends output data to an HTTP URL using the POST request method. menu: v2_0_ref: name: http.endpoint @@ -9,7 +9,7 @@ menu: weight: 202 --- -The `http.endpoint()` function sends output data to a an HTTP URL using the POST request method. +The `http.endpoint()` function sends output data to an HTTP URL using the POST request method. _**Function type:** Output_ diff --git a/content/v2.0/reference/flux/functions/slack/endpoint.md b/content/v2.0/reference/flux/functions/slack/endpoint.md index bee802fe6..ea3ecbb7a 100644 --- a/content/v2.0/reference/flux/functions/slack/endpoint.md +++ b/content/v2.0/reference/flux/functions/slack/endpoint.md @@ -29,14 +29,15 @@ The Slack API URL. Defaults to `https://slack.com/api/chat.postMessage`. {{% note %}} -If using a Slack Webhook, the Webhook setup process provides the -[Webhook URL](https://api.slack.com/incoming-webhooks#create_a_webhook). +If using a Slack webhook, you'll receive a Slack webhook URL when you +[create an incoming webhook](https://api.slack.com/incoming-webhooks#create_a_webhook). {{% /note %}} _**Data type:** String_ ### token -The Slack API token used to interact with Slack. +The [Slack API token](https://get.slack.help/hc/en-us/articles/215770388-Create-and-regenerate-API-tokens) +used to interact with Slack. Defaults to `""`. {{% note %}} diff --git a/content/v2.0/reference/flux/functions/slack/message.md b/content/v2.0/reference/flux/functions/slack/message.md index a7a0cfbdf..70606b866 100644 --- a/content/v2.0/reference/flux/functions/slack/message.md +++ b/content/v2.0/reference/flux/functions/slack/message.md @@ -2,7 +2,7 @@ title: slack.message() function description: > The `slack.message()` function sends a single message to a Slack channel. - It work with either with the chat.postMessage API or with a Slack webhook. + The function works with either with the chat.postMessage API or with a Slack webhook. menu: v2_0_ref: name: slack.message @@ -11,8 +11,8 @@ weight: 202 --- The `slack.message()` function sends a single message to a Slack channel. -It will work either with the [chat.postMessage API](https://api.slack.com/methods/chat.postMessage) -or with a [Slack Webhook](https://api.slack.com/incoming-webhooks). +The function works with either with the [chat.postMessage API](https://api.slack.com/methods/chat.postMessage) +or with a [Slack webhook](https://api.slack.com/incoming-webhooks). _**Function type:** Output_ @@ -38,14 +38,15 @@ The Slack API URL. Defaults to `https://slack.com/api/chat.postMessage`. {{% note %}} -If using a Slack Webhook, the Webhook setup process provides the -[Webhook URL](https://api.slack.com/incoming-webhooks#create_a_webhook). +If using a Slack webhook, you'll receive a Slack webhook URL when you +[create an incoming webhook](https://api.slack.com/incoming-webhooks#create_a_webhook). {{% /note %}} _**Data type:** String_ ### token -The Slack API token used to interact with Slack. +The [Slack API token](https://get.slack.help/hc/en-us/articles/215770388-Create-and-regenerate-API-tokens) +used to interact with Slack. Defaults to `""`. {{% note %}} @@ -60,7 +61,7 @@ The username to use when posting the message to a Slack channel. Required +The name of channel to post the message to. Required _**Data type:** String_ @@ -84,7 +85,7 @@ _**Data type:** String_ {{% note %}} #### Things to know about iconEmoji - **Do not** enclose the name in colons `:` as you do in the Slack client. -- If using a Slack Webhook, the `iconEmoji` **will not** show as the avatar. +- `iconEmoji` only appears as the user avatar when using the Slack chat.postMessage API. {{% /note %}} ### color @@ -96,7 +97,7 @@ The color to include with the message. - `good` - `warning` - `danger` -- Any valid RGB hex color code. For example: `#439FE0`. +- Any valid RGB hex color code. For example, `#439FE0`. _**Data type:** String_ From a15b45865be40dbd186dd69933e2d3f8e6fb3ea9 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 08:43:11 -0600 Subject: [PATCH 109/258] added flux secrets package --- .../flux/functions/secrets/_index.md | 22 ++++++++++ .../reference/flux/functions/secrets/get.md | 44 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/secrets/_index.md create mode 100644 content/v2.0/reference/flux/functions/secrets/get.md diff --git a/content/v2.0/reference/flux/functions/secrets/_index.md b/content/v2.0/reference/flux/functions/secrets/_index.md new file mode 100644 index 000000000..d27834ccf --- /dev/null +++ b/content/v2.0/reference/flux/functions/secrets/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux InfluxDB Secrets package +list_title: InfluxDB Secrets package +description: > + The Flux InfluxDB Secrets package provides functions for working with sensitive secrets managed by InfluxDB. + Import the `influxdata/influxdb/secrets` package. +menu: + v2_0_ref: + name: InfluxDB Secrets + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, secrets, package] +--- + +InfluxDB Secrets Flux functions provide tools for working with sensitive secrets managed by InfluxDB. +Import the `influxdata/influxdb/secrets` package: + +```js +import "influxdata/influxdb/secrets" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/secrets/get.md b/content/v2.0/reference/flux/functions/secrets/get.md new file mode 100644 index 000000000..ff669f891 --- /dev/null +++ b/content/v2.0/reference/flux/functions/secrets/get.md @@ -0,0 +1,44 @@ +--- +title: secrets.get() function +description: > + The `secrets.get()` function retrieves a secret from the InfluxDB secret store. +menu: + v2_0_ref: + name: secrets.get + parent: InfluxDB Secrets +weight: 202 +--- + +The `secrets.get()` function retrieves a secret from the InfluxDB secret store. + +_**Function type:** Miscellaneous_ + +```js +import "influxdata/influxdb/secrets" + +secrets.get(key: "KEY_NAME") +``` + +## Parameters + +### key +The secret key to retrieve. + +_**Data type:** String_ + +## Examples + +### Populate sensitive credentials with secrets +```js +import "sql" +import "influxdata/influxdb/secrets" + +username = secrets.get(key: "POSTGRES_USERNAME") +password = secrets.get(key: "POSTGRES_PASSWORD") + +sql.from( + driverName: "postgres", + dataSourceName: "postgresql://${username}:${password}@localhost", + query:"SELECT * FROM example-table" +) +``` From 5c5562db645f32066f1c23068589f0aa47071a4d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 11:05:21 -0600 Subject: [PATCH 110/258] updated flux changelog with 0.41.0 --- content/v2.0/reference/release-notes/flux.md | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 5d7e5d90c..c241a7cc4 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,34 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.40.2**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.41.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.41.0 [2019-08-26] + +### Features +- Add ability to validate URLs before making `http.post` requests. +- Evaluate string interpolation. +- Implement the `secrets.get` function. +- Added secret service interface. +- Add secrets package that will construct a secret object. +- Added a SecretService interface and a new dependencies package and a basic test of functionality. +- Add Slack endpoint. + +### Bug fixes +- Make `reset()` check for non-nil data before calling `Release()`. +- Add test case for `notify` function. +- Add missing math import to test case. +- Make packages aware of options. +- Resolved `holtWinters` panic. +- Use non-pointer receiver for `interpreter.function`. + +--- + ## v0.40.2 [2019-08-22] ### Bug fixes From f5893d35c52cf18f494bcb9afbdac79b68d71101 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:22:30 -0700 Subject: [PATCH 111/258] Update _index.md --- content/v2.0/cloud/monitor-alert/notification-rules/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md index 8b01ccc8a..8f907fa01 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/_index.md @@ -3,7 +3,7 @@ title: Manage notification rules description: > Manage notification rules in InfluxDB. weight: 20 -v2.0/tags: [manage, notification, rules] +v2.0/tags: [notifications] menu: v2_0: name: Manage notification rules From 32c06ceb9cd01a58de6e8ef5031e2eade926e183 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:22:54 -0700 Subject: [PATCH 112/258] Update create-notification-rules.md --- .../notification-rules/create-notification-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 3a8b0228e..7760c1937 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -1,7 +1,7 @@ --- title: Create notification rules description: > - Create notification rules to receive alerts on your time series data. + Create notifications to receive alerts on your time series data. weight: 201 v2.0/tags: [monitor, notification rules] From 1614aabf252433722e3a4278da64f0b7a5370704 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:23:55 -0700 Subject: [PATCH 113/258] Update create-notification-rules.md --- .../notification-rules/create-notification-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 7760c1937..dc727d446 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -25,7 +25,7 @@ Once you've set up checks and notification endpoints, create notification rules 3. Complete the **About** section: 1. In the **Name** field, enter a name for the notification rule. 2. In the **Schedule Every** field, enter how frequently the rule should run. - 3. In the **Offset** field, enter an offset time. For example, if a task is to run on the hour, a 10m offset will delay it to 10 minutes after the hour, but all time ranges defined in the task are relative to the specified execution time. + 3. In the **Offset** field, enter an offset time. For example,if a task runs on the hour, a 10m offset delays the task to 10 minutes after the hour. Time ranges defined in the task are relative to the specified execution time. 4. In the **Conditions** section, build a condition using a combination of status and tag keys. 1. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) Select status from the drop-down list (one for is equal to or two for changes from). From ce3e917885aa372dd369846b8e61e0bfb7bdfce4 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:24:56 -0700 Subject: [PATCH 114/258] Update create-notification-rules.md --- .../notification-rules/create-notification-rules.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index dc727d446..64239f4c7 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -27,8 +27,9 @@ Once you've set up checks and notification endpoints, create notification rules 2. In the **Schedule Every** field, enter how frequently the rule should run. 3. In the **Offset** field, enter an offset time. For example,if a task runs on the hour, a 10m offset delays the task to 10 minutes after the hour. Time ranges defined in the task are relative to the specified execution time. 4. In the **Conditions** section, build a condition using a combination of status and tag keys. - 1. Next to **When status**, select a an operator from the drop-down field. (either **is equal to** or **changes from**.) - Select status from the drop-down list (one for is equal to or two for changes from). + 1. Next to **When status**, select a an operator from the drop-down field: + - **is equal to** and then select the status + - **changes from** and then select both statuses 2. Next to **AND When**, enter one or more tag key-value pairs to filter by. 5. In the **Message** section, select an endpoint to notify. 6. Click **Create Notification Rule**. From abc91821116c8b2890185706692720b6ae03dc23 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:25:27 -0700 Subject: [PATCH 115/258] Update create-notification-rules.md --- .../notification-rules/create-notification-rules.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 64239f4c7..025166030 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -1,10 +1,10 @@ --- title: Create notification rules description: > - Create notifications to receive alerts on your time series data. + Create notification rules to receive alerts on your time series data. -weight: 201 -v2.0/tags: [monitor, notification rules] +weight: 20 +v2.0/tags: [notifications] menu: v2_0: name: Create notification rules From 0725bfa2bf12f89ee8efa8e66c2dfbb10aa6c42f Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:25:51 -0700 Subject: [PATCH 116/258] Update delete-notification-rules.md --- .../notification-rules/delete-notification-rules.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md index 7fdd4e281..c0340f347 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -1,7 +1,8 @@ --- title: Delete notification rules description: > - Delete notification rules to receive alerts on your time series data. + If you no longer need to receive an alert, delete the associated notification rule. + weight: 201 v2.0/tags: [monitor, notification rules] From ca73dd14d8b2316b983fed710f1e27ceef844b94 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:26:29 -0700 Subject: [PATCH 117/258] Update delete-notification-rules.md --- .../notification-rules/delete-notification-rules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md index c0340f347..ba3d61c31 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md @@ -5,7 +5,7 @@ description: > weight: 201 -v2.0/tags: [monitor, notification rules] +v2.0/tags: [notifications] menu: v2_0: name: Delete notification rules @@ -20,5 +20,5 @@ menu: {{< nav-icon "alerts" >}} -2. Under **Notification Rules**, find the rule you want to disable. +2. Under **Notification Rules**, find the rule you want to delete. 3. Click the delete icon, then click **Delete** to confirm. From 684ef7534dcebec996e61cdbb5e7303fffb79fc1 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:27:22 -0700 Subject: [PATCH 118/258] Update update-notfication-rules.md --- .../notification-rules/update-notfication-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index c71ccfd34..75a91e6c2 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -1,7 +1,7 @@ --- title: Update notification rules description: > - Update notification rules to receive alerts on your time series data. + Update notification rules to update the notification message or change the schedule or conditions. weight: 201 v2.0/tags: [monitor, notification rules] From 47b24206dc2a7980bada14c0fa1842b1070b572c Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:28:42 -0700 Subject: [PATCH 119/258] Update update-notfication-rules.md --- .../notification-rules/update-notfication-rules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index 75a91e6c2..311b7c709 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -4,7 +4,7 @@ description: > Update notification rules to update the notification message or change the schedule or conditions. weight: 201 -v2.0/tags: [monitor, notification rules] +v2.0/tags: [notifications] menu: v2_0: name: Update notification rules @@ -26,7 +26,7 @@ menu: - In the **Description** field, enter an optional description for the label. - Select a color from the for the label. - Click **Create Label**. -5. To remove a label, hover over the label next to a rule and click the X. +5. To remove a label, hover over the label under to a rule and click X. ## Disable notification rules From 0050e555853e258a156b2e70547901c4c56d0bb3 Mon Sep 17 00:00:00 2001 From: noramullen1 <42354779+noramullen1@users.noreply.github.com> Date: Thu, 5 Sep 2019 10:29:21 -0700 Subject: [PATCH 120/258] Update update-notfication-rules.md --- .../notification-rules/update-notfication-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md index 311b7c709..cc0a53d23 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md @@ -24,7 +24,7 @@ menu: 4. To create and add a new label: - In the search field, enter the name of the new label. The **Create Label** box opens. - In the **Description** field, enter an optional description for the label. - - Select a color from the for the label. + - Select a color for the label. - Click **Create Label**. 5. To remove a label, hover over the label under to a rule and click X. From e9b55218ddb1ee1a63ef09079a6e3d7fce4b4b15 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 13:52:50 -0600 Subject: [PATCH 121/258] added flux 0.42 to flux release notes --- content/v2.0/reference/release-notes/flux.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index c241a7cc4..e3f0267b3 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,27 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.41.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.42.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.42.0 [2019-08-30] + +### Features +- Add `stateChanges` function. + +### Bug fixes +- Race condition in looking up types in `map`. +- Support bool equality expressions. +- Calculating a type variable's free type variables. +- Do not generate fresh type variables for member expressions. +- Array instantiation. + +--- + ## v0.41.0 [2019-08-26] ### Features From 723a4ad103c2d3e02f5468836066f137669d335f Mon Sep 17 00:00:00 2001 From: timhallinflux Date: Thu, 5 Sep 2019 13:03:11 -0700 Subject: [PATCH 122/258] Create SECURITY.md --- SECURITY.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..79d053066 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy + +## Reporting a Vulnerability + +Reporting a Vulnerability + +InfluxData takes security and our users' trust very seriously. +If you believe you have found a security issue in any of our open source projects, +please responsibly disclose it by contacting security@influxdata.com. +More details about security vulnerability reporting, including our GPG key, +can be found here. https://www.influxdata.com/how-to-report-security-vulnerabilities/ From dcb2ba9c249897e589ddccea8ab41dac4839623b Mon Sep 17 00:00:00 2001 From: timhallinflux Date: Thu, 5 Sep 2019 13:03:57 -0700 Subject: [PATCH 123/258] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 422d5004c..d12011dd0 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,13 @@ This repository contains the InfluxDB 2.x documentation published at [docs.influ ## Contributing We welcome and encourage community contributions. For information about contributing to the InfluxData documentation, see [Contribution guidelines](CONTRIBUTING.md). +## Reporting a Vulnerability +InfluxData takes security and our users' trust very seriously. +If you believe you have found a security issue in any of our open source projects, +please responsibly disclose it by contacting security@influxdata.com. +More details about security vulnerability reporting, +including our GPG key, can be found here. https://www.influxdata.com/how-to-report-security-vulnerabilities/ + ## Run the docs locally The InfluxData documentation uses [Hugo](https://gohugo.io/), a static site generator built in Go. From 1a5c66e4d46d6d4b2440874f7cce652898f13ccf Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 15:51:43 -0600 Subject: [PATCH 124/258] added monitor.stateChanges function --- .../flux/functions/monitor/statechanges.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/monitor/statechanges.md diff --git a/content/v2.0/reference/flux/functions/monitor/statechanges.md b/content/v2.0/reference/flux/functions/monitor/statechanges.md new file mode 100644 index 000000000..2769c5b3a --- /dev/null +++ b/content/v2.0/reference/flux/functions/monitor/statechanges.md @@ -0,0 +1,55 @@ +--- +title: monitor.stateChanges() function +description: > + The `monitor.stateChanges()` function ... +menu: + v2_0_ref: + name: monitor.stateChanges + parent: InfluxDB Monitor +weight: 202 +cloud_all: true +--- + +The `monitor.stateChanges()` function detects state changes in a stream of data and +outputs only records that change from `fromLevel` to `toLevel`. + +{{% note %}} +`monitor.stateChanges` operates on data in the `statuses` measurement and requires a `_level` column . +{{% /note %}} + +_**Function type:** Transformation_ + +```js +import "influxdata/influxdb/monitor" + +monitor.stateChanges( + fromLevel: "any", + toLevel: "crit" +) +``` + +## Parameters + +### fromLevel +The level to detect a change from. +Defaults to `"any"`. + +_**Data type:** String_ + +### toLevel +The level to detect a change to. +The function only output records that change to this level. + +_**Data type:** String_ + +## Examples + +### Detect when the state changes to critical +```js +import "influxdata/influxdb/monitor" + +from(bucket: "example-bucket") + |> range(start: -10m) + |> group(columns: ["host"]) + |> monitor.stateChanges(toLevel: "crit") +``` From 030b2b484da3c47ad0f0e51a9bd8712900767237 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 15:53:56 -0600 Subject: [PATCH 125/258] added description on monitor.stateChanges function --- content/v2.0/reference/flux/functions/monitor/statechanges.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/monitor/statechanges.md b/content/v2.0/reference/flux/functions/monitor/statechanges.md index 2769c5b3a..1274829a7 100644 --- a/content/v2.0/reference/flux/functions/monitor/statechanges.md +++ b/content/v2.0/reference/flux/functions/monitor/statechanges.md @@ -1,7 +1,8 @@ --- title: monitor.stateChanges() function description: > - The `monitor.stateChanges()` function ... + The `monitor.stateChanges()` function detects state changes in a stream of data and + outputs only records that change from `fromLevel` to `toLevel`. menu: v2_0_ref: name: monitor.stateChanges From c0d40519a132eec5000c6d38ea38825d1287ae85 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 15:56:03 -0600 Subject: [PATCH 126/258] updated example in monitor.stateChange --- content/v2.0/reference/flux/functions/monitor/statechanges.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/statechanges.md b/content/v2.0/reference/flux/functions/monitor/statechanges.md index 1274829a7..1aa6c43df 100644 --- a/content/v2.0/reference/flux/functions/monitor/statechanges.md +++ b/content/v2.0/reference/flux/functions/monitor/statechanges.md @@ -49,8 +49,6 @@ _**Data type:** String_ ```js import "influxdata/influxdb/monitor" -from(bucket: "example-bucket") - |> range(start: -10m) - |> group(columns: ["host"]) +monitor.from(start: -1h) |> monitor.stateChanges(toLevel: "crit") ``` From 1c398b937c4872803267c86dd0bdb7c8447458b2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 5 Sep 2019 16:01:06 -0600 Subject: [PATCH 127/258] added flux 0.43 to the flux changelog --- content/v2.0/reference/release-notes/flux.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index e3f0267b3..3352a8e00 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,20 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.42.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.43.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.43.0 [2019-09-04] + +### Features +- PagerDuty endpoint for alerts and notifications. + +--- + ## v0.42.0 [2019-08-30] ### Features From f23fb2ec4d6fa55c0a3649596c53945d708b78ab Mon Sep 17 00:00:00 2001 From: timhallinflux Date: Thu, 5 Sep 2019 17:46:21 -0700 Subject: [PATCH 128/258] Update create-notification-endpoints.md Removed HTTP from Free Plan --- .../create-notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 52864ad7f..0057cac10 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -22,7 +22,7 @@ To send notifications about changes in your data, start by creating a notificati 1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. 2. In the **Name** and **Description** fields, enter a name and description for the endpoint. 3. From the **Destination** drop-down list, select a destination endpoint to send notifications: - - (Free plan) HTTP or Slack + - (Free plan) Slack - (Pay as You Go plan) HTTP, Slack, or PagerDuty 4. Enter the **URL** to notify, and then enter connection information: From 4ca6115f18a4b36a1ebf0899c0fc59effda7ff79 Mon Sep 17 00:00:00 2001 From: timhallinflux Date: Thu, 5 Sep 2019 18:24:18 -0700 Subject: [PATCH 129/258] Update create-notification-endpoints.md Updated Slack instructions. --- .../create-notification-endpoints.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 0057cac10..79f0ffe00 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -34,7 +34,12 @@ To send notifications about changes in your data, start by creating a notificati c. In the **Content Template** field, enter {examples for each endpoint template}. - - For Slack, enter your Slack authentication token in the **Token** field. + - For Slack: + + a. Create an Incoming WebHook within Slack in order to send notifications to Slack. + + b. Enter the Slack Incoming WebHook URL in the **Slack Incoming WebHook URL** field. + - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. 5. Click **Create Notification Endpoint**. From 4784f6cc499db7ea7aea4e2fc49822504abb2b72 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 09:49:44 -0600 Subject: [PATCH 130/258] added flux pagerduty package --- .../reference/flux/functions/http/endpoint.md | 1 + .../flux/functions/pagerduty/_index.md | 22 ++++ .../functions/pagerduty/actionfromseverity.md | 42 ++++++ .../flux/functions/pagerduty/dedupkey.md | 36 +++++ .../flux/functions/pagerduty/endpoint.md | 81 ++++++++++++ .../flux/functions/pagerduty/sendevent.md | 123 ++++++++++++++++++ .../flux/functions/slack/endpoint.md | 1 + 7 files changed, 306 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/pagerduty/_index.md create mode 100644 content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md create mode 100644 content/v2.0/reference/flux/functions/pagerduty/dedupkey.md create mode 100644 content/v2.0/reference/flux/functions/pagerduty/endpoint.md create mode 100644 content/v2.0/reference/flux/functions/pagerduty/sendevent.md diff --git a/content/v2.0/reference/flux/functions/http/endpoint.md b/content/v2.0/reference/flux/functions/http/endpoint.md index 6b316bf27..df67ea6af 100644 --- a/content/v2.0/reference/flux/functions/http/endpoint.md +++ b/content/v2.0/reference/flux/functions/http/endpoint.md @@ -7,6 +7,7 @@ menu: name: http.endpoint parent: HTTP weight: 202 +v2.0/tags: [endpoints] --- The `http.endpoint()` function sends output data to an HTTP URL using the POST request method. diff --git a/content/v2.0/reference/flux/functions/pagerduty/_index.md b/content/v2.0/reference/flux/functions/pagerduty/_index.md new file mode 100644 index 000000000..8a8a1fd13 --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/_index.md @@ -0,0 +1,22 @@ +--- +title: Flux PagerDuty package +list_title: PagerDuty package +description: > + The Flux PagerDuty package provides functions for sending data to PagerDuty. + Import the `pagerduty` package. +menu: + v2_0_ref: + name: PagerDuty + parent: Flux packages and functions +weight: 202 +v2.0/tags: [functions, pagerduty, package] +--- + +The Flux PagerDuty package provides functions for sending data to PagerDuty. +Import the `pagerduty` package: + +```js +import "pagerduty" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md b/content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md new file mode 100644 index 000000000..6ac966f05 --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md @@ -0,0 +1,42 @@ +--- +title: pagerduty.actionFromSeverity() function +description: > + The `pagerduty.actionFromSeverity()` function converts a severity to a PagerDuty action. +menu: + v2_0_ref: + name: pagerduty.actionFromSeverity + parent: PagerDuty +weight: 202 +--- + +The `pagerduty.actionFromSeverity()` function converts a severity to a PagerDuty action. +`ok` converts to `resolve`. +All other severities convert to `trigger`. + +_**Function type:** Transformation_ + +```js +import "pagerduty" + +pagerduty.actionFromSeverity( + severity: "ok" +) + +// Returns "resolve" +``` + +## Parameters + +### severity +The severity to convert to a PagerDuty action. + +_**Data type:** String_ + +## Function definition +```js +import "strings" + +actionFromSeverity = (severity) => + if strings.toLower(v: severity) == "ok" then "resolve" + else "trigger" +``` diff --git a/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md b/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md new file mode 100644 index 000000000..a932cd754 --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md @@ -0,0 +1,36 @@ +--- +title: pagerduty.dedupKey() function +description: > + The `pagerduty.dedupKey()` function uses the group key of an input table to + generate and store a deduplication key in the `_pagerdutyDedupKey` column. +menu: + v2_0_ref: + name: pagerduty.dedupKey + parent: PagerDuty +weight: 202 +--- + +The `pagerduty.dedupKey()` function uses the group key of an input table to +generate and store a deduplication key in the `_pagerdutyDedupKey` column. +The function sorts, newline-concatenates, SHA256-hashes, and hex-encodes +the group key before storing it. + +_**Function type:** Transformation_ + +```js +import "pagerduty" + +pagerduty.dedupKey() +``` + +## Examples + +##### Add a PagerDuty deduplication key to output data +```js +import "pagerduty" + +from(bucket: "default") + |> range(start: -5m) + |> filter(fn: (r) => r._measurement == "mem") + |> pagerduty.dedupKey() +``` diff --git a/content/v2.0/reference/flux/functions/pagerduty/endpoint.md b/content/v2.0/reference/flux/functions/pagerduty/endpoint.md new file mode 100644 index 000000000..cd3a63ffc --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/endpoint.md @@ -0,0 +1,81 @@ +--- +title: pagerduty.endpoint() function +description: > + The `pagerduty.endpoint()` function sends a message to PagerDuty that includes output data. +menu: + v2_0_ref: + name: pagerduty.endpoint + parent: PagerDuty +weight: 202 +v2.0/tags: [endpoints] +--- + +The `pagerduty.endpoint()` function sends a message to PagerDuty that includes output data. + +_**Function type:** Output_ + +```js +import "pagerduty" + +pagerduty.endpoint( + url: "https://events.pagerduty.com/v2/enqueue", + token: "mySuPerSecRetTokEn" +) +``` + +## Parameters + +### pagerdutyURL +The PagerDuty API URL. +Defaults to `https://events.pagerduty.com/v2/enqueue`. + +_**Data type:** String_ + +### token +The [PagerDuty API token](https://support.pagerduty.com/docs/generating-api-keys#section-generating-a-general-access-rest-api-key) +used to interact with PagerDuty. +Defaults to `""`. + +_**Data type:** String_ + +### mapFn +A function that builds the object used to generate the POST request. + +{{% note %}} +_You should rarely need to override the default `mapFn` parameter. +To see the default `mapFn` value or for insight into possible overrides, view the +[`pagerduty.endpoint()` source code](https://github.com/influxdata/flux/blob/master/stdlib/pagerduty/pagerduty.flux)._ +{{% /note %}} + +_**Data type:** Function_ + +The returned object must include the following fields: + +- `routingKey` +- `client` +- `client_url` +- `class` +- `group` +- `severity` +- `component` +- `source` +- `summary` +- `timestamp` + +_For more information, see [`pagerduty.message()`](/v2.0/reference/flux/functions/pagerduty/message/)_ + +## Examples + +##### Send critical statuses to a PagerDuty endpoint +```js +import "monitor" +import "pagerduty" + +endpoint = pagerduty.endpoint(token: "mySuPerSecRetTokEn") + +from(bucket: "example-bucket") + |> range(start: -1m) + |> filter(fn: (r) => r._measurement == "statuses" and status == "crit") + |> map(fn: (r) => { return {r with status: r._status} }) + |> monitor.notify(endpoint: endpoint) +``` diff --git a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md new file mode 100644 index 000000000..2dfdd436b --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md @@ -0,0 +1,123 @@ +--- +title: pagerduty.sendEvent() function +description: > + The `pagerduty.sendEvent()` function sends an event to PagerDuty. +menu: + v2_0_ref: + name: pagerduty.sendEvent + parent: PagerDuty +weight: 202 +--- + +The `pagerduty.sendEvent()` function sends an event to PagerDuty. + +_**Function type:** Output_ + +```js +import "pagerduty" + +pagerduty.sendEvent( + pagerdutyURL: "https://events.pagerduty.com/v2/enqueue", + token: "mySuPerSecRetTokEn", + routingKey: "ExampleRoutingKey", + client: "ExampleClient", + clientURL: "http://examplepagerdutyclient.com", + dedupkey: "ExampleDedupKey", + class: "cpu usage", + group: "app-stack", + severity: "ok", + component: "postgres", + source: "monitoringtool:vendor:region", + summary: "This is an example summary.", + timestamp: "2016-07-17T08:42:58.315+0000" +) +``` + +## Parameters + +### pagerdutyURL +The URL of the PagerDuty endpoint. +Defaults to `https://events.pagerduty.com/v2/enqueue`. + +_**Data type:** String_ + +### token +The [PagerDuty API token](https://support.pagerduty.com/docs/generating-api-keys#section-generating-a-general-access-rest-api-key) +used to interact with PagerDuty. +Defaults to `""`. + +_**Data type:** String_ + +### routingKey +The routing key generated from your PagerDuty integration. + +_**Data type:** String_ + +### client +The name of the client sending the alert. + +_**Data type:** String_ + +### clientURL +The URL of the client sending the alert. + +_**Data type:** String_ + +### dedupkey +A per-alert ID that acts as deduplication key and allows you to acknowledge or +change the severity of previous messages. +Supports a maximum of 255 characters. + +{{% note %}} +When using [`pagerduty.endpoint()`](/v2.0/reference/flux/functions/pagerduty/endpoint/) +to send data to PagerDuty, the function uses the [`pagerduty.dedupKey()` function](/v2.0/reference/flux/functions/pagerduty/dedupkey/) to populate the `dedupkey` parameter. +{{% /note %}} + +_**Data type:** String_ + +### class +The class or type of the event. +For example, `ping failure` or `cpu load`. + +_**Data type:** String_ + +### group +A logical grouping used by PagerDuty. +For example, `app-stack`. + +_**Data type:** String_ + +### severity +The severity of the event. + +**Valid values include:** + +- `critical` +- `error` +- `warning` +- `info` + +_**Data type:** String_ + +### component +The component of the source machine responsible for the event. +For example, `mysql` or `eth0`. + +_**Data type:** String_ + +### source +The unique location of the affected system. +For example, the hostname or fully qualified domain name (FQDN). + +_**Data type:** String_ + +### summary +A brief text summary of the event used as the summaries or titles of associated alerts. +The maximum permitted length is 1024 characters. + +_**Data type:** String_ + +### timestamp +The time the detected event occurred in [RFC3339nano format](https://golang.org/pkg/time/#RFC3339Nano). + +_**Data type:** String_ diff --git a/content/v2.0/reference/flux/functions/slack/endpoint.md b/content/v2.0/reference/flux/functions/slack/endpoint.md index ea3ecbb7a..a4940de1a 100644 --- a/content/v2.0/reference/flux/functions/slack/endpoint.md +++ b/content/v2.0/reference/flux/functions/slack/endpoint.md @@ -7,6 +7,7 @@ menu: name: slack.endpoint parent: Slack weight: 202 +v2.0/tags: [endpoints] --- The `slack.endpoint()` function sends a message to Slack that includes output data. From a64cec6784127dcbf7a755ad44e2e54fe2b761c2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 09:57:39 -0600 Subject: [PATCH 131/258] updated stateChanges doc to address PR feedback --- .../v2.0/reference/flux/functions/monitor/statechanges.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/statechanges.md b/content/v2.0/reference/flux/functions/monitor/statechanges.md index 1aa6c43df..fd3b0dc0d 100644 --- a/content/v2.0/reference/flux/functions/monitor/statechanges.md +++ b/content/v2.0/reference/flux/functions/monitor/statechanges.md @@ -2,7 +2,7 @@ title: monitor.stateChanges() function description: > The `monitor.stateChanges()` function detects state changes in a stream of data and - outputs only records that change from `fromLevel` to `toLevel`. + outputs records that change from `fromLevel` to `toLevel`. menu: v2_0_ref: name: monitor.stateChanges @@ -12,7 +12,7 @@ cloud_all: true --- The `monitor.stateChanges()` function detects state changes in a stream of data and -outputs only records that change from `fromLevel` to `toLevel`. +outputs records that change from `fromLevel` to `toLevel`. {{% note %}} `monitor.stateChanges` operates on data in the `statuses` measurement and requires a `_level` column . @@ -39,7 +39,7 @@ _**Data type:** String_ ### toLevel The level to detect a change to. -The function only output records that change to this level. +The function output records that change to this level. _**Data type:** String_ From c70a09faf897023cd98bf485b36ac5d105cb9b91 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 10:15:23 -0600 Subject: [PATCH 132/258] added flux 0.44 to changelog, updated monitor functions with measurement filters --- content/v2.0/reference/flux/functions/monitor/from.md | 6 ++++-- content/v2.0/reference/flux/functions/monitor/logs.md | 6 ++++-- content/v2.0/reference/release-notes/flux.md | 11 +++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/functions/monitor/from.md index 2c97ed710..cffde8c9c 100644 --- a/content/v2.0/reference/flux/functions/monitor/from.md +++ b/content/v2.0/reference/flux/functions/monitor/from.md @@ -1,7 +1,8 @@ --- title: monitor.from() function description: > - The `monitor.from()` function retrieves check statuses stored in the `_monitoring` bucket. + The `monitor.from()` function retrieves check statuses stored in the `statuses` + measurement in the `_monitoring` bucket. menu: v2_0_ref: name: monitor.from @@ -9,7 +10,8 @@ menu: weight: 202 --- -The `monitor.from()` function retrieves check statuses stored in the `_monitoring` bucket. +The `monitor.from()` function retrieves check statuses stored in the `statuses` +measurement in the `_monitoring` bucket. _**Function type:** Input_ diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/functions/monitor/logs.md index 5b13f9c14..a27b6bc0d 100644 --- a/content/v2.0/reference/flux/functions/monitor/logs.md +++ b/content/v2.0/reference/flux/functions/monitor/logs.md @@ -1,7 +1,8 @@ --- title: monitor.logs() function description: > - The `monitor.logs()` function retrieves notification events stored in the `_monitoring` bucket. + The `monitor.logs()` function retrieves notification events stored in the `notifications` + measurement in the `_monitoring` bucket. menu: v2_0_ref: name: monitor.logs @@ -9,7 +10,8 @@ menu: weight: 202 --- -The `monitor.logs()` function retrieves notification events stored in the `_monitoring` bucket. +The `monitor.logs()` function retrieves notification events stored in the `notifications` +measurement in the `_monitoring` bucket. _**Function type:** Input_ diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 3352a8e00..eb7e39a4b 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -18,6 +18,17 @@ InfluxDB until the next InfluxDB v2.0 release._ --- +## v0.44.0 [2019-09-05] + +### Features +- Add `http.basicAuth` function. +- Add measurement filters to `monitor.from` and `monitor.logs`. + +### Bug fixes +- changed the default HTTP client to be more robust. + +--- + ## v0.43.0 [2019-09-04] ### Features From a97b75b1ae5dca3b83c35fa618b765fc3116b912 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 11:40:01 -0600 Subject: [PATCH 133/258] added http.basicAuth function --- .../flux/functions/http/basicauth.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/http/basicauth.md diff --git a/content/v2.0/reference/flux/functions/http/basicauth.md b/content/v2.0/reference/flux/functions/http/basicauth.md new file mode 100644 index 000000000..37fc33f71 --- /dev/null +++ b/content/v2.0/reference/flux/functions/http/basicauth.md @@ -0,0 +1,56 @@ +--- +title: http.basicAuth() function +description: > + The `http.basicAuth()` function returns a Base64-encoded basic authentication + header using a specified username and password combination. +menu: + v2_0_ref: + name: http.basicAuth + parent: HTTP +weight: 202 +--- + +The `http.basicAuth()` function returns a Base64-encoded basic authentication +header using a specified username and password combination. + +_**Function type:** Miscellaneous_ + +```js +import "http" + +http.basicAuth( + u: "username" + p: "passw0rd" +) + +// Returns "Basic dXNlcm5hbWU6cGFzc3cwcmQ=" +``` + +## Parameters + +### u +The username to use in the basic authentication header. + +_**Data type:** String_ + +### p +The password to use in the basic authentication header. + +_**Data type:** String_ + +## Examples + +##### Set a basic authentication header in an HTTP POST request +```js +import "monitor" +import "http" + +username = "myawesomeuser" +password = "mySupErSecRetPasSW0rD" + +http.post( + url: "http://localhost:9999/", + headers: {Authorization: http.basicAuth(u:username, p:password)}, + data: bytes(v: "something I want to send.") +) +``` From 1794a6e094ec714dfdfca4f172393dc3cceff40b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 13:28:18 -0600 Subject: [PATCH 134/258] updated pagerduty docs to address PR feedback --- content/v2.0/reference/flux/functions/pagerduty/dedupkey.md | 2 +- content/v2.0/reference/flux/functions/pagerduty/sendevent.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md b/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md index a932cd754..a49792e6d 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md +++ b/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md @@ -13,7 +13,7 @@ weight: 202 The `pagerduty.dedupKey()` function uses the group key of an input table to generate and store a deduplication key in the `_pagerdutyDedupKey` column. The function sorts, newline-concatenates, SHA256-hashes, and hex-encodes -the group key before storing it. +the group key to create a unique deduplication key for each input table. _**Function type:** Transformation_ diff --git a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md index 2dfdd436b..562abf3e3 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md +++ b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md @@ -77,12 +77,14 @@ _**Data type:** String_ ### class The class or type of the event. +Classes are user-defined. For example, `ping failure` or `cpu load`. _**Data type:** String_ ### group A logical grouping used by PagerDuty. +Groups are user-defined. For example, `app-stack`. _**Data type:** String_ @@ -101,6 +103,7 @@ _**Data type:** String_ ### component The component of the source machine responsible for the event. +Components are user-defined. For example, `mysql` or `eth0`. _**Data type:** String_ From e814c21a09bb1c461d7fdf372a2daf5c4be8e587 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 6 Sep 2019 13:30:24 -0600 Subject: [PATCH 135/258] updated example url in http.basicAuth doc --- content/v2.0/reference/flux/functions/http/basicauth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/http/basicauth.md b/content/v2.0/reference/flux/functions/http/basicauth.md index 37fc33f71..3ea42a485 100644 --- a/content/v2.0/reference/flux/functions/http/basicauth.md +++ b/content/v2.0/reference/flux/functions/http/basicauth.md @@ -49,7 +49,7 @@ username = "myawesomeuser" password = "mySupErSecRetPasSW0rD" http.post( - url: "http://localhost:9999/", + url: "http://myawesomesite.com/api/", headers: {Authorization: http.basicAuth(u:username, p:password)}, data: bytes(v: "something I want to send.") ) From d9ec46fc5f0737005816262fb80af95e95e785d6 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 12:58:10 -0700 Subject: [PATCH 136/258] glossary updates --- content/v2.0/reference/glossary.md | 53 ++++++++++++++---------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index 330b62d03..99ea96622 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -34,12 +34,6 @@ For a list of available aggregation functions, see [Flux built-in aggregate func Related entries: [function](#function), [selector](#selector), [transformation](#transformation) -### alert - -In data monitoring and alerting, an alert occurs when a [check](#check) results in a [check status](#check-status) that triggers a [notification rule](#notification-rule). - -Related entries: [notification bucket](#notification-bucket) - ## B ### bar graph @@ -100,16 +94,29 @@ A bucket is a named location where time series data is stored. All buckets have ### check -In data monitoring and alerting, a check analyzes query results to determine the current [check status](#check-status) and writes the check status to a [status bucket](#status-bucket). +Checks are part of queries used in monitoring to read input data and assign a [status](#check-status) (`_level`) based on specified conditions. For example: -Related entries: [alerts](#alerts) +``` +monitor.check( + crit: (r) => r._value > 90.0, + warn: (r) => r._value > 80.0, + info: (r) => r._value > 60.0, + ok: (r) => r._value <= 20.0, + messageFn: (r) => "The current level is ${r._level}", +) +``` + +This check gives rows with a `_value` greater than 90.0 a crit _level; rows greater than 80.0 get a warn _level, and so on. + +Learn how to [create a check](/v2.0/cloud/monitor-alert/manage-checks/create-checks). + +Related entries: [check status](#check-status), [notification rule](#notification-rule), [notification endpoint](#notification-endpoint) ### check status -In data monitoring and alerting, a check status identifies: +A [check](#check) gets one of the following statuses (`_level`): CRIT, INFO, WARN, or OK. Check statuses are written to a status measurement in the _monitoring bucket. -- Status level (OK, INFO, WARN, CRIT, or UNKNOWN) -- Check [tags](#tag) written to the [status bucket](#status-bucket) +Related entries: [check](#check), [notification rule](#notification-rule), [notification endpoint](#notification-endpoint) ### CSV @@ -542,21 +549,19 @@ An independent `influxd` process. Related entries: [server](#server) -### notification bucket - - In data monitoring and alerting, the notification bucket is where a [notification rule](#notification-rule) records the name of the [notification endpoint](#notification-endpoint), [notification message](notification-message), and [tags](#tag) in a [query](#query). - ### notification endpoint - In data monitoring and alerting, the notification endpoint is the configuration describing how to call a 3rd party service (for example, Slack or Pagerduty). + The notification endpoint specifies the Slack or PagerDuty endpoint to send a notification and contains configuration details for connecting to the endpoint. Learn how to [create a notification endpoint](/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints). -### notification message - -A templatized payload sent to the [notification endpoint](#notification-endpoint). +Related entries: [check](#check), [notification rule](#notification-rule) ### notification rule - In data monitoring and alerting, a notification rule is a query on a [status bucket](#status-bucket) that returns the [check status](#check-status). When warranted by the conditions of the rule, the notification rule sends a [message] to a 3rd party using the [notification endpoint](#notification-endpoint) and stores a receipt in the [notification bucket](#notification-bucket). +A notification rule specifies a status level (and tags) to alert on, the notification message to send for the specified status level (or change in status level), and the interval or schedule you want to check the status level (and tags). If conditions are met, the notification rule sends a message to the [notification endpoint](#notification-endpoint) and stores a receipt in a notification measurement in the _monitoring bucket. For example, a notification rule may specify a message to send to a Slack endpoint when a status level is critical (`crit`). + +Learn how to [create a notification rule](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules). + +Related entries: [check](#check), [notification endpoint](#notification-endpoint) ### now() @@ -814,14 +819,6 @@ A visualization that displays points sharing a common X value as stacked rather Related entries: [bin](#bin) --> -### status bucket - - In data monitoring and alerting, a status bucket stores the current [check status](#check-status). - -### status graph - - In data monitoring and alerting, a status graph shows the [check status](#check-status) over time. - ### step-plot In InfluxDB 1.x, a [step-plot graph](https://docs.influxdata.com/chronograf/v1.7/guides/visualization-types/#step-plot-graph) displays time series data in a staircase graph. In InfluxDB 2.0, generate a similar graph using the step interpolation option for [line graphs](https://v2.docs.influxdata.com/v2.0/visualize-data/visualization-types/graph/#options). From d03ca8d6f2babfa2c90663112772b852abd08ed1 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 13:00:12 -0700 Subject: [PATCH 137/258] add icons to notification endpoint topics --- .../create-notification-endpoints.md | 16 +++++++++++----- .../delete-notification-endpoints.md | 5 ++++- .../update-notification-endpoints.md | 5 ++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 79f0ffe00..d18bc9f7c 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -19,12 +19,18 @@ To send notifications about changes in your data, start by creating a notificati ## Create a notification endpoint in the UI -1. On the **Monitoring and Alerting** page, next to **Notification Endpoints**, click **Create**. -2. In the **Name** and **Description** fields, enter a name and description for the endpoint. -3. From the **Destination** drop-down list, select a destination endpoint to send notifications: +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} + + +2. Next to **Notification Endpoints**, click **Create**. +3. In the **Name** and **Description** fields, enter a name and description for the endpoint. +4. From the **Destination** drop-down list, select a destination endpoint to send notifications: - (Free plan) Slack - (Pay as You Go plan) HTTP, Slack, or PagerDuty -4. Enter the **URL** to notify, and then enter connection information: +5. Enter the **URL** to notify, and then enter connection information: - For HTTP: @@ -42,4 +48,4 @@ To send notifications about changes in your data, start by creating a notificati - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. -5. Click **Create Notification Endpoint**. +6. Click **Create Notification Endpoint**. diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md index 809abf0eb..aaa611250 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md @@ -17,4 +17,7 @@ related: If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. -1. \ No newline at end of file +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} \ No newline at end of file diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md index d1a670377..3382eb98f 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md @@ -15,4 +15,7 @@ related: To update information for a specified notification endpoint, complete the steps below. To update a notification endpoint for a specified notification rule, [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/) by selecting the updated notification endpoint. -1. +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} From c6bdd0ac29ce3d3f84f92b26ee8177ff44f4c270 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 13:06:55 -0700 Subject: [PATCH 138/258] remove patch and get methods from notif endpoint --- .../create-notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index d18bc9f7c..1cffc46d3 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -34,7 +34,7 @@ To send notifications about changes in your data, start by creating a notificati - For HTTP: - a. Select the **HTTP method** to use. In most cases, select **POST**. {find use cases when to use PUT & GET} + a. From the **HTTP method** drop-down list, select **POST**. b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. From 5fb903d1f2ee96fb1b5c985403105046e4768a12 Mon Sep 17 00:00:00 2001 From: Nora Date: Fri, 6 Sep 2019 13:14:59 -0700 Subject: [PATCH 139/258] fix icon shortcode --- .../notification-rules/create-notification-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 3a8b0228e..e02ef92bf 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -38,7 +38,7 @@ Once you've set up checks and notification endpoints, create notification rules 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, hover over the rule you want to clone. From 0691c7b490069a045fc0b32a3592df69d61bd3dc Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 14:17:05 -0700 Subject: [PATCH 140/258] remove HTTP from manage notification endpoints --- .../cloud/monitor-alert/manage-notification-endpoints/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md index 9c5ca7252..a3e930c48 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md @@ -12,6 +12,6 @@ menu: weight: 102 --- -Notification endpoints store information to connect to a third party service. If you're using the Free plan, create an HTTP or Slack endpoint. If you're using the Pay as You Go plan, create a connection to a HTTP, Slack, or PagerDuty endpoint. +Notification endpoints store information to connect to a third party service. If you're using the Free plan, create a Slack endpoint. If you're using the Pay as You Go plan, create a connection to a HTTP, Slack, or PagerDuty endpoint. {{< children >}} From ca145084b5d27fe300e776c079759deb95dc109f Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 14:54:43 -0700 Subject: [PATCH 141/258] add Slack and PagerDuty endpoint updates --- .../create-notification-endpoints.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 1cffc46d3..048e3a3df 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -30,7 +30,7 @@ To send notifications about changes in your data, start by creating a notificati 4. From the **Destination** drop-down list, select a destination endpoint to send notifications: - (Free plan) Slack - (Pay as You Go plan) HTTP, Slack, or PagerDuty -5. Enter the **URL** to notify, and then enter connection information: +5. Enter the **URL** to send the notification, and then enter connection information: - For HTTP: @@ -42,10 +42,8 @@ To send notifications about changes in your data, start by creating a notificati - For Slack: - a. Create an Incoming WebHook within Slack in order to send notifications to Slack. + a. Create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - b. Enter the Slack Incoming WebHook URL in the **Slack Incoming WebHook URL** field. - - - For PagerDuty, enter your PagerDuty routing key in the **Routing Key** field. + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. 6. Click **Create Notification Endpoint**. From f19549489223ca8343d96133b6d650d25f248589 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:15:01 -0700 Subject: [PATCH 142/258] rmv content template field, upd steps 2 match UI --- .../create-notification-endpoints.md | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 048e3a3df..ca594c989 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -26,23 +26,15 @@ To send notifications about changes in your data, start by creating a notificati 2. Next to **Notification Endpoints**, click **Create**. -3. In the **Name** and **Description** fields, enter a name and description for the endpoint. -4. From the **Destination** drop-down list, select a destination endpoint to send notifications: +3. From the **Destination** drop-down list, select a destination endpoint to send notifications: - (Free plan) Slack - (Pay as You Go plan) HTTP, Slack, or PagerDuty -5. Enter the **URL** to send the notification, and then enter connection information: +4. In the **Name** and **Description** fields, enter a name and description for the endpoint. +5. Enter enter information to connect to the endpoint: - - For HTTP: - - a. From the **HTTP method** drop-down list, select **POST**. + - For HTTP, select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - b. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - - c. In the **Content Template** field, enter {examples for each endpoint template}. - - - For Slack: - - a. Create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. + - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. From 8a79be07343b07ce06a543849dab6af62951220e Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:20:48 -0700 Subject: [PATCH 143/258] add URL to for HTTP step --- .../create-notification-endpoints.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index ca594c989..8d51f614d 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -21,10 +21,8 @@ To send notifications about changes in your data, start by creating a notificati 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Next to **Notification Endpoints**, click **Create**. 3. From the **Destination** drop-down list, select a destination endpoint to send notifications: - (Free plan) Slack @@ -32,7 +30,7 @@ To send notifications about changes in your data, start by creating a notificati 4. In the **Name** and **Description** fields, enter a name and description for the endpoint. 5. Enter enter information to connect to the endpoint: - - For HTTP, select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. + - For HTTP, enter the **URL** to send the notification. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. From 44c7ead0fbc51b703af875cc59574e727665c28e Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:27:51 -0700 Subject: [PATCH 144/258] fix formatting --- .../create-notification-endpoints.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 8d51f614d..631ae2b20 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -32,8 +32,8 @@ To send notifications about changes in your data, start by creating a notificati - For HTTP, enter the **URL** to send the notification. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. + - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. 6. Click **Create Notification Endpoint**. From 19a4b8f0c209ee666f5583a57b5896bbca2641a7 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:52:25 -0700 Subject: [PATCH 145/258] update notification endpoint --- .../update-notification-endpoints.md | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md index 3382eb98f..3f8657365 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md @@ -13,9 +13,58 @@ related: - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ --- -To update information for a specified notification endpoint, complete the steps below. To update a notification endpoint for a specified notification rule, [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/) by selecting the updated notification endpoint. +To update the notification endpoint details, complete the following procedures as needed. + +> **Note:** To update the notification endpoint selected for a notification rule, see [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/). + +## Add a label to notification endpoint 1. Select the **Monitoring and Alerting** icon from the sidebar. {{< nav-icon "alerts" >}} + + +2. Under **Notification Endpoints**, click **Add a label** next to the endpoint you want to add a label to. The **Add Labels** box opens. +3. To add an existing label, select the label from the list. +4. To create and add a new label: + + - In the search field, enter the name of the new label. The **Create Label** box opens. + - In the **Description** field, enter an optional description for the label. + - Select a color for the label. + - Click **Create Label**. + +5. To remove a label, hover over the label under an endpoint and click X. + + +## Disable notification endpoint + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} + + +2. Under **Notification Endpoints**, find the endpoint you want to disable. +3. Click the blue toggle to disable the notification endpoint. + +## Update the name or description for notification endpoint + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + + {{< nav-icon "alerts" >}} + + +2. Under **Notification Endpoints**, hover over the name or description of the endpoint. +3. Click the pencil icon to edit the field. +4. Click outside of the field to save your changes. + +## Change endpoint details + +1. Select the **Monitoring and Alerting** icon from the sidebar. + + {{< nav-icon "alerts" >}} + +2. Under **Notification Endpoints**, click the endpoint to update. +3. Update details as needed, and then click **Edit a Notification Endpoint**. For details about each field, see [create a notification endpoint](v2.0/cloud/monitor-alert/manage-checks/create-notification-endpoints). From 4f6d5f9f24e794d6d0aef25739fe9e9c8b0820c4 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:52:39 -0700 Subject: [PATCH 146/258] update delete notification endpoint --- .../delete-notification-endpoints.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md index aaa611250..48166598f 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md @@ -17,7 +17,11 @@ related: If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. +## Delete a notification endpoint in the UI + 1. Select the **Monitoring and Alerting** icon from the sidebar. + {{< nav-icon "alerts" >}} - {{< nav-icon "alerts" >}} \ No newline at end of file +2. Under **Notification Rules**, find the rule you want to delete. +3. Click the delete icon, then click **Delete** to confirm. From 96346ef8a85eb96a31a61f299b5c635af2b57413 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 15:55:17 -0700 Subject: [PATCH 147/258] update links in create notification endpoint --- .../create-notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 631ae2b20..38093ba4c 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -15,7 +15,7 @@ related: - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ --- -To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/manage-checks/create-checks). +To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/checks/create-checks). ## Create a notification endpoint in the UI From 7b5b7c9feae89f477d565865264279379a6e1892 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 6 Sep 2019 16:41:22 -0700 Subject: [PATCH 148/258] add reference to PagerDuty client URL docs --- .../create-notification-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md index 38093ba4c..52f14d7d9 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md @@ -34,6 +34,6 @@ To send notifications about changes in your data, start by creating a notificati - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the PagerDuty client URL is https://events.pagerduty.com/v2/enqueue. For details, see [PagerDuty documentation](https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2). 6. Click **Create Notification Endpoint**. From c20bdcd10a86141ed5106bd792c01d694bda4d1a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 7 Sep 2019 00:10:37 -0600 Subject: [PATCH 149/258] added check management docs --- assets/styles/layouts/_inline-icons.scss | 19 ++- assets/styles/tools/_icomoon.scss | 6 + .../v2.0/cloud/monitor-alert/checks/_index.md | 16 +++ .../v2.0/cloud/monitor-alert/checks/create.md | 127 ++++++++++++++++++ .../v2.0/cloud/monitor-alert/checks/delete.md | 32 +++++ .../v2.0/cloud/monitor-alert/checks/update.md | 60 +++++++++ .../v2.0/cloud/monitor-alert/checks/view.md | 42 ++++++ layouts/shortcodes/icon.html | 6 +- static/fonts/icomoon.eot | Bin 16456 -> 16944 bytes static/fonts/icomoon.svg | 2 + static/fonts/icomoon.ttf | Bin 16292 -> 16780 bytes static/fonts/icomoon.woff | Bin 16368 -> 16856 bytes .../2-0-monitor-check-builder-view-toggle.png | Bin 0 -> 19454 bytes 13 files changed, 299 insertions(+), 11 deletions(-) create mode 100644 content/v2.0/cloud/monitor-alert/checks/_index.md create mode 100644 content/v2.0/cloud/monitor-alert/checks/create.md create mode 100644 content/v2.0/cloud/monitor-alert/checks/delete.md create mode 100644 content/v2.0/cloud/monitor-alert/checks/update.md create mode 100644 content/v2.0/cloud/monitor-alert/checks/view.md create mode 100644 static/img/2-0-monitor-check-builder-view-toggle.png diff --git a/assets/styles/layouts/_inline-icons.scss b/assets/styles/layouts/_inline-icons.scss index 0609c0c24..5151d2091 100644 --- a/assets/styles/layouts/_inline-icons.scss +++ b/assets/styles/layouts/_inline-icons.scss @@ -26,22 +26,21 @@ &.ui-toggle { display: inline-block; position: relative; - width: 34px; - height: 22px; - background: #1C1C21; - border: 2px solid #383846; + width: 28px; + height: 16px; + background: $b-pool; border-radius: .7rem; - vertical-align: text-bottom; + vertical-align: text-top; .circle { display: inline-block; position: absolute; border-radius: 50%; - height: 12px; - width: 12px; - background: #22ADF6; - top: 3px; - right: 3px; + height: 8px; + width: 8px; + background: $g20-white; + top: 4px; + right: 4px; } } } diff --git a/assets/styles/tools/_icomoon.scss b/assets/styles/tools/_icomoon.scss index 0ba91e342..b089302dc 100644 --- a/assets/styles/tools/_icomoon.scss +++ b/assets/styles/tools/_icomoon.scss @@ -24,6 +24,12 @@ -moz-osx-font-smoothing: grayscale; } +.icon-ui-eye-closed:before { + content: "\e956"; +} +.icon-ui-eye-open:before { + content: "\e957"; +} .icon-ui-chat:before { content: "\e93a"; } diff --git a/content/v2.0/cloud/monitor-alert/checks/_index.md b/content/v2.0/cloud/monitor-alert/checks/_index.md new file mode 100644 index 000000000..8f7ba6a21 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/checks/_index.md @@ -0,0 +1,16 @@ +--- +title: Manage checks +seotitle: Manage monitoring checks in InfluxDB +description: > + InfluxDB checks query data and apply a status or level to each data point based on specified conditions. +menu: + v2_0: + parent: Monitor and alert +weight: 101 +v2.0/tags: [monitor, checks, notifications] +--- + +InfluxDB checks query data and apply a status or level to each data point based on specified conditions. +The following articles provide information about creating and managing checks: + +{{< children >}} diff --git a/content/v2.0/cloud/monitor-alert/checks/create.md b/content/v2.0/cloud/monitor-alert/checks/create.md new file mode 100644 index 000000000..38662d497 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/checks/create.md @@ -0,0 +1,127 @@ +--- +title: Create checks +seotitle: Create monitoring checks in InfluxDB +description: > + Create a check in the InfluxDB UI. +menu: + v2_0: + parent: Manage checks +weight: 201 +v2.0/tags: [monitor, checks, notifications] +--- + +Create a check in the InfluxDB user interface (UI). + +## Create a check +1. To create a check in the InfluxDB UI, click **Monitoring & Alerting** in the sidebar. + + {{< nav-icon "alerts" >}} + +2. In the top right corner of the **Checks** column, click **{{< icon "plus" >}} Create**. + The check builder will appear. + +3. Click **Name this check** in the top left corner of the check builder and provide + a unique name for the check. + +A check consists of two parts – a query and check logic. +The check builder provides separate views for configuring each. + +{{< img-hd src="/img/2-0-monitor-check-builder-view-toggle.png" alt="Check builder view toggle" />}} + +### Configure the query +The check query determines the specific dataset to monitor. +Each query requires a bucket, measurement, field, and an aggregate function. +You can narrow results further with tags, but they are not required. + +{{% note %}} +The aggregate function uses data points recorded between check intervals to +calculate and return a single value for the check to process. +{{% /note %}} + +1. In the **Query view**, select the bucket, measurement, field and any desired tag sets to query. +2. In the **Aggregate functions** column, select an interval from the interval dropdown + (for example, "Every 5 minutes") and an aggregate function from the list of functions. +3. Click **Submit** to run the query and preview the results in the visualization pane. + To see the raw query results, click the the **View Raw Data** toggle. + +### Configure the check logic +A check adds a status to each data point based on defined conditions. +The status is stored in the `_level` column. +The following statuses or levels are available: + +- `crit` +- `warn` +- `info` +- `note` + +1. In the **Properties** column, configure the following: + + ##### Schedule Every + Schedule every sets the interval at which the check runs. + _This and the aggregate function interval will always be the same._ + + ##### Offset + The offset delays the execution of a check to account for any late data. + Although the query is delayed, it does not change the queried time range. + + {{% note %}}Your offset must be shorter than your [check interval](#schedule-every) or the check will not run. + {{% /note %}} + + ##### Tags + Add custom tags to the query output. + These tags are unique to each check. + +2. In the **Status Message Template** column, configure the status message for the check. + Use [Flux string interpolation](#) to populate the message with data from the query. + Check data is represented as an object, `r`. + Access specific column values using dot notation: `r.columnName`. + + Each check has access to data from the following columns: + + - all columns included in the query output + - any [custom tags](#tags) added the query output + - `_check_id` + - `_check_name` + - `_level` + - `_source_measurement` + - `_type` + +3. In the **Conditions** column, define the logic that assigns a status or level to data. + There are two types of checks: + + #### Threshold + A threshold check assigns a status based on a value being above, below, + inside, or outside of defined thresholds. + + 1. Click a status to configure thresholds. + 2. Use the dropdown to configure the kind of threshold to use. + + - is above + - is below + - is inside of + - is outside of + + 3. Depending on the kind of threshold you select, one or two fields appear on the next line. + Enter threshold values in each field or use the threshold sliders that appear + in the data visualization to define threshold values. + 4. Repeat for each status you want the check to assigns. + You do not need to define logic for all statuses; only those you wish to use. + + #### Deadman + A deadman check assigns a status to data when a series or group has not + reported in a specified amount of time. + + 1. In the first field, enter a duration for the deadman check. + Any series that have not reported within the specified duration are considered dead. + 2. Use the dropdown to select a status to assign to a dead series. + 3. In the last field, enter a duration after which if a series does not begin reporting again, + the check no longer looks for that series. + +After configuring your check query and logic, click the green **{{< icon "check" >}}** +in the top right corner to save the check. + +## Clone a check +Create a new check by cloning an existing check. + +1. In the **Checks** column, hover over the check you want to clone. +2. Click the **{{< icon "clone" >}}** icon, then **Clone**. diff --git a/content/v2.0/cloud/monitor-alert/checks/delete.md b/content/v2.0/cloud/monitor-alert/checks/delete.md new file mode 100644 index 000000000..90c42a138 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/checks/delete.md @@ -0,0 +1,32 @@ +--- +title: Delete checks +seotitle: Delete monitoring checks in InfluxDB +description: > + Delete checks in the InfluxDB UI. +menu: + v2_0: + parent: Manage checks +weight: 204 +v2.0/tags: [monitor, checks, notifications] +--- + +If you no longer need a check, use the InfluxDB user interface (UI) to delete it. + +{{% warn %}} +Deleting a check cannot be undone. +{{% /warn %}} + +1. Click **Monitoring & Alerting** in the sidebar. + + {{< nav-icon "alerts" >}} + +2. In the **Checks** column, hover over the check you want to delete, click the + **{{< icon "delete" >}}** icon, then **Delete**. + +After a check is deleted, all statuses generated by the check remain in the `_monitoring` +bucket until the retention period for the bucket expires. + +{{% note %}} +You can also [disable a check](/v2.0/cloud/monitor-alert/checks/update/#enable-or-disable-a-check) +without having to delete it. +{{% /note %}} diff --git a/content/v2.0/cloud/monitor-alert/checks/update.md b/content/v2.0/cloud/monitor-alert/checks/update.md new file mode 100644 index 000000000..45b136a8a --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/checks/update.md @@ -0,0 +1,60 @@ +--- +title: Update checks +seotitle: Update monitoring checks in InfluxDB +description: > + Update, rename, enable or disable checks in the InfluxDB UI. +menu: + v2_0: + parent: Manage checks +weight: 203 +v2.0/tags: [monitor, checks, notifications] +--- + +Update checks in the InfluxDB user interface (UI). +Common updates include: + +- [Update check queries and logic](#update-check-queries-and-logic) +- [Enable or disable a check](#enable-or-disable-a-check) +- [Rename a check](#rename-a-check) +- [Add or update a check description](#add-or-update-a-check-description) +- [Add a label to a check](#add-a-label-to-a-check) + +To update checks, click **Monitoring & Alerting** in the InfluxDB UI sidebar. + +{{< nav-icon "alerts" >}} + + +## Update check queries and logic +1. In the **Checks** column, click the name of the check you want to update. + The check builder appears. +2. To edit the check query, click **1. Query** at the top of the check builder window. +3. To edit the check logic, click **2. Check** at the top of the check builder window. + +_For details about using the check builder, see [Create checks](/v2.0/cloud/monitor-alert/checks/create/)._ + +## Enable or disable a check +In the **Checks** column, click the {{< icon "toggle" >}} toggle next to a check +to enable or disable it. + +## Rename a check +1. In the **Checks** column, hover over the name of the check you want to update. +2. Click the **{{< icon "edit" >}}** icon that appears next to the check name. +2. Enter a new name and click out of the name field or press enter to save. + +_You can also rename a check in the [check builder](#update-check-queries-and-logic)._ + +## Add or update a check description +1. In the **Checks** column, hover over the check description you want to update. +2. Click the **{{< icon "edit" >}}** icon that appears next to the description. +2. Enter a new description and click out of the name field or press enter to save. + +## Add a label to a check +1. In the **Checks** column, click **Add a label** next to the check you want to add a label to. + The **Add Labels** box opens. +2. To add an existing label, select the label from the list. +3. To create and add a new label: + - In the search field, enter the name of the new label. The **Create Label** box opens. + - In the **Description** field, enter an optional description for the label. + - Select a color for the label. + - Click **Create Label**. +4. To remove a label, hover over the label under to a rule and click **{{< icon "x" >}}**. diff --git a/content/v2.0/cloud/monitor-alert/checks/view.md b/content/v2.0/cloud/monitor-alert/checks/view.md new file mode 100644 index 000000000..2fc4cd8d6 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/checks/view.md @@ -0,0 +1,42 @@ +--- +title: View checks +seotitle: View monitoring checks in InfluxDB +description: > + placeholder +menu: + v2_0: + parent: Manage checks +weight: 202 +v2.0/tags: [monitor, checks, notifications] +--- + +View checks and statuses generated by checks in the InfluxDB user interface (UI). + +- [View a list of all checks](#view-a-list-of-all-checks) +- [View check details](#view-check-details) +- [View statuses generated by a check](#view-statuses-generated-by-a-check) +- [View notifications triggered by a check](#view-notifications-triggered-by-a-check) + +To view checks, click **Monitoring & Alerting** in the InfluxDB UI sidebar. + +{{< nav-icon "alerts" >}} + +## View a list of all checks +The **Checks** column on the Monitoring & Alerting landing page displays all existing checks. + +## View check details +In the **Checks** column, click the name of the check you want to view. +The check builder appears. +Here you can view the check query and logic. + +## View statuses generated by a check +1. In the **Checks** column, hover over the check, click the **{{< icon "view" >}}** + icon, then **View History**. +2. This takes you to the **Statuses History** page filtered to statuses generated + from the check. + +## View notifications triggered by a check +1. In the **Checks** column, hover over the check, click the **{{< icon "view" >}}** + icon, then **View History**. +2. Click **Notifications** in the **Statuses | Notifications** toggle at the top of the page. +3. This displays the **Notifications History** filtered to notifications triggered by the check. diff --git a/layouts/shortcodes/icon.html b/layouts/shortcodes/icon.html index d1fb7b15a..6016f819d 100644 --- a/layouts/shortcodes/icon.html +++ b/layouts/shortcodes/icon.html @@ -41,7 +41,7 @@ {{ else if or (eq $icon "refresh") (eq $icon "replay") }} {{ else if or (eq $icon "remove") (eq $icon "x") }} - + {{ else if eq $icon "search" }} {{ else if or (eq $icon "trash") (eq $icon "trashcan") (eq $icon "delete") }} @@ -54,6 +54,10 @@ {{ else if eq $icon "chat" }} +{{ else if or (eq $icon "eye-open") (eq $icon "eye") (eq $icon "view") }} + +{{ else if or (eq $icon "eye-closed") (eq $icon "hide") }} + {{ else if eq $icon "add-label" }} {{ else if eq $icon "toggle" }} diff --git a/static/fonts/icomoon.eot b/static/fonts/icomoon.eot index b10672cf56d20e695867c36daedfac6ef5d8cc37..c76b18107924e06680dfb0c6daf4a9922113583b 100755 GIT binary patch delta 814 zcmZ9KT}V@L6u{5f=Do|iHgET1*}lw;-95M=(|ZToRF*-IH?R>U7T793ps52tu&0?t z7>FV3!M>jQz=s}$y#;}U4?cx~1QtEjL)$|Lktmt#Ow+^*m;e8F&i|bM`CabPIL_Zi zrv4PbRAPqFOe3Rf(cDb4ICCMBoty5x34l%jc+s00%FtRxyg;kDH+`$ewEW=#@e)96 zrLQ}6!}Y9w8ldSZ<+VNvSO+)<@d~l8uYY)~E`0nW@dnk@rw6a6lCKlX04)K^KkiSB zWuO!1h!=@#22%ai-H*;5`AvauRB$gdI5Z4KNyMlKdleBfyKt`|vLQNr7XelHL zdZE2=DYt>1;KjnHVyHM@d|P~1`co@MF8`E&$Z5G+nw6%c`_ut*34=4= zX3%TvFF3 zRMl%XyE_bKD`T-3k@HwMZmVRnA|Jix8|M`%7*OIo&oar%N>S7`?X;!p%Wd8-g_J;S zH_nL?#apXv(XMS1LmiA@v2Y%0!i7zdmP^1uKZlTi-ux2(0>bFGX8-^I delta 321 zcmdnc!g!*Aky0Hg(g{2f4= zBR!`w?ZUAjULgMf1A`SqMrvY;>~yXi1_o;&pTR5xD8QG;EeYiR0Pyj3llx zFxUXiW7NpWPfj#tQ<=rUVCw>upO%|gQNR$vxB|$(1LP~@CFV+|&h+B^4HWnT)X-Lt zUtGe#43uK9Z?#LU3Mz{sHR()y+SOUIW!F9Rn3Vw9gO%_PH{B_=L9 zO|(n29jJzJav+n)W;c1fwUX o*qJkWZJuMN%sBbD{RCkrsa4WeGBq-{WI-wzf!J$vp2HzV02T02$^ZZW diff --git a/static/fonts/icomoon.svg b/static/fonts/icomoon.svg index 229d9fdc8..7364c8c24 100755 --- a/static/fonts/icomoon.svg +++ b/static/fonts/icomoon.svg @@ -71,6 +71,8 @@ + + diff --git a/static/fonts/icomoon.ttf b/static/fonts/icomoon.ttf index 70f0b78749a48536fe212022044729299083c94c..d4b5f62009941a274b318a32ae3dcae118168936 100755 GIT binary patch delta 821 zcmZXSOGs2<6vxk*8Rt&UZN}?;Y0kr(;oe#3AfxvVIAbCPLEgY-QBn(;N=ImXfEKnI zQ-}hwVp`a15m>lrA5{(*Uja$k+QR z;2Ct+kX|Ak?jIN(tB+N^C;gLZ8nZ)Z)2YYpivVpA^6w0!$A;k)&XHaqT|1Z_sP4Ue zbl)!utWd#~;h~XHu#*Mt*_%%$Ggs*ppn2@z0fbsJVYZp=reSuOC(RGVXmP&yviREi zZCRxf@?qCMvF*Ru_R;z*J7knWT9v*_U!|;6EzXEj;x+1x`3G2)pGT(f6dlbuy5BnO zK-*oqItj;Ut|+QZ07ZfEAma?xDJ9huiyy+c-iB&fJc?TLrfP~wGO1AAW~LYA0LqlE zG{;eo$&$dJ2kmQtZf(4b;kZOZZIBc$rF2D(cN!DA7IwMTpXL7bQid_1X(5*@&~0;h zoGfcccaU|v*DZ$!xt25GaZVK*B5IQ37-y=yTo4RhKg?Eqyv!+LRE;FI;%-5tct?e| zrDwz8qz-mqS$B}yI2}-Wbn7iaYY+)S0*(;1q7t|AmqjYkNW0u+`A?O;9H9|efZnCf zz82Q>38S-Xci?Tk1GfQN(`=FNIWs)ZYn7ah7n+dk&~-x;c81-nyvzSpRz@2(0THMH z&kGvI7oKaZ)7SFt;)Nb>@&~vHj=trY)xyr6UrEH#DEN{g%*R`24vro8Qd3`Z%NO?d a`4{{}N<&%(K7#$F60p(#!56I7hxi9?j>N?P delta 315 zcmeBaW?WJ~L7{%K^<-`a21XeM28KE5iNys#S^&u30i-$7b1Ks=91G$F@((aDSTSUz zCZ@iOPUnL{Aq(a3=;u-^k4bVJBjhy`CL{m1ESqu!e zEYEZ3X$oB@E0!DF*wNi94Dl8-Oes zpnI4Zco-NN6kb}tw14UN(&uHs%ppqFtixljkuiZa&D!VzPOrIX9b(B>NW8cz&C&4BRXrYZz`$eY^-pPd;F4 m&gixIhpjT>WM%sa!cJ1Fq^)FXWNyiVR4@Xu*XC39hZq6VwOeKY diff --git a/static/fonts/icomoon.woff b/static/fonts/icomoon.woff index b043be6595959349c702c49438d5b476a0978824..9d4279f587ac469bfcb827332d4236156e742b8c 100755 GIT binary patch delta 814 zcmZ9LPfXKL9LImZwp%N0w$-+qI<^tEv^&5;2JI3yzy*Sd)`&YO(F2(ZERlZ+sCXJe zVl)yA%mZqS9yoCDwu|xL!FV>97y}3I%!9#$CPV`Mx&abi^38j{Z@=&N-sdIVDz49= zdhb$iFCfs!u7g;e=S#m(U1GS!rbuyxoR!su;oHOc$q4{PqFUIOZ+PVX5P2#<`l};u z?aR}`VEz_B$0lVgN1<0O3k5O(Ivc2tIr5B&!NTa&G~m zp^~n2Rk9Vk(pR}!dV>+XQu=@)?@#}T|FpKO&1;V-i8X5165}d!jH|840_gTu{fyvoOA?D> zL=wfFJRgL^^pSOKrmvd7G z79>fGP#ZS~^bWB1nV?OGM<5O7h*~#@TmR4EcWC^F+^*7VIap+gjnKmMFpcbX%(Q0h z3w?(--meencA<8i8v2nnuPBOnQf3sj73FTrvNiSKwnr=P#_^qsk!Y?GB2WWGQB7GX z3zp=rZ{NCmXTY2J4IRq}<=lje(H?2<$&FaD(Y3lRq*_Ow^IDp9AF1nQT3oJ3XYJjkck;Ju}{A8dy+X+B5(?Hmi%}8ZdZej({VmqKB1_dyVU|f-xn41a| z^8jjW1L2uooWBe5i%Wn$xG?cgcVYujp$vln12Y2;&|?ZOtzX)|bbRUaGT`N{S9-5D zyxRBb(Eq>x{{vM44SmUgCc76Z%lQAXIEy%=ID^zV&bCHM7u=Wfu=G7gGXjF z4->1&=BMV|Y%-GUTSVjeZN4&agTjY_;pWuGi(vF*9y@bJugxxY%8Zlq?I*}ONv)E$ flBtooB@0pk3U)8XWemI^4g(X=T;a{e4oevUTg-Ch diff --git a/static/img/2-0-monitor-check-builder-view-toggle.png b/static/img/2-0-monitor-check-builder-view-toggle.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b64ec632e08b780d15a227080b9027d74015eb GIT binary patch literal 19454 zcmaI6b967kw>=o=#y7TY+qP{x`NVc|W81cE+sTb>+t%Fgo8Nmgf6SX+y{fBfoxRVg zQ@eWA>gsR>IdM2>ENCDgAUH`05hWlX5Z8ZotzV%3N)WG$+J6sBXHgAjWjixxH$z8L zAVCv5BU1uNTSIeGB~wEa4~KD69v~o43QH9YXAM~yE@L}eI>Z0i(7D^%|3d=-@$kFb z8yZ`iIujU~np*;RiEcW3i3luBc!|_mWf^4cg-tCiB|IHXl|AKDj6JQ5IZcT8`3QL2 zx&9H@nmQX2xZBzQoVeV1iT;b1>tFpp-Sk8R|7GHA%}exu2c;paKp<@AXiC6J$3|<+ z$ihm%&Pm6}#>~RWNkhQIz{o+*z(LQ*Ov}i|#lpbF#6<9aE~0=6*FVg>e2)6eBLkn>FKWX}xFnV`GdwNDXhW`xdzYS$&|Nl*G zZU4vG$yv$t|B3hilh{ec!`_r$$<)ct#nJfR#F-KQ$CW*ou%oG=vz?=got@2pXHmhz z&e_h%!p@#RSol9#<0PPvH8i#a{HK%hzfiKWT#^7MXG4IosiX)m(LWwKOG^_j77F^2yY`yWBr z+W+$`V(Mt=YHA|pXlG0CUjyf|{NG~{`Cs||57y*=jYU-Sf5p=O3x@tb)BFFL?*H!k zr=kB;|3|$48vi4IQ@}sXJN^^5P_1_7dCh{=jeD#+V-m+X8SI{Q*k z)K5w)5omoeGI2P6{~_|(?1lJ9;|RWtcB_pa6d z`tkK6BC1SB#}&Ewo}6CF#U*a<;Ma5V85NTy)c$H{>_AofT(kG-;1Xyt`WBs#D=njW z@%jz0_uYN`mX*`yX?|I|`*fLnUAp~ZZG15>vLCtl@(qmh_Kzm2xcBmj^z@F1P0Wvu z&Gwvm=i!lZn0T`ve>1mmRo5_k`uK722swQEW?>Ory!~Fh`I@`_A|<8oJpN#n&?7Ft zZP@?J-S~)(&(${o@bSq6ho=UGCdn)4xqF8@xdmHTxd{s^#>C}>MP>N^N$?4X;pLO@ z^o`=?k#ctZ?(P{X+40KT@>00<;o}$Ge)OfRV#LlN zA}pdL+x5cBEB*TUQ?m7LH1sxq^KEJEQM3D*m|B#YRi3~39x(TQ_3}+s|12l3>lYL+ z(*7dW{*to#Dctt*XYTFh?fd5K$8qu%zv@xE^G!@##eMoMFeEW!?VY*dg`oV-Y~(FA zF;7X^P*>mf^y&Nj<(sYPW$NmC`s&Me{5>=>JtQneci=^D@RglI6rX^C<6ntSK|nxB zRQ1HcDTa?vPC!6GSpCewA;vwv`33|eY9J{hsN%kU>En?{E2+5?Y!HViXf6mA&l`pX znM@#5|0t)Nyv%IF_`~1UqM~i%#0pUT%H{-tY?yWc9`-S;4 zu<`9LQ0N0b!cS`FDUdJrRPdYI!j!Xh5IXy`3_=1Vyd%5*(Cl&J{cFjb_`9J+8+P&D zJuILi{~6+@Jebh$)_a-&l=cUK86p4khL^8%Zx6P_4|EGM8n$?@e{ykGcKb2s`f(oH zlPp$~YzEeOB;D>_pPyx37MDbxn{9SB1u9u>dNNOM_r|OYU%$qBSM)>~R96vV{&4i7 zYQX#T6NCreu}*gn(P%bQa9e;FosC5zR@ZU@C^M0tyz}4vgJ8lw?J(wdLdkydusCXn zRnm?#{lotDlGS_Sk?GxIlygd-HQWn|6O49=>JDEM%tqw%ARD^^=QF6TfbCA&vMl3_ zi)%^Lq+1hq#3#@1jK9Te5Xle{urbo(ffs#pFee{AccF7f+1AJ0_-7%gVITkj9xkr?#CX5~!jR7i&>c{Ea?Dd>Wn|ow@3J&D z5AarY`fbKKU>!yeTkO`i@RfJbU4Q8c0XR$^{6$UpJiud8v*!FXUUQ2H83b#Z)~tI> zH7LWgYHwrc#UZu#5yVNF$ZnG>4?2+2WhfEsWvfRa1GxTUcedpkFMLeg$bRYo{>U6f4X`); zgqw=>4ym8oessEL2%R2!fG3(_Khk`A==&=8R>*z03)lhfCco4^CNkZ8_0C8H-bR>O zfxW5xysqb8EcK>gj`r3?b7sh8DCO~M&vvBWLh!ls?E{yZrL*-+qsFA?D}5~9+yI5^ zOXKaDb+mIDuy!YK6q^v;R>26a#mvmZEHczcla1y=5$%gF;S@5;47MUbX9Cso9hiY` z!Y~V<>7pu!404V_G!+zY14FFdE$*vC)rZ$^0Vf7PW0Tsi!#WKso*i#8d`^|Hf_n^1 zzU86QK?)hFEi*FHZ`@v*wMaA@9X?x9sEA<9b;AkOjI^--j>S%6#5@+sN-)W>JKch( zXgQsMQ1COpD>P^c2@}OTF~7!w`+EVZiIgo8Yf&Phztcw^H%l}K?85MU4nC;yHqDfC zr(9GRU&Lcbhj0qPAl*}7XcDku#iwYo zK2&6?!92w#?2x>ZVun&PLP3d*v$nIh#-!Zq;fX}tu)xTN0!dCG3$lhPgwMIn+&`YL zmAFFbf>@m)4m`hWKVrW%Nwf8(2Pb87K+`$pjV)0$QQsCjjQ{1x&arlo8MJ0;5yLa9 zE;!ChxIz?akMbAUJCnJ~mY))Qk0S3W5p#(TrCp>>G(KNdd=j&XM#wctpsC>Rcx!(j zl5W0UTUH&g5PS||VimNWV^Dw@9D#V-x>sQ()GQ8-wg3q$#-EkCh!QTHAe?+edro(w z*=YsK=%CYqoJZ|S11jytzu_9UQ@^Y1#cpEzb`=;|EJZzb{bh{$5a4)+uyuGE_X5lV zhw$qjOXj{CPj{gp;<#BJ3{a0o(m;Qm3IAX}Ks1;7qK#OlRkIU6{9#O&rT)Z@+W=nS zoNQ{JbZ#TA*fh18-U)TQq;bj#gxdA?eQ}3Xzo4rvXMT;gMe*E8zWFQ0d3@cUR$H|Rw^6=%~o`Gvnk+yLjfRJs-&&$JJEB-ouVI{r_@`0Xz z!+pyBjG49ZEq8MH9t%9a;p({lRb^B&z|(1tm+N%@aF;iwLS{_#AFq5*~r%o zV&$lZ)g8_ro_@7)j}e8>iA@IXfE$Z^>H~AeR%Dn(`ZBEMx0nmhBu zgz5&m-nC@pureNNO+I3@V_K}UtDxZ&&KJRZrQtRz5y>S}9oeRa=qhXqXEbB~o1mcH zpr;;anpTo`(5D178$(CAK|`rH=n2*%46vZ7*0z>BZL67qT@fzu+r5R|D@__1glV!n zq>(gpbYr}}no4#Yt+iN|e+z2dhd<;l#qD5N<)lW`zJO9EVy2q#uPO8k4Y0GrlL-rVj|hW z8>~HSx$Mct{#O8P?P&v)x)AjmRz5gZWMIGnJ%r*6_*oON$gMbt{5vUJja}{ zF%Kn3!3pg#>TzT&sPF=mk}HCBkmWWy9uW@I6ET0@6W*Jo{9_Ey#0l#L@j4Kk6c0|3 z;Ql+qviE$(`$*-ni8t=RM}|dHUm2UTR`O{drCiUF+ccM& zoX+pGm&WE-@%{3G>U6INH^PckQ4^3E(lO-a8pu5Z(DU3~V*=ligBOc0$gM{5NTBfy zBVdcMpt(3Y*c_niWOk%t^BFlMY9zM@we7l-VnbZF20n~?VRvTzecXb(k^YO$5%Sj_ z#Sig2C5@9E9n8T-8oR0%Vc8=c%U2ty)~7ai zXH{L^znQlbl%=m0DtOl6+@fJig`J2hK|Nw1n-*@R{83>l5!A}W`H1v{j}Veq{!)ix zfh{GwR{h9#HPzppw$cc>%Lj-+swt7mnoDCmw`$InqkrSJ^w}K z$Ji-sNgxCxsl9#(r}=IaT3n=pbP) zQHVJPwJ+mA;BR*{mO9F`WV|bs0d@D{%&7|ykxe=XpA{&bTm!-{&SfBJ2bCAZ-_z*R zYyY(4=69!@{^jks`qp8`5z3`$pF_rAkb72Vnf{)*iy7cqcV9K=gu@TNZtqUFLs<*W zC+KHi1~_`tEGGSq1Cde0lkD3zoMcJo;6L&q%l`1>atC>sv!4vs2ER`zoi~kgg@F8drQda%XB3xt@KbBoAQ( z^kn13#i8R>8X0USabd6RxAVBZ&LX)@_74Gh$k2~xuY%(|t4bk>)(f62$WSXJN|@a% z0?gR2&2uE&sekA>vL$e{x*}mhyb`bVg@BKBzd4Dkn0UFy5AQ0(9ihK zD&xZ&YB9zcZYxk*NZc6b$V`o6+8~ezDx7^5oxd>Ad0A&!!c5YVzT*+FM$qHZL7qrj z4Q=34h3u)FD6gb)Li3dUW+JPH0_{z^DQxJFYid7haNJmkgv}-X4*ku$Xb{lt`v{6a zAaWq+SE=RKVJRJjgkUC~F z8dVLj*!49^+diYnV5qOFcY<7+fXE<3|^C@QAsPk}Jd(5>NdK|rM7(Vo=T(*5d! zry`*qDui9EM!i6e5v|%%mEpkLcakgL2yQANkP?)Fb^vd!`nHqd zO%utsr+HXLI+MEpwwKftLbE+jYcZ@y<4pZ-PqIQ&A2PM4iWXLwp)f&=%MNzR*`q0K zok-Ob468v&FCw;AC?|$Mi-SlrQ(>U5@J~E;RfYS#|2k|795tSAu>EHim-)J;yx3GPN`N?E`q5`fE%(3kEFih z9CcEE!8}5IP><_8PH5UYWx{~LwGUPmc5-CWKuv8HS;T>Y(%y_{+{2KlYVgd8_`&jL z$YJ}H-jp~&(Z{q|UBH5@2sX$-rD2SoN=zrBlJleqy(cQ~VI#MSA3g`0Saw2Jw3NZd z=CAQ5$j3|2f$701i$f_FN3yA||7RdJi$X4>l$01}U~auy%P5SP3zA{LgtbbgnoJQz zeXp4*d`6WvvS#q6k0z}NSH4;Qw!I?*fq%A!}PPWy1w8-=2u@z@9q9QGS$M1c%&i-3=YU%=mRU zHvL{&z0cI`xYvWOk2x@+G%nwM4U=VniuImb-S1=@5+E@s%MF+4O+Eoogmi>~O#NoM2v-j^K7^Si)^idr^9f2^`7$_1-TA%^SFhUIs z6At`_taVIZ)-X=tu-&x7>VXS3iIL1F_1Hxe%#NZfOJ zYjw#)s)-r8J66K8_-Lj<>8LV0j{8p1TSi)(`*k_F(^AG*T%FDv(|aaVdS@h}EI_66 zqB;<1bJ-r_k{SW_bUHNq(BsJW&a>O<{Swse1vMR609B;d+t5I$g!m5ktvp<5bzNgFmuVev zSQ3`s@(65UZy8*76ysocymEhaMRc0Svwu!(JEL(9gWD#RrJi(RW=p7 z?AZTz*7ngSb!KqyvKNR?<%4wSzAA;?#9d%}T#yu2aa={_8;t6v2|z(fGZU$d#$`>2HZW zLIHimU>GAuR@cTQ0VlKZ;U9;#43DE!=ekzOXG1eB>NYp9YsQMzH z(23xL%@k@i31Zt0?pzNUGoDHQ^WxjNMlzU@iBtebL3z2_x3U@VF2)K=(oG0+NJJ_dvU&g)90QP6OW?#jI@;}!Z! zy;KW)&Nq?^eBRh&F&m(IQ3V6i74Z@jBqp?P05M9Uz_Zi3?5yEa3>8esOsRx-emR#n~5MLC6q%Q;avG|cxxsH zB&t%IA*nie%RB82jqtiV7ZfA}NufXvk#Np9ZQI|G96GwFib*j9f$K4}Np)LdGFVhN z`JbtMB5}WDql|gdDRwd=a2a|<_Lcy&I^I>);|?fZgGRrx=k%!;sX`LvuJDU6VwUe2 ziE>&Og;yO-e1k?ehI6#SSm_FK=s?b+a79+)(&W-QHUKC=v#WF+5<^w zL~01OYxt>WpH$YQwVFjXM>T^`Q$_p{^!LuoZky8~<6baN$m;Z6HJn)woVX(&aBDBzn_$&Gg zYtabQHOtftdmdqQFC--)A-~HBhrtClAFNy|G-;Q$M!bUGaM9)16&><5U~xavCV|9M zK%XaGVsy%~DMXvFc;>cW(W2PDB;{31J03rL1&wxw!h5oii%<;7n>LW0(SSh0n%&G| z&u=(os{u=ZYRIBFYyS&$Nkru>SniV)LEDABp%l7Q0Y(GdDgEp?dji0dMX zF^Ah^g03tGDP>s4qG~ij5Y(P~f_T6RFuvCS4g_DDvFx*v5Fi9=S-7efEf0dIt&V9I zpsgkRYr_PrS@ko%tirhAS|JyuZzTdXb80xdy%qWQ%5uaxh1&5PPQ@o0&8~;#EgTc< z#UMs1cYJx;tyuJiHthn^Ug;jL2|oO*C9gQK8ny@%UfVlMXGhjuL%}pHNwcz3-XfcS z!##~OMc1l&!qXi%d5C2zl$4~689eq>UO;Di5X#aSc3IvpL<&%J$jNmYNa960au4e2 zB|I(E&|lwhURqUSxNGM-<4090NwEkWfHjH+0o4PS+~=qr??1LqHt0TYlSZhfp1!7% z`S8xk>auEm8f(F6soK&xcRh>_ts~#=!x;9$(``}8yqI>qJ>Rwx`p~GeQfPBKAM}8C zHA4N&p4|c7S?_yUe1Slpv8zz>T^~c%fRe-R(lSHz>(v`Sp(t_#7uROt;a_Ib0Z6zh zEHm}4IH9VmR;2ZcpC6Whzrw)7Q*so>;f>^LVayQ{s7mE1}}Zxr{?bG#=Z|n%;uriVh``AKxIP!VB<6ZRAHhZB`*e_Ur%aQ z98(ZHj~-fId{(~gG39y=t0@z=zSpoBwdT0K+7A@kbmvh>RH?H3bK8*R8Spm|!n{BPP z04x|62e#B>P{!A*ZooO3R(vn7a@d2=WJb_C41_^QMc51sn_>v*Y4Ip5NSvH(#fM%w zDV$rge&cSsd^kB3uG$v7ZJ95jgVw&sl{vjT`rlEkrhpf)nBrDS(lif=>m3=_kHO}I zX5u@aaZ3pCye1Jd!+hwg+GdzkCC6pjlw}1-ET&*7S*wWFhX+xbE-sykQ2KjM75Suk z6B-x$Es9Tpfpm$l-;)ieK^1a=r9kwr2Jr>K8_ler6F+`>e4ppuM~QrQkB_;$fm?bN z#bJSz4ao&}RM%c6(})c6sM#26G=bv zr6hfn+2*SodO+afxbv8~`ZYG#CDf=HeQ!f^KX&D*Oj_$ecoIrFytmHIRt8OjS$^tt zeSfa?y##tb^nXrkx4tHiZeM<8V0s_1`ELZ@a^yQcu6KS8Za&fwzMeY$9=8xCUifaV z@w-2I>(32&+z*TjEv(e9EuQe6bK}&&pLtyio6N>_38i)FzSYIolmnd7*GMv9$6z+V zNF{;MX@>=W^+o4)@O#UCe+SaYN{fd-IuWQU6<4Qj|E1@i z)i0sfk74KbbzwnVRZ)3rRO`aJ{#(D0uz7iF6S2`cd01PkTlw-efXQlw;M&n8x`YdQ z_B};um&4D)w7kKkYd`tM`{e7s((CDDY+kNo+R;=qbb^AU=ULW6)gXeAo z;p6M-<0R>1)A@?eX>2n0ZNl+ta66?J=ULtx*r3x|{Uz|_`o-_Wr`gHSG|>oJyq!C1 zQ5J(hHQ*1{B~8Cxc}23qH;dA5xbd0_l|>m?ztQ4-Rg{oP!K=a!8*vwc=>04rH$l|M zf*8+;3xU*AbKq8O8w({sLEO^GZt%a^$aK4q%Wc$(heTTSyR!Riy zxG#<7=J;CR+)P^B9#qkeWDh#lbAT>SpzS)|TlPFS{;GLYOh z%U;0DvUP-AEI*b}5dWLCZUVHla{bb4pdrrbroBvl9S4T3t`hOJm%ADF^E0(ld-0*4 zBL5@7cfb8neX;P+KYC1`s{b8<3QN)2eOc$XW-GX*TV7GREAy?uG{chUN0Xy}UDY`L zuv{m^!lm4eR>9(;1Px>upg^G%!Adkw1@JmVE@VxqyI;j>D#|Dc`Gk&~dxUYekCO(8 z=_$15PTBm-8yJx5h28jpEG^|{jS+A?xL*@+UD^71d{pk)t&pD>df7cfxX<@{*y#P} zI{Nr02!JN^!UylcQpG?K$1i`}-;q+Xj5$q_ve4zxLS?h_GCJj1cXF~XNCy&Rdw-6@ zO~U1}FAn(&r@o426bw<%lG9Ck0+FpKWM4~Ul;xT8l@T~EZ#*Y>YsVU%pI2%wq@O=l zcs#n#pgz9PtL=OSzMs*1_j5*Z;6q3Ma6hNke)auK9J(VnA5+Aykid`|k4hF8VCU-U znioQIHtiv>T}McvE5`2}n>4skNP|JopDNKhAmgww`B#GMpwz{>-1>XIihIsU1>4_a zO1OT`ha2Ii$9_9?UGlyisKUf;32j~{KK$f%`}2Gy4_xuRI6<=}rQ|ey4lgY9S{j-B zIYA`8X3M8>w;Y8(a;PVy#sVJ%wF|$TsHc{*QLUNShbTvc(j-90IaKqmJDm=p zO-K6fA8T;tN$3=JD1M4ip>ror5!7d75iBo%!-u~QY3w8Zp_#Z<^TwK_M+1ZoWwmdG zrXH0tuN}F?n7sH;0qs2G{5l^U5@ zF*91{pH8!Hi1YDyvmZ44!FlPENv!qy*x31&*6cuIb6eqktMKB#jlhnK+tT00$0It* z%~BpsBg097htm;2o{YVuko z#1>xR0);niAu*mFR`ginhWpHa-&dHq9hdxvTgKb$PARF>#B`7IVgVlf3>9SK=H{i& zyO-w(zK&l1djtP3ik7+XNdn5PW@5_Yuf8W44QZr7hwO9WCF-z5X`M0^qCY-jA;_xa z6Rsrjw9&@a7S*mU>9bK`Vv?)t5Pu4&g!1>7Aw~ppRG_D4{1HT>_<-ozuX}TH_#ABl zF4qyqua`{4CxcreW;4^IpC03w@6sAM;TZ<_&QIsD6N>FixT?X>XgcqPV>v?Dcm|J(`B znM{V)cE26l5uRuq|J#^2EvuWgzhA`;^4oc?@7-z`io5BEjgFu@$ce`V=RG5uFZ^tE z+{G*fD4c*DS8gs7C^<+x9^zQ%vAGL>tlYjE8rx}~A;w{Ao7SrVkB!E6Rl~uyP#PFX zctJvI!eI*ZJd`ag#D;j~q|WlUX*ckE9n0{Gj(vw7Au#)V;f1D~G<+B`jU8q-q}%~< z%{9EWF^A)m5sASOZTvlP7)-OhN#?oHnKjj_{DW*gRWHqUk&bL&JKyM(kYY8-Sj^4? z==HlvT&ZBfWLmkIsW^{5+W0_7WzL$U8g7I+Gt+%uSTQ$Kd!hCIf?;x_W_oY-dp4)1 z(2Mvw@tZvw+*_%}X0^C0r!rEFmr6|uB zo`gkg*2DYdhJPI?V@3;!>pYUD8_Y~Y z7B163WUW6+0lZY$?n$E;aUj4lZaVjFHt<_V7gjPdtAcS^F_{!_IFgD(*L$@RjFt15 z#%^!eR5gJI?{_o8+D&g=?bgljbF+7Qc|V2?pT5!k6dwAee3NRrtITJttDj4G$36HS zLXK8>KL{Ucy%617x5NLVO^Ww7;9#*`Rwlf$BUnv@6`;4jrS&tvq}isz28D#?wax*} z&hsyGktUs;Nu>1B7U3x<&5f*xc-7%oHqj{?EeD7MCcF*Rg}aowMkt+I_tyomb&~&1 z*2YHpzwhX$HZN2WW<&XEcH0nqjwmxC`IG#%e%gEg$s_muTga7PMtWaAc_CK61&zCs zKW&UQdJMa|K9qSPnMNDi!7eHBiMX%H#Q0CsOscjlQNf)K>8%8q>@OK3Iq6#NOZuNw z^xh*{JCD0a{nnb?p59L+pMP&J&9?@9pGos${T~kNhR}j>Gk}}NPu6d|M1-CzQoGM~ zkjLelO?ver!T~#e4RQr>8Gfcr^2Jtfq9l{9+T4mJa0~%ON z*xv`kGB)VU(Yj!slS0cE5Ek|6ZQqDB=Ly4A00=ov0O=e=0})04qLON|TH`qP(iHe> z6hzYfTco^vucF6%BwtE%NUxgS7rq~lcaPuqTWC5XU((E1Aw4KSoWj<_knizEhU8pH zRjs}mN=9$YV%jTGa-`0%d}}^tSu_6U<3$`*LwQw=K~l+vbclDUk<#zhgTHs8R=XBq#p9<9@#i7Pb;E7gqKQrU_EN<+0=YKdAO7k-uRj=r zmqETSiV|A-KS4+5JD>M7{QO5SahEBTcnWg9Qv2J+^m%x{s>P#d8>q2uAQfsa zv??Q8gpAl8bP68e0342Vpm2KS4^HzAdpP9b`g>V6f4p%Jb;B9tE^!pD+Pdo9P+$Eh zJS_zQwLaf)2u>w9L#^H$#t0v+UpJ-bNI*KZlA zxXSM^8W1sG%HoRjeDDY~yo@FA$P)ur{d4 zNLg%^KW*lC9Xm2Q=9O6Z;(pJkb;*JsYx#CR!S!R&F+F?jGVf5a`XGrD?uxSW-LjeS z0lIf&*=uxm#ubHv>vg#cLp!m&rAj!KB~3u}B`QCDoe63P`S(=}0~6Mb;gILupxp?w^2A&-$rA{WY@&ozMWzg~>ht829-Mr+ey z(5tHw4s;By?a;drCD49M9Q{aS8z@`bHg zix!pCmB$%E??ILiO@rU4Wg^dX(p6z|C@Q&^P$F;B{qTVTMzOzudW{V#j|~G^6W+Dj zpT&c@*^;U^v~H=a!7*61pfijmtHwEui(zQ=ZwDYZ`iiL%M~Y;d4!HS9l}~5+$|CH} zWpLn3ja#d=Fsg&pKwd~3J+U))=KCxxb;_kfj2u=8ifO7jYbF5Y18Z3#r&1AxP_u^> zSx`Z$HgBe_wETvy&;LH4Ch)^)s5w#=+s;KyfWm(NDzCD>ILc9uXG`bVG;pM2nSiJy zNd4fo?U~=5m3+LLuD8GdwZN)kwsvlZ`UIrP(n2EBuQh9V7FAzNC`MhE^@Hn5)08&T zxmsuAjXDg{h$DCQlqUxGP$^RPKCQ7u)-N%ZC04P@#!QlNSXD)&NK(}>`ne?>dljpx zs7Ax+#D~xMl`$&^89GC~VDHGK5h36gXqi? zHM;yU&)birR&8yJB;#!4$U+RL#a>k3^p@?g_!oQxFW!_4_{^!oFeKl?So&v6) z?_X=b>vT8LEse&ZBLC5;X#9(` zle(z~To17s1%0#(*L+ zu4kG)W~wi%C8maG{b0hV#IjPbWm7U@=lZaN9ws@mtiTdG zd$GmnOxa?|{guRAZbHsTlC{x;Rw7};@7Nxp;)zNmu8jCt0}6@xu4~%{K?{q|xb9^t zrR^dINIGn@h}bp)?F0+Ps0rWfK*a1el0cvil_i;Sw>PK`sGy`b)o<;J zxWPT~LbfFrY29Y?Ci-oZdIg$Q&2s8zc4eEq2|g~W8s>G3qskkkD6 z>jc%K%L{scII`X5OI1QVeXV zK`Zd9+7yxq<(4fdNxl`;*ye3y91M44^`;%vWDp95!p`y33ZORV8cR-sl@1No+NPt4 zN+R6m95zrASD+@6UM*v8VlNSDSh2-1z}jDb6#eo`s>l>kwx|4#185+l?YZBsBrj5- z8c9KJEj4W7TNwA33c2{T{1t8&%FyX*D5 z0<*;HF#t!#Y4NaCL*}kA>r0c8q#dTXHL6z4^0c_kwG?!7YQUXWSyUTRSQlfYYV$H_ z5vc|_3Rdu-mD3|K>P(YYOHthxAvsB7eL0~C8D%HjrWPg9zEJ%1LlfCLTS`Zbk4&TR z2B`abRYw_0`a94DDy^^%*9yaHKF+U1R>l?xF~t#7)i`TvVKA7=JBso4LSD)dMbZ`r zL&?WXi`HxlDB3v(Yhc}0dr8xaRAgaYYc>(f=ny3+RTzp^Lh^zL=Z1j3Cl@j4=G+8k zu4A!B2}SEI$9Y>Tcx_j-z;gL4nfpe{_~f@C*}E-!U7EurG(VX&C%>K?%1xD2)gAWM&krmr zA#Y8CT8#>@})pdRHX_ z>1hz15nEcc7%jq*quLtzzPnj#o9vp)D8KTp{~d^g{&ICq;3WGKckav_!{w?ficg7V zeL-(YNtC~c>*6Mjvw?u&`*_Q8hEP?-&iCJsNVr*Ny`JPQvxT6fGz$Qk=rXqW2=lwvXt{DpZb->TYbV zgK1km}#} z5k6T;^73y@g!FRuVt9|yqh^QFt}=)^wn=1wi+H;6!Xi-X!`oll8J@Mf?*yfBVz8~a z6$TSRZ^O!dvXc;(PHox0_cP;%W5vV*p4)irz_}?hGQl=~)2hIvRhMFb>iOuZHf+f+ty^Hobu5*~HCC;QRYkMnd&hc%^*U^jqNpQpK zMnxZ^rO@W>I3UR{TA~gnAN$yaV#mf(PkLHKz&tRlNp{8p z(*?a(Nz)!N6GKMpkZy#|roAT_kuPT75P8_v!-if3UC~}ZJgi|7=u)Ulumwz=m-O!1 zDdW>gDfZdkyk1saGv}((OI$5(nP9Vw7)@h4uhzn(cI&!6VzCsd zyG)g#|3W8u0fC_MG~&@Hg}8^kkYYn%mtNwu7e;OEvU+%lN4N~%Amzh>7)w}f2J=|t zs-rx`kadt)I1wfu&T%~^P5#MPWV^>T5{ES|5Npm>6dXKM-F5D|^Q0|j)!E|`VO|eO z>zc~BjhVW=cg33t!}d11RLCqncIXt+97C_&oKq1kzPWqVbSDs6hnM=7lyNq*f!n>i zf1sO6@^AII%A%}Jy%@bm>^!IB=jCyg5}}T29i7D8*%L7;Cd(P(P*A1hA}=~=oA7;A zR3=rGjvwRNmkr1M7SrGmwq%itdO5ryXc#FMDVQb?2k|w|LPR_rnsb9!^qLkc)LEIg z7b<~Izp^il^13A06;S~yr*+f!Tnb^PEi=^}K1ygjoRVgcvRw{hy#5BG-L+EGZ~kn6hs>c2C|q8p?3pjm3GFzpBk-g<;5ww6c2ZT92RyI030hJ-Oy?vrs{^cE+G?*9Upm-^aI#9&SpPPO^oo!rr;-$aUWm0CSM0yht} zYNce4m?~N9a#(7U;tS~jGg~j3t##38OY&gm4vT{@v!t=jy3h1r4p^a6O?K6-sJ>I; zVZ<=jt>C%p5NL8QUDkkwKp`y+R&Gf*!!E2@xOaDj7&IdWHm@|ocGb3Yl?!LGZI#z_ z`9LxUR!ElU37Mer2O?F?D5$jOrfc14I~u6&`JF}&rY2G49gblKiQOXJu!AZKYP1bG zQHw!zSw#zu0f!aUWN3`gV!opQBTOzSXP&kcpzTT|@ZxtWb%dAd01s;^C&8?#iyeS_;!Y zfTLb#mOZeGoT*xt;}^wczO?j$uB>I$MKvA9IbxD1PvC5e7cnZu2TChxLLoKicS9}LQE)+l(+ZCYN#F@C4C1W#75qlC1x+)2Q$D=cj2{<0xQeGvxtJ{=hiiLzd-pBiA7)dIIkEQsK69Ir z+|%jdvu63Xu^jh)wh3f=cuBiCd*H=;cVHWK)ZdgXdIRF0IbnLczSX%SPBjOLzviha z+8UA%(c`el$2Q@efS1F!bQ7t%QTHesTX%p!IaJm_h&m#EMp zhv=DqAZn1=06}Md*9idgC3D(ZJ?aT)6DDGB}g+~}OAWQ1}9^e?RcE zp#4F-fz0cC&sCH>?_yh@9;G;e?rbwZWi7dJ^hA@`bm2rT`kQ;1gFrg z{FL$^-ccUnwQcAk-5a$PyxxG1{9n&cD&w1IZs;VooSW+>(;#($hXLQpwDJHW{m-*B z@tomQ;grM}r)kqixwdea$xZ-W1$~X)^Mu9n`tVX8MGVn1q^BZ-qKpfl;&}+=BTZk# zJ7gM=)iKHRG}j=KCi6l)i9vi;FV8l197RrHwHg7f*c7yGhghf2c-|xL*xg7E4@K( z6P6_$^j+bIx#T`0zG%>Ql<(XNGwXuE6{Qh(M-J*u3q_`R{$#e!;a<^wf;$Jo{IcB> z^<5-F;dZ;ID*$9KVT3bS%o(%z8atfP${|_Kn5f_`@N{InAlGAiUgSRF2gDpR;XAl4 z-%~JG=>uUl#DWp=0O7WHM$40MTZHp~!+K$sgny(B@WSA;GB)#w**s$oT+3&G(+G!6 zINlkrgZAf$YkD?Vtl+sFwoiDp2kd$_@i-8J?Fh#a&J&($=d!fDBbETqjgfF7wmk#; z;_G7E5qsKEzt0Hk?g|s?ryj?ncnjwkB@<(<*_ZcF`rAjwdx`^jo|#?AoZ~yoTzV!P zx$`o%g8LAM5}w^D{sbOBQ-7xt3UCS1vl}V`HTXAsP1nYse6C!RS4#dIFVS&K>xKel z<+tZe^PruqOI`GEAN+kYMY-U8$j_+glrQaHqV)r9dEhSPIUd?awBn&pwAL>6)Hg(h z9^1kdf01-UZ6C*DH~{eYOEkur$BL=LG50&-vl_BBm18rEt|y>Gk}_JTf? z?;huh-Wm2!cx!nkKLZQTMeP4f_!!;;%!{WvMvH?y!y^sI`-xQ23HnR(OgcUk8Y=*V z6h%*X!jqMS&>AemUeQD!MaBaWdw>cI1{j^FbT`;Se*q`;V$G3DJ)wjc88#6*@zW#+ zGUUj;rhXvkoAj}zPrWCI;R&Whf|ZD@d?ZU!4Iaz6K5lzVkgO-|EmmWT28Q7@^x7AK za|DohumEZeAmj$3PAN?}<0U#t@}Ng#70vB5I0cx|PZq4oXd>|)o>0%vuMjrkK6yRR z7w83__JY`fcyM-M3OwICO$L}UWld-bnNBn=pt8s{#%2TdvdFbkIQN1rJcu5=V7Gy6 ze2tIdUJCXG}zrf85)6y3Q;`#4$HCbbRb zzIdZMN-IZ}rihv(Jpt<{Ox{Ff@^-)AbJ!P^W&Wk+rUUb)4 zFf*aJg0>>ghc|uoTsBTh11s9&x$&%RAK#cFRQ5 z(xjHm#=|U>TnbTjbnT+r=tbL$aZ>%n@HbkG#3g|vkb2vj1qAK*vcx@cCT58JBnMb2 z6)*t|DXKE(RmVfc8a*ni&f#)HhU;k^(rWFAjUbz&rRt+{SmqfqTGknjcIri~Ep5b! zITH7lg@Vi=tFk;O;iu6|BlOP`1FqPX7go(ZMJXhF*jt{T;^l_;32Ks51iT!>D?t&gFe%JXtg;b|G^GIO6eMyiP@h~(&QQO zjvcM_i8x9*x1;q`exGIRcZOOcfZj8-%jb}$= zKcjWZ{m5 z4;U3@{S1qO^*iEO6IoVw{Ej@&SGj+{e&jJvSky%N0Y&We9hPU6xj*q_`SM1|0{Ete z8nq-D03ar-IQ6jxacp;s$QOJRmSAukou&}f!c-2QnT?*R-k9q}e z(U|ReA5|V`-y(`CYm+oL(F^lrnPqDs*!p_IJeh@hGtvAuym^z@Jz$d_uy2e}A!?kA zTri;jM6^}3D_xA>r6Wyl@RwMN?Hko>%ZlicBVB@fREsH^;3cxSqXsiXx@RJ7(35u8 zqsCLT&W5x$#ybOPjHuaOBIF@jT)yKHK8HS&W(V3_Gm&-($ML5j?brKq{!)}N!+oqp zlXe(I11=gYX@aCRq81lXi-r5WTF0nw5zmnZ-Ge2JErk)S0t3zmwjD3Qe6Z#{h^9GD z{2auhJil@-qe9eT5n;2|jAIgSIawVVYNtU>zuX(k9QvM-C|fONeosY9=HvOAOMVcW zAzBj3ILH!89QP7^qj`>M4H?AhF_)lrW;}?B3N812%?E@diIQ27^D#5*`$-if(U|B~ zU?B3`vbF|8{@m<%NIjQuJl)!;DkyC{1CRSt&}E4bGy zlLCew36L5zM2sHC%1Sk|ooF6{keBC-bj4mB3Dhz4bm)v0b-7F!9qprXQ)R;5$fGFc z1IE=+y))EJUvaY9@Ib0GbLlu$ehqb*MDZpG$gWzU+hRN+yZPiv_U4tdBP;nCVh@t( z4PcGJ#kf>YnWr7Ok9Q*X@tz&&!ywBeVn%ST^CZ}ZFqzhLDfkTW3E-R3HsjPtIFhgjdIgY9_0bNM^A zHRD`TxPgZ`oFn2wz><;r1^BQ*eBQ&op5L3!IZC~9-;Vq#@P3#U7?a0==F8*#J&tcy nOb0km@Uxegl!Cqgp8x{@%ipLK_^OG900000NkvXXu0mjfv_*gv literal 0 HcmV?d00001 From 9abe5e6a1c332d76ba59b492d38566977d165844 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 7 Sep 2019 00:14:19 -0600 Subject: [PATCH 150/258] added page description to view checks doc --- content/v2.0/cloud/monitor-alert/checks/view.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/monitor-alert/checks/view.md b/content/v2.0/cloud/monitor-alert/checks/view.md index 2fc4cd8d6..937fe564f 100644 --- a/content/v2.0/cloud/monitor-alert/checks/view.md +++ b/content/v2.0/cloud/monitor-alert/checks/view.md @@ -2,7 +2,7 @@ title: View checks seotitle: View monitoring checks in InfluxDB description: > - placeholder + View check details and statuses and notifications generated by checks in the InfluxDB UI. menu: v2_0: parent: Manage checks @@ -10,7 +10,7 @@ weight: 202 v2.0/tags: [monitor, checks, notifications] --- -View checks and statuses generated by checks in the InfluxDB user interface (UI). +View check details and statuses and notifications generated by checks in the InfluxDB user interface (UI). - [View a list of all checks](#view-a-list-of-all-checks) - [View check details](#view-check-details) From 0a6aa30e59922228df999e7d73e92bc3efffb91b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 7 Sep 2019 10:29:43 -0600 Subject: [PATCH 151/258] added string interpolation doc to flux reference --- assets/styles/themes/_theme-dark.scss | 2 +- assets/styles/tools/_color-palette.scss | 1 + .../flux/language/lexical-elements.md | 4 +- .../flux/language/string-interpolation.md | 96 +++++++++++++++++++ 4 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 content/v2.0/reference/flux/language/string-interpolation.md diff --git a/assets/styles/themes/_theme-dark.scss b/assets/styles/themes/_theme-dark.scss index 26efd67cc..4ca1c16ad 100644 --- a/assets/styles/themes/_theme-dark.scss +++ b/assets/styles/themes/_theme-dark.scss @@ -86,7 +86,7 @@ $article-note-table-row-alt: #3B2862; $article-note-table-scrollbar: $np-deepnight; $article-note-shadow: $np-deepnight; $article-note-code: $cp-comet; -$article-note-code-bg: $wp-telopea; +$article-note-code-bg: $wp-jaguar; $article-note-code-accent1: #567375; $article-note-code-accent2: $b-pool; $article-note-code-accent3: $gr-viridian; diff --git a/assets/styles/tools/_color-palette.scss b/assets/styles/tools/_color-palette.scss index 7004a1aa2..146282cfa 100644 --- a/assets/styles/tools/_color-palette.scss +++ b/assets/styles/tools/_color-palette.scss @@ -24,6 +24,7 @@ $g19-ghost: #FAFAFC; $g20-white: #FFFFFF; // Brand color // Warm Purples - Magentas +$wp-jaguar: #1d0135; $wp-telopea: #23043E; $wp-violentdark: #2d0749; $wp-violet: #32094E; diff --git a/content/v2.0/reference/flux/language/lexical-elements.md b/content/v2.0/reference/flux/language/lexical-elements.md index d19fb807b..b27481165 100644 --- a/content/v2.0/reference/flux/language/lexical-elements.md +++ b/content/v2.0/reference/flux/language/lexical-elements.md @@ -300,9 +300,9 @@ To be added: TODO: With string interpolation `string_lit` is not longer a lexica ``` String literals are also interpolated for embedded expressions to be evaluated as strings. -Embedded expressions are enclosed in curly brackets (`{}`). +Embedded expressions are enclosed in a dollar sign and curly braces (`${}`). The expressions are evaluated in the scope containing the string literal. -The result of an expression is formatted as a string and replaces the string content between the brackets. +The result of an expression is formatted as a string and replaces the string content between the braces. All types are formatted as strings according to their literal representation. A function `printf` exists to allow more precise control over formatting of various types. To include the literal curly brackets within a string they must be escaped. diff --git a/content/v2.0/reference/flux/language/string-interpolation.md b/content/v2.0/reference/flux/language/string-interpolation.md new file mode 100644 index 000000000..ebe90a9c4 --- /dev/null +++ b/content/v2.0/reference/flux/language/string-interpolation.md @@ -0,0 +1,96 @@ +--- +title: String interpolation +description: > + Flux string interpolation evaluates string literals containing one or more placeholders + and returns a result with placeholders replaced with their corresponding values. +menu: + v2_0_ref: + parent: Flux specification + name: String interpolation +weight: 211 +--- + +Flux string interpolation evaluates string literals containing one or more placeholders +and returns a result with placeholders replaced with their corresponding values. + +## String interpolation syntax +To use Flux string interpolation, enclose embedded [expressions](/v2.0/reference/flux/language/expressions/) +in a dollar sign and curly braces `${}`. +Flux replaces the content between the braces with the result of the expression and +returns a string literal. + +```js +name = "John" + +"My name is ${name}." + +// My name is John. +``` + +{{% note %}} +#### Flux only interpolates string values +Flux currently interpolates only string values ([IMP#1775](https://github.com/influxdata/flux/issues/1775)). +Use the [string() function](/v2.0/reference/functions/built-in/transformations/type-conversions/string/) +to convert non-string values to strings. + +```js +count = 12 + +"I currently have ${string(v: count)} cats." +``` +{{% /note %}} + + +## Use dot notation to interpolate object values +[Objects](/v2.0/reference/flux/language/expressions/#object-literals) consist of key-value pairs. +Use [dot notation](/v2.0/reference/flux/language/expressions/#member-expressions) +to interpolate values from an object. + +```js +person = { + name: "John", + age: 42 +} + +"My name is ${person.name} and I'm ${string(v: person.age)} years old." + +// My name is John and I'm 42 years old. +``` + +Flux returns each record in query results as an object. +In Flux row functions, each row object is represented by `r`. +Use dot notation to interpolate specific column values from the `r` object. + +##### Use string interpolation to add a human-readable message +```js +from(bucket: "example-bucket") + |> range(start: -30m) + |> map(fn: (r) => ({ + r with + human-readable: "${r._field} is ${r._value} at ${string(v: r._time)}." + })) +``` + +## String interpolation versus concatenation +Flux supports both string interpolation and string concatenation. +String interpolation is a more concise method for achieving the same result. + +```js +person = { + name: "John", + age: 42 +} + +// String interpolation +"My name is ${person.name} and I'm ${string(v: person.age)} years old." + +// String concatenation +"My name is " + person.name + " and I'm " + string(v: person.age) + " years old." + +// Both return: My name is John and I'm 42 years old. +``` + +{{% note %}} +Check and notification message templates configured in the InfluxDB user interface +**do not** support string concatenation. +{{% /note %}} From ac187688c1b576adc3d5fae23fea6b3c331de245 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sat, 7 Sep 2019 10:31:03 -0600 Subject: [PATCH 152/258] added string interpolation link to flux check create doc --- content/v2.0/cloud/monitor-alert/checks/create.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/checks/create.md b/content/v2.0/cloud/monitor-alert/checks/create.md index 38662d497..e3c5aa934 100644 --- a/content/v2.0/cloud/monitor-alert/checks/create.md +++ b/content/v2.0/cloud/monitor-alert/checks/create.md @@ -72,7 +72,8 @@ The following statuses or levels are available: These tags are unique to each check. 2. In the **Status Message Template** column, configure the status message for the check. - Use [Flux string interpolation](#) to populate the message with data from the query. + Use [Flux string interpolation](/v2.0/reference/flux/language/string-interpolation/) + to populate the message with data from the query. Check data is represented as an object, `r`. Access specific column values using dot notation: `r.columnName`. From b56d3db7980997ded23946ecef3ef78cb18de928 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 11:22:37 -0600 Subject: [PATCH 153/258] Update string-interpolation.md --- content/v2.0/reference/flux/language/string-interpolation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/language/string-interpolation.md b/content/v2.0/reference/flux/language/string-interpolation.md index ebe90a9c4..463233ae4 100644 --- a/content/v2.0/reference/flux/language/string-interpolation.md +++ b/content/v2.0/reference/flux/language/string-interpolation.md @@ -30,7 +30,7 @@ name = "John" {{% note %}} #### Flux only interpolates string values Flux currently interpolates only string values ([IMP#1775](https://github.com/influxdata/flux/issues/1775)). -Use the [string() function](/v2.0/reference/functions/built-in/transformations/type-conversions/string/) +Use the [string() function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string/) to convert non-string values to strings. ```js From 5ca0047783241cf52d0e8251380c52aca92d7c4c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 11:30:04 -0600 Subject: [PATCH 154/258] updated check management docs to address PR feedback --- assets/styles/layouts/_article.scss | 3 +- assets/styles/layouts/_inline-icons.scss | 1 + .../v2.0/cloud/monitor-alert/checks/_index.md | 4 +- .../v2.0/cloud/monitor-alert/checks/create.md | 156 ++++++++++-------- .../v2.0/cloud/monitor-alert/checks/view.md | 7 +- .../2-0-monitor-check-builder-view-toggle.png | Bin 19454 -> 0 bytes 6 files changed, 95 insertions(+), 76 deletions(-) delete mode 100644 static/img/2-0-monitor-check-builder-view-toggle.png diff --git a/assets/styles/layouts/_article.scss b/assets/styles/layouts/_article.scss index c9ca666a0..1c8ef4a49 100644 --- a/assets/styles/layouts/_article.scss +++ b/assets/styles/layouts/_article.scss @@ -18,7 +18,8 @@ } } h2,h3,h4,h5,h6 { - & + .highlight pre { margin-top: .5rem; } + & + .highlight pre { margin-top: .5rem } + & + pre { margin-top: .5rem } & + .code-tabs-wrapper { margin-top: 0; } } h1 { diff --git a/assets/styles/layouts/_inline-icons.scss b/assets/styles/layouts/_inline-icons.scss index 5151d2091..b654d14bd 100644 --- a/assets/styles/layouts/_inline-icons.scss +++ b/assets/styles/layouts/_inline-icons.scss @@ -31,6 +31,7 @@ background: $b-pool; border-radius: .7rem; vertical-align: text-top; + margin-top: 2px; .circle { display: inline-block; diff --git a/content/v2.0/cloud/monitor-alert/checks/_index.md b/content/v2.0/cloud/monitor-alert/checks/_index.md index 8f7ba6a21..50a882404 100644 --- a/content/v2.0/cloud/monitor-alert/checks/_index.md +++ b/content/v2.0/cloud/monitor-alert/checks/_index.md @@ -2,7 +2,7 @@ title: Manage checks seotitle: Manage monitoring checks in InfluxDB description: > - InfluxDB checks query data and apply a status or level to each data point based on specified conditions. + Checks in InfluxDB query data and apply a status or level to each data point based on specified conditions. menu: v2_0: parent: Monitor and alert @@ -11,6 +11,6 @@ v2.0/tags: [monitor, checks, notifications] --- InfluxDB checks query data and apply a status or level to each data point based on specified conditions. -The following articles provide information about creating and managing checks: +Learn how to create and manage checks: {{< children >}} diff --git a/content/v2.0/cloud/monitor-alert/checks/create.md b/content/v2.0/cloud/monitor-alert/checks/create.md index e3c5aa934..f02de1f19 100644 --- a/content/v2.0/cloud/monitor-alert/checks/create.md +++ b/content/v2.0/cloud/monitor-alert/checks/create.md @@ -11,115 +11,133 @@ v2.0/tags: [monitor, checks, notifications] --- Create a check in the InfluxDB user interface (UI). +A check consists of two parts – a query and check confiuration. -## Create a check -1. To create a check in the InfluxDB UI, click **Monitoring & Alerting** in the sidebar. +##### Check query +- Specifies the dataset to monitor. +- Requires a bucket, measurement, field, and an aggregate function. + + {{% note %}}The aggregate function aggregates data points between the specified check intervals + and returns a single value for the check to process. + {{% /note %}} +- May include tags to narrow results. + +##### Check configuration +- Defines check properties, including the check interval and status message. +- Evaluates specified conditions and applies a status (if applicable) to each data point: + - `crit` + - `warn` + - `info` + - `note` +- Stores status in the `_level` column. + +## Create a check in the InfluxDB UI +1. Click **Monitoring & Alerting** in the sidebar. {{< nav-icon "alerts" >}} 2. In the top right corner of the **Checks** column, click **{{< icon "plus" >}} Create**. - The check builder will appear. -3. Click **Name this check** in the top left corner of the check builder and provide - a unique name for the check. - -A check consists of two parts – a query and check logic. -The check builder provides separate views for configuring each. - -{{< img-hd src="/img/2-0-monitor-check-builder-view-toggle.png" alt="Check builder view toggle" />}} +3. Click **Name this check** in the top left corner and provide a unique name for the check. ### Configure the query -The check query determines the specific dataset to monitor. -Each query requires a bucket, measurement, field, and an aggregate function. -You can narrow results further with tags, but they are not required. - -{{% note %}} -The aggregate function uses data points recorded between check intervals to -calculate and return a single value for the check to process. -{{% /note %}} - -1. In the **Query view**, select the bucket, measurement, field and any desired tag sets to query. -2. In the **Aggregate functions** column, select an interval from the interval dropdown +1. In the **Query view**, select the bucket, measurement, field and tag sets to query. +2. In the **Aggregate functions** column, select an interval from the interval drop-down list (for example, "Every 5 minutes") and an aggregate function from the list of functions. -3. Click **Submit** to run the query and preview the results in the visualization pane. - To see the raw query results, click the the **View Raw Data** toggle. +3. Click **Submit** to run the query and preview the results. + To see the raw query results, click the the **{{< icon "toggle" >}} View Raw Data** toggle. -### Configure the check logic -A check adds a status to each data point based on defined conditions. -The status is stored in the `_level` column. -The following statuses or levels are available: - -- `crit` -- `warn` -- `info` -- `note` - -1. In the **Properties** column, configure the following: +### Configure the check +1. Click **2. Check** near the top of the window to display the **Check view**. +2. In the **Properties** column, configure the following: ##### Schedule Every - Schedule every sets the interval at which the check runs. - _This and the aggregate function interval will always be the same._ + Select the interval to run the check (for example, "Every 5 minutes"). + This interval matches the aggregate function interval for the check query. + _Changing the interval here will update the aggregate function interval._ ##### Offset - The offset delays the execution of a check to account for any late data. - Although the query is delayed, it does not change the queried time range. + Delay the execution of a task to account for any late data. + Offset queries do not change the queried time range. - {{% note %}}Your offset must be shorter than your [check interval](#schedule-every) or the check will not run. + {{% note %}}Your offset must be shorter than your [check interval](#schedule-every). {{% /note %}} ##### Tags Add custom tags to the query output. - These tags are unique to each check. + Each custom tag appends a new column to each row in the query output. + The column label is the tag key and the column value is the tag value. -2. In the **Status Message Template** column, configure the status message for the check. + Use custom tags to associate additional metadata with the check. + Common metadata tags across different checks lets you easily group and organize checks. + You can also use custom tags in [notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules/). + +3. In the **Status Message Template** column, enter the status message template for the check. Use [Flux string interpolation](/v2.0/reference/flux/language/string-interpolation/) to populate the message with data from the query. + + {{% note %}} +#### Flux only interpolates string values +Flux currently interpolates only string values. +Use the [string() function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string/) +to convert non-string values to strings. + +```js +count = 12 +"I currently have ${string(v: count)} cats." +``` + {{% /note %}} + Check data is represented as an object, `r`. Access specific column values using dot notation: `r.columnName`. - Each check has access to data from the following columns: + Use data from the following columns: - - all columns included in the query output - - any [custom tags](#tags) added the query output + - columns included in the query output + - [custom tags](#tags) added to the query output - `_check_id` - `_check_name` - `_level` - `_source_measurement` - `_type` -3. In the **Conditions** column, define the logic that assigns a status or level to data. - There are two types of checks: + ###### Example status message template + ``` + From ${r._check_name}: + ${r._field} is ${r._level}. + Its value is ${string(v: r._value)}. + ``` - #### Threshold + When a check generates a status, it stores the message in the `_message` column. + +4. In the **Conditions** column, define the logic that assigns a status or level to data. + Select the type of check to configure: + + ##### Threshold A threshold check assigns a status based on a value being above, below, inside, or outside of defined thresholds. + [Configure a threshold check](#configure-a-threshold-check). - 1. Click a status to configure thresholds. - 2. Use the dropdown to configure the kind of threshold to use. - - - is above - - is below - - is inside of - - is outside of - - 3. Depending on the kind of threshold you select, one or two fields appear on the next line. - Enter threshold values in each field or use the threshold sliders that appear - in the data visualization to define threshold values. - 4. Repeat for each status you want the check to assigns. - You do not need to define logic for all statuses; only those you wish to use. - - #### Deadman + ##### Deadman A deadman check assigns a status to data when a series or group has not reported in a specified amount of time. + [Configure a deadman check](#configure-a-deadman-check). - 1. In the first field, enter a duration for the deadman check. - Any series that have not reported within the specified duration are considered dead. - 2. Use the dropdown to select a status to assign to a dead series. - 3. In the last field, enter a duration after which if a series does not begin reporting again, - the check no longer looks for that series. + ##### Configure a threshold check + 1. For each status you want to configure, click the status name (CRIT, WARN, INFO, or OK). + 2. From the **When value** drop-down list, select a threshold: is above, is below, + is inside of, is outside of. + 3. Enter a value or values for the threshold. + You can also use the threshold sliders in the data visualization to define threshold values. -After configuring your check query and logic, click the green **{{< icon "check" >}}** -in the top right corner to save the check. + ##### Configure a deadman check + 1. In the **for** field, enter a duration for the deadman check. + For example, `5m`, `1h`, or `2h30m`. + 2. Use the **set status to** drop-down list to select a status to set on a dead series. + 3. In the **And stop checking after** field, enter the time to stop monitoring the series. + For example, `30m`, `2h`, `3h15m`. + +5. Click the green **{{< icon "check" >}}** in the top right corner to save the check. ## Clone a check Create a new check by cloning an existing check. diff --git a/content/v2.0/cloud/monitor-alert/checks/view.md b/content/v2.0/cloud/monitor-alert/checks/view.md index 937fe564f..a742da80a 100644 --- a/content/v2.0/cloud/monitor-alert/checks/view.md +++ b/content/v2.0/cloud/monitor-alert/checks/view.md @@ -32,11 +32,10 @@ Here you can view the check query and logic. ## View statuses generated by a check 1. In the **Checks** column, hover over the check, click the **{{< icon "view" >}}** icon, then **View History**. -2. This takes you to the **Statuses History** page filtered to statuses generated - from the check. + The Statuses History page displays statuses generated by the selected check. ## View notifications triggered by a check 1. In the **Checks** column, hover over the check, click the **{{< icon "view" >}}** icon, then **View History**. -2. Click **Notifications** in the **Statuses | Notifications** toggle at the top of the page. -3. This displays the **Notifications History** filtered to notifications triggered by the check. +2. In the top left corner, click **Notifications**. + The Notifications History page displays notifications initiated by the selected check. diff --git a/static/img/2-0-monitor-check-builder-view-toggle.png b/static/img/2-0-monitor-check-builder-view-toggle.png deleted file mode 100644 index e3b64ec632e08b780d15a227080b9027d74015eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19454 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 From 6aae13b904918503da0d34c47a268ea3c3a2c9e2 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 10:41:14 -0700 Subject: [PATCH 155/258] Fix shortcode --- .../notification-rules/create-notification-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md index 025166030..24dbf049e 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md +++ b/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md @@ -39,7 +39,7 @@ Once you've set up checks and notification endpoints, create notification rules 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alert" >}} + {{< nav-icon "alerts" >}} 2. Under **Notification Rules**, hover over the rule you want to clone. From 2f2d80de44458bef120d8d66477360cb15f9593f Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 10:48:23 -0700 Subject: [PATCH 156/258] add pricing calc topic; add link in pricing plans --- content/v2.0/cloud/pricing-calculator.md | 37 ++++++++++++++++++++++++ content/v2.0/cloud/pricing-plans.md | 2 ++ 2 files changed, 39 insertions(+) create mode 100644 content/v2.0/cloud/pricing-calculator.md diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md new file mode 100644 index 000000000..c94eb87e9 --- /dev/null +++ b/content/v2.0/cloud/pricing-calculator.md @@ -0,0 +1,37 @@ +--- +title: InfluxDB Cloud 2.0 pricing calculator +description: > + Use the InfluxDB Cloud 2.0 pricing calculator to estimate costs by adjusting the number of devices, + plugins, metrics, and writes. + for the Pay As You Go Plan. +aliases: + - /v2.0/cloud/rate-limits/ +weight: 2 +menu: + v2_0_cloud: + name: Pricing calculator +--- + +Use the {{< cloud-name >}} pricing calculator to estimate costs by adjusting your number of devices, + plugins, users, dashboards, writes, and retention. Default configurations include: + +| Configuration | Hobby | Standard | Professional | Enterprise | +|:-----------------------------------|-------:|---------:|-------------:|-----------:| +| **Devices** | 8 | 200 | 500 | 1000 | +| **Plugins per device** | 1 | 4 | 4 | 5 | +| **Users** | 1 | 2 | 10 | 20 | +| **Concurrent dashboards per user** | 2 | 2 | 2 | 2 | +| **Writes per minute** | 6 | 4 | 3 | 3 | +| **Average retention in days** | 7 | 30 | 30 | 30 | + +**To estimate costs** + +1. Click the **Pricing Calculator** icon in the left navigation bar. +2. Choose your region. +2. Select your configuration: + - **Hobby**. For a single user monitoring a few machines or sensors. + - **Standard**. For a single team (what is real-time visibility? monitoring a {how many is a single set?} of use-cases.) + - **Professional**. For teams monitoring multiple disparate systems or use cases. + - **Enterprise**. For teams monitoring multiple domains and use cases accessing a variety of dashboards. +3. Adjust the default configuration values to match your number of devices, plugins, metrics, and so on. The **Projected Usage** costs are automatically updated as you adjust your configuration. +4. Click **Get started with InfluxDB Cloud** [to get started](https://v2.docs.influxdata.com/v2.0/cloud/get-started/). diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index 96f84efd6..873ac5273 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -16,6 +16,8 @@ InfluxDB Cloud 2.0 offers two pricing plans: - [Free Plan](#free-plan) - [Pay As You Go Plan](#pay-as-you-go-plan) +To estimate your projected usage costs, use the [InfluxDB Cloud 2.0 pricing calculator](/v2.0/cloud/pricing-calculator/). + ## Free Plan All new {{< cloud-name >}} accounts start with a rate-limited Free Plan. Use it as much and as long as you want within the Free Plan rate limits: From 16cf4d25edc32cc392c83d091374c77586cd41a7 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 11:00:58 -0700 Subject: [PATCH 157/258] Updated token paths --- content/v2.0/security/tokens/create-token.md | 4 ++-- content/v2.0/security/tokens/delete-token.md | 4 ++-- content/v2.0/security/tokens/update-tokens.md | 4 ++-- content/v2.0/security/tokens/view-tokens.md | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/v2.0/security/tokens/create-token.md b/content/v2.0/security/tokens/create-token.md index d364d99bd..a5f2e2b10 100644 --- a/content/v2.0/security/tokens/create-token.md +++ b/content/v2.0/security/tokens/create-token.md @@ -16,9 +16,9 @@ command line interface (CLI). ## Create a token in the InfluxDB UI -1. Click the **Settings** icon in the navigation bar. +1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load" >}} 2. Click **Tokens**. 3. Click the **+ Generate** dropdown in the upper right and select a token type (**Read/Write Token** or **All Access Token**). diff --git a/content/v2.0/security/tokens/delete-token.md b/content/v2.0/security/tokens/delete-token.md index 13083063a..f036a72e5 100644 --- a/content/v2.0/security/tokens/delete-token.md +++ b/content/v2.0/security/tokens/delete-token.md @@ -17,9 +17,9 @@ have access to your InfluxDB instance. ## Delete tokens in the InfluxDB UI -1. Click the **Settings** icon in the navigation bar. +1. Click the Click the **Load Data** icon in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Hover over the token you want to delete and click **Delete** and **Confirm**. diff --git a/content/v2.0/security/tokens/update-tokens.md b/content/v2.0/security/tokens/update-tokens.md index eb1b86533..70accf31c 100644 --- a/content/v2.0/security/tokens/update-tokens.md +++ b/content/v2.0/security/tokens/update-tokens.md @@ -15,9 +15,9 @@ Update an authentication token's description using the InfluxDB user interface ( ## Update a token in the InfluxDB UI -1. Click the **Settings** icon in the navigation bar. +1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Click the pencil icon {{< icon "pencil" >}} next to the token's name in the **Description** column. diff --git a/content/v2.0/security/tokens/view-tokens.md b/content/v2.0/security/tokens/view-tokens.md index 6dc3537e9..c8f962341 100644 --- a/content/v2.0/security/tokens/view-tokens.md +++ b/content/v2.0/security/tokens/view-tokens.md @@ -16,9 +16,9 @@ command line interface (CLI). ## View tokens in the InfluxDB UI -1. Click the **Settings** icon in the navigation bar. +1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "settings" >}} + {{< nav-icon "load" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Click on a token name from the list to view the token and a summary of access permissions. From eed8fe42fb3bf3db97070ca01f3e56a6ca6ec550 Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 11:05:44 -0700 Subject: [PATCH 158/258] add link to pricing calc in get-started topic --- content/v2.0/cloud/get-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/get-started.md b/content/v2.0/cloud/get-started.md index be12978cf..c25b538ad 100644 --- a/content/v2.0/cloud/get-started.md +++ b/content/v2.0/cloud/get-started.md @@ -139,4 +139,4 @@ The primary differences between InfluxDB OSS 2.0 and InfluxDB Cloud 2.0 are: the new user interface (InfluxDB UI) offers quick and effortless onboarding, richer user experiences, and significantly quicker results. - **Usage-based pricing**: The [The Pay As You Go Plan](/v2.0/cloud/pricing-plans/#pay-as-you-go-plan) - offers more flexibility and ensures that you only pay for what you use. + offers more flexibility and ensures that you only pay for what you use. To estimate your projected usage costs, use the [InfluxDB Cloud 2.0 pricing calculator](/v2.0/cloud/pricing-calculator/). From 78d53a7d3457875e197fdb9ef415a3c881824afd Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 11:24:47 -0700 Subject: [PATCH 159/258] update rate limits for Cloud 2.0 per #413 --- content/v2.0/cloud/pricing-plans.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index 873ac5273..1763f76d7 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -19,34 +19,46 @@ InfluxDB Cloud 2.0 offers two pricing plans: To estimate your projected usage costs, use the [InfluxDB Cloud 2.0 pricing calculator](/v2.0/cloud/pricing-calculator/). ## Free Plan + All new {{< cloud-name >}} accounts start with a rate-limited Free Plan. -Use it as much and as long as you want within the Free Plan rate limits: +Use this plan as much and as long as you want within the Free Plan rate limits: #### Free Plan rate limits + - **Writes:** 3MB every 5 minutes +- **Ingest batch size:** 50MB - **Query:** 30MB every 5 minutes - **Storage:** 72-hour data retention +- **Series cardinality:** 10,000 - **Create:** - Up to 5 dashboards - Up to 5 tasks - Up to 2 buckets + - Up to 3 checks + - Up to 2 notification rules + _To remove rate limits, [upgrade to a Pay As You Go Plan](/v2.0/cloud/account-management/upgrade-to-payg/)._ ## Pay As You Go Plan + Pay As You Go Plans offer more flexibility and ensure you only pay for what you use. #### Pay As You Go Plan rate limits -In order to protect against any intentional or unintentional harm, -Pay As You Go Plans include soft rate limits: + +To protect against any intentional or unintentional harm, Pay As You Go Plans include soft rate limits: - **Writes:** 300MB every 5 minutes +- **Ingest batch size:** 50MB - **Queries:** 3000MB every 5 minutes - **Storage:** Unlimited retention +- **Series cardinality:** 1,000,000 - **Create:** - Unlimited dashboards - Unlimited tasks - Unlimited buckets - Unlimited users + - Unlimited checks + - Unlimited notification rules _To request higher rate limits, contact [InfluxData Support](mailto:support@influxdata.com)._ From 43006c9837f491fc1c138e9e08c63ec16f256e7b Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 11:26:27 -0700 Subject: [PATCH 160/258] Add view notification rules doc --- .../view-notification-rules.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md new file mode 100644 index 000000000..b383e06e4 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md @@ -0,0 +1,42 @@ +--- +title: View notification rules +description: > + Update notification rules to update the notification message or change the schedule or conditions. + +weight: 201 +v2.0/tags: [notifications] +menu: + v2_0: + name: View notification rules + parent: Manage notification rules +--- + +View notification rule details and statuses and notifications generated by notification rules in the InfluxDB user interface (UI). + +- [View a list of all notification rules](#view-a-list-of-all-notification-rules) +- [View notification rule details](#view-notification-rule-details) +- [View statuses generated by a check](#view-statuses-generated-by-a-notification-rule) +- [View notifications triggered by a notification rule](#view-notifications-triggered-by-a-notification-rule) + +To view notification rules, click **Monitoring & Alerting** in the InfluxDB UI sidebar. + +{{< nav-icon "alerts" >}} + +## View a list of all notification rules +The **Notification Rules** column on the Monitoring & Alerting landing page displays all existing checks. + +## View notification rule details +In the **Notification Rules** column, click the name of the check you want to view. +The check builder appears. +Here you can view the check query and logic. + +## View statuses generated by a notification rule +1. In the **Notification Rules** column, hover over the check, click the **{{< icon "view" >}}** + icon, then **View History**. + The Statuses History page displays statuses generated by the selected check. + +## View notifications triggered by a notification rule +1. In the **Notification Rules** column, hover over the notification rule, click the **{{< icon "view" >}}** + icon, then **View History**. +2. In the top left corner, click **Notifications**. + The Notifications History page displays notifications initiated by the selected notification rule. From c0aae4a7e736b5e2925128ac1e9a3b3a02c24081 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 13:54:29 -0600 Subject: [PATCH 161/258] moved monitor docs out of cloud directory --- content/v2.0/{cloud => }/monitor-alert/_index.md | 10 +++++----- .../v2.0/{cloud => }/monitor-alert/checks/_index.md | 0 .../v2.0/{cloud => }/monitor-alert/checks/create.md | 0 .../v2.0/{cloud => }/monitor-alert/checks/delete.md | 2 +- .../v2.0/{cloud => }/monitor-alert/checks/update.md | 2 +- content/v2.0/{cloud => }/monitor-alert/checks/view.md | 0 .../notification-endpoints}/_index.md | 0 .../notification-endpoints/create.md} | 6 +++--- .../notification-endpoints/delete.md} | 6 +++--- .../notification-endpoints/update.md} | 4 ++-- .../monitor-alert/notification-rules/_index.md | 2 +- .../notification-rules/create.md} | 0 .../notification-rules/delete.md} | 0 .../notification-rules/update.md} | 0 content/v2.0/reference/glossary.md | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) rename content/v2.0/{cloud => }/monitor-alert/_index.md (65%) rename content/v2.0/{cloud => }/monitor-alert/checks/_index.md (100%) rename content/v2.0/{cloud => }/monitor-alert/checks/create.md (100%) rename content/v2.0/{cloud => }/monitor-alert/checks/delete.md (88%) rename content/v2.0/{cloud => }/monitor-alert/checks/update.md (98%) rename content/v2.0/{cloud => }/monitor-alert/checks/view.md (100%) rename content/v2.0/{cloud/monitor-alert/manage-notification-endpoints => monitor-alert/notification-endpoints}/_index.md (100%) rename content/v2.0/{cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md => monitor-alert/notification-endpoints/create.md} (93%) rename content/v2.0/{cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md => monitor-alert/notification-endpoints/delete.md} (73%) rename content/v2.0/{cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md => monitor-alert/notification-endpoints/update.md} (94%) rename content/v2.0/{cloud => }/monitor-alert/notification-rules/_index.md (96%) rename content/v2.0/{cloud/monitor-alert/notification-rules/create-notification-rules.md => monitor-alert/notification-rules/create.md} (100%) rename content/v2.0/{cloud/monitor-alert/notification-rules/delete-notification-rules.md => monitor-alert/notification-rules/delete.md} (100%) rename content/v2.0/{cloud/monitor-alert/notification-rules/update-notfication-rules.md => monitor-alert/notification-rules/update.md} (100%) diff --git a/content/v2.0/cloud/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md similarity index 65% rename from content/v2.0/cloud/monitor-alert/_index.md rename to content/v2.0/monitor-alert/_index.md index 602e87b54..c56f45e23 100644 --- a/content/v2.0/cloud/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -6,7 +6,7 @@ description: > menu: v2_0: name: Monitor and alert -weight: 3 +weight: 6 v2.0/tags: [monitor, alert, checks, notification, endpoints] --- @@ -15,12 +15,12 @@ Monitor your time series data and send alerts by creating checks, notification r 1. [Create checks](...create-a-check) to monitor data for a specified check status. 2. (Optional) Send alerts on a specified check status by doing the following: - a. [Create a notification endpoint](/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints). + a. [Create a notification endpoint](/v2.0/monitor-alert/notification-endpoints/create). - b. [Create notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/create-notification-rules). + b. [Create notification rules](/v2.0/monitor-alert/notification-rules/create). After creating your initial checks and notifications, adjust how you monitor data and alerts as needed. For more information, see: - [Manage checks](/v2.0/cloud/monitor-alert/manage-checks) -- [Manage notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules) -- [Manage notification endpoints](/v2.0/cloud/monitor-alert/manage-notification-endpoints) +- [Manage notification rules](/v2.0/monitor-alert/notification-rules) +- [Manage notification endpoints](/v2.0/monitor-alert/notification-endpoints) diff --git a/content/v2.0/cloud/monitor-alert/checks/_index.md b/content/v2.0/monitor-alert/checks/_index.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/checks/_index.md rename to content/v2.0/monitor-alert/checks/_index.md diff --git a/content/v2.0/cloud/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/checks/create.md rename to content/v2.0/monitor-alert/checks/create.md diff --git a/content/v2.0/cloud/monitor-alert/checks/delete.md b/content/v2.0/monitor-alert/checks/delete.md similarity index 88% rename from content/v2.0/cloud/monitor-alert/checks/delete.md rename to content/v2.0/monitor-alert/checks/delete.md index 90c42a138..58e0a70c4 100644 --- a/content/v2.0/cloud/monitor-alert/checks/delete.md +++ b/content/v2.0/monitor-alert/checks/delete.md @@ -27,6 +27,6 @@ After a check is deleted, all statuses generated by the check remain in the `_mo bucket until the retention period for the bucket expires. {{% note %}} -You can also [disable a check](/v2.0/cloud/monitor-alert/checks/update/#enable-or-disable-a-check) +You can also [disable a check](/v2.0/monitor-alert/checks/update/#enable-or-disable-a-check) without having to delete it. {{% /note %}} diff --git a/content/v2.0/cloud/monitor-alert/checks/update.md b/content/v2.0/monitor-alert/checks/update.md similarity index 98% rename from content/v2.0/cloud/monitor-alert/checks/update.md rename to content/v2.0/monitor-alert/checks/update.md index 45b136a8a..2a3cb1f44 100644 --- a/content/v2.0/cloud/monitor-alert/checks/update.md +++ b/content/v2.0/monitor-alert/checks/update.md @@ -30,7 +30,7 @@ To update checks, click **Monitoring & Alerting** in the InfluxDB UI sidebar. 2. To edit the check query, click **1. Query** at the top of the check builder window. 3. To edit the check logic, click **2. Check** at the top of the check builder window. -_For details about using the check builder, see [Create checks](/v2.0/cloud/monitor-alert/checks/create/)._ +_For details about using the check builder, see [Create checks](/v2.0/monitor-alert/checks/create/)._ ## Enable or disable a check In the **Checks** column, click the {{< icon "toggle" >}} toggle next to a check diff --git a/content/v2.0/cloud/monitor-alert/checks/view.md b/content/v2.0/monitor-alert/checks/view.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/checks/view.md rename to content/v2.0/monitor-alert/checks/view.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md b/content/v2.0/monitor-alert/notification-endpoints/_index.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/manage-notification-endpoints/_index.md rename to content/v2.0/monitor-alert/notification-endpoints/_index.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md b/content/v2.0/monitor-alert/notification-endpoints/create.md similarity index 93% rename from content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md rename to content/v2.0/monitor-alert/notification-endpoints/create.md index 52f14d7d9..cf0381d7f 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -11,11 +11,11 @@ menu: parent: Manage notification endpoints weight: 201 related: - - /v2.0/cloud/monitor-alert/manage-notification-rules/ - - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ --- -To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/cloud/monitor-alert/checks/create-checks). +To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/monitor-alert/checks/create-checks). ## Create a notification endpoint in the UI diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md b/content/v2.0/monitor-alert/notification-endpoints/delete.md similarity index 73% rename from content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md rename to content/v2.0/monitor-alert/notification-endpoints/delete.md index 48166598f..842042c15 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/delete-notification-endpoints.md +++ b/content/v2.0/monitor-alert/notification-endpoints/delete.md @@ -11,11 +11,11 @@ menu: parent: Manage notification endpoints weight: 201 related: - - /v2.0/cloud/monitor-alert/manage-notification-rules/ - - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ --- -If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/cloud/monitor-alert/manage-notification-rules/update-notification-rules) with a new notification endpoint as needed. +If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/monitor-alert/notification-rules/update) with a new notification endpoint as needed. ## Delete a notification endpoint in the UI diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md b/content/v2.0/monitor-alert/notification-endpoints/update.md similarity index 94% rename from content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md rename to content/v2.0/monitor-alert/notification-endpoints/update.md index 3f8657365..cbb0a6afc 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/update-notification-endpoints.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -9,8 +9,8 @@ menu: parent: Manage notification endpoints weight: 204 related: - - /v2.0/cloud/monitor-alert/manage-notification-rules/ - - /v2.0/cloud/monitor-alert/manage-notification-endpoints/ + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ --- To update the notification endpoint details, complete the following procedures as needed. diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md b/content/v2.0/monitor-alert/notification-rules/_index.md similarity index 96% rename from content/v2.0/cloud/monitor-alert/notification-rules/_index.md rename to content/v2.0/monitor-alert/notification-rules/_index.md index 8f907fa01..e43daae95 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/monitor-alert/notification-rules/_index.md @@ -2,7 +2,7 @@ title: Manage notification rules description: > Manage notification rules in InfluxDB. -weight: 20 +weight: 103 v2.0/tags: [notifications] menu: v2_0: diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md b/content/v2.0/monitor-alert/notification-rules/create.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules.md rename to content/v2.0/monitor-alert/notification-rules/create.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md b/content/v2.0/monitor-alert/notification-rules/delete.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/notification-rules/delete-notification-rules.md rename to content/v2.0/monitor-alert/notification-rules/delete.md diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md b/content/v2.0/monitor-alert/notification-rules/update.md similarity index 100% rename from content/v2.0/cloud/monitor-alert/notification-rules/update-notfication-rules.md rename to content/v2.0/monitor-alert/notification-rules/update.md diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index 99ea96622..8dd7a1d45 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -551,7 +551,7 @@ Related entries: [server](#server) ### notification endpoint - The notification endpoint specifies the Slack or PagerDuty endpoint to send a notification and contains configuration details for connecting to the endpoint. Learn how to [create a notification endpoint](/v2.0/cloud/monitor-alert/manage-notification-endpoints/create-notification-endpoints). + The notification endpoint specifies the Slack or PagerDuty endpoint to send a notification and contains configuration details for connecting to the endpoint. Learn how to [create a notification endpoint](/v2.0/monitor-alert/notification-endpoints/create). Related entries: [check](#check), [notification rule](#notification-rule) From cb3e1bcf661ca5645adcdae1458776ade240acce Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 13:19:15 -0700 Subject: [PATCH 162/258] Restructure files (addresses #434 ) --- content/v2.0/security/secrets/_index.md | 0 content/v2.0/security/secrets/storing-secrets-in-bolt.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/v2.0/security/secrets/_index.md create mode 100644 content/v2.0/security/secrets/storing-secrets-in-bolt.md diff --git a/content/v2.0/security/secrets/_index.md b/content/v2.0/security/secrets/_index.md new file mode 100644 index 000000000..e69de29bb diff --git a/content/v2.0/security/secrets/storing-secrets-in-bolt.md b/content/v2.0/security/secrets/storing-secrets-in-bolt.md new file mode 100644 index 000000000..e69de29bb From 97514f17184ecf8f48f7c419986f78b1629b4435 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 13:31:33 -0700 Subject: [PATCH 163/258] Fixed icon shortcode --- content/v2.0/security/tokens/create-token.md | 2 +- content/v2.0/security/tokens/delete-token.md | 2 +- content/v2.0/security/tokens/update-tokens.md | 2 +- content/v2.0/security/tokens/view-tokens.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/v2.0/security/tokens/create-token.md b/content/v2.0/security/tokens/create-token.md index a5f2e2b10..0352c5a6c 100644 --- a/content/v2.0/security/tokens/create-token.md +++ b/content/v2.0/security/tokens/create-token.md @@ -18,7 +18,7 @@ command line interface (CLI). 1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "load" >}} + {{< nav-icon "disks" >}} 2. Click **Tokens**. 3. Click the **+ Generate** dropdown in the upper right and select a token type (**Read/Write Token** or **All Access Token**). diff --git a/content/v2.0/security/tokens/delete-token.md b/content/v2.0/security/tokens/delete-token.md index f036a72e5..b96e308af 100644 --- a/content/v2.0/security/tokens/delete-token.md +++ b/content/v2.0/security/tokens/delete-token.md @@ -19,7 +19,7 @@ have access to your InfluxDB instance. 1. Click the Click the **Load Data** icon in the navigation bar. - {{< nav-icon "load" >}} + {{< nav-icon "disks" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Hover over the token you want to delete and click **Delete** and **Confirm**. diff --git a/content/v2.0/security/tokens/update-tokens.md b/content/v2.0/security/tokens/update-tokens.md index 70accf31c..b566c8809 100644 --- a/content/v2.0/security/tokens/update-tokens.md +++ b/content/v2.0/security/tokens/update-tokens.md @@ -17,7 +17,7 @@ Update an authentication token's description using the InfluxDB user interface ( 1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "load" >}} + {{< nav-icon "disks" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Click the pencil icon {{< icon "pencil" >}} next to the token's name in the **Description** column. diff --git a/content/v2.0/security/tokens/view-tokens.md b/content/v2.0/security/tokens/view-tokens.md index c8f962341..3e5fe9d22 100644 --- a/content/v2.0/security/tokens/view-tokens.md +++ b/content/v2.0/security/tokens/view-tokens.md @@ -18,7 +18,7 @@ command line interface (CLI). 1. Click the **Load Data** icon in the navigation bar. - {{< nav-icon "load" >}} + {{< nav-icon "disks" >}} 2. Click **Tokens**. All of your account's tokens appear. 3. Click on a token name from the list to view the token and a summary of access permissions. From 536d220665c7cf9ffd689e310fd9aa5784c06090 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 14:38:02 -0600 Subject: [PATCH 164/258] cleaned up frontmatter in monitoring docs and updated links --- content/v2.0/monitor-alert/_index.md | 1 + content/v2.0/monitor-alert/checks/_index.md | 6 +++- content/v2.0/monitor-alert/checks/create.md | 5 ++- content/v2.0/monitor-alert/checks/delete.md | 5 ++- content/v2.0/monitor-alert/checks/update.md | 5 ++- content/v2.0/monitor-alert/checks/view.md | 5 ++- .../notification-endpoints/_index.md | 12 ++++--- .../notification-endpoints/create.md | 35 +++++++++++-------- .../notification-endpoints/delete.md | 6 ++-- .../notification-endpoints/update.md | 6 ++-- .../notification-rules/_index.md | 8 +++-- .../notification-rules/create.md | 15 ++++---- .../notification-rules/delete.md | 10 +++--- .../notification-rules/update.md | 9 +++-- 14 files changed, 76 insertions(+), 52 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index c56f45e23..c5bcc3992 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -8,6 +8,7 @@ menu: name: Monitor and alert weight: 6 v2.0/tags: [monitor, alert, checks, notification, endpoints] +cloud_all: true --- Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. To get started, do the following: diff --git a/content/v2.0/monitor-alert/checks/_index.md b/content/v2.0/monitor-alert/checks/_index.md index 50a882404..e420f4323 100644 --- a/content/v2.0/monitor-alert/checks/_index.md +++ b/content/v2.0/monitor-alert/checks/_index.md @@ -7,7 +7,11 @@ menu: v2_0: parent: Monitor and alert weight: 101 -v2.0/tags: [monitor, checks, notifications] +v2.0/tags: [monitor, checks, notifications, alert] +related: + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- InfluxDB checks query data and apply a status or level to each data point based on specified conditions. diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index f02de1f19..332eca11c 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -7,7 +7,10 @@ menu: v2_0: parent: Manage checks weight: 201 -v2.0/tags: [monitor, checks, notifications] +related: + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- Create a check in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/checks/delete.md b/content/v2.0/monitor-alert/checks/delete.md index 58e0a70c4..3d42b1bac 100644 --- a/content/v2.0/monitor-alert/checks/delete.md +++ b/content/v2.0/monitor-alert/checks/delete.md @@ -7,7 +7,10 @@ menu: v2_0: parent: Manage checks weight: 204 -v2.0/tags: [monitor, checks, notifications] +related: + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- If you no longer need a check, use the InfluxDB user interface (UI) to delete it. diff --git a/content/v2.0/monitor-alert/checks/update.md b/content/v2.0/monitor-alert/checks/update.md index 2a3cb1f44..935509b05 100644 --- a/content/v2.0/monitor-alert/checks/update.md +++ b/content/v2.0/monitor-alert/checks/update.md @@ -7,7 +7,10 @@ menu: v2_0: parent: Manage checks weight: 203 -v2.0/tags: [monitor, checks, notifications] +related: + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- Update checks in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/checks/view.md b/content/v2.0/monitor-alert/checks/view.md index a742da80a..b27e7a202 100644 --- a/content/v2.0/monitor-alert/checks/view.md +++ b/content/v2.0/monitor-alert/checks/view.md @@ -7,7 +7,10 @@ menu: v2_0: parent: Manage checks weight: 202 -v2.0/tags: [monitor, checks, notifications] +related: + - /v2.0/monitor-alert/notification-rules/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- View check details and statuses and notifications generated by checks in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/notification-endpoints/_index.md b/content/v2.0/monitor-alert/notification-endpoints/_index.md index a3e930c48..15aa8c339 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/_index.md +++ b/content/v2.0/monitor-alert/notification-endpoints/_index.md @@ -1,17 +1,21 @@ --- title: Manage notification endpoints -seotitle: Manage notification endpoints list_title: Manage notification endpoints description: > Create, read, update, and delete endpoints in the InfluxDB UI. -v2.0/tags: [endpoints] +v2.0/tags: [monitor, endpoints, notifications, alert] menu: v2_0: - name: Manage notification endpoints parent: Monitor and alert weight: 102 +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-rules/ +cloud_all: true --- -Notification endpoints store information to connect to a third party service. If you're using the Free plan, create a Slack endpoint. If you're using the Pay as You Go plan, create a connection to a HTTP, Slack, or PagerDuty endpoint. +Notification endpoints store information to connect to a third party service. +If you're using the Free plan, create a Slack endpoint. +If you're using the Pay as You Go plan, create a connection to a HTTP, Slack, or PagerDuty endpoint. {{< children >}} diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index cf0381d7f..5d1188c91 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -1,18 +1,16 @@ --- title: Create notification endpoints -seotitle: Create notification endpoints description: > Create notification endpoints to send alerts on your time series data. - -v2.0/tags: [monitor, notifications, endpoints] menu: v2_0: name: Create endpoints parent: Manage notification endpoints weight: 201 related: + - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ - - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/monitor-alert/checks/create-checks). @@ -23,17 +21,24 @@ To send notifications about changes in your data, start by creating a notificati {{< nav-icon "alerts" >}} -2. Next to **Notification Endpoints**, click **Create**. -3. From the **Destination** drop-down list, select a destination endpoint to send notifications: - - (Free plan) Slack - - (Pay as You Go plan) HTTP, Slack, or PagerDuty -4. In the **Name** and **Description** fields, enter a name and description for the endpoint. -5. Enter enter information to connect to the endpoint: +2. Next to **Notification Endpoints**, click **Create**. +3. From the **Destination** drop-down list, select a destination endpoint to send notifications. + The following endpoints are available for InfluxDB 2.0 OSS, the InfluxDB Cloud 2.0 Free Plan, + and the InfluxDB Cloud 2.0 Pay As You Go (PAYG) Plan: - - For HTTP, enter the **URL** to send the notification. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. - - - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the PagerDuty client URL is https://events.pagerduty.com/v2/enqueue. For details, see [PagerDuty documentation](https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2). + | Endpoint | OSS | Free Plan _(Cloud)_ | PAYG Plan _(Cloud)_ | + |:-------- |:--------:|:-------------------: |:----------------------------:| + | **Slack** | _Coming_ | **{{< icon "check" >}}** | **{{< icon "check" >}}** | + | **PagerDuty** | _Coming_ | | **{{< icon "check" >}}** | + | **HTTP** | _Coming_ | | **{{< icon "check" >}}** | + +4. In the **Name** and **Description** fields, enter a name and description for the endpoint. +5. Enter enter information to connect to the endpoint: + + - For HTTP, enter the **URL** to send the notification. Select the **auth method** to use: **None** for no authentication. To authenticate with a username and password, select **Basic** and then enter credentials in the **Username** and **Password** fields. To authenticate with a token, select **Bearer**, and then enter the authentication token in the **Token** field. + + - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. + + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the PagerDuty client URL is https://events.pagerduty.com/v2/enqueue. For details, see [PagerDuty documentation](https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2). 6. Click **Create Notification Endpoint**. diff --git a/content/v2.0/monitor-alert/notification-endpoints/delete.md b/content/v2.0/monitor-alert/notification-endpoints/delete.md index 842042c15..0f3200f54 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/delete.md +++ b/content/v2.0/monitor-alert/notification-endpoints/delete.md @@ -1,18 +1,16 @@ --- title: Delete notification endpoints -seotitle: Delete notification endpoints description: > Delete a notification endpoint in the InfluxDB UI. - -v2.0/tags: [monitor, notifications, endpoints] menu: v2_0: name: Delete endpoints parent: Manage notification endpoints weight: 201 related: + - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ - - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/monitor-alert/notification-rules/update) with a new notification endpoint as needed. diff --git a/content/v2.0/monitor-alert/notification-endpoints/update.md b/content/v2.0/monitor-alert/notification-endpoints/update.md index cbb0a6afc..9353fd9a3 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/update.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -1,6 +1,5 @@ --- title: Update notification endpoints -seotitle: Update notification endpoints description: > Update notification endpoints in the InfluxDB UI. menu: @@ -9,8 +8,9 @@ menu: parent: Manage notification endpoints weight: 204 related: + - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ - - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- To update the notification endpoint details, complete the following procedures as needed. @@ -21,10 +21,8 @@ To update the notification endpoint details, complete the following procedures a 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Under **Notification Endpoints**, click **Add a label** next to the endpoint you want to add a label to. The **Add Labels** box opens. 3. To add an existing label, select the label from the list. 4. To create and add a new label: diff --git a/content/v2.0/monitor-alert/notification-rules/_index.md b/content/v2.0/monitor-alert/notification-rules/_index.md index e43daae95..6225efa41 100644 --- a/content/v2.0/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/monitor-alert/notification-rules/_index.md @@ -3,12 +3,16 @@ title: Manage notification rules description: > Manage notification rules in InfluxDB. weight: 103 -v2.0/tags: [notifications] +v2.0/tags: [monitor, notifications, alert] menu: v2_0: - name: Manage notification rules parent: Monitor and alert +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- + The following articles provide information on managing your notification rules: {{< children >}} diff --git a/content/v2.0/monitor-alert/notification-rules/create.md b/content/v2.0/monitor-alert/notification-rules/create.md index 24dbf049e..c3c47aa53 100644 --- a/content/v2.0/monitor-alert/notification-rules/create.md +++ b/content/v2.0/monitor-alert/notification-rules/create.md @@ -1,26 +1,27 @@ --- title: Create notification rules description: > - Create notification rules to receive alerts on your time series data. - + Create notification rules to send alerts on your time series data. weight: 20 -v2.0/tags: [notifications] menu: v2_0: - name: Create notification rules parent: Manage notification rules +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- -Once you've set up checks and notification endpoints, create notification rules to alert you. For details, see and . +Once you've set up checks and notification endpoints, create notification rules to alert you. +_For details, see [Manage checks](/v2.0/monitor-alert/checks/) and +[Manage notification endpoints](/v2.0/monitor-alert/notification-endpoints/)._ ## Create a new notification rule in the UI 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Under **Notification Rules**, click **+Create**. 3. Complete the **About** section: 1. In the **Name** field, enter a name for the notification rule. diff --git a/content/v2.0/monitor-alert/notification-rules/delete.md b/content/v2.0/monitor-alert/notification-rules/delete.md index ba3d61c31..317d11b88 100644 --- a/content/v2.0/monitor-alert/notification-rules/delete.md +++ b/content/v2.0/monitor-alert/notification-rules/delete.md @@ -2,23 +2,21 @@ title: Delete notification rules description: > If you no longer need to receive an alert, delete the associated notification rule. - - weight: 201 -v2.0/tags: [notifications] menu: v2_0: - name: Delete notification rules parent: Manage notification rules +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- ## Delete a notification rule in the UI 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Under **Notification Rules**, find the rule you want to delete. 3. Click the delete icon, then click **Delete** to confirm. diff --git a/content/v2.0/monitor-alert/notification-rules/update.md b/content/v2.0/monitor-alert/notification-rules/update.md index cc0a53d23..21a278c7c 100644 --- a/content/v2.0/monitor-alert/notification-rules/update.md +++ b/content/v2.0/monitor-alert/notification-rules/update.md @@ -2,23 +2,22 @@ title: Update notification rules description: > Update notification rules to update the notification message or change the schedule or conditions. - weight: 201 -v2.0/tags: [notifications] menu: v2_0: - name: Update notification rules parent: Manage notification rules +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- ## Add a label to notification rules 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Under **Notification Rules**, click **Add a label** next to the rule you want to add a label to. The **Add Labels** box opens. 3. To add an existing label, select the label from the list. 4. To create and add a new label: From 9a50e6c8d281e200b968bd96637695427f81e29a Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 13:48:55 -0700 Subject: [PATCH 165/258] add view endpoint notification history doc --- .../view-endpoint-history.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md new file mode 100644 index 000000000..622eae500 --- /dev/null +++ b/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md @@ -0,0 +1,41 @@ +--- +title: View notification endpoint history +seotitle: View notification endpoint details and history in the InfluxDB. +description: > + View notification endpoint details and history in the InfluxDB UI. +menu: + v2_0: + name: View endpoint history + parent: Manage notification endpoints +weight: 202 +v2.0/tags: [monitor, notifications] +--- + +View notification endpoint details and history in the InfluxDB user interface (UI). + +- [View notification endpoints](#view-notification-endpoints) +- [View notification endpoint details](#view-notification-endpoint-details) +- [View history notification endpoint history](#view-notification-endpoint-history), including statues and notifications sent to the endpoint + +## View notification endpoints + +- Click **Monitoring & Alerting** in the InfluxDB UI sidebar. + + {{< nav-icon "alerts" >}} + + In the **Notification Endpoints** column, view existing notification endpoints. + +## View notification endpoint details + +1. Click **Monitoring & Alerting** in the InfluxDB UI sidebar. +2. In the **Notification Endpoints** column, click the name of the notification endpoint you want to view. +3. View the notification endpoint destination, name, and information to connect to the endpoint. + +## View notification endpoint history + +1. Click **Monitoring & Alerting** in the InfluxDB UI sidebar. +2. In the **Notification Endpoints** column, hover over the notification endpoint, click the **{{< icon "view" >}}** icon, then **View History**. +The Check Statuses History page displays: + + - Statuses generated for the selected notification endpoint + - Notifications sent to the selected notification endpoint From fd2b00735a9777ad241c154d32bc8bc322f11703 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 14:56:17 -0600 Subject: [PATCH 166/258] updated content on monitoring landing page --- content/v2.0/monitor-alert/_index.md | 33 +++++++++++++------ content/v2.0/monitor-alert/checks/_index.md | 2 +- .../notification-rules/create.md | 2 -- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index c5bcc3992..1a131482e 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -2,7 +2,8 @@ title: Monitor data and send alerts seotitle: Monitor data and send alerts description: > - Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. + Monitor your time series data and send alerts by creating checks, notification + rules, and notification endpoints. menu: v2_0: name: Monitor and alert @@ -11,17 +12,29 @@ v2.0/tags: [monitor, alert, checks, notification, endpoints] cloud_all: true --- -Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. To get started, do the following: +Monitor your time series data and send alerts by creating checks, notification +rules, and notification endpoints. -1. [Create checks](...create-a-check) to monitor data for a specified check status. -2. (Optional) Send alerts on a specified check status by doing the following: +InfluxDB lets - a. [Create a notification endpoint](/v2.0/monitor-alert/notification-endpoints/create). +## The monitoring workflow +1. InfluxDB uses a [check](/v2.0/reference/glossary/#check) to query data and + assigns a status or `_level` based on specific conditions. +2. InfluxDB stores the output the check in the `statuses` measurement in the `_monitoring` system bucket. +3. [Notification rules](/v2.0/reference/glossary/#notification-rule) check data in the `statuses` + measurement and, based conditions set in the notification rule, send a message + to a [notification endpoint](/v2.0/reference/glossary/#notification-endpoint). +4. InfluxDB stores notifications in the `notifications` measurement in the `_monitoring` system bucket. - b. [Create notification rules](/v2.0/monitor-alert/notification-rules/create). +## Monitor your data +To get started, do the following: -After creating your initial checks and notifications, adjust how you monitor data and alerts as needed. For more information, see: +1. [Create checks](/v2.0/monitor-alert/checks/create/) to monitor data and assign a status. +2. [Add notification endpoints](/v2.0/monitor-alert/notification-endpoints/create/) to send notifications to. +3. [Create notification rules](/v2.0/monitor-alert/notification-rules/create) to check + statuses and send notifications to your notifications endpoints. -- [Manage checks](/v2.0/cloud/monitor-alert/manage-checks) -- [Manage notification rules](/v2.0/monitor-alert/notification-rules) -- [Manage notification endpoints](/v2.0/monitor-alert/notification-endpoints) + +## Manage your monitoring and alerting pipeline + +{{< children >}} diff --git a/content/v2.0/monitor-alert/checks/_index.md b/content/v2.0/monitor-alert/checks/_index.md index e420f4323..77463f54c 100644 --- a/content/v2.0/monitor-alert/checks/_index.md +++ b/content/v2.0/monitor-alert/checks/_index.md @@ -14,7 +14,7 @@ related: cloud_all: true --- -InfluxDB checks query data and apply a status or level to each data point based on specified conditions. +Checks in InfluxDB query data and apply a status or level to each data point based on specified conditions. Learn how to create and manage checks: {{< children >}} diff --git a/content/v2.0/monitor-alert/notification-rules/create.md b/content/v2.0/monitor-alert/notification-rules/create.md index c3c47aa53..fea519401 100644 --- a/content/v2.0/monitor-alert/notification-rules/create.md +++ b/content/v2.0/monitor-alert/notification-rules/create.md @@ -39,9 +39,7 @@ _For details, see [Manage checks](/v2.0/monitor-alert/checks/) and 1. Select the **Monitoring and Alerting** icon from the sidebar. - {{< nav-icon "alerts" >}} - 2. Under **Notification Rules**, hover over the rule you want to clone. 3. Click the clone icon and select **Clone**. The cloned rule appears. From 3e6f5d8dac0dc52338c5a0e233406882f2912e13 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 14:58:56 -0600 Subject: [PATCH 167/258] updated monitor and alert nav name --- content/v2.0/monitor-alert/_index.md | 2 +- content/v2.0/monitor-alert/checks/_index.md | 2 +- content/v2.0/monitor-alert/notification-endpoints/_index.md | 2 +- content/v2.0/monitor-alert/notification-rules/_index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index 1a131482e..ef2eafd3d 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -6,7 +6,7 @@ description: > rules, and notification endpoints. menu: v2_0: - name: Monitor and alert + name: Monitor & alert weight: 6 v2.0/tags: [monitor, alert, checks, notification, endpoints] cloud_all: true diff --git a/content/v2.0/monitor-alert/checks/_index.md b/content/v2.0/monitor-alert/checks/_index.md index 77463f54c..490bb8645 100644 --- a/content/v2.0/monitor-alert/checks/_index.md +++ b/content/v2.0/monitor-alert/checks/_index.md @@ -5,7 +5,7 @@ description: > Checks in InfluxDB query data and apply a status or level to each data point based on specified conditions. menu: v2_0: - parent: Monitor and alert + parent: Monitor & alert weight: 101 v2.0/tags: [monitor, checks, notifications, alert] related: diff --git a/content/v2.0/monitor-alert/notification-endpoints/_index.md b/content/v2.0/monitor-alert/notification-endpoints/_index.md index 15aa8c339..2362d0f5e 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/_index.md +++ b/content/v2.0/monitor-alert/notification-endpoints/_index.md @@ -6,7 +6,7 @@ description: > v2.0/tags: [monitor, endpoints, notifications, alert] menu: v2_0: - parent: Monitor and alert + parent: Monitor & alert weight: 102 related: - /v2.0/monitor-alert/checks/ diff --git a/content/v2.0/monitor-alert/notification-rules/_index.md b/content/v2.0/monitor-alert/notification-rules/_index.md index 6225efa41..0b7115605 100644 --- a/content/v2.0/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/monitor-alert/notification-rules/_index.md @@ -6,7 +6,7 @@ weight: 103 v2.0/tags: [monitor, notifications, alert] menu: v2_0: - parent: Monitor and alert + parent: Monitor & alert related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ From 72c8846c9ec3870d940671d9267fcae7b8e3f381 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 15:01:16 -0600 Subject: [PATCH 168/258] added monitor and alert to version landing page --- layouts/_default/version-landing.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/layouts/_default/version-landing.html b/layouts/_default/version-landing.html index b6ee4d93a..2a1bcfdf3 100644 --- a/layouts/_default/version-landing.html +++ b/layouts/_default/version-landing.html @@ -35,6 +35,10 @@

Visualize Data

+ +

Monitor & alert

+
+ From 2ba7de16b704810dd1504a7563aea08c54c8c7a8 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 15:08:11 -0600 Subject: [PATCH 169/258] fixed broken links in monitoring section --- content/v2.0/monitor-alert/checks/create.md | 2 +- content/v2.0/monitor-alert/notification-endpoints/create.md | 2 +- content/v2.0/monitor-alert/notification-endpoints/update.md | 2 +- content/v2.0/reference/glossary.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index 332eca11c..f4c0fd74a 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -73,7 +73,7 @@ A check consists of two parts – a query and check confiuration. Use custom tags to associate additional metadata with the check. Common metadata tags across different checks lets you easily group and organize checks. - You can also use custom tags in [notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules/). + You can also use custom tags in [notification rules](/v2.0/monitor-alert/notification-rules/create/). 3. In the **Status Message Template** column, enter the status message template for the check. Use [Flux string interpolation](/v2.0/reference/flux/language/string-interpolation/) diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index 5d1188c91..3c485876e 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -13,7 +13,7 @@ related: cloud_all: true --- -To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules) to send alerts to third party services on [check statuses](/v2.0/monitor-alert/checks/create-checks). +To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/monitor-alert/notification-rules/create) to send alerts to third party services on [check statuses](/v2.0/monitor-alert/checks/create). ## Create a notification endpoint in the UI diff --git a/content/v2.0/monitor-alert/notification-endpoints/update.md b/content/v2.0/monitor-alert/notification-endpoints/update.md index 9353fd9a3..dccc45216 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/update.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -65,4 +65,4 @@ To update the notification endpoint details, complete the following procedures a {{< nav-icon "alerts" >}} 2. Under **Notification Endpoints**, click the endpoint to update. -3. Update details as needed, and then click **Edit a Notification Endpoint**. For details about each field, see [create a notification endpoint](v2.0/cloud/monitor-alert/manage-checks/create-notification-endpoints). +3. Update details as needed, and then click **Edit a Notification Endpoint**. For details about each field, see [Create notification endpoints](/v2.0/monitor-alert/notification-endpoints/create/). diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index 8dd7a1d45..1111627d2 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -559,7 +559,7 @@ Related entries: [check](#check), [notification rule](#notification-rule) A notification rule specifies a status level (and tags) to alert on, the notification message to send for the specified status level (or change in status level), and the interval or schedule you want to check the status level (and tags). If conditions are met, the notification rule sends a message to the [notification endpoint](#notification-endpoint) and stores a receipt in a notification measurement in the _monitoring bucket. For example, a notification rule may specify a message to send to a Slack endpoint when a status level is critical (`crit`). -Learn how to [create a notification rule](/v2.0/cloud/monitor-alert/notification-rules/create-notification-rules). +Learn how to [create a notification rule](/v2.0/monitor-alert/notification-rules/create). Related entries: [check](#check), [notification endpoint](#notification-endpoint) From 2326703bb058960b89d7894d1ac3397ab242f920 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 15:13:33 -0600 Subject: [PATCH 170/258] various fixes in monitoring docs --- content/v2.0/monitor-alert/_index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index ef2eafd3d..00d2bf8bf 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -15,8 +15,6 @@ cloud_all: true Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. -InfluxDB lets - ## The monitoring workflow 1. InfluxDB uses a [check](/v2.0/reference/glossary/#check) to query data and assigns a status or `_level` based on specific conditions. @@ -30,7 +28,8 @@ InfluxDB lets To get started, do the following: 1. [Create checks](/v2.0/monitor-alert/checks/create/) to monitor data and assign a status. -2. [Add notification endpoints](/v2.0/monitor-alert/notification-endpoints/create/) to send notifications to. +2. [Add notification endpoints](/v2.0/monitor-alert/notification-endpoints/create/) + to send notifications to third parties. 3. [Create notification rules](/v2.0/monitor-alert/notification-rules/create) to check statuses and send notifications to your notifications endpoints. From 090275460966486d4be8ce096679adced512f694 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 15:19:39 -0600 Subject: [PATCH 171/258] moved monitor view docs out of cloud --- .../v2.0/monitor-alert/notification-endpoints/delete.md | 2 +- .../v2.0/monitor-alert/notification-endpoints/update.md | 2 +- .../notification-endpoints/view.md} | 9 ++++++--- content/v2.0/monitor-alert/notification-rules/create.md | 2 +- content/v2.0/monitor-alert/notification-rules/delete.md | 2 +- content/v2.0/monitor-alert/notification-rules/update.md | 2 +- .../notification-rules/view.md} | 9 +++++---- 7 files changed, 16 insertions(+), 12 deletions(-) rename content/v2.0/{cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md => monitor-alert/notification-endpoints/view.md} (89%) rename content/v2.0/{cloud/monitor-alert/notification-rules/view-notification-rules.md => monitor-alert/notification-rules/view.md} (93%) diff --git a/content/v2.0/monitor-alert/notification-endpoints/delete.md b/content/v2.0/monitor-alert/notification-endpoints/delete.md index 0f3200f54..88d2448b0 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/delete.md +++ b/content/v2.0/monitor-alert/notification-endpoints/delete.md @@ -6,7 +6,7 @@ menu: v2_0: name: Delete endpoints parent: Manage notification endpoints -weight: 201 +weight: 204 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ diff --git a/content/v2.0/monitor-alert/notification-endpoints/update.md b/content/v2.0/monitor-alert/notification-endpoints/update.md index dccc45216..a49675a4d 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/update.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -6,7 +6,7 @@ menu: v2_0: name: Update endpoints parent: Manage notification endpoints -weight: 204 +weight: 203 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ diff --git a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md b/content/v2.0/monitor-alert/notification-endpoints/view.md similarity index 89% rename from content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md rename to content/v2.0/monitor-alert/notification-endpoints/view.md index 622eae500..a4c5342d9 100644 --- a/content/v2.0/cloud/monitor-alert/manage-notification-endpoints/view-endpoint-history.md +++ b/content/v2.0/monitor-alert/notification-endpoints/view.md @@ -1,6 +1,6 @@ --- title: View notification endpoint history -seotitle: View notification endpoint details and history in the InfluxDB. +seotitle: View notification endpoint details and history description: > View notification endpoint details and history in the InfluxDB UI. menu: @@ -8,7 +8,10 @@ menu: name: View endpoint history parent: Manage notification endpoints weight: 202 -v2.0/tags: [monitor, notifications] +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-rules/ +cloud_all: true --- View notification endpoint details and history in the InfluxDB user interface (UI). @@ -34,7 +37,7 @@ View notification endpoint details and history in the InfluxDB user interface (U ## View notification endpoint history 1. Click **Monitoring & Alerting** in the InfluxDB UI sidebar. -2. In the **Notification Endpoints** column, hover over the notification endpoint, click the **{{< icon "view" >}}** icon, then **View History**. +2. In the **Notification Endpoints** column, hover over the notification endpoint, click the **{{< icon "view" >}}** icon, then **View History**. The Check Statuses History page displays: - Statuses generated for the selected notification endpoint diff --git a/content/v2.0/monitor-alert/notification-rules/create.md b/content/v2.0/monitor-alert/notification-rules/create.md index fea519401..9bbb54e17 100644 --- a/content/v2.0/monitor-alert/notification-rules/create.md +++ b/content/v2.0/monitor-alert/notification-rules/create.md @@ -2,7 +2,7 @@ title: Create notification rules description: > Create notification rules to send alerts on your time series data. -weight: 20 +weight: 201 menu: v2_0: parent: Manage notification rules diff --git a/content/v2.0/monitor-alert/notification-rules/delete.md b/content/v2.0/monitor-alert/notification-rules/delete.md index 317d11b88..7ebfca923 100644 --- a/content/v2.0/monitor-alert/notification-rules/delete.md +++ b/content/v2.0/monitor-alert/notification-rules/delete.md @@ -2,7 +2,7 @@ title: Delete notification rules description: > If you no longer need to receive an alert, delete the associated notification rule. -weight: 201 +weight: 204 menu: v2_0: parent: Manage notification rules diff --git a/content/v2.0/monitor-alert/notification-rules/update.md b/content/v2.0/monitor-alert/notification-rules/update.md index 21a278c7c..7b9960fb5 100644 --- a/content/v2.0/monitor-alert/notification-rules/update.md +++ b/content/v2.0/monitor-alert/notification-rules/update.md @@ -2,7 +2,7 @@ title: Update notification rules description: > Update notification rules to update the notification message or change the schedule or conditions. -weight: 201 +weight: 203 menu: v2_0: parent: Manage notification rules diff --git a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md b/content/v2.0/monitor-alert/notification-rules/view.md similarity index 93% rename from content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md rename to content/v2.0/monitor-alert/notification-rules/view.md index b383e06e4..5dad401c4 100644 --- a/content/v2.0/cloud/monitor-alert/notification-rules/view-notification-rules.md +++ b/content/v2.0/monitor-alert/notification-rules/view.md @@ -2,13 +2,14 @@ title: View notification rules description: > Update notification rules to update the notification message or change the schedule or conditions. - -weight: 201 -v2.0/tags: [notifications] +weight: 202 menu: v2_0: - name: View notification rules parent: Manage notification rules +related: + - /v2.0/monitor-alert/checks/ + - /v2.0/monitor-alert/notification-endpoints/ +cloud_all: true --- View notification rule details and statuses and notifications generated by notification rules in the InfluxDB user interface (UI). From de1e9116b292485f062027310e1512247ac536be Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 14:36:58 -0700 Subject: [PATCH 172/258] enable the corrent version of KV engine (kv-v2) --- content/v2.0/security/use-vault.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/content/v2.0/security/use-vault.md b/content/v2.0/security/use-vault.md index 5fc8bc3bd..c53651855 100644 --- a/content/v2.0/security/use-vault.md +++ b/content/v2.0/security/use-vault.md @@ -10,7 +10,7 @@ weight: 102 [Vault](https://www.vaultproject.io/) secures, stores, and tightly controls access to tokens, passwords, certificates, and other sensitive secrets. -Store sensitive secrets in Vault using the InfluxDB built-in Vault integration. +Store sensitive secrets in Vault using the InfluxDB built-in Vault integration. {{% note %}} When not using Vault, secrets are Base64-encoded and stored in the InfluxDB embedded key value store, @@ -18,7 +18,9 @@ When not using Vault, secrets are Base64-encoded and stored in the InfluxDB embe {{% /note %}} ## Start a Vault server + Start a Vault server and ensure InfluxDB has network access to the server. + The following links provide information about running Vault in both development and production: - [Install Vault](https://learn.hashicorp.com/vault/getting-started/install) @@ -32,10 +34,12 @@ vault server -dev ``` ## Define Vault environment variables + Use [Vault environment variables](https://www.vaultproject.io/docs/commands/index.html#environment-variables) to provide connection credentials and other important Vault-related information to InfluxDB. #### Required environment variables + - `VAULT_ADDR`: The API address of your Vault server _(provided in the Vault server output)_. - `VAULT_TOKEN`: The [Vault token](https://learn.hashicorp.com/vault/getting-started/authentication) required to access your Vault server. @@ -47,6 +51,7 @@ export VAULT_ADDR='http://127.0.0.1:8200' VAULT_TOKEN='s.0X0XxXXx0xXxXXxxxXxXxX0 ``` ## Start InfluxDB + Start the [`influxd` service](/v2.0/reference/cli/influxd/) with the `--secret-store` option set to `vault`. @@ -55,6 +60,7 @@ influxd --secret-store vault ``` ## Test Vault storage + With Vault and InfluxDB servers running, use the InfluxDB API to test Vault: {{% note %}} @@ -63,6 +69,7 @@ and `YOURAUTHTOKEN` with your [InfluxDB authentication token](/v2.0/security/tok {{% /note %}} ##### Retrieve an organization's secrets + ```sh curl --request GET \ --url http://localhost:9999/api/v2/orgs//secrets \ @@ -79,6 +86,7 @@ curl --request GET \ ``` ##### Add secrets to an organization + ```sh curl --request PATCH \ --url http://localhost:9999/api/v2/orgs//secrets \ @@ -93,6 +101,7 @@ curl --request PATCH \ ``` ##### Retrieve the added secrets + ```bash curl --request GET \ --url http://localhost:9999/api/v2/orgs//secrets \ @@ -112,12 +121,17 @@ curl --request GET \ ``` ## Vault secrets storage -For each organization, InfluxDB creates a [secrets engine](https://learn.hashicorp.com/vault/getting-started/secrets-engines) -using the following pattern: -``` -/secret/data/ -``` +For each organization, InfluxDB creates a [secrets engine](https://learn.hashicorp.com/vault/getting-started/secrets-engines) +using the following pattern: `/secret/data/` + +{{% note %}} +The InfluxDB API supports KV engine v2 only. +{{% /note %}} + +#### Enable KV engine v2 + +To pass the correct version of the KV engine when you enable a secrets engine, run the following command `vault secrets enable kv-v2`. Secrets are stored in Vault as key value pairs in their respective secrets engines. From 6c62e0ae3ec9a07f040b955596b6a767d066dcd2 Mon Sep 17 00:00:00 2001 From: kelseiv <47797004+kelseiv@users.noreply.github.com> Date: Mon, 9 Sep 2019 14:42:28 -0700 Subject: [PATCH 173/258] Update use-vault.md --- content/v2.0/security/use-vault.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/security/use-vault.md b/content/v2.0/security/use-vault.md index c53651855..2db1f42a5 100644 --- a/content/v2.0/security/use-vault.md +++ b/content/v2.0/security/use-vault.md @@ -129,9 +129,9 @@ using the following pattern: `/secret/data/` The InfluxDB API supports KV engine v2 only. {{% /note %}} -#### Enable KV engine v2 +#### Enable KV secrets engine v2 -To pass the correct version of the KV engine when you enable a secrets engine, run the following command `vault secrets enable kv-v2`. +To pass the correct version of the KV secrets engine when you enable a secrets engine, run: `vault secrets enable kv-v2`. Secrets are stored in Vault as key value pairs in their respective secrets engines. From 5d0e638afeb7a8a599b20c780b753397e17cd85d Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 14:43:42 -0700 Subject: [PATCH 174/258] Move vault doc --- content/v2.0/security/{ => secrets}/use-vault.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/v2.0/security/{ => secrets}/use-vault.md (100%) diff --git a/content/v2.0/security/use-vault.md b/content/v2.0/security/secrets/use-vault.md similarity index 100% rename from content/v2.0/security/use-vault.md rename to content/v2.0/security/secrets/use-vault.md From 0c859170e97f903b5a425cfd557d33111eee5ed9 Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 15:02:44 -0700 Subject: [PATCH 175/258] add edits from Scott --- content/v2.0/cloud/pricing-calculator.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md index c94eb87e9..b7d4644a3 100644 --- a/content/v2.0/cloud/pricing-calculator.md +++ b/content/v2.0/cloud/pricing-calculator.md @@ -2,10 +2,7 @@ title: InfluxDB Cloud 2.0 pricing calculator description: > Use the InfluxDB Cloud 2.0 pricing calculator to estimate costs by adjusting the number of devices, - plugins, metrics, and writes. - for the Pay As You Go Plan. -aliases: - - /v2.0/cloud/rate-limits/ + plugins, metrics, and writes for the Pay As You Go Plan. weight: 2 menu: v2_0_cloud: @@ -30,7 +27,7 @@ Use the {{< cloud-name >}} pricing calculator to estimate costs by adjusting you 2. Choose your region. 2. Select your configuration: - **Hobby**. For a single user monitoring a few machines or sensors. - - **Standard**. For a single team (what is real-time visibility? monitoring a {how many is a single set?} of use-cases.) + - **Standard**. For a single team requiring real-time visibility and monitoring a single set of use cases. - **Professional**. For teams monitoring multiple disparate systems or use cases. - **Enterprise**. For teams monitoring multiple domains and use cases accessing a variety of dashboards. 3. Adjust the default configuration values to match your number of devices, plugins, metrics, and so on. The **Projected Usage** costs are automatically updated as you adjust your configuration. From 7f1f2eb5400a9708cc0efaa6b266a68f5dd4f4c9 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 16:13:23 -0600 Subject: [PATCH 176/258] added pagerduty.severityFromLevel function --- .../functions/pagerduty/severityfromlevel.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md diff --git a/content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md b/content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md new file mode 100644 index 000000000..a70fd76b6 --- /dev/null +++ b/content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md @@ -0,0 +1,55 @@ +--- +title: pagerduty.severityFromLevel() function +description: > + The `pagerduty.severityFromLevel()` function converts an InfluxDB status level to + a PagerDuty severity. +menu: + v2_0_ref: + name: pagerduty.severityFromLevel + parent: PagerDuty +weight: 202 +--- + +The `pagerduty.severityFromLevel()` function converts an InfluxDB status level to +a PagerDuty severity. + +_**Function type:** Transformation_ + +```js +import "pagerduty" + +pagerduty.severityFromLevel( + level: "crit" +) + +// Returns "critical" +``` + +| Status level | PagerDuty severity | +|:------------:|:------------------:| +| `crit` | `critical` | +| `warn` | `warning` | +| `info` | `info` | +| `ok` | `info` | + +## Parameters + +### level +The InfluxDB status level to convert to a PagerDuty severity. + +_**Data type:** String_ + +## Function definition +```js +import "strings" + +severityFromLevel = (level) => { + lvl = strings.toLower(v:level) + sev = if lvl == "warn" then "warning" + else if lvl == "crit" then "critical" + else if lvl == "info" then "info" + else if lvl == "ok" then "info" + else "error" + return sev +} +``` From 29f8b0ef64973b6a58d200f79def6c854d0ef23d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 16:26:53 -0600 Subject: [PATCH 177/258] removed token from pagerduty functions --- .../flux/functions/pagerduty/endpoint.md | 10 +--------- .../flux/functions/pagerduty/sendevent.md | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/content/v2.0/reference/flux/functions/pagerduty/endpoint.md b/content/v2.0/reference/flux/functions/pagerduty/endpoint.md index cd3a63ffc..70fb7cf83 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/endpoint.md +++ b/content/v2.0/reference/flux/functions/pagerduty/endpoint.md @@ -18,8 +18,7 @@ _**Function type:** Output_ import "pagerduty" pagerduty.endpoint( - url: "https://events.pagerduty.com/v2/enqueue", - token: "mySuPerSecRetTokEn" + url: "https://events.pagerduty.com/v2/enqueue" ) ``` @@ -31,13 +30,6 @@ Defaults to `https://events.pagerduty.com/v2/enqueue`. _**Data type:** String_ -### token -The [PagerDuty API token](https://support.pagerduty.com/docs/generating-api-keys#section-generating-a-general-access-rest-api-key) -used to interact with PagerDuty. -Defaults to `""`. - -_**Data type:** String_ - ### mapFn A function that builds the object used to generate the POST request. diff --git a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md index 562abf3e3..a3fb2b7d0 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md +++ b/content/v2.0/reference/flux/functions/pagerduty/sendevent.md @@ -18,7 +18,6 @@ import "pagerduty" pagerduty.sendEvent( pagerdutyURL: "https://events.pagerduty.com/v2/enqueue", - token: "mySuPerSecRetTokEn", routingKey: "ExampleRoutingKey", client: "ExampleClient", clientURL: "http://examplepagerdutyclient.com", @@ -41,13 +40,6 @@ Defaults to `https://events.pagerduty.com/v2/enqueue`. _**Data type:** String_ -### token -The [PagerDuty API token](https://support.pagerduty.com/docs/generating-api-keys#section-generating-a-general-access-rest-api-key) -used to interact with PagerDuty. -Defaults to `""`. - -_**Data type:** String_ - ### routingKey The routing key generated from your PagerDuty integration. @@ -101,6 +93,17 @@ The severity of the event. _**Data type:** String_ +### eventAction +The type of event to send to PagerDuty. + +**Valid values include:** + +- `trigger` +- `resolve` +- `acknowledge` + +_**Data type:** String_ + ### component The component of the source machine responsible for the event. Components are user-defined. From 6145483b6701ad33abf1f84c274003a622112c8d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 16:33:35 -0600 Subject: [PATCH 178/258] added flux 0.45.0 and 0.45.1 to flux changelog --- content/v2.0/reference/release-notes/flux.md | 22 +++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index eb7e39a4b..8d5d09809 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,13 +11,33 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.43.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.45.1**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} --- +## v0.45.1 [2019-09-09] + +### Bug fixes +- Ensure `http.post` respects the context. + +--- + +## v0.45.0 [2019-09-06] + +### Features +- Added Google Bigtable `from()`. + +### Bug fixes +- Add `pagerduty.severityFromLevel()` helper function. +- Sleep function now gets canceled when the context is canceled. +- Categorize the undefined identifier as an invalid status code. +- Panic from `CheckKind` in `memberEvaluator`. + +--- + ## v0.44.0 [2019-09-05] ### Features From e802a19b929ef37acac9c954b1ff006812d3890a Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 16:01:25 -0700 Subject: [PATCH 179/258] Add overview content to index page --- content/v2.0/security/secrets/_index.md | 14 ++++++++++++++ .../security/secrets/storing-secrets-in-bolt.md | 0 content/v2.0/security/secrets/use-vault.md | 6 +++--- 3 files changed, 17 insertions(+), 3 deletions(-) delete mode 100644 content/v2.0/security/secrets/storing-secrets-in-bolt.md diff --git a/content/v2.0/security/secrets/_index.md b/content/v2.0/security/secrets/_index.md index e69de29bb..030970e8f 100644 --- a/content/v2.0/security/secrets/_index.md +++ b/content/v2.0/security/secrets/_index.md @@ -0,0 +1,14 @@ +--- +title: Store secrets +description: +v2.0/tags: [secrets, security] +menu: + v2_0: + parent: Security & authorization +weight: 102 +--- + +There are two options for storing secrets with InfluxDB: + +- By default, secrets are Base64-encoded and stored in the InfluxDB embedded key value store, [BoltDB](https://github.com/boltdb/bolt). +- You can also set up Vault to store secrets. For details, see [Store secrets in Vault](/v2.0/security/secrets/use-vault). diff --git a/content/v2.0/security/secrets/storing-secrets-in-bolt.md b/content/v2.0/security/secrets/storing-secrets-in-bolt.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index 2db1f42a5..36b42b372 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -4,13 +4,13 @@ description: Manage authentication tokens in InfluxDB using the InfluxDB UI or t v2.0/tags: [tokens, security] menu: v2_0: - parent: Security & authorization -weight: 102 + parent: Store secrets +weight: 201 --- [Vault](https://www.vaultproject.io/) secures, stores, and tightly controls access to tokens, passwords, certificates, and other sensitive secrets. -Store sensitive secrets in Vault using the InfluxDB built-in Vault integration. +Store sensitive secrets in Vault using the InfluxDB built-in Vault integration. {{% note %}} When not using Vault, secrets are Base64-encoded and stored in the InfluxDB embedded key value store, From b95327d07b83dc66a638ce2b9d56868687e94574 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 16:06:59 -0700 Subject: [PATCH 180/258] Move API calls to manage doc --- .../v2.0/security/secrets/manage-secrets.md | 64 +++++++++++++++++++ content/v2.0/security/secrets/use-vault.md | 4 +- 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 content/v2.0/security/secrets/manage-secrets.md diff --git a/content/v2.0/security/secrets/manage-secrets.md b/content/v2.0/security/secrets/manage-secrets.md new file mode 100644 index 000000000..053f69e45 --- /dev/null +++ b/content/v2.0/security/secrets/manage-secrets.md @@ -0,0 +1,64 @@ +--- +title: Manage secrets +description: Manage secrets in InfluxDB with the API. +v2.0/tags: [secrets, security] +menu: + v2_0: + parent: Store secrets +weight: 201 +--- + + +The following API calls allow you to manage secrets: + + +### Add secrets to an organization + +```sh +curl --request PATCH \ + --url http://localhost:9999/api/v2/orgs//secrets \ + --header 'authorization: Token YOURAUTHTOKEN' \ + --header 'content-type: application/json' \ + --data '{ + "foo": "bar", + "hello": "world" +}' + +# should return 204 no content +``` +### Retrieve an organization's secrets + +```sh +curl --request GET \ + --url http://localhost:9999/api/v2/orgs//secrets \ + --header 'authorization: Token YOURAUTHTOKEN' + +# should return +# { +# "links": { +# "org": "/api/v2/orgs/031c8cbefe101000", +# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" +# }, +# "secrets": [] +# } +``` + +### Retrieve the added secrets + +```bash +curl --request GET \ + --url http://localhost:9999/api/v2/orgs//secrets \ + --header 'authorization: Token YOURAUTHTOKEN' + +# should return +# { +# "links": { +# "org": "/api/v2/orgs/031c8cbefe101000", +# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" +# }, +# "secrets": [ +# "foo", +# "hello" +# ] +# } +``` diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index 36b42b372..7b6a74b60 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -1,7 +1,7 @@ --- title: Store secrets in Vault -description: Manage authentication tokens in InfluxDB using the InfluxDB UI or the influx CLI. -v2.0/tags: [tokens, security] +description: Manage secrets in InfluxDB using the InfluxDB UI or the influx CLI. +v2.0/tags: [secrets, security] menu: v2_0: parent: Store secrets From 049e7928b649542002df82ec04a8a32af6b77b2d Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 16:14:31 -0700 Subject: [PATCH 181/258] move note about kv-v2 up to install section --- content/v2.0/security/secrets/use-vault.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index 7b6a74b60..e50ff4716 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -33,6 +33,14 @@ For this example, install Vault on your local machine and start a Vault dev serv vault server -dev ``` +{{% note %}} +The InfluxDB API supports KV engine v2 only. +{{% /note %}} + +#### Enable KV secrets engine v2 + +To pass the correct version of the KV secrets engine when you enable a secrets engine, run: `vault secrets enable kv-v2`. + ## Define Vault environment variables Use [Vault environment variables](https://www.vaultproject.io/docs/commands/index.html#environment-variables) @@ -125,14 +133,6 @@ curl --request GET \ For each organization, InfluxDB creates a [secrets engine](https://learn.hashicorp.com/vault/getting-started/secrets-engines) using the following pattern: `/secret/data/` -{{% note %}} -The InfluxDB API supports KV engine v2 only. -{{% /note %}} - -#### Enable KV secrets engine v2 - -To pass the correct version of the KV secrets engine when you enable a secrets engine, run: `vault secrets enable kv-v2`. - Secrets are stored in Vault as key value pairs in their respective secrets engines. ``` From 9123ee349b996b52c902b4963fdcd780c5b8fc2e Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 16:21:01 -0700 Subject: [PATCH 182/258] add note to enable kv-v2 -secrets storage section --- content/v2.0/security/secrets/use-vault.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index e50ff4716..dd2fdc65a 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -37,10 +37,6 @@ vault server -dev The InfluxDB API supports KV engine v2 only. {{% /note %}} -#### Enable KV secrets engine v2 - -To pass the correct version of the KV secrets engine when you enable a secrets engine, run: `vault secrets enable kv-v2`. - ## Define Vault environment variables Use [Vault environment variables](https://www.vaultproject.io/docs/commands/index.html#environment-variables) @@ -133,8 +129,11 @@ curl --request GET \ For each organization, InfluxDB creates a [secrets engine](https://learn.hashicorp.com/vault/getting-started/secrets-engines) using the following pattern: `/secret/data/` -Secrets are stored in Vault as key value pairs in their respective secrets engines. +{{% note %}} +When you create a secrets engine, enable the `kv-v2` version by running: `vault secrets enable kv-v2`. +{{% /note %}} +Secrets are stored in Vault as key value pairs in their respective secrets engines. ``` /secret/data/031c8cbefe101000 -> this_key: foo From 043fe36db7eb3ec1e20d701a17d4a10fe22f240a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 17:54:39 -0600 Subject: [PATCH 183/258] added example api calls and queries to the manage secrets doc --- .../v2.0/security/secrets/manage-secrets.md | 87 ++++++++++--------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/content/v2.0/security/secrets/manage-secrets.md b/content/v2.0/security/secrets/manage-secrets.md index 053f69e45..17826985f 100644 --- a/content/v2.0/security/secrets/manage-secrets.md +++ b/content/v2.0/security/secrets/manage-secrets.md @@ -1,6 +1,6 @@ --- title: Manage secrets -description: Manage secrets in InfluxDB with the API. +description: Manage secrets in InfluxDB with the InfluxDB API. v2.0/tags: [secrets, security] menu: v2_0: @@ -9,56 +9,61 @@ weight: 201 --- -The following API calls allow you to manage secrets: +Manage secrets using the InfluxDB `/org/{orgID}/secrets` API endpoint. +All secrets belong to an organization and are stored in your [secret-store](/v2.0/security/secrets/). +Include your [organization ID](/v2.0/organizations/view-orgs/#view-your-organization-id) +and [authentication token](/v2.0/security/tokens/view-tokens/) with each request. - -### Add secrets to an organization +### Add a secret +Use the `PATCH` request method to add a new secret to your organization. +Pass the secret key-value pair in the request body. ```sh -curl --request PATCH \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' \ - --header 'content-type: application/json' \ +curl -XPATCH http://localhost:9999/api/v2/orgs//secrets \ + -H 'authorization: Token YOURAUTHTOKEN' \ + -H 'Content-type: application/json' \ --data '{ - "foo": "bar", - "hello": "world" + "": "" }' - -# should return 204 no content ``` -### Retrieve an organization's secrets + +### View secret keys +Use the `GET` request method to view your organization's secrets keys. ```sh -curl --request GET \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' - -# should return -# { -# "links": { -# "org": "/api/v2/orgs/031c8cbefe101000", -# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" -# }, -# "secrets": [] -# } +curl -XGET http://localhost:9999/api/v2/orgs//secrets \ + -H 'authorization: Token YOURAUTHTOKEN' ``` -### Retrieve the added secrets +### Delete a secret +Use the `POST` request method and the `orgs/{orgID}/secrets/delete` API endpoint +to delete one or more secrets. +Include an array of secret keys to delete in the requests body in the following format. ```bash -curl --request GET \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' - -# should return -# { -# "links": { -# "org": "/api/v2/orgs/031c8cbefe101000", -# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" -# }, -# "secrets": [ -# "foo", -# "hello" -# ] -# } +curl -XGET http://localhost:9999/api/v2/orgs//secrets/delete \ + --H 'authorization: Token YOURAUTHTOKEN' + --data '{ + "secrets": [ + "" + ] +}' +``` + +## Use secrets in a query +Import the `influxdata/influxd/secrets` package and use the `secrets.get()` function +to populate sensitive data in queries with secrets from your secret store. + +```js +import "influxdata/influxdb/secrets" +import "sql" + +username = secrets.get(key: "POSTGRES_USERNAME") +password = secrets.get(key: "POSTGRES_PASSWORD") + +sql.from( + driverName: "postgres", + dataSourceName: "postgresql://${username}:${password}@localhost", + query:"SELECT * FROM example-table" +) ``` From 27c64405c360cf118e30dc3e139fd2e7c6024bfb Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 17:07:58 -0700 Subject: [PATCH 184/258] Updated index page --- content/v2.0/security/secrets/_index.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/content/v2.0/security/secrets/_index.md b/content/v2.0/security/secrets/_index.md index 030970e8f..4e34bc970 100644 --- a/content/v2.0/security/secrets/_index.md +++ b/content/v2.0/security/secrets/_index.md @@ -1,5 +1,5 @@ --- -title: Store secrets +title: Store and view secrets description: v2.0/tags: [secrets, security] menu: @@ -12,3 +12,25 @@ There are two options for storing secrets with InfluxDB: - By default, secrets are Base64-encoded and stored in the InfluxDB embedded key value store, [BoltDB](https://github.com/boltdb/bolt). - You can also set up Vault to store secrets. For details, see [Store secrets in Vault](/v2.0/security/secrets/use-vault). + +## Use secrets in a query +Import the `influxdata/influxd/secrets` package and use the `secrets.get()` function +to populate sensitive data in queries with secrets from your secret store. + +```js +import "influxdata/influxdb/secrets" +import "sql" + +username = secrets.get(key: "POSTGRES_USERNAME") +password = secrets.get(key: "POSTGRES_PASSWORD") + +sql.from( + driverName: "postgres", + dataSourceName: "postgresql://${username}:${password}@localhost", + query:"SELECT * FROM example-table" +) +``` + +## Add, list, and delete secrets + +See [Manage secrets](/v2.0/security/secrets/manage-secrets). From 96d7e8ae749b8f33c6480856489c5507725e194e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 18:10:39 -0600 Subject: [PATCH 185/258] minor updates to the secrets doc --- content/v2.0/security/secrets/_index.md | 2 +- content/v2.0/security/secrets/manage-secrets.md | 2 +- content/v2.0/security/secrets/use-vault.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/v2.0/security/secrets/_index.md b/content/v2.0/security/secrets/_index.md index 4e34bc970..dba43f9a8 100644 --- a/content/v2.0/security/secrets/_index.md +++ b/content/v2.0/security/secrets/_index.md @@ -1,5 +1,5 @@ --- -title: Store and view secrets +title: Store and use secrets description: v2.0/tags: [secrets, security] menu: diff --git a/content/v2.0/security/secrets/manage-secrets.md b/content/v2.0/security/secrets/manage-secrets.md index 17826985f..9b4054267 100644 --- a/content/v2.0/security/secrets/manage-secrets.md +++ b/content/v2.0/security/secrets/manage-secrets.md @@ -4,7 +4,7 @@ description: Manage secrets in InfluxDB with the InfluxDB API. v2.0/tags: [secrets, security] menu: v2_0: - parent: Store secrets + parent: Store and use secrets weight: 201 --- diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index dd2fdc65a..a6a9197d7 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -4,7 +4,7 @@ description: Manage secrets in InfluxDB using the InfluxDB UI or the influx CLI. v2.0/tags: [secrets, security] menu: v2_0: - parent: Store secrets + parent: Store and use secrets weight: 201 --- From 302623c8d9818400b833025525a5ad7772747456 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 18:16:01 -0600 Subject: [PATCH 186/258] updated vault doc --- content/v2.0/security/secrets/use-vault.md | 96 ++-------------------- 1 file changed, 9 insertions(+), 87 deletions(-) diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index a6a9197d7..6302787f0 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -12,11 +12,6 @@ weight: 201 to tokens, passwords, certificates, and other sensitive secrets. Store sensitive secrets in Vault using the InfluxDB built-in Vault integration. -{{% note %}} -When not using Vault, secrets are Base64-encoded and stored in the InfluxDB embedded key value store, -[BoltDB](https://github.com/boltdb/bolt). -{{% /note %}} - ## Start a Vault server Start a Vault server and ensure InfluxDB has network access to the server. @@ -27,16 +22,21 @@ The following links provide information about running Vault in both development - [Start a Vault dev server](https://learn.hashicorp.com/vault/getting-started/dev-server) - [Deploy Vault](https://learn.hashicorp.com/vault/getting-started/deploy) +{{% note %}} +InfluxDB supports the [Vault KV Secrets Engine Version 2 API](https://www.vaultproject.io/api/secret/kv/kv-v2.html) only. +When you create a secrets engine, enable the `kv-v2` version by running: + +```js +vault secrets enable kv-v2 +``` +{{% /note %}} + For this example, install Vault on your local machine and start a Vault dev server. ```sh vault server -dev ``` -{{% note %}} -The InfluxDB API supports KV engine v2 only. -{{% /note %}} - ## Define Vault environment variables Use [Vault environment variables](https://www.vaultproject.io/docs/commands/index.html#environment-variables) @@ -62,81 +62,3 @@ option set to `vault`. ```bash influxd --secret-store vault ``` - -## Test Vault storage - -With Vault and InfluxDB servers running, use the InfluxDB API to test Vault: - -{{% note %}} -Replace `` with your [organization ID](/v2.0/organizations/view-orgs/#view-your-organization-id) -and `YOURAUTHTOKEN` with your [InfluxDB authentication token](/v2.0/security/tokens/). -{{% /note %}} - -##### Retrieve an organization's secrets - -```sh -curl --request GET \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' - -# should return -# { -# "links": { -# "org": "/api/v2/orgs/031c8cbefe101000", -# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" -# }, -# "secrets": [] -# } -``` - -##### Add secrets to an organization - -```sh -curl --request PATCH \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' \ - --header 'content-type: application/json' \ - --data '{ - "foo": "bar", - "hello": "world" -}' - -# should return 204 no content -``` - -##### Retrieve the added secrets - -```bash -curl --request GET \ - --url http://localhost:9999/api/v2/orgs//secrets \ - --header 'authorization: Token YOURAUTHTOKEN' - -# should return -# { -# "links": { -# "org": "/api/v2/orgs/031c8cbefe101000", -# "secrets": "/api/v2/orgs/031c8cbefe101000/secrets" -# }, -# "secrets": [ -# "foo", -# "hello" -# ] -# } -``` - -## Vault secrets storage - -For each organization, InfluxDB creates a [secrets engine](https://learn.hashicorp.com/vault/getting-started/secrets-engines) -using the following pattern: `/secret/data/` - -{{% note %}} -When you create a secrets engine, enable the `kv-v2` version by running: `vault secrets enable kv-v2`. -{{% /note %}} - -Secrets are stored in Vault as key value pairs in their respective secrets engines. -``` -/secret/data/031c8cbefe101000 -> - this_key: foo - that_key: bar - a_secret: key -``` From caaa3138e179c9b3e9a17abd9526e96faf49aea6 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 20:04:33 -0600 Subject: [PATCH 187/258] updated left nav icons --- assets/styles/tools/_icomoon.scss | 9 ++++++--- layouts/shortcodes/nav-icon.html | 4 ++-- static/fonts/icomoon.eot | Bin 16944 -> 17144 bytes static/fonts/icomoon.svg | 3 ++- static/fonts/icomoon.ttf | Bin 16780 -> 16980 bytes static/fonts/icomoon.woff | Bin 16856 -> 17056 bytes 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/assets/styles/tools/_icomoon.scss b/assets/styles/tools/_icomoon.scss index b089302dc..32f4e000f 100644 --- a/assets/styles/tools/_icomoon.scss +++ b/assets/styles/tools/_icomoon.scss @@ -24,6 +24,12 @@ -moz-osx-font-smoothing: grayscale; } +.icon-ui-disks-nav:before { + content: "\e93c"; +} +.icon-ui-wrench-nav:before { + content: "\e93d"; +} .icon-ui-eye-closed:before { content: "\e956"; } @@ -42,9 +48,6 @@ .icon-ui-nav-chat:before { content: "\e941"; } -.icon-ui-disks:before { - content: "\e950"; -} .icon-ui-add-cell:before { content: "\e91f"; } diff --git a/layouts/shortcodes/nav-icon.html b/layouts/shortcodes/nav-icon.html index d87e0c133..b2f5a22e8 100644 --- a/layouts/shortcodes/nav-icon.html +++ b/layouts/shortcodes/nav-icon.html @@ -15,10 +15,10 @@ {{ .Scratch.Set "icon" "bell" }} {{ .Scratch.Set "title" "Monitoring & Alerting" }} {{ else if or (eq $navIcon "disks") (eq $navIcon "load data") (eq $navIcon "load-data") }} - {{ .Scratch.Set "icon" "disks" }} + {{ .Scratch.Set "icon" "disks-nav" }} {{ .Scratch.Set "title" "Load Data" }} {{ else if eq $navIcon "settings" }} - {{ .Scratch.Set "icon" "wrench-2" }} + {{ .Scratch.Set "icon" "wrench-nav" }} {{ .Scratch.Set "title" "Settings" }} {{ else if or (eq $navIcon "feedback") }} {{ .Scratch.Set "icon" "nav-chat" }} diff --git a/static/fonts/icomoon.eot b/static/fonts/icomoon.eot index c76b18107924e06680dfb0c6daf4a9922113583b..c2e03e9b413b1bcf9b340508073dbdacf9ccc341 100755 GIT binary patch delta 931 zcmY*XU1(ET5T3a=y(i{wPfT)uXp+V>HL0l(OKyJXUs5aeL7HvdEh21To7i78wPJ-9 zDiOB3528@L2#S61!3U8Fb+d>R7p1=XqWDq~6+|I@+1-c5qBL>RBI<#2X1@7mK4ylq zJdYc{qqNZtFwlKTN?5}0Uanp0nlG3=W&;3v0bp?~dwPoOPQv%eTE|Yzjvl=Cbd~TU zfQ}pEBiZ5lo3|GLQbWWi#woxjWvWeGCA@n)KRweDt-DV60oBA#oIIBOX<_J3fb_q_ zFXpo|Q}7Gk0_eIx*gu)g*Nt2|wBr*6mZ;#5sgtLtK_m*gW9A_Krk^9%OAU$e10eWI zouzbXf2r5pz+HQflwPby)|c1+USF+jRw{s%x4K0abwS(E{?YQ9TfL@URL@f_nui6& z91?2iT8bmW^OiyltW?g52ZhH_4||~%df;bjAiy{>Np&c?4|UCmCR3P9#2vAw2sVXW z92*0nrnnD{Xd>zO4vA4s-wveE^)*T5C_ra>+n|@uU|W0V7r#JYNj@_%aYl~JrPFhf zZ~ap4l*4fgPcy00?lj(kDI@{(~4~0d(p*6iZ?RC@H!YO=7B=Mf-_&V4O*TeOr2oG&W=7iZ|vAhjBoZG_BBU z7_I&Tep@YLv%y)Wa+}Li%QdYxYP2~To#i`f!Ye=~&zLCK%2zn&L5|059!_K?pCdFX zTN%q)WXoMeZJrL{fV$h!W<+~6&F-)`Wt%Ejg_&rx`BVN@!yrNu%S);v_T)1mlHqQd zgo7ka!V+U_G9y}9j`J~Qx5;)k3Q$ZMFR(a~c+I?PFW-fKwRijvvZeYzVQsPa*B5IJ zr;?Z{E~Z4RT_O5tHHB`Ixt!L`hv|h~@9Spj-nd)b!|qp}A3c{nAHC=6pZJ=6{q(B= KGR4WRRs0O;gVL=4 delta 742 zcmey-%DAD0k$&QX96GIB>SM;T4GcYj9FfcGINlz>;0MY_L z{sAD(k)BhT#&Y3eKahWdfx-GpMrvY;>|BFB1_s+XKzXwapa5SUw=|G{1;|&)$StYR zF_O3jt#CfFX);1(1IP$XCcq%#}=?>BadQDDVWR zp{*dlxP*ZjD8=BIGdYH_S+WDjlmj}5nSqaikwM|5^-KGgjxT*)22B3OD6b#zGVJB8 zS9-5DyxRNf(Eq>x|1&WDe=N=-&M3|x_D$@w*gLTtF-g%GqCKLWKob}zJ2J^^j$*oQ zusPK924g)7gYSPv<}J)jKpU(WA{femE>L3UV`OKOWfT#YV-y!NHZr$kG&i$lG*Q=M zR990LH3AEZihxxqD}hB#O~8uKwVS>b1XC%pHcU1%6AzD;jEurE1sNGF9w3NB;u-VsC}4@^EwW zC<+R3^9Twl@bLUO15*xCeHNMHfXqRW*{oy!fL+GwLs@A&zs*+$ZWd64GTfZ;Z8MCX ztYL4?=(9P&o|%!C0Vu5wQUb)jlM5WAC-*yaXr7allMIslCsiT!LRv?9ij0bEn(PtT cS3qTqK + + - diff --git a/static/fonts/icomoon.ttf b/static/fonts/icomoon.ttf index d4b5f62009941a274b318a32ae3dcae118168936..0a5bee2552ca57f9c64386fe2ed2183f8c379d5b 100755 GIT binary patch delta 928 zcmY*XUuY9)5TDtN`^Bt&xlOXWG)Z&Y)TE|DEZO{_wMo>YK1g#dDk_|!iP}~)wPJ-9 zln9CsqEHQjVi7?fL@KBek>aUW@kM-5d{K@&K@`##^+8TfnmF55)DOOI<~P5YA2Y*u z@+iJIhGRyl+*NJ@KtBMC_va4`k^P16U9$H6y`z0=?mU|!{1Bk?(!j3#&c-X(#sD(g ziBAqtfDg)4n>j~#$v|;;`1Fr(CJW1FX z%oiJWonO1~3k4>q;P}wK1H&K^1*_wy?;hQHggig>Bf=s;FskWlwz{g?UENfDH65M4 zF@1k}sy9cqX$se%vdUesboTlw?wfe?B>`U47Vf#XvUH$k>@Uo{KV%4x z?Dn9~8=83@^7?{yIu;V5bEx(}UbyDWnO0%nWT}}E0$Q2nA1xM{H=RCx5kHg1_%oPiS`eZv}1)FTU=}}vU!?;0R zqI8(CZcTG4Hka&BWlNZe4u_F3+D(%PNvut%9A6y_?Q(;_O9L~piI v=(bq4Y|mc)^#0%BZ+H3{tuuYgPi>2#Go~f7Z@1q zHGuN7auX{G7@`_OY5&skrO(TNm*FpOz0!NN;nluZhyMTl{~x3UD9-?spIpEwF3u>< zAofk{v)DVa95G4J8KOO+oj{WqCog1_n7o0Jee+JnD+Zf4n%rQlXJPRD&&a%mnF(l{ z6+;9=8PG9G?0k&uY_g0Z;&P1QV#Y@1c8um`wu~m~dW`C7%A!VKVNnsVDrF_GsHq89 z5xN#sHKu3=0%hxg7Qu{QVu#&3o*a8F?9i(&`{3 zKqt+LQISoPJtF%GsDu%SeHfQ9@B(QD1}0#n3U6NT Hu#^!1jiIk` diff --git a/static/fonts/icomoon.woff b/static/fonts/icomoon.woff index 9d4279f587ac469bfcb827332d4236156e742b8c..a232e31cc369010b9a8fb17431f8d67e53a106f4 100755 GIT binary patch delta 935 zcmY*YOK1~87@mJO?!;_6ag%-6Bu&%Qq)nArcJrXGq&}L1G`46Df{HfQKCr2ZEw)f; zLG+*qt-(XFhk_48>OmtOdJ*;NML|#z^`Jsd;z2BGQ~ymZ)`4$lzHh$$X8)a;*XLpW z0?21OQz-%j+s=6+miq48H`qM0t!i=(>0GWoSKZ%p<`f~E1-bPvHuVpU_n}rsNXxv5 z)T0+q2afmj5|UUzPs~K+&AZbBD5CZW`4$swSo92JN5%+AVirV9H0TxAhfW?tUt0@$ zO6%^M){j2O_Ke}eZLd-Em2eR54EJP@qqc-EUNkYgXXCF^C(n#v1yeJ>FKbh1^pH)2 zCuLZeuh3dZ7IqXma`RA?djhJ$Yn-~IepR!oOPN)!D3{O)Sh6Qy#=UBo+&~sr&haVk z8L1>&Nh4_|`*9UNWk3Z*k~J@As-edd5RXNrNNpHugH8rD{$Op?3x*zxOaC!mSG83k z0nUFWg#kxeo0|@KupMe@Ze1HsB3Tee2M0&R@I*2>5newoWKK)c>CEbLor8O3wffzz z!1Bw0%k8&fGZ`0NWyQy0U7gtJa5^2uA7UtkLs@n}XEkF!A7jJ(X2|y42 zj%W)+so>vUdOenedZ=0SL>!?Ibn}9$b{IyZZLsjjP#Ua`h z(M+bi&E`w^8Vv&{1irYS$b5S?jWNt6VsHSXF<79K4ySo5%`nza?KaU)@s#I3=x-q} z#XeBan|Gf>N9--%iD=#iLf*{fAFlPevP2xx`P~T~q(z)QU|JBhW}oX$-UxlE7_0c` pYH;%AF)_c23S1=8?Nx2zDI6RNeywP?G{s5TH#BBfo delta 767 zcmZ3`%6OxhQKa18&5ePP0SFv#FmQwEp2;5>MJ6$^Ow^IDUjh_avZ60NJ3X|4 z$1RXvwfEJb|9}7gXJGvQSe!+iQJg{So7iWucVanWlA<$2dqg{dCNM%m zgLM)U>t+_Fs|K6@n%rQlXJPRD&&a%mnF(l*6+;9=8PFL@?0k&uY_g0Z;&P1QV#Y@1 zc8um`wu~m~dW`C7%A!VKVNnsVDrF_GsHq895xN#sHKu3=0%hxg7Qu{QVuNj21)*ts*rji bts^}}MnyJF_K55&pfXTG_t|{U;SeJLsFASI From 329ba4ab0dbfd380705df821486347ffa94c5e90 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 9 Sep 2019 21:00:29 -0600 Subject: [PATCH 188/258] various updates to flux functions --- .../built-in/transformations/aggregates/kaufmansama.md | 2 +- .../transformations/aggregates/tripleexponentialderivative.md | 2 +- content/v2.0/reference/flux/functions/secrets/get.md | 3 ++- content/v2.0/security/secrets/use-vault.md | 4 ++++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md index 26d6c1686..1944d041d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md @@ -21,7 +21,7 @@ _**Function type:** Aggregate_ ```js kaufmansAMA( n: 10, - columns: ["_value"] + column: "_value" ) ``` diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md index 1f734698c..4fa7c2137 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -19,7 +19,7 @@ related: --- The `tripleExponentialDerivative()` function calculates a triple exponential -derivative ([TRIX](https://en.wikipedia.org/wiki/Trix_(technical_analysis)) of +derivative ([TRIX](https://en.wikipedia.org/wiki/Trix_(technical_analysis))) of input tables using `n` points. _**Function type:** Aggregate_ diff --git a/content/v2.0/reference/flux/functions/secrets/get.md b/content/v2.0/reference/flux/functions/secrets/get.md index ff669f891..342e6d380 100644 --- a/content/v2.0/reference/flux/functions/secrets/get.md +++ b/content/v2.0/reference/flux/functions/secrets/get.md @@ -9,7 +9,8 @@ menu: weight: 202 --- -The `secrets.get()` function retrieves a secret from the InfluxDB secret store. +The `secrets.get()` function retrieves a secret from the +[InfluxDB secret store](/v2.0/security/secrets/). _**Function type:** Miscellaneous_ diff --git a/content/v2.0/security/secrets/use-vault.md b/content/v2.0/security/secrets/use-vault.md index 6302787f0..7b7ca9934 100644 --- a/content/v2.0/security/secrets/use-vault.md +++ b/content/v2.0/security/secrets/use-vault.md @@ -62,3 +62,7 @@ option set to `vault`. ```bash influxd --secret-store vault ``` + +## Manage tokens through the InfluxDB API +Use the InfluxDB `/org/{orgID}/secrets` API endpoint to add tokens to Vault. +For details, see [Manage secrets](/v2.0/security/secrets/manage-secrets/). From 89763c968e40a4e85df097fc01aca2619adb946b Mon Sep 17 00:00:00 2001 From: Kelly Date: Mon, 9 Sep 2019 20:27:50 -0700 Subject: [PATCH 189/258] add Billing doc --- .../v2.0/cloud/account-management/billing.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 content/v2.0/cloud/account-management/billing.md diff --git a/content/v2.0/cloud/account-management/billing.md b/content/v2.0/cloud/account-management/billing.md new file mode 100644 index 000000000..876fb7fed --- /dev/null +++ b/content/v2.0/cloud/account-management/billing.md @@ -0,0 +1,87 @@ +--- +title: Add payment method and view billing +list_title: Add payment and view billing +description: > + Add your InfluxDB Cloud payment method and view billing information. +weight: 103 +menu: + v2_0_cloud: + parent: Account management + name: Add payment and view billing +--- + +## Add or update your {{< cloud-name >}} payment method + +1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. + +{{< nav-icon "billing" >}} + +2. To update, click the **Change Payment** button. +3. In the **Payment Method** section: + + - Enter your cardholder name and number + - Select your expiration month and year + - Enter your CVV code and select your card type + - Enter your card billing address + +3. Click **Add Card**. + +## View Pay as You Go billing information + +For Pay as You Go plan, check your account balance, invoices, billing notification, and other billing information. + +1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. + +{{< nav-icon "billing" >}} + + Billing page displays your billing information, including: + - Account balance + - Last billing update (updated hourly) + - Past invoices + - Payment method + - Contact information + - Notification settings + +## Add or update your {{< cloud-name >}} contact information + +1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. + +{{< nav-icon "billing" >}} + +2. To update, click the **Edit Information** button. +3. In the **Contact Information** section: + + - Enter your name, company, and address. +4. Click **Save Contact Info**. + +## Send notifications when usage exceeds an amount + +1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. + +{{< nav-icon "billing" >}} + +2. Click **Notification Settings**. +3. Select the **Send email notification** toggle, and then enter the email address to notify. +4. Enter the dollar amount to trigger a notification email. By default, an email is triggered when the amount exceeds $10. (Whole dollar amounts only. For example, $10.50 is not a supported amount.) + +## View Free plan information + +If you're on the Free plan, the Billing page monitors rate limits and lets you know how much data or options you have left to use. + +## Exceeded rate limits + +If you exceed your plan's [rate limits](/v2.0/cloud/pricing-plans/), {{< cloud-name >}} provides a notification in the {{< cloud-name "short" >}} user interface (UI) and adds a rate limit event to your **Usage** page for review. + +All rate-limited requests are rejected; including both read and write requests. +_Rate-limited requests are **not** queued._ + +_To remove rate limits, [upgrade to a Pay As You Go Plan](/v2.0/cloud/account-management/upgrade-to-payg/)._ + +### Rate-limited HTTP response code + +When a request exceeds your plan's rate limit, the InfluxDB API returns the following response: + +``` +HTTP 429 “Too Many Requests” +Retry-After: xxx (seconds to wait before retrying the request) +``` From be81797dbc27a4475bafca67326538de4f7cfe58 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 20:53:57 -0700 Subject: [PATCH 190/258] Remove status change for launch --- content/v2.0/monitor-alert/notification-rules/create.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/content/v2.0/monitor-alert/notification-rules/create.md b/content/v2.0/monitor-alert/notification-rules/create.md index 9bbb54e17..5bed355ea 100644 --- a/content/v2.0/monitor-alert/notification-rules/create.md +++ b/content/v2.0/monitor-alert/notification-rules/create.md @@ -28,10 +28,8 @@ _For details, see [Manage checks](/v2.0/monitor-alert/checks/) and 2. In the **Schedule Every** field, enter how frequently the rule should run. 3. In the **Offset** field, enter an offset time. For example,if a task runs on the hour, a 10m offset delays the task to 10 minutes after the hour. Time ranges defined in the task are relative to the specified execution time. 4. In the **Conditions** section, build a condition using a combination of status and tag keys. - 1. Next to **When status**, select a an operator from the drop-down field: - - **is equal to** and then select the status - - **changes from** and then select both statuses - 2. Next to **AND When**, enter one or more tag key-value pairs to filter by. + - Next to **When status is equal to**, select a status from the drop-down field. + - Next to **AND When**, enter one or more tag key-value pairs to filter by. 5. In the **Message** section, select an endpoint to notify. 6. Click **Create Notification Rule**. From d0eb50ad31f171d4caca177514af701aa196ce76 Mon Sep 17 00:00:00 2001 From: Nora Date: Mon, 9 Sep 2019 20:54:50 -0700 Subject: [PATCH 191/258] Fix typo --- content/v2.0/monitor-alert/checks/create.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index f4c0fd74a..b075a4f83 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -14,7 +14,7 @@ cloud_all: true --- Create a check in the InfluxDB user interface (UI). -A check consists of two parts – a query and check confiuration. +A check consists of two parts – a query and check configuration. ##### Check query - Specifies the dataset to monitor. From 917c19b382cf72e721dca589eb0cf53149533742 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 08:48:23 -0600 Subject: [PATCH 192/258] updated the hugo version --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1dd82d7b1..ffd410c2d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: docker: - image: circleci/node:latest environment: - HUGO_VERSION: "0.55.1" + HUGO_VERSION: "0.56.3" S3DEPLOY_VERSION: "2.3.2" steps: - checkout From 7f81fa4c5b37f965aac9d6dc591889f08f1d6776 Mon Sep 17 00:00:00 2001 From: kelseiv <47797004+kelseiv@users.noreply.github.com> Date: Tue, 10 Sep 2019 07:58:17 -0700 Subject: [PATCH 193/258] Update pricing-plans.md --- content/v2.0/cloud/pricing-plans.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index 1763f76d7..b445251c6 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -34,7 +34,7 @@ Use this plan as much and as long as you want within the Free Plan rate limits: - Up to 5 dashboards - Up to 5 tasks - Up to 2 buckets - - Up to 3 checks + - Up to 2 checks - Up to 2 notification rules From 13a96b2a11b1f39f49d9010a1293e860eddf91a5 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 09:12:47 -0600 Subject: [PATCH 194/258] fixed typo in check create doc --- content/v2.0/monitor-alert/checks/create.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index b075a4f83..0902abb45 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -31,7 +31,7 @@ A check consists of two parts – a query and check configuration. - `crit` - `warn` - `info` - - `note` + - `ok` - Stores status in the `_level` column. ## Create a check in the InfluxDB UI From cea697bd19f2c3c656d28180b1380be7d21246f0 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 09:16:02 -0600 Subject: [PATCH 195/258] fixed another typo in check create doc --- content/v2.0/monitor-alert/checks/create.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index 0902abb45..469ac6949 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -48,7 +48,7 @@ A check consists of two parts – a query and check configuration. 2. In the **Aggregate functions** column, select an interval from the interval drop-down list (for example, "Every 5 minutes") and an aggregate function from the list of functions. 3. Click **Submit** to run the query and preview the results. - To see the raw query results, click the the **{{< icon "toggle" >}} View Raw Data** toggle. + To see the raw query results, click the **{{< icon "toggle" >}} View Raw Data** toggle. ### Configure the check 1. Click **2. Check** near the top of the window to display the **Check view**. From bcc591809943ce25d4f2f50cf9a6b7e48394c0bd Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 08:45:12 -0700 Subject: [PATCH 196/258] add edits --- .../v2.0/cloud/account-management/billing.md | 77 ++++++++----------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/content/v2.0/cloud/account-management/billing.md b/content/v2.0/cloud/account-management/billing.md index 876fb7fed..ac2ec2f5f 100644 --- a/content/v2.0/cloud/account-management/billing.md +++ b/content/v2.0/cloud/account-management/billing.md @@ -10,65 +10,52 @@ menu: name: Add payment and view billing --- -## Add or update your {{< cloud-name >}} payment method +## Manage your InfluxDB Cloud payment and billing information -1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. +- Hover over the **Usage** icon in the left navigation bar and select **Billing**. -{{< nav-icon "billing" >}} +{{< nav-icon "cloud" >}} -2. To update, click the **Change Payment** button. -3. In the **Payment Method** section: +### Add or update your {{< cloud-name >}} payment method - - Enter your cardholder name and number - - Select your expiration month and year - - Enter your CVV code and select your card type - - Enter your card billing address +1. On the Billing page: + - To update, click the **Change Payment** button on the Billing page. + - In the **Payment Method** section: + - Enter your cardholder name and number + - Select your expiration month and year + - Enter your CVV code and select your card type + - Enter your card billing address -3. Click **Add Card**. +2. Click **Add Card**. -## View Pay as You Go billing information +### View Pay As You Go billing information -For Pay as You Go plan, check your account balance, invoices, billing notification, and other billing information. +- On the Billing page, view your billing information, including: + - Account balance + - Last billing update (updated hourly) + - Past invoices + - Payment method + - Contact information + - Notification settings -1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. +### Add or update your contact information -{{< nav-icon "billing" >}} +1. On the Billing page: + - To update, click the **Edit Information** button. + - In the **Contact Information** section, enter your name, company, and address. +2. Click **Save Contact Info**. - Billing page displays your billing information, including: - - Account balance - - Last billing update (updated hourly) - - Past invoices - - Payment method - - Contact information - - Notification settings +### Send notifications when usage exceeds an amount -## Add or update your {{< cloud-name >}} contact information +1. On the Billing page, click **Notification Settings**. +2. Select the **Send email notification** toggle, and then enter the email address to notify. +3. Enter the dollar amount to trigger a notification email. By default, an email is triggered when the amount exceeds $10. (Whole dollar amounts only. For example, $10.50 is not a supported amount.) -1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. - -{{< nav-icon "billing" >}} - -2. To update, click the **Edit Information** button. -3. In the **Contact Information** section: - - - Enter your name, company, and address. -4. Click **Save Contact Info**. - -## Send notifications when usage exceeds an amount - -1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. - -{{< nav-icon "billing" >}} - -2. Click **Notification Settings**. -3. Select the **Send email notification** toggle, and then enter the email address to notify. -4. Enter the dollar amount to trigger a notification email. By default, an email is triggered when the amount exceeds $10. (Whole dollar amounts only. For example, $10.50 is not a supported amount.) - -## View Free plan information +### View Free plan information If you're on the Free plan, the Billing page monitors rate limits and lets you know how much data or options you have left to use. -## Exceeded rate limits +### Exceeded rate limits If you exceed your plan's [rate limits](/v2.0/cloud/pricing-plans/), {{< cloud-name >}} provides a notification in the {{< cloud-name "short" >}} user interface (UI) and adds a rate limit event to your **Usage** page for review. @@ -77,7 +64,7 @@ _Rate-limited requests are **not** queued._ _To remove rate limits, [upgrade to a Pay As You Go Plan](/v2.0/cloud/account-management/upgrade-to-payg/)._ -### Rate-limited HTTP response code +#### Rate-limited HTTP response code When a request exceeds your plan's rate limit, the InfluxDB API returns the following response: From c2f1ec89843941ebccf87846808b87c0381c7f22 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 08:49:18 -0700 Subject: [PATCH 197/258] typo edits --- content/v2.0/monitor-alert/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index 00d2bf8bf..946e0b88b 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -17,10 +17,10 @@ rules, and notification endpoints. ## The monitoring workflow 1. InfluxDB uses a [check](/v2.0/reference/glossary/#check) to query data and - assigns a status or `_level` based on specific conditions. + assign a status or `_level` based on specific conditions. 2. InfluxDB stores the output the check in the `statuses` measurement in the `_monitoring` system bucket. 3. [Notification rules](/v2.0/reference/glossary/#notification-rule) check data in the `statuses` - measurement and, based conditions set in the notification rule, send a message + measurement and, based on conditions set in the notification rule, send a message to a [notification endpoint](/v2.0/reference/glossary/#notification-endpoint). 4. InfluxDB stores notifications in the `notifications` measurement in the `_monitoring` system bucket. From 38caca0aac3fadc0d5dec7331b9ae6ad89a9dca2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 10:58:59 -0600 Subject: [PATCH 198/258] updated string function example --- .../built-in/transformations/type-conversions/string.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md index 4c892b569..c8274b482 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md +++ b/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md @@ -27,5 +27,5 @@ The value to convert. from(bucket: "sensor-data") |> range(start: -1m) |> filter(fn:(r) => r._measurement == "system" ) - |> map(fn:(r) => ({ r with model_number string(v: r.model_number) })) + |> map(fn:(r) => ({ r with model_number: string(v: r.model_number) })) ``` From 58c9adfa6596e9ba73bbfd07d646998f79028543 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 10:19:47 -0700 Subject: [PATCH 199/258] pricing calculator accessible to Free plan users --- content/v2.0/cloud/pricing-calculator.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md index b7d4644a3..d14073ccb 100644 --- a/content/v2.0/cloud/pricing-calculator.md +++ b/content/v2.0/cloud/pricing-calculator.md @@ -9,7 +9,7 @@ menu: name: Pricing calculator --- -Use the {{< cloud-name >}} pricing calculator to estimate costs by adjusting your number of devices, +Use the {{< cloud-name >}} pricing calculator to estimate costs for the Pay As You Go plan by adjusting your number of devices, plugins, users, dashboards, writes, and retention. Default configurations include: | Configuration | Hobby | Standard | Professional | Enterprise | @@ -23,7 +23,13 @@ Use the {{< cloud-name >}} pricing calculator to estimate costs by adjusting you **To estimate costs** -1. Click the **Pricing Calculator** icon in the left navigation bar. +Free plan only. + +1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. + +{{< nav-icon "cloud" >}} + +2. Click the **Pricing Calculator** link at the bottom of the page. 2. Choose your region. 2. Select your configuration: - **Hobby**. For a single user monitoring a few machines or sensors. From 6b69920458202694481d77ce682df35af33931ce Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 10:39:47 -0700 Subject: [PATCH 200/258] add link to pricing calculator on website for PAYG --- content/v2.0/cloud/pricing-calculator.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md index d14073ccb..85c6ec227 100644 --- a/content/v2.0/cloud/pricing-calculator.md +++ b/content/v2.0/cloud/pricing-calculator.md @@ -23,18 +23,21 @@ Use the {{< cloud-name >}} pricing calculator to estimate costs for the Pay As Y **To estimate costs** -Free plan only. - -1. Hover over the **Usage** icon in the left navigation bar and select **Billing**. +1. If you're using the Free plan, hover over the **Usage** icon in the left navigation bar and select **Billing**. {{< nav-icon "cloud" >}} 2. Click the **Pricing Calculator** link at the bottom of the page. -2. Choose your region. -2. Select your configuration: + +{{% note %}} +If you're using the Pay As You Go plan, open the pricing calculator [here](https://cloud2.influxdata.com/pricing). +{{% /note %}} + +3. Choose your region. +4. Select your configuration: - **Hobby**. For a single user monitoring a few machines or sensors. - **Standard**. For a single team requiring real-time visibility and monitoring a single set of use cases. - **Professional**. For teams monitoring multiple disparate systems or use cases. - **Enterprise**. For teams monitoring multiple domains and use cases accessing a variety of dashboards. -3. Adjust the default configuration values to match your number of devices, plugins, metrics, and so on. The **Projected Usage** costs are automatically updated as you adjust your configuration. -4. Click **Get started with InfluxDB Cloud** [to get started](https://v2.docs.influxdata.com/v2.0/cloud/get-started/). +5. Adjust the default configuration values to match your number of devices, plugins, metrics, and so on. The **Projected Usage** costs are automatically updated as you adjust your configuration. +6. Click **Get started with InfluxDB Cloud** [to get started](https://v2.docs.influxdata.com/v2.0/cloud/get-started/). From 1695b35eb4321a1c77f5b1bdc3f083fc3ca65a38 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 11:03:59 -0700 Subject: [PATCH 201/258] remove ingest limit on Free plan --- content/v2.0/cloud/pricing-calculator.md | 10 +++++++++- content/v2.0/cloud/pricing-plans.md | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md index 85c6ec227..8f8197725 100644 --- a/content/v2.0/cloud/pricing-calculator.md +++ b/content/v2.0/cloud/pricing-calculator.md @@ -21,6 +21,14 @@ Use the {{< cloud-name >}} pricing calculator to estimate costs for the Pay As Y | **Writes per minute** | 6 | 4 | 3 | 3 | | **Average retention in days** | 7 | 30 | 30 | 30 | +Guidelines used to estimate costs for default configurations: + +- Average metrics per plugin = 25 +- Average KB per value = 0.01 +- Number of cells per dashboard = 10 +- Average response KB per cell = 0.5 +- Average query duration = 75ms + **To estimate costs** 1. If you're using the Free plan, hover over the **Usage** icon in the left navigation bar and select **Billing**. @@ -30,7 +38,7 @@ Use the {{< cloud-name >}} pricing calculator to estimate costs for the Pay As Y 2. Click the **Pricing Calculator** link at the bottom of the page. {{% note %}} -If you're using the Pay As You Go plan, open the pricing calculator [here](https://cloud2.influxdata.com/pricing). +If you're using the Pay As You Go plan, open the pricing calculator [here](https://cloud2.influxdata.com/pricing). {{% /note %}} 3. Choose your region. diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index b445251c6..2883dfddd 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -26,7 +26,6 @@ Use this plan as much and as long as you want within the Free Plan rate limits: #### Free Plan rate limits - **Writes:** 3MB every 5 minutes -- **Ingest batch size:** 50MB - **Query:** 30MB every 5 minutes - **Storage:** 72-hour data retention - **Series cardinality:** 10,000 @@ -60,5 +59,6 @@ To protect against any intentional or unintentional harm, Pay As You Go Plans in - Unlimited users - Unlimited checks - Unlimited notification rules + - Unlimited PagerDuty, Slack, and HTTP notification endpoints _To request higher rate limits, contact [InfluxData Support](mailto:support@influxdata.com)._ From a0d46bb7b125ee9e566a01a8a58cc47e763d2543 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 12:06:02 -0600 Subject: [PATCH 202/258] renamed flux functions dir to stdlib, added aliases to all function docs --- .../v2.0/reference/flux/functions/_index.md | 15 --------------- content/v2.0/reference/flux/stdlib/_index.md | 19 +++++++++++++++++++ .../{functions => stdlib}/all-functions.md | 4 +++- .../{functions => stdlib}/built-in/_index.md | 4 +++- .../built-in/inputs/_index.md | 3 ++- .../built-in/inputs/buckets.md | 1 + .../built-in/inputs/from.md | 1 + .../built-in/misc/_index.md | 1 + .../built-in/misc/intervals.md | 1 + .../built-in/misc/linearbins.md | 1 + .../built-in/misc/logarithmicbins.md | 1 + .../built-in/misc/now.md | 2 ++ .../built-in/misc/sleep.md | 2 ++ .../built-in/outputs/_index.md | 1 + .../built-in/outputs/to.md | 1 + .../built-in/outputs/yield.md | 1 + .../built-in/tests/_index.md | 2 ++ .../built-in/tests/contains.md | 2 ++ .../built-in/transformations/_index.md | 1 + .../transformations/aggregates/_index.md | 1 + .../aggregates/aggregatewindow.md | 1 + .../aggregates/chandemomentumoscillator.md | 2 ++ .../transformations/aggregates/count.md | 1 + .../transformations/aggregates/cov.md | 1 + .../transformations/aggregates/covariance.md | 1 + .../transformations/aggregates/derivative.md | 1 + .../transformations/aggregates/difference.md | 1 + .../transformations/aggregates/doubleema.md | 2 ++ .../aggregates/exponentialmovingaverage.md | 2 ++ .../aggregates/histogramquantile.md | 1 + .../transformations/aggregates/holtwinters.md | 1 + .../transformations/aggregates/increase.md | 1 + .../transformations/aggregates/integral.md | 1 + .../transformations/aggregates/kaufmansama.md | 2 ++ .../transformations/aggregates/kaufmanser.md | 2 ++ .../transformations/aggregates/mean.md | 1 + .../transformations/aggregates/median.md | 1 + .../transformations/aggregates/mode.md | 4 +++- .../aggregates/movingaverage.md | 2 ++ .../transformations/aggregates/pearsonr.md | 1 + .../transformations/aggregates/quantile.md | 1 + .../transformations/aggregates/reduce.md | 2 ++ .../aggregates/relativestrengthindex.md | 2 ++ .../transformations/aggregates/skew.md | 1 + .../transformations/aggregates/spread.md | 1 + .../transformations/aggregates/stddev.md | 1 + .../transformations/aggregates/sum.md | 3 ++- .../aggregates/timedmovingaverage.md | 2 ++ .../transformations/aggregates/tripleema.md | 2 ++ .../aggregates/tripleexponentialderivative.md | 2 ++ .../built-in/transformations/columns.md | 1 + .../built-in/transformations/cumulativesum.md | 1 + .../built-in/transformations/drop.md | 1 + .../built-in/transformations/duplicate.md | 1 + .../built-in/transformations/elapsed.md | 2 ++ .../built-in/transformations/fill.md | 1 + .../built-in/transformations/filter.md | 1 + .../built-in/transformations/group.md | 1 + .../built-in/transformations/histogram.md | 1 + .../built-in/transformations/hourselection.md | 3 ++- .../built-in/transformations/join.md | 1 + .../built-in/transformations/keep.md | 1 + .../built-in/transformations/keys.md | 1 + .../built-in/transformations/keyvalues.md | 1 + .../built-in/transformations/limit.md | 1 + .../built-in/transformations/map.md | 1 + .../built-in/transformations/pivot.md | 1 + .../built-in/transformations/range.md | 1 + .../built-in/transformations/rename.md | 1 + .../transformations/selectors/_index.md | 1 + .../transformations/selectors/bottom.md | 1 + .../transformations/selectors/distinct.md | 1 + .../transformations/selectors/first.md | 1 + .../selectors/highestaverage.md | 1 + .../selectors/highestcurrent.md | 1 + .../transformations/selectors/highestmax.md | 1 + .../transformations/selectors/last.md | 1 + .../selectors/lowestaverage.md | 1 + .../selectors/lowestcurrent.md | 1 + .../transformations/selectors/lowestmin.md | 1 + .../built-in/transformations/selectors/max.md | 5 +++-- .../built-in/transformations/selectors/min.md | 1 + .../transformations/selectors/sample.md | 3 ++- .../built-in/transformations/selectors/top.md | 1 + .../transformations/selectors/unique.md | 1 + .../built-in/transformations/set.md | 1 + .../built-in/transformations/sort.md | 1 + .../built-in/transformations/statecount.md | 1 + .../built-in/transformations/stateduration.md | 1 + .../transformations/stream-table/_index.md | 2 ++ .../transformations/stream-table/getcolumn.md | 2 ++ .../transformations/stream-table/getrecord.md | 2 ++ .../transformations/stream-table/tablefind.md | 2 ++ .../built-in/transformations/tail.md | 2 ++ .../built-in/transformations/timeshift.md | 1 + .../transformations/truncatetimecolumn.md | 2 ++ .../type-conversions/_index.md | 1 + .../transformations/type-conversions/bool.md | 2 ++ .../transformations/type-conversions/bytes.md | 2 ++ .../type-conversions/duration.md | 2 ++ .../transformations/type-conversions/float.md | 2 ++ .../transformations/type-conversions/int.md | 2 ++ .../type-conversions/string.md | 2 ++ .../transformations/type-conversions/time.md | 2 ++ .../type-conversions/tobool.md | 1 + .../type-conversions/toduration.md | 1 + .../type-conversions/tofloat.md | 1 + .../transformations/type-conversions/toint.md | 1 + .../type-conversions/tostring.md | 1 + .../type-conversions/totime.md | 1 + .../type-conversions/touint.md | 1 + .../transformations/type-conversions/uint.md | 2 ++ .../built-in/transformations/union.md | 1 + .../built-in/transformations/window.md | 1 + .../flux/{functions => stdlib}/csv/_index.md | 4 +++- .../flux/{functions => stdlib}/csv/from.md | 1 + .../flux/{functions => stdlib}/date/_index.md | 3 ++- .../flux/{functions => stdlib}/date/hour.md | 2 ++ .../{functions => stdlib}/date/microsecond.md | 2 ++ .../{functions => stdlib}/date/millisecond.md | 2 ++ .../flux/{functions => stdlib}/date/minute.md | 2 ++ .../flux/{functions => stdlib}/date/month.md | 4 +++- .../{functions => stdlib}/date/monthday.md | 2 ++ .../{functions => stdlib}/date/nanosecond.md | 2 ++ .../{functions => stdlib}/date/quarter.md | 2 ++ .../flux/{functions => stdlib}/date/second.md | 2 ++ .../{functions => stdlib}/date/truncate.md | 2 ++ .../flux/{functions => stdlib}/date/week.md | 2 ++ .../{functions => stdlib}/date/weekday.md | 2 ++ .../flux/{functions => stdlib}/date/year.md | 2 ++ .../{functions => stdlib}/date/yearday.md | 2 ++ .../flux/{functions => stdlib}/http/_index.md | 4 +++- .../{functions => stdlib}/http/basicauth.md | 2 ++ .../{functions => stdlib}/http/endpoint.md | 2 ++ .../flux/{functions => stdlib}/http/post.md | 2 ++ .../influxdb-v1/_index.md | 4 +++- .../influxdb-v1/fieldsascols.md | 1 + .../influxdb-v1/measurements.md | 2 ++ .../influxdb-v1/measurementtagkeys.md | 2 ++ .../influxdb-v1/measurementtagvalues.md | 2 ++ .../influxdb-v1/tagkeys.md | 2 ++ .../influxdb-v1/tagvalues.md | 2 ++ .../flux/{functions => stdlib}/json/_index.md | 4 +++- .../flux/{functions => stdlib}/json/encode.md | 2 ++ .../flux/{functions => stdlib}/math/_index.md | 4 +++- .../flux/{functions => stdlib}/math/abs.md | 2 ++ .../flux/{functions => stdlib}/math/acos.md | 2 ++ .../flux/{functions => stdlib}/math/acosh.md | 2 ++ .../flux/{functions => stdlib}/math/asin.md | 2 ++ .../flux/{functions => stdlib}/math/asinh.md | 2 ++ .../flux/{functions => stdlib}/math/atan.md | 2 ++ .../flux/{functions => stdlib}/math/atan2.md | 2 ++ .../flux/{functions => stdlib}/math/atanh.md | 2 ++ .../flux/{functions => stdlib}/math/cbrt.md | 2 ++ .../flux/{functions => stdlib}/math/ceil.md | 2 ++ .../{functions => stdlib}/math/copysign.md | 2 ++ .../flux/{functions => stdlib}/math/cos.md | 2 ++ .../flux/{functions => stdlib}/math/cosh.md | 2 ++ .../flux/{functions => stdlib}/math/dim.md | 2 ++ .../flux/{functions => stdlib}/math/erf.md | 2 ++ .../flux/{functions => stdlib}/math/erfc.md | 2 ++ .../{functions => stdlib}/math/erfcinv.md | 2 ++ .../flux/{functions => stdlib}/math/erfinv.md | 2 ++ .../flux/{functions => stdlib}/math/exp.md | 2 ++ .../flux/{functions => stdlib}/math/exp2.md | 2 ++ .../flux/{functions => stdlib}/math/expm1.md | 2 ++ .../{functions => stdlib}/math/float64bits.md | 2 ++ .../flux/{functions => stdlib}/math/floor.md | 2 ++ .../flux/{functions => stdlib}/math/frexp.md | 2 ++ .../flux/{functions => stdlib}/math/gamma.md | 2 ++ .../flux/{functions => stdlib}/math/hypot.md | 2 ++ .../flux/{functions => stdlib}/math/ilogb.md | 2 ++ .../flux/{functions => stdlib}/math/isinf.md | 2 ++ .../flux/{functions => stdlib}/math/isnan.md | 2 ++ .../flux/{functions => stdlib}/math/j0.md | 2 ++ .../flux/{functions => stdlib}/math/j1.md | 2 ++ .../flux/{functions => stdlib}/math/jn.md | 2 ++ .../flux/{functions => stdlib}/math/ldexp.md | 2 ++ .../flux/{functions => stdlib}/math/lgamma.md | 2 ++ .../flux/{functions => stdlib}/math/log.md | 2 ++ .../flux/{functions => stdlib}/math/log10.md | 2 ++ .../flux/{functions => stdlib}/math/log1p.md | 2 ++ .../flux/{functions => stdlib}/math/log2.md | 2 ++ .../flux/{functions => stdlib}/math/logb.md | 2 ++ .../flux/{functions => stdlib}/math/m_inf.md | 4 ++-- .../flux/{functions => stdlib}/math/m_max.md | 2 ++ .../flux/{functions => stdlib}/math/m_min.md | 2 ++ .../flux/{functions => stdlib}/math/mod.md | 2 ++ .../flux/{functions => stdlib}/math/modf.md | 2 ++ .../flux/{functions => stdlib}/math/nan.md | 2 ++ .../{functions => stdlib}/math/nextafter.md | 2 ++ .../flux/{functions => stdlib}/math/pow.md | 2 ++ .../flux/{functions => stdlib}/math/pow10.md | 2 ++ .../{functions => stdlib}/math/remainder.md | 2 ++ .../flux/{functions => stdlib}/math/round.md | 2 ++ .../{functions => stdlib}/math/roundtoeven.md | 2 ++ .../{functions => stdlib}/math/signbit.md | 2 ++ .../flux/{functions => stdlib}/math/sin.md | 2 ++ .../flux/{functions => stdlib}/math/sincos.md | 2 ++ .../flux/{functions => stdlib}/math/sinh.md | 2 ++ .../flux/{functions => stdlib}/math/sqrt.md | 2 ++ .../flux/{functions => stdlib}/math/tan.md | 2 ++ .../flux/{functions => stdlib}/math/tanh.md | 2 ++ .../flux/{functions => stdlib}/math/trunc.md | 2 ++ .../flux/{functions => stdlib}/math/y0.md | 2 ++ .../flux/{functions => stdlib}/math/y1.md | 2 ++ .../flux/{functions => stdlib}/math/yn.md | 2 ++ .../{functions => stdlib}/monitor/_index.md | 4 +++- .../{functions => stdlib}/monitor/check.md | 2 ++ .../{functions => stdlib}/monitor/deadman.md | 2 ++ .../{functions => stdlib}/monitor/from.md | 2 ++ .../{functions => stdlib}/monitor/logs.md | 2 ++ .../{functions => stdlib}/monitor/notify.md | 2 ++ .../monitor/statechanges.md | 2 ++ .../flux/{functions => stdlib}/mqtt/_index.md | 2 +- .../flux/{functions => stdlib}/mqtt/to.md | 0 .../{functions => stdlib}/pagerduty/_index.md | 4 +++- .../pagerduty/actionfromseverity.md | 2 ++ .../pagerduty/dedupkey.md | 2 ++ .../pagerduty/endpoint.md | 2 ++ .../pagerduty/sendevent.md | 2 ++ .../pagerduty/severityfromlevel.md | 2 ++ .../{functions => stdlib}/regexp/_index.md | 4 +++- .../{functions => stdlib}/regexp/compile.md | 2 ++ .../regexp/findstring.md | 2 ++ .../regexp/findstringindex.md | 2 ++ .../{functions => stdlib}/regexp/getstring.md | 2 ++ .../regexp/matchregexpstring.md | 2 ++ .../{functions => stdlib}/regexp/quotemeta.md | 2 ++ .../regexp/replaceallstring.md | 2 ++ .../regexp/splitregexp.md | 2 ++ .../{functions => stdlib}/runtime/_index.md | 4 +++- .../{functions => stdlib}/runtime/version.md | 2 ++ .../{functions => stdlib}/secrets/_index.md | 4 +++- .../flux/{functions => stdlib}/secrets/get.md | 2 ++ .../{functions => stdlib}/slack/_index.md | 4 +++- .../{functions => stdlib}/slack/endpoint.md | 2 ++ .../{functions => stdlib}/slack/message.md | 2 ++ .../flux/{functions => stdlib}/sql/_index.md | 4 +++- .../flux/{functions => stdlib}/sql/from.md | 2 ++ .../flux/{functions => stdlib}/sql/to.md | 2 ++ .../{functions => stdlib}/strings/_index.md | 4 +++- .../{functions => stdlib}/strings/compare.md | 2 ++ .../strings/containsany.md | 2 ++ .../strings/containsstr.md | 2 ++ .../{functions => stdlib}/strings/countstr.md | 2 ++ .../strings/equalfold.md | 2 ++ .../strings/hasprefix.md | 2 ++ .../strings/hassuffix.md | 2 ++ .../strings/index-func.md | 2 ++ .../{functions => stdlib}/strings/indexany.md | 2 ++ .../{functions => stdlib}/strings/isdigit.md | 2 ++ .../{functions => stdlib}/strings/isletter.md | 2 ++ .../{functions => stdlib}/strings/islower.md | 1 + .../{functions => stdlib}/strings/isupper.md | 2 ++ .../{functions => stdlib}/strings/joinstr.md | 2 ++ .../strings/lastindex.md | 2 ++ .../strings/lastindexany.md | 2 ++ .../{functions => stdlib}/strings/repeat.md | 2 ++ .../{functions => stdlib}/strings/replace.md | 2 ++ .../strings/replaceall.md | 2 ++ .../{functions => stdlib}/strings/split.md | 2 ++ .../strings/splitafter.md | 2 ++ .../strings/splitaftern.md | 2 ++ .../{functions => stdlib}/strings/splitn.md | 2 ++ .../{functions => stdlib}/strings/strlen.md | 2 ++ .../strings/substring.md | 2 ++ .../{functions => stdlib}/strings/title.md | 2 ++ .../{functions => stdlib}/strings/tolower.md | 2 ++ .../{functions => stdlib}/strings/totitle.md | 2 ++ .../{functions => stdlib}/strings/toupper.md | 2 ++ .../{functions => stdlib}/strings/trim.md | 2 ++ .../{functions => stdlib}/strings/trimleft.md | 2 ++ .../strings/trimprefix.md | 2 ++ .../strings/trimright.md | 2 ++ .../strings/trimspace.md | 2 ++ .../strings/trimsuffix.md | 2 ++ .../{functions => stdlib}/system/_index.md | 4 +++- .../flux/{functions => stdlib}/system/time.md | 1 + .../{functions => stdlib}/testing/_index.md | 4 +++- .../testing/assertempty.md | 3 +++ .../testing/assertequals.md | 1 + .../{functions => stdlib}/testing/diff.md | 2 ++ 283 files changed, 520 insertions(+), 44 deletions(-) delete mode 100644 content/v2.0/reference/flux/functions/_index.md create mode 100644 content/v2.0/reference/flux/stdlib/_index.md rename content/v2.0/reference/flux/{functions => stdlib}/all-functions.md (73%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/_index.md (87%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/inputs/_index.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/inputs/buckets.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/inputs/from.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/_index.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/intervals.md (98%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/linearbins.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/logarithmicbins.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/now.md (85%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/misc/sleep.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/outputs/_index.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/outputs/to.md (98%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/outputs/yield.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/tests/_index.md (89%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/tests/contains.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/_index.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/_index.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/aggregatewindow.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/chandemomentumoscillator.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/count.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/cov.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/covariance.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/derivative.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/difference.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/doubleema.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/exponentialmovingaverage.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/histogramquantile.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/holtwinters.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/increase.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/integral.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/kaufmansama.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/kaufmanser.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/mean.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/median.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/mode.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/movingaverage.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/pearsonr.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/quantile.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/reduce.md (98%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/relativestrengthindex.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/skew.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/spread.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/stddev.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/sum.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/timedmovingaverage.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/tripleema.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/aggregates/tripleexponentialderivative.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/columns.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/cumulativesum.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/drop.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/duplicate.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/elapsed.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/fill.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/filter.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/group.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/histogram.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/hourselection.md (88%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/join.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/keep.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/keys.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/keyvalues.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/limit.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/map.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/pivot.md (99%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/range.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/rename.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/_index.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/bottom.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/distinct.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/first.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/highestaverage.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/highestcurrent.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/highestmax.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/last.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/lowestaverage.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/lowestcurrent.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/lowestmin.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/max.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/min.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/sample.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/top.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/selectors/unique.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/set.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/sort.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/statecount.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/stateduration.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/stream-table/_index.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/stream-table/getcolumn.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/stream-table/getrecord.md (89%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/stream-table/tablefind.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/tail.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/timeshift.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/truncatetimecolumn.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/_index.md (89%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/bool.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/bytes.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/duration.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/float.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/int.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/string.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/time.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/tobool.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/toduration.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/tofloat.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/toint.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/tostring.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/totime.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/touint.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/type-conversions/uint.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/union.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/built-in/transformations/window.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/csv/_index.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/csv/from.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/date/_index.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/date/hour.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/microsecond.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/millisecond.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/minute.md (89%) rename content/v2.0/reference/flux/{functions => stdlib}/date/month.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/date/monthday.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/nanosecond.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/quarter.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/second.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/truncate.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/date/week.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/weekday.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/date/year.md (88%) rename content/v2.0/reference/flux/{functions => stdlib}/date/yearday.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/http/_index.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/http/basicauth.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/http/endpoint.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/http/post.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/_index.md (87%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/fieldsascols.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/measurements.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/measurementtagkeys.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/measurementtagvalues.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/tagkeys.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/influxdb-v1/tagvalues.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/json/_index.md (82%) rename content/v2.0/reference/flux/{functions => stdlib}/json/encode.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/math/_index.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/math/abs.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/acos.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/acosh.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/asin.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/asinh.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/atan.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/atan2.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/math/atanh.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/cbrt.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/ceil.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/copysign.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/cos.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/cosh.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/dim.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/erf.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/erfc.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/erfcinv.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/erfinv.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/exp.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/exp2.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/expm1.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/float64bits.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/floor.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/frexp.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/math/gamma.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/hypot.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/ilogb.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/isinf.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/isnan.md (89%) rename content/v2.0/reference/flux/{functions => stdlib}/math/j0.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/j1.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/jn.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/ldexp.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/lgamma.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/log.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/log10.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/log1p.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/log2.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/logb.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/m_inf.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/m_max.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/m_min.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/mod.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/math/modf.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/nan.md (85%) rename content/v2.0/reference/flux/{functions => stdlib}/math/nextafter.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/pow.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/math/pow10.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/remainder.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/math/round.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/roundtoeven.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/signbit.md (88%) rename content/v2.0/reference/flux/{functions => stdlib}/math/sin.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/sincos.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/sinh.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/sqrt.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/tan.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/tanh.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/math/trunc.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/math/y0.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/y1.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/math/yn.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/_index.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/check.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/deadman.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/from.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/logs.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/notify.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/monitor/statechanges.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/mqtt/_index.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/mqtt/to.md (100%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/_index.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/actionfromseverity.md (91%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/dedupkey.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/endpoint.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/sendevent.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/pagerduty/severityfromlevel.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/_index.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/compile.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/findstring.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/findstringindex.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/getstring.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/matchregexpstring.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/quotemeta.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/replaceallstring.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/regexp/splitregexp.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/runtime/_index.md (85%) rename content/v2.0/reference/flux/{functions => stdlib}/runtime/version.md (86%) rename content/v2.0/reference/flux/{functions => stdlib}/secrets/_index.md (87%) rename content/v2.0/reference/flux/{functions => stdlib}/secrets/get.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/slack/_index.md (83%) rename content/v2.0/reference/flux/{functions => stdlib}/slack/endpoint.md (97%) rename content/v2.0/reference/flux/{functions => stdlib}/slack/message.md (98%) rename content/v2.0/reference/flux/{functions => stdlib}/sql/_index.md (85%) rename content/v2.0/reference/flux/{functions => stdlib}/sql/from.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/sql/to.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/_index.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/compare.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/containsany.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/containsstr.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/countstr.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/equalfold.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/hasprefix.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/hassuffix.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/index-func.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/indexany.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/isdigit.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/isletter.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/islower.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/isupper.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/joinstr.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/lastindex.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/lastindexany.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/repeat.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/replace.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/replaceall.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/split.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/splitafter.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/splitaftern.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/splitn.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/strlen.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/substring.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/title.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/tolower.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/totitle.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/toupper.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trim.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trimleft.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trimprefix.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trimright.md (95%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trimspace.md (93%) rename content/v2.0/reference/flux/{functions => stdlib}/strings/trimsuffix.md (94%) rename content/v2.0/reference/flux/{functions => stdlib}/system/_index.md (84%) rename content/v2.0/reference/flux/{functions => stdlib}/system/time.md (92%) rename content/v2.0/reference/flux/{functions => stdlib}/testing/_index.md (85%) rename content/v2.0/reference/flux/{functions => stdlib}/testing/assertempty.md (90%) rename content/v2.0/reference/flux/{functions => stdlib}/testing/assertequals.md (96%) rename content/v2.0/reference/flux/{functions => stdlib}/testing/diff.md (96%) diff --git a/content/v2.0/reference/flux/functions/_index.md b/content/v2.0/reference/flux/functions/_index.md deleted file mode 100644 index ee315518b..000000000 --- a/content/v2.0/reference/flux/functions/_index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Flux packages and functions -description: Flux packages and functions allows you to retrieve, transform, process, and output data easily. -v2.0/tags: [flux, functions, package] -menu: - v2_0_ref: - name: Flux packages and functions - parent: Flux query language -weight: 102 ---- - -Flux's functional syntax allows you to retrieve, transform, process, and output data easily. -There is a large library of built-in functions and importable packages: - -{{< children >}} diff --git a/content/v2.0/reference/flux/stdlib/_index.md b/content/v2.0/reference/flux/stdlib/_index.md new file mode 100644 index 000000000..7091b6e78 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/_index.md @@ -0,0 +1,19 @@ +--- +title: Flux standard library +description: > + The Flux standard library of packages and functions allows you to retrieve, + transform, process, and output data easily. +aliases: + - /v2.0/reference/flux/functions/ +v2.0/tags: [flux, functions, package] +menu: + v2_0_ref: + parent: Flux query language +weight: 102 +--- + +The Flux standard library of packages and functions allows you to retrieve, +transform, process, and output data easily. +There the standard library includes built-in functions and importable packages: + +{{< children >}} diff --git a/content/v2.0/reference/flux/functions/all-functions.md b/content/v2.0/reference/flux/stdlib/all-functions.md similarity index 73% rename from content/v2.0/reference/flux/functions/all-functions.md rename to content/v2.0/reference/flux/stdlib/all-functions.md index f0a0f821a..19e879712 100644 --- a/content/v2.0/reference/flux/functions/all-functions.md +++ b/content/v2.0/reference/flux/stdlib/all-functions.md @@ -1,10 +1,12 @@ --- title: Complete list of Flux functions description: View the full library of documented Flux functions. +aliases: + - /v2.0/reference/flux/functions/all-functions/ menu: v2_0_ref: name: View all functions - parent: Flux packages and functions + parent: Flux standard library weight: 299 --- diff --git a/content/v2.0/reference/flux/functions/built-in/_index.md b/content/v2.0/reference/flux/stdlib/built-in/_index.md similarity index 87% rename from content/v2.0/reference/flux/functions/built-in/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/_index.md index d46c12140..7d3a305d4 100644 --- a/content/v2.0/reference/flux/functions/built-in/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/_index.md @@ -4,10 +4,12 @@ list_title: Built-in functions description: > Built-in functions provide a foundation for working with data using Flux. They do not require an import statement and are usable without any extra setup. +aliases: + - /v2.0/reference/flux/functions/built-in/ menu: v2_0_ref: name: Built-in - parent: Flux packages and functions + parent: Flux standard library weight: 201 v2.0/tags: [built-in, functions, package] --- diff --git a/content/v2.0/reference/flux/functions/built-in/inputs/_index.md b/content/v2.0/reference/flux/stdlib/built-in/inputs/_index.md similarity index 84% rename from content/v2.0/reference/flux/functions/built-in/inputs/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/inputs/_index.md index 064ac6442..ae684634a 100644 --- a/content/v2.0/reference/flux/functions/built-in/inputs/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/inputs/_index.md @@ -3,7 +3,8 @@ title: Flux built-in input functions list_title: Built-in input functions description: Flux's built-in input functions define sources of data or or display information about data sources. aliases: - - /v2.0/reference/flux/functions/inputs + - /v2.0/reference/flux/functions/inputs + - /v2.0/reference/flux/functions/built-in/inputs/ menu: v2_0_ref: parent: Built-in diff --git a/content/v2.0/reference/flux/functions/built-in/inputs/buckets.md b/content/v2.0/reference/flux/stdlib/built-in/inputs/buckets.md similarity index 90% rename from content/v2.0/reference/flux/functions/built-in/inputs/buckets.md rename to content/v2.0/reference/flux/stdlib/built-in/inputs/buckets.md index 79aa46686..c759c932f 100644 --- a/content/v2.0/reference/flux/functions/built-in/inputs/buckets.md +++ b/content/v2.0/reference/flux/stdlib/built-in/inputs/buckets.md @@ -3,6 +3,7 @@ title: buckets() function description: The `buckets()` function returns a list of buckets in the organization. aliases: - /v2.0/reference/flux/functions/inputs/buckets + - /v2.0/reference/flux/functions/built-in/inputs/buckets/ menu: v2_0_ref: name: buckets diff --git a/content/v2.0/reference/flux/functions/built-in/inputs/from.md b/content/v2.0/reference/flux/stdlib/built-in/inputs/from.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/inputs/from.md rename to content/v2.0/reference/flux/stdlib/built-in/inputs/from.md index f7cf1b583..6c9cbe39a 100644 --- a/content/v2.0/reference/flux/functions/built-in/inputs/from.md +++ b/content/v2.0/reference/flux/stdlib/built-in/inputs/from.md @@ -3,6 +3,7 @@ title: from() function description: The `from()` function retrieves data from an InfluxDB data source. aliases: - /v2.0/reference/flux/functions/inputs/from + - /v2.0/reference/flux/functions/built-in/inputs/from/ menu: v2_0_ref: name: from diff --git a/content/v2.0/reference/flux/functions/built-in/misc/_index.md b/content/v2.0/reference/flux/stdlib/built-in/misc/_index.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/misc/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/_index.md index 0e5217ec5..3bedf0dfc 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/_index.md @@ -6,6 +6,7 @@ description: > retrieving, transforming, or outputting data. aliases: - /v2.0/reference/flux/functions/misc + - /v2.0/reference/flux/functions/built-in/misc/ menu: v2_0_ref: parent: Built-in diff --git a/content/v2.0/reference/flux/functions/built-in/misc/intervals.md b/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md similarity index 98% rename from content/v2.0/reference/flux/functions/built-in/misc/intervals.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md index 9d585b9c0..2a05e6179 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/intervals.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md @@ -3,6 +3,7 @@ title: intervals() function description: The `intervals()` function generates a set of time intervals over a range of time. aliases: - /v2.0/reference/flux/functions/misc/intervals + - /v2.0/reference/flux/functions/built-in/misc/intervals/ menu: v2_0_ref: name: intervals diff --git a/content/v2.0/reference/flux/functions/built-in/misc/linearbins.md b/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/misc/linearbins.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md index 0df48b679..10d031879 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/linearbins.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md @@ -3,6 +3,7 @@ title: linearBins() function description: The `linearBins()` function generates a list of linearly separated floats. aliases: - /v2.0/reference/flux/functions/misc/linearbins + - /v2.0/reference/flux/functions/built-in/misc/linearbins/ menu: v2_0_ref: name: linearBins diff --git a/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md b/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md index 039e74a56..9604a6008 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/logarithmicbins.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md @@ -3,6 +3,7 @@ title: logarithmicBins() function description: The `logarithmicBins()` function generates a list of exponentially separated floats. aliases: - /v2.0/reference/flux/functions/misc/logarithmicbins + - /v2.0/reference/flux/functions/built-in/misc/logarithmicbins/ menu: v2_0_ref: name: logarithmicBins diff --git a/content/v2.0/reference/flux/functions/built-in/misc/now.md b/content/v2.0/reference/flux/stdlib/built-in/misc/now.md similarity index 85% rename from content/v2.0/reference/flux/functions/built-in/misc/now.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/now.md index d342ad0b0..00d6d0796 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/now.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/now.md @@ -1,6 +1,8 @@ --- title: now() function description: The `now()` function returns the current time (UTC). +aliases: + - /v2.0/reference/flux/functions/built-in/misc/now/ menu: v2_0_ref: name: now diff --git a/content/v2.0/reference/flux/functions/built-in/misc/sleep.md b/content/v2.0/reference/flux/stdlib/built-in/misc/sleep.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/misc/sleep.md rename to content/v2.0/reference/flux/stdlib/built-in/misc/sleep.md index 7e6221048..c143a4fd2 100644 --- a/content/v2.0/reference/flux/functions/built-in/misc/sleep.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/sleep.md @@ -1,6 +1,8 @@ --- title: sleep() function description: The `sleep()` function delays execution by a specified duration. +aliases: + - /v2.0/reference/flux/functions/built-in/misc/sleep/ menu: v2_0_ref: name: sleep diff --git a/content/v2.0/reference/flux/functions/built-in/outputs/_index.md b/content/v2.0/reference/flux/stdlib/built-in/outputs/_index.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/outputs/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/outputs/_index.md index 568746148..01432c2a4 100644 --- a/content/v2.0/reference/flux/functions/built-in/outputs/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/outputs/_index.md @@ -4,6 +4,7 @@ list_title: Built-in output functions description: Flux's built-in output functions yield results or send data to a specified output destination. aliases: - /v2.0/reference/flux/functions/outputs + - /v2.0/reference/flux/functions/built-in/outputs/ menu: v2_0_ref: parent: Built-in diff --git a/content/v2.0/reference/flux/functions/built-in/outputs/to.md b/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md similarity index 98% rename from content/v2.0/reference/flux/functions/built-in/outputs/to.md rename to content/v2.0/reference/flux/stdlib/built-in/outputs/to.md index 0d6e900e8..97a62a776 100644 --- a/content/v2.0/reference/flux/functions/built-in/outputs/to.md +++ b/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md @@ -3,6 +3,7 @@ title: to() function description: The `to()` function writes data to an InfluxDB v2.0 bucket. aliases: - /v2.0/reference/flux/functions/outputs/to + - /v2.0/reference/flux/functions/built-in/outputs/to/ menu: v2_0_ref: name: to diff --git a/content/v2.0/reference/flux/functions/built-in/outputs/yield.md b/content/v2.0/reference/flux/stdlib/built-in/outputs/yield.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/outputs/yield.md rename to content/v2.0/reference/flux/stdlib/built-in/outputs/yield.md index 2c5c27ef7..8a736af63 100644 --- a/content/v2.0/reference/flux/functions/built-in/outputs/yield.md +++ b/content/v2.0/reference/flux/stdlib/built-in/outputs/yield.md @@ -3,6 +3,7 @@ title: yield() function description: The `yield()` function indicates the input tables received should be delivered as a result of the query. aliases: - /v2.0/reference/flux/functions/outputs/yield + - /v2.0/reference/flux/functions/built-in/outputs/yield/ menu: v2_0_ref: name: yield diff --git a/content/v2.0/reference/flux/functions/built-in/tests/_index.md b/content/v2.0/reference/flux/stdlib/built-in/tests/_index.md similarity index 89% rename from content/v2.0/reference/flux/functions/built-in/tests/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/tests/_index.md index 1dd1dcc77..91ad2fcda 100644 --- a/content/v2.0/reference/flux/functions/built-in/tests/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/tests/_index.md @@ -2,6 +2,8 @@ title: Flux built-in testing functions list_title: Built-in testing functions description: Flux's built-in testing functions test various aspects of piped-forward data. +aliases: + - /v2.0/reference/flux/functions/built-in/tests/ menu: v2_0_ref: name: Tests diff --git a/content/v2.0/reference/flux/functions/built-in/tests/contains.md b/content/v2.0/reference/flux/stdlib/built-in/tests/contains.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/tests/contains.md rename to content/v2.0/reference/flux/stdlib/built-in/tests/contains.md index ab2810daf..88376e185 100644 --- a/content/v2.0/reference/flux/functions/built-in/tests/contains.md +++ b/content/v2.0/reference/flux/stdlib/built-in/tests/contains.md @@ -1,6 +1,8 @@ --- title: contains() function description: The `contains()` function tests whether a value is a member of a set. +aliases: + - /v2.0/reference/flux/functions/built-in/tests/contains/ menu: v2_0_ref: name: contains diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/_index.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/_index.md index c75a50f9f..1b5ac3bfa 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/_index.md @@ -4,6 +4,7 @@ list_title: Built-in transformation functions description: Flux's built-in transformation functions transform and shape your data in specific ways. aliases: - /v2.0/reference/flux/functions/transformations + - /v2.0/reference/flux/functions/built-in/transformations/ menu: v2_0_ref: parent: Built-in diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md index 047f02769..4b0caccc6 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md @@ -4,6 +4,7 @@ list_title: Built-in aggregate functions description: Flux's built-in aggregate functions take values from an input table and aggregate them in some way. aliases: - /v2.0/reference/flux/functions/transformations/aggregates + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/ menu: v2_0_ref: parent: built-in-transformations diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md index 435fa5030..9901cf15e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md @@ -3,6 +3,7 @@ title: aggregateWindow() function description: The `aggregateWindow()` function applies an aggregate function to fixed windows of time. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/aggregatewindow + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow/ menu: v2_0_ref: name: aggregateWindow diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md index 78b5a118b..e9cfd5413 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md @@ -3,6 +3,8 @@ title: chandeMomentumOscillator() function description: > The `chandeMomentumOscillator()` function applies the technical momentum indicator developed by Tushar Chande. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/chandemomentumoscillator/ menu: v2_0_ref: name: chandeMomentumOscillator diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/count.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/count.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/count.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/count.md index 3f30cd2f9..3b2540a71 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/count.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/count.md @@ -3,6 +3,7 @@ title: count() function description: The `count()` function outputs the number of non-null records in a column. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/count + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/count/ menu: v2_0_ref: name: count diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/cov.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/cov.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/cov.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/cov.md index 708c9375c..af138115a 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/cov.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/cov.md @@ -3,6 +3,7 @@ title: cov() function description: The `cov()` function computes the covariance between two streams by first joining the streams, then performing the covariance operation. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/cov + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/cov/ menu: v2_0_ref: name: cov diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/covariance.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/covariance.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/covariance.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/covariance.md index 7f7254bcc..f4e7ecbbc 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/covariance.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/covariance.md @@ -3,6 +3,7 @@ title: covariance() function description: The `covariance()` function computes the covariance between two columns. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/covariance + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/covariance/ menu: v2_0_ref: name: covariance diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/derivative.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/derivative.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/derivative.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/derivative.md index cffc3973b..fbfebd257 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/derivative.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/derivative.md @@ -3,6 +3,7 @@ title: derivative() function description: The `derivative()` function computes the rate of change per unit of time between subsequent non-null records. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/derivative + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/derivative/ menu: v2_0_ref: name: derivative diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/difference.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/difference.md index 2f8d010e4..45179da67 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/difference.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/difference.md @@ -3,6 +3,7 @@ title: difference() function description: The `difference()` function computes the difference between subsequent non-null records. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/difference + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/difference/ menu: v2_0_ref: name: difference diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md index 88a99ef58..ee230e4a2 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md @@ -4,6 +4,8 @@ description: > The `doubleEMA()` function calculates the exponential moving average of values grouped into `n` number of points, giving more weight to recent data at double the rate of `exponentialMovingAverage()`. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ menu: v2_0_ref: name: doubleEMA diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md index c543ab342..4a57a1e55 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md @@ -3,6 +3,8 @@ title: exponentialMovingAverage() function description: > The `exponentialMovingAverage()` function calculates the exponential moving average of values in the `_value` column grouped into `n` number of points, giving more weight to recent data. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ menu: v2_0_ref: name: exponentialMovingAverage diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/histogramquantile.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/histogramquantile.md index 84edae201..5cda2d839 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/histogramquantile.md @@ -5,6 +5,7 @@ description: > that approximates the cumulative distribution of the dataset. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/histogramquantile + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/histogramquantile/ menu: v2_0_ref: name: histogramQuantile diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md index 7301ce089..632a0eb61 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md @@ -4,6 +4,7 @@ description: > The `holtWinters()` function applies the Holt-Winters forecasting method to input tables. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/holtwinters + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/holtwinters/ menu: v2_0_ref: name: holtWinters diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/increase.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/increase.md index 1865d9a6e..7528cca0f 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/increase.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/increase.md @@ -3,6 +3,7 @@ title: increase() function description: The `increase()` function calculates the total non-negative difference between values in a table. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/increase + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/increase/ menu: v2_0_ref: name: increase diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/integral.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/integral.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/integral.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/integral.md index 862b417d8..c3593844f 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/integral.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/integral.md @@ -3,6 +3,7 @@ title: integral() function description: The `integral()` function computes the area under the curve per unit of time of subsequent non-null records. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/integral + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/integral/ menu: v2_0_ref: name: integral diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md index 1944d041d..eb4bb39f7 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md @@ -3,6 +3,8 @@ title: kaufmansAMA() function description: > The `kaufmansAMA()` function calculates the Kaufman's Adaptive Moving Average (KAMA) using values in an input table. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama/ menu: v2_0_ref: name: kaufmansAMA diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md index 5f77fc1d6..6a54686ca 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md @@ -3,6 +3,8 @@ title: kaufmansER() function description: > The `kaufmansER()` function calculates the Kaufman's Efficiency Ratio (KER) using values in an input table. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser/ menu: v2_0_ref: name: kaufmansER diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean.md index 5f0cc4366..6065bdadc 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean.md @@ -3,6 +3,7 @@ title: mean() function description: The `mean()` function computes the mean or average of non-null records in the input table. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/mean + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/mean/ menu: v2_0_ref: name: mean diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/median.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/median.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md index eff12a6f7..af65f83c0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/median.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md @@ -5,6 +5,7 @@ description: > in the input table with values that fall within the `0.5` quantile or 50th percentile. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/median + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/median/ menu: v2_0_ref: name: median diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mode.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mode.md index 7ad9cfdd8..8afdee34e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/mode.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mode.md @@ -3,6 +3,8 @@ title: mode() function description: > The `mode()` function computes the mode or value that occurs most often in a specified column in the input table. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/mode/ menu: v2_0_ref: name: mode @@ -57,4 +59,4 @@ from(bucket: "example-bucket")
##### Related InfluxQL functions and statements: -[MODE()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#mode) +[MODE()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#mode) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md index 3ee8221c2..5f87f19d5 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md @@ -2,6 +2,8 @@ title: movingAverage() function description: > The `movingAverage()` function calculates the mean of values grouped into `n` number of points. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ menu: v2_0_ref: name: movingAverage diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/pearsonr.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/pearsonr.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/pearsonr.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/pearsonr.md index 8aaa439fe..f5e4bc776 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/pearsonr.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/pearsonr.md @@ -3,6 +3,7 @@ title: pearsonr() function description: The `pearsonr()` function computes the Pearson R correlation coefficient between two streams by first joining the streams, then performing the covariance operation normalized to compute R. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/pearsonr + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/pearsonr/ menu: v2_0_ref: name: pearsonr diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile.md index a322e83c7..483455487 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile.md @@ -4,6 +4,7 @@ description: The `quantile()` function outputs non-null records with values that aliases: - /v2.0/reference/flux/functions/transformations/aggregates/percentile - /v2.0/reference/flux/functions/built-in/transformations/aggregates/percentile + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile/ menu: v2_0_ref: name: quantile diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md similarity index 98% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md index 23ad32e82..293e020c3 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md @@ -3,6 +3,8 @@ title: reduce() function description: > The `reduce()` function aggregates records in each table according to the reducer, `fn`, providing a way to create custom table aggregations. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/ menu: v2_0_ref: name: reduce diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md index d8f08460b..4e3bc1fb1 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md @@ -3,6 +3,8 @@ title: relativeStrengthIndex() function description: > The `relativeStrengthIndex()` function measures the relative speed and change of values in an input table. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/relativestrengthindex/ menu: v2_0_ref: name: relativeStrengthIndex diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/skew.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/skew.md similarity index 90% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/skew.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/skew.md index 529fe62b2..04e223c8c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/skew.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/skew.md @@ -3,6 +3,7 @@ title: skew() function description: The `skew()` function outputs the skew of non-null records as a float. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/skew + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/skew/ menu: v2_0_ref: name: skew diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/spread.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/spread.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/spread.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/spread.md index 38a8abbaa..b0ca55f65 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/spread.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/spread.md @@ -3,6 +3,7 @@ title: spread() function description: The `spread()` function outputs the difference between the minimum and maximum values in a specified column. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/spread + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/spread/ menu: v2_0_ref: name: spread diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/stddev.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/stddev.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/stddev.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/stddev.md index 66889cd76..027bb214f 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/stddev.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/stddev.md @@ -3,6 +3,7 @@ title: stddev() function description: The `stddev()` function computes the standard deviation of non-null records in a specified column. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/stddev + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/stddev/ menu: v2_0_ref: name: stddev diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/sum.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/sum.md similarity index 90% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/sum.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/sum.md index e78449591..15b614462 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/sum.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/sum.md @@ -3,6 +3,7 @@ title: sum() function description: The `sum()` function computes the sum of non-null records in a specified column. aliases: - /v2.0/reference/flux/functions/transformations/aggregates/sum + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/sum/ menu: v2_0_ref: name: sum @@ -41,4 +42,4 @@ from(bucket: "example-bucket")
##### Related InfluxQL functions and statements: -[SUM()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#sum) +[SUM()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#sum) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md index d9b435213..be44b38dc 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md @@ -3,6 +3,8 @@ title: timedMovingAverage() function description: > The `timedMovingAverage()` function calculates the mean of values in a defined time range at a specified frequency. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ menu: v2_0_ref: name: timedMovingAverage diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md index cb084a607..70d71c0c4 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md @@ -4,6 +4,8 @@ description: > The `tripleEMA()` function calculates the exponential moving average of values grouped into `n` number of points, giving more weight to recent data with less lag than `exponentialMovingAverage()` and `doubleEMA()`. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ menu: v2_0_ref: name: tripleEMA diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md index 4fa7c2137..4ebaa982d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -3,6 +3,8 @@ title: tripleExponentialDerivative() function description: > The `tripleExponentialDerivative()` function calculates a triple exponential derivative (TRIX) of input tables using `n` points. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleexponentialderivative/ menu: v2_0_ref: name: tripleExponentialDerivative diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/columns.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/columns.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/columns.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/columns.md index e76f5bdc6..2703ce387 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/columns.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/columns.md @@ -6,6 +6,7 @@ description: > plus a new column containing the labels of the input table's columns. aliases: - /v2.0/reference/flux/functions/transformations/columns + - /v2.0/reference/flux/functions/built-in/transformations/columns/ menu: v2_0_ref: name: columns diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/cumulativesum.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/cumulativesum.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/cumulativesum.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/cumulativesum.md index c63d5f054..72d4087e6 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/cumulativesum.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/cumulativesum.md @@ -3,6 +3,7 @@ title: cumulativeSum() function description: The `cumulativeSum()` function computes a running sum for non-null records in the table. aliases: - /v2.0/reference/flux/functions/transformations/cumulativesum + - /v2.0/reference/flux/functions/built-in/transformations/cumulativesum/ menu: v2_0_ref: name: cumulativeSum diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/drop.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/drop.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/drop.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/drop.md index cfef40929..2c2f70133 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/drop.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/drop.md @@ -3,6 +3,7 @@ title: drop() function description: The `drop()` function removes specified columns from a table. aliases: - /v2.0/reference/flux/functions/transformations/drop + - /v2.0/reference/flux/functions/built-in/transformations/drop/ menu: v2_0_ref: name: drop diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/duplicate.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/duplicate.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/duplicate.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/duplicate.md index 54a90f9b2..cbc060dc0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/duplicate.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/duplicate.md @@ -3,6 +3,7 @@ title: duplicate() function description: The `duplicate()` function duplicates a specified column in a table. aliases: - /v2.0/reference/flux/functions/transformations/duplicate + - /v2.0/reference/flux/functions/built-in/transformations/duplicate/ menu: v2_0_ref: name: duplicate diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/elapsed.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/elapsed.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/elapsed.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/elapsed.md index 0c410b1f0..b297476c2 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/elapsed.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/elapsed.md @@ -1,6 +1,8 @@ --- title: elapsed() function description: The `elapsed()` function returns the time between subsequent records. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/elapsed/ menu: v2_0_ref: name: elapsed diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/fill.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/fill.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/fill.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/fill.md index ff534a98d..9cd01d630 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/fill.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/fill.md @@ -3,6 +3,7 @@ title: fill() function description: The `fill()` function replaces all null values in an input stream and replace them with a non-null value. aliases: - /v2.0/reference/flux/functions/transformations/fill + - /v2.0/reference/flux/functions/built-in/transformations/fill/ menu: v2_0_ref: name: fill diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/filter.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/filter.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md index 76c82962b..d52681b23 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/filter.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md @@ -3,6 +3,7 @@ title: filter() function description: The `filter()` function filters data based on conditions defined in a predicate function (fn). aliases: - /v2.0/reference/flux/functions/transformations/filter + - /v2.0/reference/flux/functions/built-in/transformations/filter/ menu: v2_0_ref: name: filter diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/group.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/group.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/group.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/group.md index 17412ee6c..f968ed990 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/group.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/group.md @@ -3,6 +3,7 @@ title: group() function description: The `group()` function groups records based on their values for specific columns. aliases: - /v2.0/reference/flux/functions/transformations/group + - /v2.0/reference/flux/functions/built-in/transformations/group/ menu: v2_0_ref: name: group diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/histogram.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/histogram.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md index 669f9f222..bc98d44ed 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/histogram.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md @@ -3,6 +3,7 @@ title: histogram() function description: The `histogram()` function approximates the cumulative distribution of a dataset by counting data frequencies for a list of bins. aliases: - /v2.0/reference/flux/functions/transformations/histogram + - /v2.0/reference/flux/functions/built-in/transformations/histogram/ menu: v2_0_ref: name: histogram diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/hourselection.md similarity index 88% rename from content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/hourselection.md index 0b9b2f58b..b56ad99f5 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/hourselection.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/hourselection.md @@ -4,7 +4,8 @@ description: > The `hourSelection()` function retains all rows with time values in a specified hour range. Hours are specified in military time. aliases: - - /v2.0/reference/flux/functions/transformations/hourSelection + - /v2.0/reference/flux/functions/transformations/hourselection + - /v2.0/reference/flux/functions/built-in/transformations/hourselection/ menu: v2_0_ref: name: hourSelection diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/join.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/join.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/join.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/join.md index 2a8f2d8dd..677fe845d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/join.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/join.md @@ -3,6 +3,7 @@ title: join() function description: The `join()` function merges two or more input streams whose values are equal on a set of common columns into a single output stream. aliases: - /v2.0/reference/flux/functions/transformations/join + - /v2.0/reference/flux/functions/built-in/transformations/join/ menu: v2_0_ref: name: join diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/keep.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/keep.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md index e1ec0b872..c54f3a62b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/keep.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md @@ -3,6 +3,7 @@ title: keep() function description: The `keep()` function returns a table containing only the specified columns. aliases: - /v2.0/reference/flux/functions/transformations/keep + - /v2.0/reference/flux/functions/built-in/transformations/keep/ menu: v2_0_ref: name: keep diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/keys.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/keys.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/keys.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/keys.md index e4ecd1b4d..5f82e10b3 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/keys.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/keys.md @@ -6,6 +6,7 @@ description: > _value column containing the labels of the input table's group key. aliases: - /v2.0/reference/flux/functions/transformations/keys + - /v2.0/reference/flux/functions/built-in/transformations/keys/ menu: v2_0_ref: name: keys diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/keyvalues.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/keyvalues.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/keyvalues.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/keyvalues.md index cd6b6d5f7..3db7044bc 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/keyvalues.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/keyvalues.md @@ -3,6 +3,7 @@ title: keyValues() function description: The `keyValues()` function returns a table with the input table's group key plus two columns, _key and _value, that correspond to unique column + value pairs from the input table. aliases: - /v2.0/reference/flux/functions/transformations/keyvalues + - /v2.0/reference/flux/functions/built-in/transformations/keyvalues/ menu: v2_0_ref: name: keyValues diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/limit.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md index b0e3b0741..b7036f282 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/limit.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md @@ -3,6 +3,7 @@ title: limit() function description: The `limit()` function limits each output table to the first `n` records. aliases: - /v2.0/reference/flux/functions/transformations/limit + - /v2.0/reference/flux/functions/built-in/transformations/limit/ menu: v2_0_ref: name: limit diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/map.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/map.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/map.md index c4b509bf9..8a4d8505f 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/map.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md @@ -3,6 +3,7 @@ title: map() function description: The `map()` function applies a function to each record in the input tables. aliases: - /v2.0/reference/flux/functions/transformations/map + - /v2.0/reference/flux/functions/built-in/transformations/map/ menu: v2_0_ref: name: map diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/pivot.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/pivot.md similarity index 99% rename from content/v2.0/reference/flux/functions/built-in/transformations/pivot.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/pivot.md index 1066d1e11..db5538ce3 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/pivot.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/pivot.md @@ -3,6 +3,7 @@ title: pivot() function description: The `pivot()` function collects values stored vertically (column-wise) in a table and aligns them horizontally (row-wise) into logical sets. aliases: - /v2.0/reference/flux/functions/transformations/pivot + - /v2.0/reference/flux/functions/built-in/transformations/pivot/ menu: v2_0_ref: name: pivot diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/range.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/range.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/range.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/range.md index 371cce541..379d6e8ac 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/range.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/range.md @@ -3,6 +3,7 @@ title: range() function description: The `range()` function filters records based on time bounds. aliases: - /v2.0/reference/flux/functions/transformations/range + - /v2.0/reference/flux/functions/built-in/transformations/range/ menu: v2_0_ref: name: range diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/rename.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/rename.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/rename.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/rename.md index 55c22ee0b..57e3c504f 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/rename.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/rename.md @@ -3,6 +3,7 @@ title: rename() function description: The `rename()` function renames specified columns in a table. aliases: - /v2.0/reference/flux/functions/transformations/rename + - /v2.0/reference/flux/functions/built-in/transformations/rename/ menu: v2_0_ref: name: rename diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md index cf67e6d44..2739e6036 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md @@ -4,6 +4,7 @@ list_title: Built-in selector functions description: Flux's built-in selector functions return one or more records based on function logic. aliases: - /v2.0/reference/flux/functions/transformations/selectors + - /v2.0/reference/flux/functions/built-in/transformations/selectors/ menu: v2_0_ref: parent: built-in-transformations diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/bottom.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/bottom.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/bottom.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/bottom.md index 0e82501ab..cb50c166e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/bottom.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/bottom.md @@ -3,6 +3,7 @@ title: bottom() function description: The `bottom()` function sorts a table by columns and keeps only the bottom n records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/bottom + - /v2.0/reference/flux/functions/built-in/transformations/selectors/bottom/ menu: v2_0_ref: name: bottom diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/distinct.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/distinct.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/distinct.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/distinct.md index 945db3889..a999c3dca 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/distinct.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/distinct.md @@ -3,6 +3,7 @@ title: distinct() function description: The `distinct()` function returns the unique values for a given column. aliases: - /v2.0/reference/flux/functions/transformations/selectors/distinct + - /v2.0/reference/flux/functions/built-in/transformations/selectors/distinct/ menu: v2_0_ref: name: distinct diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/first.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/first.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/first.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/first.md index 5767015ca..b2d80c8fd 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/first.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/first.md @@ -3,6 +3,7 @@ title: first() function description: The `first()` function selects the first non-null record from an input table. aliases: - /v2.0/reference/flux/functions/transformations/selectors/first + - /v2.0/reference/flux/functions/built-in/transformations/selectors/first/ menu: v2_0_ref: name: first diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestaverage.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestaverage.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestaverage.md index 054271bdd..7cf9d502c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestaverage.md @@ -3,6 +3,7 @@ title: highestAverage() function description: The `highestAverage()` function calculates the average of each table in the input stream returns the top `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/highestaverage + - /v2.0/reference/flux/functions/built-in/transformations/selectors/highestaverage/ menu: v2_0_ref: name: highestAverage diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestcurrent.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestcurrent.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestcurrent.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestcurrent.md index 3a59ce712..ca0a922b0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestcurrent.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestcurrent.md @@ -3,6 +3,7 @@ title: highestCurrent() function description: The `highestCurrent()` function selects the last record of each table in the input stream and returns the top `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/highestcurrent + - /v2.0/reference/flux/functions/built-in/transformations/selectors/highestcurrent/ menu: v2_0_ref: name: highestCurrent diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestmax.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestmax.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestmax.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestmax.md index 40dd14f26..e9268edcf 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/highestmax.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestmax.md @@ -3,6 +3,7 @@ title: highestMax() function description: The `highestMax()` function selects the maximum record from each table in the input stream and returns the top `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/highestmax + - /v2.0/reference/flux/functions/built-in/transformations/selectors/highestmax/ menu: v2_0_ref: name: highestMax diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/last.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/last.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/last.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/last.md index 83d7c3e96..52a11a4aa 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/last.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/last.md @@ -3,6 +3,7 @@ title: last() function description: The `last()` function selects the last non-null record from an input table. aliases: - /v2.0/reference/flux/functions/transformations/selectors/last + - /v2.0/reference/flux/functions/built-in/transformations/selectors/last/ menu: v2_0_ref: name: last diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestaverage.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestaverage.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestaverage.md index 9020333d3..d1ea9fe7c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestaverage.md @@ -3,6 +3,7 @@ title: lowestAverage() function description: The `lowestAverage()` function calculates the average of each table in the input stream returns the lowest `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/lowestaverage + - /v2.0/reference/flux/functions/built-in/transformations/selectors/lowestaverage/ menu: v2_0_ref: name: lowestAverage diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestcurrent.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestcurrent.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestcurrent.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestcurrent.md index 0b2855df5..eab20a443 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestcurrent.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestcurrent.md @@ -3,6 +3,7 @@ title: lowestCurrent() function description: The `lowestCurrent()` function selects the last record of each table in the input stream and returns the lowest `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/lowestcurrent + - /v2.0/reference/flux/functions/built-in/transformations/selectors/lowestcurrent/ menu: v2_0_ref: name: lowestCurrent diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestmin.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestmin.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestmin.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestmin.md index f8b1319cf..8a0cdc57a 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/lowestmin.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestmin.md @@ -3,6 +3,7 @@ title: lowestMin() function description: The `lowestMin()` function selects the minimum record from each table in the input stream and returns the lowest `n` records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/lowestmin + - /v2.0/reference/flux/functions/built-in/transformations/selectors/lowestmin/ menu: v2_0_ref: name: lowestMin diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/max.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/max.md similarity index 90% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/max.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/max.md index 3069e2393..9ec939844 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/max.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/max.md @@ -2,7 +2,8 @@ title: max() function description: The `max()` function selects record with the highest _value from the input table. aliases: - - /v2.0/reference/flux/functions/transformations/selectors/max + - /v2.0/reference/flux/functions/transformations/selectors/max + - /v2.0/reference/flux/functions/built-in/transformations/selectors/max/ menu: v2_0_ref: name: max @@ -41,4 +42,4 @@ from(bucket:"example-bucket")
##### Related InfluxQL functions and statements: -[MAX()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#max) +[MAX()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#max) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/min.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/min.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/min.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/min.md index 24ea3c573..28c3ba794 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/min.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/min.md @@ -3,6 +3,7 @@ title: min() function description: The `min()` function selects record with the lowest _value from the input table. aliases: - /v2.0/reference/flux/functions/transformations/selectors/min + - /v2.0/reference/flux/functions/built-in/transformations/selectors/min/ menu: v2_0_ref: name: min diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/sample.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/sample.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/sample.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/sample.md index 2bcc6ae83..7e6f9a7f5 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/sample.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/sample.md @@ -3,6 +3,7 @@ title: sample() function description: The `sample()` function selects a subset of the records from the input table. aliases: - /v2.0/reference/flux/functions/transformations/selectors/sample + - /v2.0/reference/flux/functions/built-in/transformations/selectors/sample/ menu: v2_0_ref: name: sample @@ -48,4 +49,4 @@ from(bucket:"example-bucket")
##### Related InfluxQL functions and statements: -[SAMPLE()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#sample) +[SAMPLE()](https://docs.influxdata.com/influxdb/latest/query_language/functions/#sample) diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/top.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/top.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/top.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/top.md index 87ffbed73..630bf8f4e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/top.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/top.md @@ -3,6 +3,7 @@ title: top() function description: The `top()` function sorts a table by columns and keeps only the top n records. aliases: - /v2.0/reference/flux/functions/transformations/selectors/top + - /v2.0/reference/flux/functions/built-in/transformations/selectors/top/ menu: v2_0_ref: name: top diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/unique.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/unique.md similarity index 91% rename from content/v2.0/reference/flux/functions/built-in/transformations/selectors/unique.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/unique.md index fe5047a7f..899ca0bd2 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/selectors/unique.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/unique.md @@ -3,6 +3,7 @@ title: unique() function description: The `unique()` function returns all records containing unique values in a specified column. aliases: - /v2.0/reference/flux/functions/transformations/selectors/unique + - /v2.0/reference/flux/functions/built-in/transformations/selectors/unique/ menu: v2_0_ref: name: unique diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/set.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/set.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/set.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/set.md index 51e88830d..812bc21b0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/set.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/set.md @@ -3,6 +3,7 @@ title: set() function description: The `set()` function assigns a static value to each record in the input table. aliases: - /v2.0/reference/flux/functions/transformations/set + - /v2.0/reference/flux/functions/built-in/transformations/set/ menu: v2_0_ref: name: set diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/sort.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/sort.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/sort.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/sort.md index 679885b53..a4a6f4e1d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/sort.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/sort.md @@ -3,6 +3,7 @@ title: sort() function description: The `sort()` function orders the records within each table. aliases: - /v2.0/reference/flux/functions/transformations/sort + - /v2.0/reference/flux/functions/built-in/transformations/sort/ menu: v2_0_ref: name: sort diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/statecount.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/statecount.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/statecount.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/statecount.md index 22dfa0c4c..58966ae86 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/statecount.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/statecount.md @@ -3,6 +3,7 @@ title: stateCount() function description: The `stateCount()` function computes the number of consecutive records in a given state. aliases: - /v2.0/reference/flux/functions/transformations/statecount + - /v2.0/reference/flux/functions/built-in/transformations/statecount/ menu: v2_0_ref: name: stateCount diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/stateduration.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stateduration.md similarity index 96% rename from content/v2.0/reference/flux/functions/built-in/transformations/stateduration.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/stateduration.md index 114299a9d..d21f16227 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/stateduration.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stateduration.md @@ -3,6 +3,7 @@ title: stateDuration() function description: The `stateDuration()` function computes the duration of a given state. aliases: - /v2.0/reference/flux/functions/transformations/stateduration + - /v2.0/reference/flux/functions/built-in/transformations/stateduration/ menu: v2_0_ref: name: stateDuration diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/_index.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/stream-table/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/_index.md index 9206961fd..c1c0f1382 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/_index.md @@ -5,6 +5,8 @@ seotitle: Flux built-in stream and table functions description: > Use stream and table functions to extract a table from a stream of tables and access its columns and records. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/stream-table/ weight: 401 menu: v2_0_ref: diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md similarity index 90% rename from content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md index 2bc462efb..fa4285d9b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md @@ -3,6 +3,8 @@ title: getColumn() function description: > The `getColumn()` function extracts a column from a table given its label. If the label is not present in the set of columns, the function errors. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn/ menu: v2_0_ref: name: getColumn diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md similarity index 89% rename from content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md index 9e1f35826..4e16469e5 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md @@ -3,6 +3,8 @@ title: getRecord() function description: > The `getRecord()` function extracts a record from a table given its index. If the index is out of bounds, the function errors. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord/ menu: v2_0_ref: name: getRecord diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md index f558c3f38..69b89798d 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md @@ -3,6 +3,8 @@ title: tableFind() function description: > The `tableFind()` function extracts the first table in a stream of tables whose group key values match a predicate. If no table is found, the function errors. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind/ menu: v2_0_ref: name: tableFind diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/tail.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/tail.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/tail.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/tail.md index 330d90a68..b86287b1b 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/tail.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/tail.md @@ -1,6 +1,8 @@ --- title: tail() function description: The `tail()` function limits each output table to the last `n` records. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/tail/ menu: v2_0_ref: name: tail diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/timeshift.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/timeshift.md similarity index 94% rename from content/v2.0/reference/flux/functions/built-in/transformations/timeshift.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/timeshift.md index a936dacaa..be365a397 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/timeshift.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/timeshift.md @@ -4,6 +4,7 @@ description: The `timeShift()` function adds a fixed duration to time columns. aliases: - /v2.0/reference/flux/functions/transformations/shift - /v2.0/reference/flux/functions/built-in/transformations/shift + - /v2.0/reference/flux/functions/built-in/transformations/timeshift/ menu: v2_0_ref: name: timeShift diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md index 164091a53..6813d0730 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md @@ -2,6 +2,8 @@ title: truncateTimeColumn() function description: > The `truncateTimeColumn()` function truncates all input table `_time` values to a specified unit. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/truncatetimecolumn/ menu: v2_0_ref: name: truncateTimeColumn diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/_index.md similarity index 89% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/_index.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/_index.md index 32dc3ad41..713e7c120 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/_index.md @@ -4,6 +4,7 @@ list_title: Built-in type conversion functions description: Flux's built-in built-in type conversion functions convert columns of the input table into a specific data type. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/ menu: v2_0_ref: parent: built-in-transformations diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bool.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bool.md index e2124006c..03935abee 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bool.md @@ -1,6 +1,8 @@ --- title: bool() function description: The `bool()` function converts a single value to a boolean. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool/ menu: v2_0_ref: name: bool diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bytes.md similarity index 84% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bytes.md index c4bf8212e..a3707bb88 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bytes.md @@ -1,6 +1,8 @@ --- title: bytes() function description: The `bytes()` function converts a single value to bytes. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/bytes/ menu: v2_0_ref: name: bytes diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/duration.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/duration.md index bb3a79a28..bb52c0560 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/duration.md @@ -1,6 +1,8 @@ --- title: duration() function description: The `duration()` function converts a single value to a duration. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration/ menu: v2_0_ref: name: duration diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/float.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/float.md index c077410db..30e54c5b0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/float.md @@ -1,6 +1,8 @@ --- title: float() function description: The `float()` function converts a single value to a float. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/float/ menu: v2_0_ref: name: float diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/int.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/int.md index 4085a88ce..a0da92ec4 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/int.md @@ -1,6 +1,8 @@ --- title: int() function description: The `int()` function converts a single value to an integer. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/int/ menu: v2_0_ref: name: int diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string.md index c8274b482..d8c3648bf 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string.md @@ -1,6 +1,8 @@ --- title: string() function description: The `string()` function converts a single value to a string. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/string/ menu: v2_0_ref: name: string diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time.md index 1bd9c324a..bcaa3fcaa 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time.md @@ -1,6 +1,8 @@ --- title: time() function description: The `time()` function converts a single value to a time. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/time/ menu: v2_0_ref: name: time diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tobool.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tobool.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md index 0f0ec100a..41a97df96 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tobool.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md @@ -3,6 +3,7 @@ title: toBool() function description: The `toBool()` function converts all values in the `_value` column to booleans. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/tobool + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/tobool/ menu: v2_0_ref: name: toBool diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toduration.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toduration.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md index 29adcd293..78967cf1c 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toduration.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md @@ -3,6 +3,7 @@ title: toDuration() function description: The `toDuration()` function converts all values in the `_value` column to durations. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/toduration + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/toduration/ menu: v2_0_ref: name: toDuration diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tofloat.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tofloat.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md index 237babf29..f5f233414 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tofloat.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md @@ -3,6 +3,7 @@ title: toFloat() function description: The `toFloat()` function converts all values in the `_value` column to floats. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/tofloat + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/tofloat/ menu: v2_0_ref: name: toFloat diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toint.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toint.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md index 69bbb02c5..39a14ed37 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/toint.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md @@ -3,6 +3,7 @@ title: toInt() function description: The `toInt()` function converts all values in the `_value` column to integers. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/toint + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/toint/ menu: v2_0_ref: name: toInt diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tostring.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tostring.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md index 342052ccd..c9256b8f9 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tostring.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md @@ -3,6 +3,7 @@ title: toString() function description: The `toString()` function converts all values in the `_value` column to strings. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/tostring + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/tostring/ menu: v2_0_ref: name: toString diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/totime.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md similarity index 92% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/totime.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md index 6b22ae988..5b6b2a6c8 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/totime.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md @@ -3,6 +3,7 @@ title: toTime() function description: The `toTime()` function converts all values in the `_value` column to times. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/totime + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/totime/ menu: v2_0_ref: name: toTime diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/touint.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md similarity index 93% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/touint.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md index 5e0809358..d50ac5a7e 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/touint.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md @@ -3,6 +3,7 @@ title: toUInt() function description: The `toUInt()` function converts all values in the `_value` column to UIntegers. aliases: - /v2.0/reference/flux/functions/transformations/type-conversions/touint + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/touint/ menu: v2_0_ref: name: toUInt diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/uint.md similarity index 86% rename from content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/uint.md index 1c72dcc67..72f12c2d0 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/uint.md @@ -1,6 +1,8 @@ --- title: uint() function description: The `uint()` function converts a single value to a UInteger. +aliases: + - /v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint/ menu: v2_0_ref: name: uint diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/union.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/union.md similarity index 95% rename from content/v2.0/reference/flux/functions/built-in/transformations/union.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/union.md index 449e15ee6..eba22a466 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/union.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/union.md @@ -3,6 +3,7 @@ title: union() function description: The `union()` function concatenates two or more input streams into a single output stream. aliases: - /v2.0/reference/flux/functions/transformations/union + - /v2.0/reference/flux/functions/built-in/transformations/union/ menu: v2_0_ref: name: union diff --git a/content/v2.0/reference/flux/functions/built-in/transformations/window.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/window.md similarity index 97% rename from content/v2.0/reference/flux/functions/built-in/transformations/window.md rename to content/v2.0/reference/flux/stdlib/built-in/transformations/window.md index bd9f658aa..6611b35a6 100644 --- a/content/v2.0/reference/flux/functions/built-in/transformations/window.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/window.md @@ -3,6 +3,7 @@ title: window() function description: The `window()` function groups records based on a time value. aliases: - /v2.0/reference/flux/functions/transformations/window + - /v2.0/reference/flux/functions/built-in/transformations/window/ menu: v2_0_ref: name: window diff --git a/content/v2.0/reference/flux/functions/csv/_index.md b/content/v2.0/reference/flux/stdlib/csv/_index.md similarity index 86% rename from content/v2.0/reference/flux/functions/csv/_index.md rename to content/v2.0/reference/flux/stdlib/csv/_index.md index f1af202be..e8ebc3e22 100644 --- a/content/v2.0/reference/flux/functions/csv/_index.md +++ b/content/v2.0/reference/flux/stdlib/csv/_index.md @@ -4,10 +4,12 @@ list_title: CSV package description: > The Flux CSV package provides functions for working with data in annotated CSV format. Import the `csv` package. +aliases: + - /v2.0/reference/flux/functions/csv/ menu: v2_0_ref: name: CSV - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, csv, package] --- diff --git a/content/v2.0/reference/flux/functions/csv/from.md b/content/v2.0/reference/flux/stdlib/csv/from.md similarity index 97% rename from content/v2.0/reference/flux/functions/csv/from.md rename to content/v2.0/reference/flux/stdlib/csv/from.md index 712555dcd..6114f3c08 100644 --- a/content/v2.0/reference/flux/functions/csv/from.md +++ b/content/v2.0/reference/flux/stdlib/csv/from.md @@ -4,6 +4,7 @@ description: The `csv.from()` function retrieves data from a CSV data source. aliases: - /v2.0/reference/flux/functions/inputs/fromcsv - /v2.0/reference/flux/functions/built-in/inputs/fromcsv + - /v2.0/reference/flux/functions/csv/from/ menu: v2_0_ref: name: csv.from diff --git a/content/v2.0/reference/flux/functions/date/_index.md b/content/v2.0/reference/flux/stdlib/date/_index.md similarity index 93% rename from content/v2.0/reference/flux/functions/date/_index.md rename to content/v2.0/reference/flux/stdlib/date/_index.md index 14d49900d..0d603df8b 100644 --- a/content/v2.0/reference/flux/functions/date/_index.md +++ b/content/v2.0/reference/flux/stdlib/date/_index.md @@ -6,10 +6,11 @@ description: > Import the `date` package. aliases: - /v2.0/reference/flux/language/built-ins/time-constants/ + - /v2.0/reference/flux/functions/date/ menu: v2_0_ref: name: Date - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [date, time, functions] --- diff --git a/content/v2.0/reference/flux/functions/date/hour.md b/content/v2.0/reference/flux/stdlib/date/hour.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/hour.md rename to content/v2.0/reference/flux/stdlib/date/hour.md index 619d0aa8d..efdf143e7 100644 --- a/content/v2.0/reference/flux/functions/date/hour.md +++ b/content/v2.0/reference/flux/stdlib/date/hour.md @@ -3,6 +3,8 @@ title: date.hour() function description: > The `date.hour()` function returns the hour of a specified time. Results range from `[0-23]`. +aliases: + - /v2.0/reference/flux/functions/date/hour/ menu: v2_0_ref: name: date.hour diff --git a/content/v2.0/reference/flux/functions/date/microsecond.md b/content/v2.0/reference/flux/stdlib/date/microsecond.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/microsecond.md rename to content/v2.0/reference/flux/stdlib/date/microsecond.md index 6a1226250..bd4cbba76 100644 --- a/content/v2.0/reference/flux/functions/date/microsecond.md +++ b/content/v2.0/reference/flux/stdlib/date/microsecond.md @@ -3,6 +3,8 @@ title: date.microsecond() function description: > The `date.microsecond()` function returns the microsecond of a specified time. Results range from `[0-999999]`. +aliases: + - /v2.0/reference/flux/functions/date/microsecond/ menu: v2_0_ref: name: date.microsecond diff --git a/content/v2.0/reference/flux/functions/date/millisecond.md b/content/v2.0/reference/flux/stdlib/date/millisecond.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/millisecond.md rename to content/v2.0/reference/flux/stdlib/date/millisecond.md index cc3645240..6d7a6285e 100644 --- a/content/v2.0/reference/flux/functions/date/millisecond.md +++ b/content/v2.0/reference/flux/stdlib/date/millisecond.md @@ -3,6 +3,8 @@ title: date.millisecond() function description: > The `date.millisecond()` function returns the millisecond of a specified time. Results range from `[0-999999]`. +aliases: + - /v2.0/reference/flux/functions/date/millisecond/ menu: v2_0_ref: name: date.millisecond diff --git a/content/v2.0/reference/flux/functions/date/minute.md b/content/v2.0/reference/flux/stdlib/date/minute.md similarity index 89% rename from content/v2.0/reference/flux/functions/date/minute.md rename to content/v2.0/reference/flux/stdlib/date/minute.md index 9a1f10fc9..5e5ec0b34 100644 --- a/content/v2.0/reference/flux/functions/date/minute.md +++ b/content/v2.0/reference/flux/stdlib/date/minute.md @@ -3,6 +3,8 @@ title: date.minute() function description: > The `date.minute()` function returns the minute of a specified time. Results range from `[0-59]`. +aliases: + - /v2.0/reference/flux/functions/date/minute/ menu: v2_0_ref: name: date.minute diff --git a/content/v2.0/reference/flux/functions/date/month.md b/content/v2.0/reference/flux/stdlib/date/month.md similarity index 84% rename from content/v2.0/reference/flux/functions/date/month.md rename to content/v2.0/reference/flux/stdlib/date/month.md index cfe91894c..6612dedd4 100644 --- a/content/v2.0/reference/flux/functions/date/month.md +++ b/content/v2.0/reference/flux/stdlib/date/month.md @@ -2,7 +2,9 @@ title: date.month() function description: > The `date.month()` function returns the month of a specified time. - Results range from `[1-12]` + Results range from `[1-12]`. +aliases: + - /v2.0/reference/flux/functions/date/month/ menu: v2_0_ref: name: date.month diff --git a/content/v2.0/reference/flux/functions/date/monthday.md b/content/v2.0/reference/flux/stdlib/date/monthday.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/monthday.md rename to content/v2.0/reference/flux/stdlib/date/monthday.md index 7e95af6e7..fabc7d31b 100644 --- a/content/v2.0/reference/flux/functions/date/monthday.md +++ b/content/v2.0/reference/flux/stdlib/date/monthday.md @@ -3,6 +3,8 @@ title: date.monthDay() function description: > The `date.monthDay()` function returns the day of the month for a specified time. Results range from `[1-31]`. +aliases: + - /v2.0/reference/flux/functions/date/monthday/ menu: v2_0_ref: name: date.monthDay diff --git a/content/v2.0/reference/flux/functions/date/nanosecond.md b/content/v2.0/reference/flux/stdlib/date/nanosecond.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/nanosecond.md rename to content/v2.0/reference/flux/stdlib/date/nanosecond.md index 21f42bdd7..9d05b1f72 100644 --- a/content/v2.0/reference/flux/functions/date/nanosecond.md +++ b/content/v2.0/reference/flux/stdlib/date/nanosecond.md @@ -3,6 +3,8 @@ title: date.nanosecond() function description: > The `date.nanosecond()` function returns the nanosecond of a specified time. Results range from `[0-999999999]`. +aliases: + - /v2.0/reference/flux/functions/date/nanosecond/ menu: v2_0_ref: name: date.nanosecond diff --git a/content/v2.0/reference/flux/functions/date/quarter.md b/content/v2.0/reference/flux/stdlib/date/quarter.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/quarter.md rename to content/v2.0/reference/flux/stdlib/date/quarter.md index 87576ce4c..a2f05b0f9 100644 --- a/content/v2.0/reference/flux/functions/date/quarter.md +++ b/content/v2.0/reference/flux/stdlib/date/quarter.md @@ -3,6 +3,8 @@ title: date.quarter() function description: > The `date.quarter()` function returns the quarter of the year for a specified time. Results range from `[1-4]`. +aliases: + - /v2.0/reference/flux/functions/date/quarter/ menu: v2_0_ref: name: date.quarter diff --git a/content/v2.0/reference/flux/functions/date/second.md b/content/v2.0/reference/flux/stdlib/date/second.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/second.md rename to content/v2.0/reference/flux/stdlib/date/second.md index 849ccea6f..e7cc28f7f 100644 --- a/content/v2.0/reference/flux/functions/date/second.md +++ b/content/v2.0/reference/flux/stdlib/date/second.md @@ -3,6 +3,8 @@ title: date.second() function description: > The `date.second()` function returns the second of a specified time. Results range from `[0-59]`. +aliases: + - /v2.0/reference/flux/functions/date/second/ menu: v2_0_ref: name: date.second diff --git a/content/v2.0/reference/flux/functions/date/truncate.md b/content/v2.0/reference/flux/stdlib/date/truncate.md similarity index 94% rename from content/v2.0/reference/flux/functions/date/truncate.md rename to content/v2.0/reference/flux/stdlib/date/truncate.md index 960bd999a..762cfffcd 100644 --- a/content/v2.0/reference/flux/functions/date/truncate.md +++ b/content/v2.0/reference/flux/stdlib/date/truncate.md @@ -2,6 +2,8 @@ title: date.truncate() function description: > The `date.truncate()` function truncates a time to a specified unit. +aliases: + - /v2.0/reference/flux/functions/date/truncate/ menu: v2_0_ref: name: date.truncate diff --git a/content/v2.0/reference/flux/functions/date/week.md b/content/v2.0/reference/flux/stdlib/date/week.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/week.md rename to content/v2.0/reference/flux/stdlib/date/week.md index 8e1bede7b..dec8bddec 100644 --- a/content/v2.0/reference/flux/functions/date/week.md +++ b/content/v2.0/reference/flux/stdlib/date/week.md @@ -3,6 +3,8 @@ title: date.week() function description: > The `date.week()` function returns the ISO week of the year for a specified time. Results range from `[1-53]`. +aliases: + - /v2.0/reference/flux/functions/date/week/ menu: v2_0_ref: name: date.week diff --git a/content/v2.0/reference/flux/functions/date/weekday.md b/content/v2.0/reference/flux/stdlib/date/weekday.md similarity index 90% rename from content/v2.0/reference/flux/functions/date/weekday.md rename to content/v2.0/reference/flux/stdlib/date/weekday.md index 4ab512c05..6e6fdb18c 100644 --- a/content/v2.0/reference/flux/functions/date/weekday.md +++ b/content/v2.0/reference/flux/stdlib/date/weekday.md @@ -3,6 +3,8 @@ title: date.weekDay() function description: > The `date.weekDay()` function returns the day of the week for a specified time. Results range from `[0-6]`. +aliases: + - /v2.0/reference/flux/functions/date/weekday/ menu: v2_0_ref: name: date.weekDay diff --git a/content/v2.0/reference/flux/functions/date/year.md b/content/v2.0/reference/flux/stdlib/date/year.md similarity index 88% rename from content/v2.0/reference/flux/functions/date/year.md rename to content/v2.0/reference/flux/stdlib/date/year.md index b2e2a80b4..f911a5976 100644 --- a/content/v2.0/reference/flux/functions/date/year.md +++ b/content/v2.0/reference/flux/stdlib/date/year.md @@ -2,6 +2,8 @@ title: date.year() function description: > The `date.year()` function returns the year of a specified time. +aliases: + - /v2.0/reference/flux/functions/date/year/ menu: v2_0_ref: name: date.year diff --git a/content/v2.0/reference/flux/functions/date/yearday.md b/content/v2.0/reference/flux/stdlib/date/yearday.md similarity index 91% rename from content/v2.0/reference/flux/functions/date/yearday.md rename to content/v2.0/reference/flux/stdlib/date/yearday.md index 0725e9418..20df57afe 100644 --- a/content/v2.0/reference/flux/functions/date/yearday.md +++ b/content/v2.0/reference/flux/stdlib/date/yearday.md @@ -3,6 +3,8 @@ title: date.yearDay() function description: > The `date.yearDay()` function returns the day of the year for a specified time. Results range from `[1-365]` for non-leap years, and `[1-366]` in leap years. +aliases: + - /v2.0/reference/flux/functions/date/yearday/ menu: v2_0_ref: name: date.yearDay diff --git a/content/v2.0/reference/flux/functions/http/_index.md b/content/v2.0/reference/flux/stdlib/http/_index.md similarity index 84% rename from content/v2.0/reference/flux/functions/http/_index.md rename to content/v2.0/reference/flux/stdlib/http/_index.md index 575108bfb..7145da674 100644 --- a/content/v2.0/reference/flux/functions/http/_index.md +++ b/content/v2.0/reference/flux/stdlib/http/_index.md @@ -4,10 +4,12 @@ list_title: HTTP package description: > The Flux HTTP package provides functions for transferring data using the HTTP protocol. Import the `http` package. +aliases: + - /v2.0/reference/flux/functions/http/ menu: v2_0_ref: name: HTTP - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, http, package] --- diff --git a/content/v2.0/reference/flux/functions/http/basicauth.md b/content/v2.0/reference/flux/stdlib/http/basicauth.md similarity index 94% rename from content/v2.0/reference/flux/functions/http/basicauth.md rename to content/v2.0/reference/flux/stdlib/http/basicauth.md index 3ea42a485..746f84ba2 100644 --- a/content/v2.0/reference/flux/functions/http/basicauth.md +++ b/content/v2.0/reference/flux/stdlib/http/basicauth.md @@ -3,6 +3,8 @@ title: http.basicAuth() function description: > The `http.basicAuth()` function returns a Base64-encoded basic authentication header using a specified username and password combination. +aliases: + - /v2.0/reference/flux/functions/http/basicauth/ menu: v2_0_ref: name: http.basicAuth diff --git a/content/v2.0/reference/flux/functions/http/endpoint.md b/content/v2.0/reference/flux/stdlib/http/endpoint.md similarity index 96% rename from content/v2.0/reference/flux/functions/http/endpoint.md rename to content/v2.0/reference/flux/stdlib/http/endpoint.md index df67ea6af..7dd176e99 100644 --- a/content/v2.0/reference/flux/functions/http/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/http/endpoint.md @@ -2,6 +2,8 @@ title: http.endpoint() function description: > The `http.endpoint()` function sends output data to an HTTP URL using the POST request method. +aliases: + - /v2.0/reference/flux/functions/http/endpoint/ menu: v2_0_ref: name: http.endpoint diff --git a/content/v2.0/reference/flux/functions/http/post.md b/content/v2.0/reference/flux/stdlib/http/post.md similarity index 95% rename from content/v2.0/reference/flux/functions/http/post.md rename to content/v2.0/reference/flux/stdlib/http/post.md index 214c15833..bc694a8aa 100644 --- a/content/v2.0/reference/flux/functions/http/post.md +++ b/content/v2.0/reference/flux/stdlib/http/post.md @@ -3,6 +3,8 @@ title: http.post() function description: > The `http.post()` function submits an HTTP POST request to the specified URL with headers and data. The HTTP status code is returned. +aliases: + - /v2.0/reference/flux/functions/http/post/ menu: v2_0_ref: name: http.post diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/_index.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/_index.md similarity index 87% rename from content/v2.0/reference/flux/functions/influxdb-v1/_index.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/_index.md index 18b00d1cc..325f1e8d0 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/_index.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/_index.md @@ -5,10 +5,12 @@ description: > The Flux InfluxDB v1 package provides functions for managing data from an InfluxDB v1.x database or structured using the InfluxDB v1 data structure. Import the `influxdata/influxdb/v1` package. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/ menu: v2_0_ref: name: InfluxDB v1 - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, influxdb-v1, package] --- diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/fieldsascols.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md similarity index 95% rename from content/v2.0/reference/flux/functions/influxdb-v1/fieldsascols.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md index 0d7b2da64..93a94f978 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/fieldsascols.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md @@ -4,6 +4,7 @@ description: The v1.fieldsAsCols() function is pivots a table and automatically aliases: - /v2.0/reference/flux/functions/inputs/fromrows - /v2.0/reference/flux/functions/transformations/influxfieldsascols + - /v2.0/reference/flux/functions/influxdb-v1/fieldsascols/ menu: v2_0_ref: name: v1.fieldsAsCols diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/measurements.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md similarity index 91% rename from content/v2.0/reference/flux/functions/influxdb-v1/measurements.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md index a13e77ae0..9034836ee 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/measurements.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md @@ -1,6 +1,8 @@ --- title: v1.measurements() function description: The v1.measurements() function returns a list of measurements in a specific bucket. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/measurements/ menu: v2_0_ref: name: v1.measurements diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/measurementtagkeys.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md similarity index 92% rename from content/v2.0/reference/flux/functions/influxdb-v1/measurementtagkeys.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md index dc1382b25..84b1b74f2 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/measurementtagkeys.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md @@ -1,6 +1,8 @@ --- title: v1.measurementTagKeys() function description: The v1.measurementTagKeys() function returns a list of tag keys for a specific measurement. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/measurementtagkeys/ menu: v2_0_ref: name: v1.measurementTagKeys diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md similarity index 93% rename from content/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md index 979f07b9e..90643cd64 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md @@ -1,6 +1,8 @@ --- title: v1.measurementTagValues() function description: The v1.measurementTagValues() function returns a list of tag values for a specific measurement. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues/ menu: v2_0_ref: name: v1.measurementTagValues diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/tagkeys.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md similarity index 96% rename from content/v2.0/reference/flux/functions/influxdb-v1/tagkeys.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md index 7a65ac062..154a261dc 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/tagkeys.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md @@ -1,6 +1,8 @@ --- title: v1.tagKeys() function description: The v1.tagKeys() function returns a list of tag keys for all series that match the predicate. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/tagkeys/ menu: v2_0_ref: name: v1.tagKeys diff --git a/content/v2.0/reference/flux/functions/influxdb-v1/tagvalues.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md similarity index 96% rename from content/v2.0/reference/flux/functions/influxdb-v1/tagvalues.md rename to content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md index 7db47cb88..47525e8bd 100644 --- a/content/v2.0/reference/flux/functions/influxdb-v1/tagvalues.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md @@ -1,6 +1,8 @@ --- title: v1.tagValues() function description: The `v1.tagValues()` function returns a list unique values for a given tag. +aliases: + - /v2.0/reference/flux/functions/influxdb-v1/tagvalues/ menu: v2_0_ref: name: v1.tagValues diff --git a/content/v2.0/reference/flux/functions/json/_index.md b/content/v2.0/reference/flux/stdlib/json/_index.md similarity index 82% rename from content/v2.0/reference/flux/functions/json/_index.md rename to content/v2.0/reference/flux/stdlib/json/_index.md index ca7b8a82f..00d4e266c 100644 --- a/content/v2.0/reference/flux/functions/json/_index.md +++ b/content/v2.0/reference/flux/stdlib/json/_index.md @@ -4,10 +4,12 @@ list_title: JSON package description: > The Flux JSON package provides functions for working with JSON. Import the `json` package. +aliases: + - /v2.0/reference/flux/functions/json/ menu: v2_0_ref: name: JSON - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, json, package] --- diff --git a/content/v2.0/reference/flux/functions/json/encode.md b/content/v2.0/reference/flux/stdlib/json/encode.md similarity index 94% rename from content/v2.0/reference/flux/functions/json/encode.md rename to content/v2.0/reference/flux/stdlib/json/encode.md index 640241b34..0c6f42cd9 100644 --- a/content/v2.0/reference/flux/functions/json/encode.md +++ b/content/v2.0/reference/flux/stdlib/json/encode.md @@ -1,6 +1,8 @@ --- title: json.encode() function description: The `json.encode()` function converts a value into JSON bytes. +aliases: + - /v2.0/reference/flux/functions/json/encode/ menu: v2_0_ref: name: json.encode diff --git a/content/v2.0/reference/flux/functions/math/_index.md b/content/v2.0/reference/flux/stdlib/math/_index.md similarity index 95% rename from content/v2.0/reference/flux/functions/math/_index.md rename to content/v2.0/reference/flux/stdlib/math/_index.md index bb0ef8f25..1ad8fa2fb 100644 --- a/content/v2.0/reference/flux/functions/math/_index.md +++ b/content/v2.0/reference/flux/stdlib/math/_index.md @@ -4,10 +4,12 @@ list_title: Math package description: > The Flux math package provides basic constants and mathematical functions. Import the `math` package. +aliases: + - /v2.0/reference/flux/functions/math/ menu: v2_0_ref: name: Math - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [math, functions] --- diff --git a/content/v2.0/reference/flux/functions/math/abs.md b/content/v2.0/reference/flux/stdlib/math/abs.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/abs.md rename to content/v2.0/reference/flux/stdlib/math/abs.md index 8db0c56b7..ac946c108 100644 --- a/content/v2.0/reference/flux/functions/math/abs.md +++ b/content/v2.0/reference/flux/stdlib/math/abs.md @@ -1,6 +1,8 @@ --- title: math.abs() function description: The math.abs() function returns the absolute value of `x`. +aliases: + - /v2.0/reference/flux/functions/math/abs/ menu: v2_0_ref: name: math.abs diff --git a/content/v2.0/reference/flux/functions/math/acos.md b/content/v2.0/reference/flux/stdlib/math/acos.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/acos.md rename to content/v2.0/reference/flux/stdlib/math/acos.md index 5b6b88fd8..528edc827 100644 --- a/content/v2.0/reference/flux/functions/math/acos.md +++ b/content/v2.0/reference/flux/stdlib/math/acos.md @@ -1,6 +1,8 @@ --- title: math.acos() function description: The math.acos() function returns the arccosine of `x` in radians. +aliases: + - /v2.0/reference/flux/functions/math/acos/ menu: v2_0_ref: name: math.acos diff --git a/content/v2.0/reference/flux/functions/math/acosh.md b/content/v2.0/reference/flux/stdlib/math/acosh.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/acosh.md rename to content/v2.0/reference/flux/stdlib/math/acosh.md index 95cead337..80ccad2c2 100644 --- a/content/v2.0/reference/flux/functions/math/acosh.md +++ b/content/v2.0/reference/flux/stdlib/math/acosh.md @@ -1,6 +1,8 @@ --- title: math.acosh() function description: The math.acosh() function returns the inverse hyperbolic cosine of `x`. +aliases: + - /v2.0/reference/flux/functions/math/acosh/ menu: v2_0_ref: name: math.acosh diff --git a/content/v2.0/reference/flux/functions/math/asin.md b/content/v2.0/reference/flux/stdlib/math/asin.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/asin.md rename to content/v2.0/reference/flux/stdlib/math/asin.md index 614e12174..9e667f686 100644 --- a/content/v2.0/reference/flux/functions/math/asin.md +++ b/content/v2.0/reference/flux/stdlib/math/asin.md @@ -1,6 +1,8 @@ --- title: math.asin() function description: The math.asin() function returns the arcsine of `x` in radians. +aliases: + - /v2.0/reference/flux/functions/math/asin/ menu: v2_0_ref: name: math.asin diff --git a/content/v2.0/reference/flux/functions/math/asinh.md b/content/v2.0/reference/flux/stdlib/math/asinh.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/asinh.md rename to content/v2.0/reference/flux/stdlib/math/asinh.md index 9800d3ad0..4ff4ca9bc 100644 --- a/content/v2.0/reference/flux/functions/math/asinh.md +++ b/content/v2.0/reference/flux/stdlib/math/asinh.md @@ -1,6 +1,8 @@ --- title: math.asinh() function description: The math.asinh() function returns the inverse hyperbolic sine of `x`. +aliases: + - /v2.0/reference/flux/functions/math/asinh/ menu: v2_0_ref: name: math.asinh diff --git a/content/v2.0/reference/flux/functions/math/atan.md b/content/v2.0/reference/flux/stdlib/math/atan.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/atan.md rename to content/v2.0/reference/flux/stdlib/math/atan.md index 524a3fe96..77a360dc1 100644 --- a/content/v2.0/reference/flux/functions/math/atan.md +++ b/content/v2.0/reference/flux/stdlib/math/atan.md @@ -1,6 +1,8 @@ --- title: math.atan() function description: The math.atan() function returns the arctangent of `x` in radians. +aliases: + - /v2.0/reference/flux/functions/math/atan/ menu: v2_0_ref: name: math.atan diff --git a/content/v2.0/reference/flux/functions/math/atan2.md b/content/v2.0/reference/flux/stdlib/math/atan2.md similarity index 96% rename from content/v2.0/reference/flux/functions/math/atan2.md rename to content/v2.0/reference/flux/stdlib/math/atan2.md index 1556dcbf5..69049aafc 100644 --- a/content/v2.0/reference/flux/functions/math/atan2.md +++ b/content/v2.0/reference/flux/stdlib/math/atan2.md @@ -3,6 +3,8 @@ title: math.atan2() function description: > The math.atan2() function returns the arc tangent of `y`/`x`, using the signs of the parameters to determine the quadrant of the return value. +aliases: + - /v2.0/reference/flux/functions/math/atan2/ menu: v2_0_ref: name: math.atan2 diff --git a/content/v2.0/reference/flux/functions/math/atanh.md b/content/v2.0/reference/flux/stdlib/math/atanh.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/atanh.md rename to content/v2.0/reference/flux/stdlib/math/atanh.md index d3a551543..ea01f337a 100644 --- a/content/v2.0/reference/flux/functions/math/atanh.md +++ b/content/v2.0/reference/flux/stdlib/math/atanh.md @@ -1,6 +1,8 @@ --- title: math.atanh() function description: The math.atanh() function returns the inverse hyperbolic tangent of `x`. +aliases: + - /v2.0/reference/flux/functions/math/atanh/ menu: v2_0_ref: name: math.atanh diff --git a/content/v2.0/reference/flux/functions/math/cbrt.md b/content/v2.0/reference/flux/stdlib/math/cbrt.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/cbrt.md rename to content/v2.0/reference/flux/stdlib/math/cbrt.md index 6054dacf3..f7018bb68 100644 --- a/content/v2.0/reference/flux/functions/math/cbrt.md +++ b/content/v2.0/reference/flux/stdlib/math/cbrt.md @@ -1,6 +1,8 @@ --- title: math.cbrt() function description: The math.cbrt() function returns the cube root of `x`. +aliases: + - /v2.0/reference/flux/functions/math/cbrt/ menu: v2_0_ref: name: math.cbrt diff --git a/content/v2.0/reference/flux/functions/math/ceil.md b/content/v2.0/reference/flux/stdlib/math/ceil.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/ceil.md rename to content/v2.0/reference/flux/stdlib/math/ceil.md index 091ffbedb..397fd53e3 100644 --- a/content/v2.0/reference/flux/functions/math/ceil.md +++ b/content/v2.0/reference/flux/stdlib/math/ceil.md @@ -1,6 +1,8 @@ --- title: math.ceil() function description: The math.ceil() function returns the least integer value greater than or equal to `x`. +aliases: + - /v2.0/reference/flux/functions/math/ceil/ menu: v2_0_ref: name: math.ceil diff --git a/content/v2.0/reference/flux/functions/math/copysign.md b/content/v2.0/reference/flux/stdlib/math/copysign.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/copysign.md rename to content/v2.0/reference/flux/stdlib/math/copysign.md index 26466573f..ecc4b0267 100644 --- a/content/v2.0/reference/flux/functions/math/copysign.md +++ b/content/v2.0/reference/flux/stdlib/math/copysign.md @@ -1,6 +1,8 @@ --- title: math.copysign() function description: The math.copysign() function returns a value with the magnitude of `x` and the sign of `y`. +aliases: + - /v2.0/reference/flux/functions/math/copysign/ menu: v2_0_ref: name: math.copysign diff --git a/content/v2.0/reference/flux/functions/math/cos.md b/content/v2.0/reference/flux/stdlib/math/cos.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/cos.md rename to content/v2.0/reference/flux/stdlib/math/cos.md index 7c1b6bd2f..f06e07a50 100644 --- a/content/v2.0/reference/flux/functions/math/cos.md +++ b/content/v2.0/reference/flux/stdlib/math/cos.md @@ -1,6 +1,8 @@ --- title: math.cos() function description: The math.cos() function returns the cosine of the radian argument `x`. +aliases: + - /v2.0/reference/flux/functions/math/cos/ menu: v2_0_ref: name: math.cos diff --git a/content/v2.0/reference/flux/functions/math/cosh.md b/content/v2.0/reference/flux/stdlib/math/cosh.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/cosh.md rename to content/v2.0/reference/flux/stdlib/math/cosh.md index 22fff8771..a23477022 100644 --- a/content/v2.0/reference/flux/functions/math/cosh.md +++ b/content/v2.0/reference/flux/stdlib/math/cosh.md @@ -1,6 +1,8 @@ --- title: math.cosh() function description: The math.cosh() function returns the hyperbolic cosine of `x`. +aliases: + - /v2.0/reference/flux/functions/math/cosh/ menu: v2_0_ref: name: math.cosh diff --git a/content/v2.0/reference/flux/functions/math/dim.md b/content/v2.0/reference/flux/stdlib/math/dim.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/dim.md rename to content/v2.0/reference/flux/stdlib/math/dim.md index b52a3c8b2..135bb4356 100644 --- a/content/v2.0/reference/flux/functions/math/dim.md +++ b/content/v2.0/reference/flux/stdlib/math/dim.md @@ -1,6 +1,8 @@ --- title: math.dim() function description: The math.dim() function returns the maximum of `x`-`y` or 0. +aliases: + - /v2.0/reference/flux/functions/math/dim/ menu: v2_0_ref: name: math.dim diff --git a/content/v2.0/reference/flux/functions/math/erf.md b/content/v2.0/reference/flux/stdlib/math/erf.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/erf.md rename to content/v2.0/reference/flux/stdlib/math/erf.md index ebc8cca16..18c23441e 100644 --- a/content/v2.0/reference/flux/functions/math/erf.md +++ b/content/v2.0/reference/flux/stdlib/math/erf.md @@ -1,6 +1,8 @@ --- title: math.erf() function description: The math.erf() function returns the error function of `x`. +aliases: + - /v2.0/reference/flux/functions/math/erf/ menu: v2_0_ref: name: math.erf diff --git a/content/v2.0/reference/flux/functions/math/erfc.md b/content/v2.0/reference/flux/stdlib/math/erfc.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/erfc.md rename to content/v2.0/reference/flux/stdlib/math/erfc.md index a2a7e2ac5..176ccd6bb 100644 --- a/content/v2.0/reference/flux/functions/math/erfc.md +++ b/content/v2.0/reference/flux/stdlib/math/erfc.md @@ -1,6 +1,8 @@ --- title: math.erfc() function description: The math.erfc() function returns the complementary error function of `x`. +aliases: + - /v2.0/reference/flux/functions/math/erfc/ menu: v2_0_ref: name: math.erfc diff --git a/content/v2.0/reference/flux/functions/math/erfcinv.md b/content/v2.0/reference/flux/stdlib/math/erfcinv.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/erfcinv.md rename to content/v2.0/reference/flux/stdlib/math/erfcinv.md index c5f2c473f..4a1ba079e 100644 --- a/content/v2.0/reference/flux/functions/math/erfcinv.md +++ b/content/v2.0/reference/flux/stdlib/math/erfcinv.md @@ -1,6 +1,8 @@ --- title: math.erfcinv() function description: The math.erfcinv() function returns the inverse of `math.erfc()`. +aliases: + - /v2.0/reference/flux/functions/math/erfcinv/ menu: v2_0_ref: name: math.erfcinv diff --git a/content/v2.0/reference/flux/functions/math/erfinv.md b/content/v2.0/reference/flux/stdlib/math/erfinv.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/erfinv.md rename to content/v2.0/reference/flux/stdlib/math/erfinv.md index 2c4511397..1abdc350c 100644 --- a/content/v2.0/reference/flux/functions/math/erfinv.md +++ b/content/v2.0/reference/flux/stdlib/math/erfinv.md @@ -1,6 +1,8 @@ --- title: math.erfinv() function description: The math.erfinv() function returns the inverse error function of `x`. +aliases: + - /v2.0/reference/flux/functions/math/erfinv/ menu: v2_0_ref: name: math.erfinv diff --git a/content/v2.0/reference/flux/functions/math/exp.md b/content/v2.0/reference/flux/stdlib/math/exp.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/exp.md rename to content/v2.0/reference/flux/stdlib/math/exp.md index 14228533a..5d530b556 100644 --- a/content/v2.0/reference/flux/functions/math/exp.md +++ b/content/v2.0/reference/flux/stdlib/math/exp.md @@ -1,6 +1,8 @@ --- title: math.exp() function description: The math.exp() function returns `e**x`, the base-e exponential of `x`. +aliases: + - /v2.0/reference/flux/functions/math/exp/ menu: v2_0_ref: name: math.exp diff --git a/content/v2.0/reference/flux/functions/math/exp2.md b/content/v2.0/reference/flux/stdlib/math/exp2.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/exp2.md rename to content/v2.0/reference/flux/stdlib/math/exp2.md index d66b572d0..599bf86ff 100644 --- a/content/v2.0/reference/flux/functions/math/exp2.md +++ b/content/v2.0/reference/flux/stdlib/math/exp2.md @@ -1,6 +1,8 @@ --- title: math.exp2() function description: The math.exp2() function returns `2**x`, the base-2 exponential of `x`. +aliases: + - /v2.0/reference/flux/functions/math/exp2/ menu: v2_0_ref: name: math.exp2 diff --git a/content/v2.0/reference/flux/functions/math/expm1.md b/content/v2.0/reference/flux/stdlib/math/expm1.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/expm1.md rename to content/v2.0/reference/flux/stdlib/math/expm1.md index 953926420..02df8ce1a 100644 --- a/content/v2.0/reference/flux/functions/math/expm1.md +++ b/content/v2.0/reference/flux/stdlib/math/expm1.md @@ -3,6 +3,8 @@ title: math.expm1() function description: > The math.expm1() function returns `e**x - 1`, the base-e exponential of `x` minus 1. It is more accurate than `math.exp(x:x) - 1` when `x` is near zero. +aliases: + - /v2.0/reference/flux/functions/math/expm1/ menu: v2_0_ref: name: math.expm1 diff --git a/content/v2.0/reference/flux/functions/math/float64bits.md b/content/v2.0/reference/flux/stdlib/math/float64bits.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/float64bits.md rename to content/v2.0/reference/flux/stdlib/math/float64bits.md index 95a16dcb9..20d233052 100644 --- a/content/v2.0/reference/flux/functions/math/float64bits.md +++ b/content/v2.0/reference/flux/stdlib/math/float64bits.md @@ -1,6 +1,8 @@ --- title: math.float64bits() function description: The math.float64bits() function returns the IEEE 754 binary representation of `f`, with the sign bit of `f` and the result in the same bit position. +aliases: + - /v2.0/reference/flux/functions/math/float64bits/ menu: v2_0_ref: name: math.float64bits diff --git a/content/v2.0/reference/flux/functions/math/floor.md b/content/v2.0/reference/flux/stdlib/math/floor.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/floor.md rename to content/v2.0/reference/flux/stdlib/math/floor.md index bea8631d9..4e87ee103 100644 --- a/content/v2.0/reference/flux/functions/math/floor.md +++ b/content/v2.0/reference/flux/stdlib/math/floor.md @@ -1,6 +1,8 @@ --- title: math.floor() function description: The math.floor() function returns the greatest integer value less than or equal to `x`. +aliases: + - /v2.0/reference/flux/functions/math/floor/ menu: v2_0_ref: name: math.floor diff --git a/content/v2.0/reference/flux/functions/math/frexp.md b/content/v2.0/reference/flux/stdlib/math/frexp.md similarity index 94% rename from content/v2.0/reference/flux/functions/math/frexp.md rename to content/v2.0/reference/flux/stdlib/math/frexp.md index 622a1006c..6b4a043f7 100644 --- a/content/v2.0/reference/flux/functions/math/frexp.md +++ b/content/v2.0/reference/flux/stdlib/math/frexp.md @@ -4,6 +4,8 @@ description: > The math.frexp() function breaks `f` into a normalized fraction and an integral power of two. It returns `frac` and `exp` satisfying `f == frac × 2**exp`, with the absolute value of `frac` in the interval [½, 1). +aliases: + - /v2.0/reference/flux/functions/math/frexp/ menu: v2_0_ref: name: math.frexp diff --git a/content/v2.0/reference/flux/functions/math/gamma.md b/content/v2.0/reference/flux/stdlib/math/gamma.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/gamma.md rename to content/v2.0/reference/flux/stdlib/math/gamma.md index 744d5cdc8..81fb2f936 100644 --- a/content/v2.0/reference/flux/functions/math/gamma.md +++ b/content/v2.0/reference/flux/stdlib/math/gamma.md @@ -1,6 +1,8 @@ --- title: math.gamma() function description: The math.gamma() function returns the Gamma function of `x`. +aliases: + - /v2.0/reference/flux/functions/math/gamma/ menu: v2_0_ref: name: math.gamma diff --git a/content/v2.0/reference/flux/functions/math/hypot.md b/content/v2.0/reference/flux/stdlib/math/hypot.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/hypot.md rename to content/v2.0/reference/flux/stdlib/math/hypot.md index c9d6af266..459f83f31 100644 --- a/content/v2.0/reference/flux/functions/math/hypot.md +++ b/content/v2.0/reference/flux/stdlib/math/hypot.md @@ -3,6 +3,8 @@ title: math.hypot() function description: > The math.hypot() function returns the square root of `p*p + q*q`, taking care to avoid unnecessary overflow and underflow. +aliases: + - /v2.0/reference/flux/functions/math/hypot/ menu: v2_0_ref: name: math.hypot diff --git a/content/v2.0/reference/flux/functions/math/ilogb.md b/content/v2.0/reference/flux/stdlib/math/ilogb.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/ilogb.md rename to content/v2.0/reference/flux/stdlib/math/ilogb.md index 22b87b558..ec18d023c 100644 --- a/content/v2.0/reference/flux/functions/math/ilogb.md +++ b/content/v2.0/reference/flux/stdlib/math/ilogb.md @@ -1,6 +1,8 @@ --- title: math.ilogb() function description: The math.ilogb() function returns the binary exponent of `x` as an integer. +aliases: + - /v2.0/reference/flux/functions/math/ilogb/ menu: v2_0_ref: name: math.ilogb diff --git a/content/v2.0/reference/flux/functions/math/isinf.md b/content/v2.0/reference/flux/stdlib/math/isinf.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/isinf.md rename to content/v2.0/reference/flux/stdlib/math/isinf.md index 900dc54cf..e1d69151b 100644 --- a/content/v2.0/reference/flux/functions/math/isinf.md +++ b/content/v2.0/reference/flux/stdlib/math/isinf.md @@ -1,6 +1,8 @@ --- title: math.isInf() function description: The math.isInf() function reports whether `f` is an infinity, according to `sign`. +aliases: + - /v2.0/reference/flux/functions/math/isinf/ menu: v2_0_ref: name: math.isInf diff --git a/content/v2.0/reference/flux/functions/math/isnan.md b/content/v2.0/reference/flux/stdlib/math/isnan.md similarity index 89% rename from content/v2.0/reference/flux/functions/math/isnan.md rename to content/v2.0/reference/flux/stdlib/math/isnan.md index dfcf73ae1..2d9424592 100644 --- a/content/v2.0/reference/flux/functions/math/isnan.md +++ b/content/v2.0/reference/flux/stdlib/math/isnan.md @@ -1,6 +1,8 @@ --- title: math.isNaN() function description: The math.isNaN() function reports whether `f` is an IEEE 754 “not-a-number” value. +aliases: + - /v2.0/reference/flux/functions/math/isnan/ menu: v2_0_ref: name: math.isNaN diff --git a/content/v2.0/reference/flux/functions/math/j0.md b/content/v2.0/reference/flux/stdlib/math/j0.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/j0.md rename to content/v2.0/reference/flux/stdlib/math/j0.md index 74338fd03..1d8faf6fe 100644 --- a/content/v2.0/reference/flux/functions/math/j0.md +++ b/content/v2.0/reference/flux/stdlib/math/j0.md @@ -1,6 +1,8 @@ --- title: math.j0() function description: The math.j0() function returns the order-zero Bessel function of the first kind. +aliases: + - /v2.0/reference/flux/functions/math/j0/ menu: v2_0_ref: name: math.j0 diff --git a/content/v2.0/reference/flux/functions/math/j1.md b/content/v2.0/reference/flux/stdlib/math/j1.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/j1.md rename to content/v2.0/reference/flux/stdlib/math/j1.md index 594b3c81d..0160d3915 100644 --- a/content/v2.0/reference/flux/functions/math/j1.md +++ b/content/v2.0/reference/flux/stdlib/math/j1.md @@ -1,6 +1,8 @@ --- title: math.j1() function description: The math.j1() function returns the order-one Bessel function of the first kind. +aliases: + - /v2.0/reference/flux/functions/math/j1/ menu: v2_0_ref: name: math.j1 diff --git a/content/v2.0/reference/flux/functions/math/jn.md b/content/v2.0/reference/flux/stdlib/math/jn.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/jn.md rename to content/v2.0/reference/flux/stdlib/math/jn.md index 80e0f6acf..2bda3bc79 100644 --- a/content/v2.0/reference/flux/functions/math/jn.md +++ b/content/v2.0/reference/flux/stdlib/math/jn.md @@ -1,6 +1,8 @@ --- title: math.jn() function description: The math.jn() function returns the order-n Bessel function of the first kind. +aliases: + - /v2.0/reference/flux/functions/math/jn/ menu: v2_0_ref: name: math.jn diff --git a/content/v2.0/reference/flux/functions/math/ldexp.md b/content/v2.0/reference/flux/stdlib/math/ldexp.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/ldexp.md rename to content/v2.0/reference/flux/stdlib/math/ldexp.md index 8ecfb26eb..207ef02dc 100644 --- a/content/v2.0/reference/flux/functions/math/ldexp.md +++ b/content/v2.0/reference/flux/stdlib/math/ldexp.md @@ -1,6 +1,8 @@ --- title: math.ldexp() function description: The math.ldexp() function is the inverse of `math.frexp()`. It returns `frac × 2**exp`. +aliases: + - /v2.0/reference/flux/functions/math/ldexp/ menu: v2_0_ref: name: math.ldexp diff --git a/content/v2.0/reference/flux/functions/math/lgamma.md b/content/v2.0/reference/flux/stdlib/math/lgamma.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/lgamma.md rename to content/v2.0/reference/flux/stdlib/math/lgamma.md index 2be3b19e5..327505a88 100644 --- a/content/v2.0/reference/flux/functions/math/lgamma.md +++ b/content/v2.0/reference/flux/stdlib/math/lgamma.md @@ -1,6 +1,8 @@ --- title: math.lgamma() function description: The math.lgamma() function returns the natural logarithm and sign (-1 or +1) of `math.gamma(x:x)`. +aliases: + - /v2.0/reference/flux/functions/math/lgamma/ menu: v2_0_ref: name: math.lgamma diff --git a/content/v2.0/reference/flux/functions/math/log.md b/content/v2.0/reference/flux/stdlib/math/log.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/log.md rename to content/v2.0/reference/flux/stdlib/math/log.md index 84eb17fc8..8e2672f6d 100644 --- a/content/v2.0/reference/flux/functions/math/log.md +++ b/content/v2.0/reference/flux/stdlib/math/log.md @@ -1,6 +1,8 @@ --- title: math.log() function description: The math.log() function returns the natural logarithm of `x`. +aliases: + - /v2.0/reference/flux/functions/math/log/ menu: v2_0_ref: name: math.log diff --git a/content/v2.0/reference/flux/functions/math/log10.md b/content/v2.0/reference/flux/stdlib/math/log10.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/log10.md rename to content/v2.0/reference/flux/stdlib/math/log10.md index 1b3a7ed72..7f6ab2843 100644 --- a/content/v2.0/reference/flux/functions/math/log10.md +++ b/content/v2.0/reference/flux/stdlib/math/log10.md @@ -1,6 +1,8 @@ --- title: math.log10() function description: The math.log10() function returns the decimal logarithm of `x`. +aliases: + - /v2.0/reference/flux/functions/math/log10/ menu: v2_0_ref: name: math.log10 diff --git a/content/v2.0/reference/flux/functions/math/log1p.md b/content/v2.0/reference/flux/stdlib/math/log1p.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/log1p.md rename to content/v2.0/reference/flux/stdlib/math/log1p.md index 463ccc078..a5ced2f8b 100644 --- a/content/v2.0/reference/flux/functions/math/log1p.md +++ b/content/v2.0/reference/flux/stdlib/math/log1p.md @@ -3,6 +3,8 @@ title: math.log1p() function description: > The math.log1p() function returns the natural logarithm of 1 plus its argument `x`. It is more accurate than `math.log(x: 1 + x)` when `x` is near zero. +aliases: + - /v2.0/reference/flux/functions/math/log1p/ menu: v2_0_ref: name: math.log1p diff --git a/content/v2.0/reference/flux/functions/math/log2.md b/content/v2.0/reference/flux/stdlib/math/log2.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/log2.md rename to content/v2.0/reference/flux/stdlib/math/log2.md index a44fd54f0..f61944d2f 100644 --- a/content/v2.0/reference/flux/functions/math/log2.md +++ b/content/v2.0/reference/flux/stdlib/math/log2.md @@ -1,6 +1,8 @@ --- title: math.log2() function description: The math.log2() function returns the binary logarithm of `x`. +aliases: + - /v2.0/reference/flux/functions/math/log2/ menu: v2_0_ref: name: math.log2 diff --git a/content/v2.0/reference/flux/functions/math/logb.md b/content/v2.0/reference/flux/stdlib/math/logb.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/logb.md rename to content/v2.0/reference/flux/stdlib/math/logb.md index cd5049a70..313c116be 100644 --- a/content/v2.0/reference/flux/functions/math/logb.md +++ b/content/v2.0/reference/flux/stdlib/math/logb.md @@ -1,6 +1,8 @@ --- title: math.logb() function description: The math.logb() function returns the binary exponent of `x`. +aliases: + - /v2.0/reference/flux/functions/math/logb/ menu: v2_0_ref: name: math.logb diff --git a/content/v2.0/reference/flux/functions/math/m_inf.md b/content/v2.0/reference/flux/stdlib/math/m_inf.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/m_inf.md rename to content/v2.0/reference/flux/stdlib/math/m_inf.md index da77b79ec..91aa392ec 100644 --- a/content/v2.0/reference/flux/functions/math/m_inf.md +++ b/content/v2.0/reference/flux/stdlib/math/m_inf.md @@ -1,8 +1,8 @@ --- title: math.m_inf() function description: The math.m_inf() function returns positive infinity if `sign >= 0`, negative infinity if `sign < 0`. - - +aliases: + - /v2.0/reference/flux/functions/math/m_inf/ menu: v2_0_ref: name: math.m_inf diff --git a/content/v2.0/reference/flux/functions/math/m_max.md b/content/v2.0/reference/flux/stdlib/math/m_max.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/m_max.md rename to content/v2.0/reference/flux/stdlib/math/m_max.md index 3dd4c422e..408f3bc33 100644 --- a/content/v2.0/reference/flux/functions/math/m_max.md +++ b/content/v2.0/reference/flux/stdlib/math/m_max.md @@ -1,6 +1,8 @@ --- title: math.m_max() function description: The math.m_max() function returns the larger of `x` or `y`. +aliases: + - /v2.0/reference/flux/functions/math/m_max/ menu: v2_0_ref: name: math.m_max diff --git a/content/v2.0/reference/flux/functions/math/m_min.md b/content/v2.0/reference/flux/stdlib/math/m_min.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/m_min.md rename to content/v2.0/reference/flux/stdlib/math/m_min.md index 404982967..ef12e6cb1 100644 --- a/content/v2.0/reference/flux/functions/math/m_min.md +++ b/content/v2.0/reference/flux/stdlib/math/m_min.md @@ -1,6 +1,8 @@ --- title: math.m_min() function description: The math.m_min() function returns the smaller of `x` or `y`. +aliases: + - /v2.0/reference/flux/functions/math/m_min/ menu: v2_0_ref: name: math.m_min diff --git a/content/v2.0/reference/flux/functions/math/mod.md b/content/v2.0/reference/flux/stdlib/math/mod.md similarity index 94% rename from content/v2.0/reference/flux/functions/math/mod.md rename to content/v2.0/reference/flux/stdlib/math/mod.md index e23493865..afef0a1ba 100644 --- a/content/v2.0/reference/flux/functions/math/mod.md +++ b/content/v2.0/reference/flux/stdlib/math/mod.md @@ -3,6 +3,8 @@ title: math.mod() function description: > The math.mod() function returns the floating-point remainder of `x`/`y`. The magnitude of the result is less than `y` and its sign agrees with that of `x`. +aliases: + - /v2.0/reference/flux/functions/math/mod/ menu: v2_0_ref: name: math.mod diff --git a/content/v2.0/reference/flux/functions/math/modf.md b/content/v2.0/reference/flux/stdlib/math/modf.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/modf.md rename to content/v2.0/reference/flux/stdlib/math/modf.md index 78e4ef7fd..94cf32fe9 100644 --- a/content/v2.0/reference/flux/functions/math/modf.md +++ b/content/v2.0/reference/flux/stdlib/math/modf.md @@ -3,6 +3,8 @@ title: math.modf() function description: > The math.modf() function returns integer and fractional floating-point numbers that sum to `f`. Both values have the same sign as `f`. +aliases: + - /v2.0/reference/flux/functions/math/modf/ menu: v2_0_ref: name: math.modf diff --git a/content/v2.0/reference/flux/functions/math/nan.md b/content/v2.0/reference/flux/stdlib/math/nan.md similarity index 85% rename from content/v2.0/reference/flux/functions/math/nan.md rename to content/v2.0/reference/flux/stdlib/math/nan.md index ebb54f06b..714f3f676 100644 --- a/content/v2.0/reference/flux/functions/math/nan.md +++ b/content/v2.0/reference/flux/stdlib/math/nan.md @@ -1,6 +1,8 @@ --- title: math.NaN() function description: The math.NaN() function returns an IEEE 754 “not-a-number” value. +aliases: + - /v2.0/reference/flux/functions/math/nan/ menu: v2_0_ref: name: math.NaN diff --git a/content/v2.0/reference/flux/functions/math/nextafter.md b/content/v2.0/reference/flux/stdlib/math/nextafter.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/nextafter.md rename to content/v2.0/reference/flux/stdlib/math/nextafter.md index bb6f0ae27..21810bda2 100644 --- a/content/v2.0/reference/flux/functions/math/nextafter.md +++ b/content/v2.0/reference/flux/stdlib/math/nextafter.md @@ -1,6 +1,8 @@ --- title: math.nextafter() function description: The math.nextafter() function returns the next representable float value after `x` towards `y`. +aliases: + - /v2.0/reference/flux/functions/math/nextafter/ menu: v2_0_ref: name: math.nextafter diff --git a/content/v2.0/reference/flux/functions/math/pow.md b/content/v2.0/reference/flux/stdlib/math/pow.md similarity index 96% rename from content/v2.0/reference/flux/functions/math/pow.md rename to content/v2.0/reference/flux/stdlib/math/pow.md index 3921a8fa1..af935c750 100644 --- a/content/v2.0/reference/flux/functions/math/pow.md +++ b/content/v2.0/reference/flux/stdlib/math/pow.md @@ -1,6 +1,8 @@ --- title: math.pow() function description: The math.pow() function returns `x**y`, the base-x exponential of y. +aliases: + - /v2.0/reference/flux/functions/math/pow/ menu: v2_0_ref: name: math.pow diff --git a/content/v2.0/reference/flux/functions/math/pow10.md b/content/v2.0/reference/flux/stdlib/math/pow10.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/pow10.md rename to content/v2.0/reference/flux/stdlib/math/pow10.md index bfd8f1f63..234fb5e5b 100644 --- a/content/v2.0/reference/flux/functions/math/pow10.md +++ b/content/v2.0/reference/flux/stdlib/math/pow10.md @@ -1,6 +1,8 @@ --- title: math.pow10() function description: The math.pow10() function returns `10**n`, the base-10 exponential of `n`. +aliases: + - /v2.0/reference/flux/functions/math/pow10/ menu: v2_0_ref: name: math.pow10 diff --git a/content/v2.0/reference/flux/functions/math/remainder.md b/content/v2.0/reference/flux/stdlib/math/remainder.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/remainder.md rename to content/v2.0/reference/flux/stdlib/math/remainder.md index c7056aef3..84563bf28 100644 --- a/content/v2.0/reference/flux/functions/math/remainder.md +++ b/content/v2.0/reference/flux/stdlib/math/remainder.md @@ -1,6 +1,8 @@ --- title: math.remainder() function description: The math.remainder() function returns the IEEE 754 floating-point remainder of `x / y`. +aliases: + - /v2.0/reference/flux/functions/math/remainder/ menu: v2_0_ref: name: math.remainder diff --git a/content/v2.0/reference/flux/functions/math/round.md b/content/v2.0/reference/flux/stdlib/math/round.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/round.md rename to content/v2.0/reference/flux/stdlib/math/round.md index 92e040360..c4c60d2ab 100644 --- a/content/v2.0/reference/flux/functions/math/round.md +++ b/content/v2.0/reference/flux/stdlib/math/round.md @@ -1,6 +1,8 @@ --- title: math.round() function description: The math.round() function returns the nearest integer, rounding half away from zero. +aliases: + - /v2.0/reference/flux/functions/math/round/ menu: v2_0_ref: name: math.round diff --git a/content/v2.0/reference/flux/functions/math/roundtoeven.md b/content/v2.0/reference/flux/stdlib/math/roundtoeven.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/roundtoeven.md rename to content/v2.0/reference/flux/stdlib/math/roundtoeven.md index 5f78da74a..381470463 100644 --- a/content/v2.0/reference/flux/functions/math/roundtoeven.md +++ b/content/v2.0/reference/flux/stdlib/math/roundtoeven.md @@ -1,6 +1,8 @@ --- title: math.roundtoeven() function description: The math.roundtoeven() function returns the nearest integer, rounding ties to even. +aliases: + - /v2.0/reference/flux/functions/math/roundtoeven/ menu: v2_0_ref: name: math.roundtoeven diff --git a/content/v2.0/reference/flux/functions/math/signbit.md b/content/v2.0/reference/flux/stdlib/math/signbit.md similarity index 88% rename from content/v2.0/reference/flux/functions/math/signbit.md rename to content/v2.0/reference/flux/stdlib/math/signbit.md index cefb73d90..9826c4e75 100644 --- a/content/v2.0/reference/flux/functions/math/signbit.md +++ b/content/v2.0/reference/flux/stdlib/math/signbit.md @@ -1,6 +1,8 @@ --- title: math.signbit() function description: The math.signbit() function reports whether `x` is negative or negative zero. +aliases: + - /v2.0/reference/flux/functions/math/signbit/ menu: v2_0_ref: name: math.signbit diff --git a/content/v2.0/reference/flux/functions/math/sin.md b/content/v2.0/reference/flux/stdlib/math/sin.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/sin.md rename to content/v2.0/reference/flux/stdlib/math/sin.md index 033a005e8..e06aaec4c 100644 --- a/content/v2.0/reference/flux/functions/math/sin.md +++ b/content/v2.0/reference/flux/stdlib/math/sin.md @@ -1,6 +1,8 @@ --- title: math.sin() function description: The math.sin() function returns the sine of the radian argument `x`. +aliases: + - /v2.0/reference/flux/functions/math/sin/ menu: v2_0_ref: name: math.sin diff --git a/content/v2.0/reference/flux/functions/math/sincos.md b/content/v2.0/reference/flux/stdlib/math/sincos.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/sincos.md rename to content/v2.0/reference/flux/stdlib/math/sincos.md index 7d1e25ff2..5536d6001 100644 --- a/content/v2.0/reference/flux/functions/math/sincos.md +++ b/content/v2.0/reference/flux/stdlib/math/sincos.md @@ -1,6 +1,8 @@ --- title: math.sincos() function description: The math.sincos() function returns the values of `math.sin(x:x)` and `math.cos(x:x)`. +aliases: + - /v2.0/reference/flux/functions/math/sincos/ menu: v2_0_ref: name: math.sincos diff --git a/content/v2.0/reference/flux/functions/math/sinh.md b/content/v2.0/reference/flux/stdlib/math/sinh.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/sinh.md rename to content/v2.0/reference/flux/stdlib/math/sinh.md index 7dd4def04..800ae94a2 100644 --- a/content/v2.0/reference/flux/functions/math/sinh.md +++ b/content/v2.0/reference/flux/stdlib/math/sinh.md @@ -1,6 +1,8 @@ --- title: math.sinh() function description: The math.sinh() function returns the hyperbolic sine of `x`. +aliases: + - /v2.0/reference/flux/functions/math/sinh/ menu: v2_0_ref: name: math.sinh diff --git a/content/v2.0/reference/flux/functions/math/sqrt.md b/content/v2.0/reference/flux/stdlib/math/sqrt.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/sqrt.md rename to content/v2.0/reference/flux/stdlib/math/sqrt.md index f09e59fa2..88e650c06 100644 --- a/content/v2.0/reference/flux/functions/math/sqrt.md +++ b/content/v2.0/reference/flux/stdlib/math/sqrt.md @@ -1,6 +1,8 @@ --- title: math.sqrt() function description: The math.sqrt() function returns the square root of `x`. +aliases: + - /v2.0/reference/flux/functions/math/sqrt/ menu: v2_0_ref: name: math.sqrt diff --git a/content/v2.0/reference/flux/functions/math/tan.md b/content/v2.0/reference/flux/stdlib/math/tan.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/tan.md rename to content/v2.0/reference/flux/stdlib/math/tan.md index 3fbb9d970..f55bb765f 100644 --- a/content/v2.0/reference/flux/functions/math/tan.md +++ b/content/v2.0/reference/flux/stdlib/math/tan.md @@ -1,6 +1,8 @@ --- title: math.tan() function description: The math.tan() function returns the tangent of the radian argument `x`. +aliases: + - /v2.0/reference/flux/functions/math/tan/ menu: v2_0_ref: name: math.tan diff --git a/content/v2.0/reference/flux/functions/math/tanh.md b/content/v2.0/reference/flux/stdlib/math/tanh.md similarity index 91% rename from content/v2.0/reference/flux/functions/math/tanh.md rename to content/v2.0/reference/flux/stdlib/math/tanh.md index a468720b0..884972b1d 100644 --- a/content/v2.0/reference/flux/functions/math/tanh.md +++ b/content/v2.0/reference/flux/stdlib/math/tanh.md @@ -1,6 +1,8 @@ --- title: math.tanh() function description: The math.tanh() function returns the hyperbolic tangent of `x`. +aliases: + - /v2.0/reference/flux/functions/math/tanh/ menu: v2_0_ref: name: math.tanh diff --git a/content/v2.0/reference/flux/functions/math/trunc.md b/content/v2.0/reference/flux/stdlib/math/trunc.md similarity index 90% rename from content/v2.0/reference/flux/functions/math/trunc.md rename to content/v2.0/reference/flux/stdlib/math/trunc.md index e787dbd80..a4c98d682 100644 --- a/content/v2.0/reference/flux/functions/math/trunc.md +++ b/content/v2.0/reference/flux/stdlib/math/trunc.md @@ -1,6 +1,8 @@ --- title: math.trunc() function description: The math.trunc() function returns the integer value of `x`. +aliases: + - /v2.0/reference/flux/functions/math/trunc/ menu: v2_0_ref: name: math.trunc diff --git a/content/v2.0/reference/flux/functions/math/y0.md b/content/v2.0/reference/flux/stdlib/math/y0.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/y0.md rename to content/v2.0/reference/flux/stdlib/math/y0.md index 7dc7fab13..4dff9fdb7 100644 --- a/content/v2.0/reference/flux/functions/math/y0.md +++ b/content/v2.0/reference/flux/stdlib/math/y0.md @@ -1,6 +1,8 @@ --- title: math.y0() function description: The math.y0() function returns the order-zero Bessel function of the second kind. +aliases: + - /v2.0/reference/flux/functions/math/y0/ menu: v2_0_ref: name: math.y0 diff --git a/content/v2.0/reference/flux/functions/math/y1.md b/content/v2.0/reference/flux/stdlib/math/y1.md similarity index 92% rename from content/v2.0/reference/flux/functions/math/y1.md rename to content/v2.0/reference/flux/stdlib/math/y1.md index b16a38c99..84b79ca1e 100644 --- a/content/v2.0/reference/flux/functions/math/y1.md +++ b/content/v2.0/reference/flux/stdlib/math/y1.md @@ -1,6 +1,8 @@ --- title: math.y1() function description: The math.y1() function returns the order-one Bessel function of the second kind. +aliases: + - /v2.0/reference/flux/functions/math/y1/ menu: v2_0_ref: name: math.y1 diff --git a/content/v2.0/reference/flux/functions/math/yn.md b/content/v2.0/reference/flux/stdlib/math/yn.md similarity index 93% rename from content/v2.0/reference/flux/functions/math/yn.md rename to content/v2.0/reference/flux/stdlib/math/yn.md index 56b951ca5..63e9e14ce 100644 --- a/content/v2.0/reference/flux/functions/math/yn.md +++ b/content/v2.0/reference/flux/stdlib/math/yn.md @@ -1,6 +1,8 @@ --- title: math.yn() function description: The math.yn() function returns the order-n Bessel function of the second kind. +aliases: + - /v2.0/reference/flux/functions/math/yn/ menu: v2_0_ref: name: math.yn diff --git a/content/v2.0/reference/flux/functions/monitor/_index.md b/content/v2.0/reference/flux/stdlib/monitor/_index.md similarity index 86% rename from content/v2.0/reference/flux/functions/monitor/_index.md rename to content/v2.0/reference/flux/stdlib/monitor/_index.md index 12271be11..b5296bc87 100644 --- a/content/v2.0/reference/flux/functions/monitor/_index.md +++ b/content/v2.0/reference/flux/stdlib/monitor/_index.md @@ -4,10 +4,12 @@ list_title: InfluxDB Monitor package description: > The Flux Monitor package provides tools for monitoring and alerting with InfluxDB. Import the `influxdata/influxdb/monitor` package. +aliases: + - /v2.0/reference/flux/functions/monitor/ menu: v2_0_ref: name: InfluxDB Monitor - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, monitor, alerts, package] --- diff --git a/content/v2.0/reference/flux/functions/monitor/check.md b/content/v2.0/reference/flux/stdlib/monitor/check.md similarity index 97% rename from content/v2.0/reference/flux/functions/monitor/check.md rename to content/v2.0/reference/flux/stdlib/monitor/check.md index ce8de7b7f..5963d46f6 100644 --- a/content/v2.0/reference/flux/functions/monitor/check.md +++ b/content/v2.0/reference/flux/stdlib/monitor/check.md @@ -3,6 +3,8 @@ title: monitor.check() function description: > The `monitor.check()` function function checks input data and assigns a level (`ok`, `info`, `warn`, or `crit`) to each row based on predicate functions. +aliases: + - /v2.0/reference/flux/functions/monitor/check/ menu: v2_0_ref: name: monitor.check diff --git a/content/v2.0/reference/flux/functions/monitor/deadman.md b/content/v2.0/reference/flux/stdlib/monitor/deadman.md similarity index 94% rename from content/v2.0/reference/flux/functions/monitor/deadman.md rename to content/v2.0/reference/flux/stdlib/monitor/deadman.md index 6f52a49a1..870c90ae7 100644 --- a/content/v2.0/reference/flux/functions/monitor/deadman.md +++ b/content/v2.0/reference/flux/stdlib/monitor/deadman.md @@ -2,6 +2,8 @@ title: monitor.deadman() function description: > The `monitor.deadman()` function detects when a group stops reporting data. +aliases: + - /v2.0/reference/flux/functions/monitor/deadman/ menu: v2_0_ref: name: monitor.deadman diff --git a/content/v2.0/reference/flux/functions/monitor/from.md b/content/v2.0/reference/flux/stdlib/monitor/from.md similarity index 96% rename from content/v2.0/reference/flux/functions/monitor/from.md rename to content/v2.0/reference/flux/stdlib/monitor/from.md index cffde8c9c..0dcf3c575 100644 --- a/content/v2.0/reference/flux/functions/monitor/from.md +++ b/content/v2.0/reference/flux/stdlib/monitor/from.md @@ -3,6 +3,8 @@ title: monitor.from() function description: > The `monitor.from()` function retrieves check statuses stored in the `statuses` measurement in the `_monitoring` bucket. +aliases: + - /v2.0/reference/flux/functions/monitor/from/ menu: v2_0_ref: name: monitor.from diff --git a/content/v2.0/reference/flux/functions/monitor/logs.md b/content/v2.0/reference/flux/stdlib/monitor/logs.md similarity index 96% rename from content/v2.0/reference/flux/functions/monitor/logs.md rename to content/v2.0/reference/flux/stdlib/monitor/logs.md index a27b6bc0d..bcf6c4861 100644 --- a/content/v2.0/reference/flux/functions/monitor/logs.md +++ b/content/v2.0/reference/flux/stdlib/monitor/logs.md @@ -3,6 +3,8 @@ title: monitor.logs() function description: > The `monitor.logs()` function retrieves notification events stored in the `notifications` measurement in the `_monitoring` bucket. +aliases: + - /v2.0/reference/flux/functions/monitor/logs/ menu: v2_0_ref: name: monitor.logs diff --git a/content/v2.0/reference/flux/functions/monitor/notify.md b/content/v2.0/reference/flux/stdlib/monitor/notify.md similarity index 94% rename from content/v2.0/reference/flux/functions/monitor/notify.md rename to content/v2.0/reference/flux/stdlib/monitor/notify.md index 5f7dfec22..8d845a80c 100644 --- a/content/v2.0/reference/flux/functions/monitor/notify.md +++ b/content/v2.0/reference/flux/stdlib/monitor/notify.md @@ -3,6 +3,8 @@ title: monitor.notify() function description: > The `monitor.notify()` function sends a notification to an endpoint and logs it in the `notifications` measurement in the `_monitoring` bucket. +aliases: + - /v2.0/reference/flux/functions/monitor/notify/ menu: v2_0_ref: name: monitor.notify diff --git a/content/v2.0/reference/flux/functions/monitor/statechanges.md b/content/v2.0/reference/flux/stdlib/monitor/statechanges.md similarity index 94% rename from content/v2.0/reference/flux/functions/monitor/statechanges.md rename to content/v2.0/reference/flux/stdlib/monitor/statechanges.md index fd3b0dc0d..b2e4573a8 100644 --- a/content/v2.0/reference/flux/functions/monitor/statechanges.md +++ b/content/v2.0/reference/flux/stdlib/monitor/statechanges.md @@ -3,6 +3,8 @@ title: monitor.stateChanges() function description: > The `monitor.stateChanges()` function detects state changes in a stream of data and outputs records that change from `fromLevel` to `toLevel`. +aliases: + - /v2.0/reference/flux/functions/monitor/statechanges/ menu: v2_0_ref: name: monitor.stateChanges diff --git a/content/v2.0/reference/flux/functions/mqtt/_index.md b/content/v2.0/reference/flux/stdlib/mqtt/_index.md similarity index 92% rename from content/v2.0/reference/flux/functions/mqtt/_index.md rename to content/v2.0/reference/flux/stdlib/mqtt/_index.md index 2b53b4519..4c9232f67 100644 --- a/content/v2.0/reference/flux/functions/mqtt/_index.md +++ b/content/v2.0/reference/flux/stdlib/mqtt/_index.md @@ -7,7 +7,7 @@ description: > menu: v2_0_ref: name: MQTT - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, mqtt, package] draft: true diff --git a/content/v2.0/reference/flux/functions/mqtt/to.md b/content/v2.0/reference/flux/stdlib/mqtt/to.md similarity index 100% rename from content/v2.0/reference/flux/functions/mqtt/to.md rename to content/v2.0/reference/flux/stdlib/mqtt/to.md diff --git a/content/v2.0/reference/flux/functions/pagerduty/_index.md b/content/v2.0/reference/flux/stdlib/pagerduty/_index.md similarity index 84% rename from content/v2.0/reference/flux/functions/pagerduty/_index.md rename to content/v2.0/reference/flux/stdlib/pagerduty/_index.md index 8a8a1fd13..a84ddf85d 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/_index.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/_index.md @@ -4,10 +4,12 @@ list_title: PagerDuty package description: > The Flux PagerDuty package provides functions for sending data to PagerDuty. Import the `pagerduty` package. +aliases: + - /v2.0/reference/flux/functions/pagerduty/ menu: v2_0_ref: name: PagerDuty - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, pagerduty, package] --- diff --git a/content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md b/content/v2.0/reference/flux/stdlib/pagerduty/actionfromseverity.md similarity index 91% rename from content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md rename to content/v2.0/reference/flux/stdlib/pagerduty/actionfromseverity.md index 6ac966f05..641083e8c 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/actionfromseverity.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/actionfromseverity.md @@ -2,6 +2,8 @@ title: pagerduty.actionFromSeverity() function description: > The `pagerduty.actionFromSeverity()` function converts a severity to a PagerDuty action. +aliases: + - /v2.0/reference/flux/functions/pagerduty/actionfromseverity/ menu: v2_0_ref: name: pagerduty.actionFromSeverity diff --git a/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md b/content/v2.0/reference/flux/stdlib/pagerduty/dedupkey.md similarity index 93% rename from content/v2.0/reference/flux/functions/pagerduty/dedupkey.md rename to content/v2.0/reference/flux/stdlib/pagerduty/dedupkey.md index a49792e6d..f34873a08 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/dedupkey.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/dedupkey.md @@ -3,6 +3,8 @@ title: pagerduty.dedupKey() function description: > The `pagerduty.dedupKey()` function uses the group key of an input table to generate and store a deduplication key in the `_pagerdutyDedupKey` column. +aliases: + - /v2.0/reference/flux/functions/pagerduty/dedupkey/ menu: v2_0_ref: name: pagerduty.dedupKey diff --git a/content/v2.0/reference/flux/functions/pagerduty/endpoint.md b/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md similarity index 96% rename from content/v2.0/reference/flux/functions/pagerduty/endpoint.md rename to content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md index 70fb7cf83..3fa4fde63 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md @@ -2,6 +2,8 @@ title: pagerduty.endpoint() function description: > The `pagerduty.endpoint()` function sends a message to PagerDuty that includes output data. +aliases: + - /v2.0/reference/flux/functions/pagerduty/endpoint/ menu: v2_0_ref: name: pagerduty.endpoint diff --git a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md b/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md similarity index 97% rename from content/v2.0/reference/flux/functions/pagerduty/sendevent.md rename to content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md index a3fb2b7d0..46ee68120 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/sendevent.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md @@ -2,6 +2,8 @@ title: pagerduty.sendEvent() function description: > The `pagerduty.sendEvent()` function sends an event to PagerDuty. +aliases: + - /v2.0/reference/flux/functions/pagerduty/sendevent/ menu: v2_0_ref: name: pagerduty.sendEvent diff --git a/content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md b/content/v2.0/reference/flux/stdlib/pagerduty/severityfromlevel.md similarity index 94% rename from content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md rename to content/v2.0/reference/flux/stdlib/pagerduty/severityfromlevel.md index a70fd76b6..7e1d829ad 100644 --- a/content/v2.0/reference/flux/functions/pagerduty/severityfromlevel.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/severityfromlevel.md @@ -3,6 +3,8 @@ title: pagerduty.severityFromLevel() function description: > The `pagerduty.severityFromLevel()` function converts an InfluxDB status level to a PagerDuty severity. +aliases: + - /v2.0/reference/flux/functions/pagerduty/severityfromlevel/ menu: v2_0_ref: name: pagerduty.severityFromLevel diff --git a/content/v2.0/reference/flux/functions/regexp/_index.md b/content/v2.0/reference/flux/stdlib/regexp/_index.md similarity index 86% rename from content/v2.0/reference/flux/functions/regexp/_index.md rename to content/v2.0/reference/flux/stdlib/regexp/_index.md index c1107742a..079929ca2 100644 --- a/content/v2.0/reference/flux/functions/regexp/_index.md +++ b/content/v2.0/reference/flux/stdlib/regexp/_index.md @@ -4,10 +4,12 @@ list_title: Regular expressions package description: > The Flux regular expressions package includes functions that provide enhanced regular expression functionality. Import the `regexp` package. +aliases: + - /v2.0/reference/flux/functions/regexp/ menu: v2_0_ref: name: Regular expressions - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [regex, functions] --- diff --git a/content/v2.0/reference/flux/functions/regexp/compile.md b/content/v2.0/reference/flux/stdlib/regexp/compile.md similarity index 94% rename from content/v2.0/reference/flux/functions/regexp/compile.md rename to content/v2.0/reference/flux/stdlib/regexp/compile.md index 8a5f45cca..93dea117d 100644 --- a/content/v2.0/reference/flux/functions/regexp/compile.md +++ b/content/v2.0/reference/flux/stdlib/regexp/compile.md @@ -3,6 +3,8 @@ title: regexp.compile() function description: > The `regexp.compile()` function parses a regular expression and, if successful, returns a Regexp object that can be used to match against text. +aliases: + - /v2.0/reference/flux/functions/regexp/compile/ menu: v2_0_ref: name: regexp.compile diff --git a/content/v2.0/reference/flux/functions/regexp/findstring.md b/content/v2.0/reference/flux/stdlib/regexp/findstring.md similarity index 93% rename from content/v2.0/reference/flux/functions/regexp/findstring.md rename to content/v2.0/reference/flux/stdlib/regexp/findstring.md index ac0f98e86..979d69a33 100644 --- a/content/v2.0/reference/flux/functions/regexp/findstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/findstring.md @@ -1,6 +1,8 @@ --- title: regexp.findString() function description: The `regexp.findString()` function returns the left-most regular expression match in a string. +aliases: + - /v2.0/reference/flux/functions/regexp/findstring/ menu: v2_0_ref: name: regexp.findString diff --git a/content/v2.0/reference/flux/functions/regexp/findstringindex.md b/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md similarity index 94% rename from content/v2.0/reference/flux/functions/regexp/findstringindex.md rename to content/v2.0/reference/flux/stdlib/regexp/findstringindex.md index 49a1d7a47..bc9ee1ddb 100644 --- a/content/v2.0/reference/flux/functions/regexp/findstringindex.md +++ b/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md @@ -3,6 +3,8 @@ title: regexp.findStringIndex() function description: > The `regexp.findStringIndex()` function returns a two-element array of integers defining the beginning and ending indexes of the left-most regular expression match in a string. +aliases: + - /v2.0/reference/flux/functions/regexp/findstringindex/ menu: v2_0_ref: name: regexp.findStringIndex diff --git a/content/v2.0/reference/flux/functions/regexp/getstring.md b/content/v2.0/reference/flux/stdlib/regexp/getstring.md similarity index 93% rename from content/v2.0/reference/flux/functions/regexp/getstring.md rename to content/v2.0/reference/flux/stdlib/regexp/getstring.md index f4528a091..34dbaf2b0 100644 --- a/content/v2.0/reference/flux/functions/regexp/getstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/getstring.md @@ -1,6 +1,8 @@ --- title: regexp.getString() function description: The `regexp.getString()` function returns the source string used to compile a regular expression. +aliases: + - /v2.0/reference/flux/functions/regexp/getstring/ menu: v2_0_ref: name: regexp.getString diff --git a/content/v2.0/reference/flux/functions/regexp/matchregexpstring.md b/content/v2.0/reference/flux/stdlib/regexp/matchregexpstring.md similarity index 92% rename from content/v2.0/reference/flux/functions/regexp/matchregexpstring.md rename to content/v2.0/reference/flux/stdlib/regexp/matchregexpstring.md index 4a5c39cf7..ec8c6a113 100644 --- a/content/v2.0/reference/flux/functions/regexp/matchregexpstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/matchregexpstring.md @@ -3,6 +3,8 @@ title: regexp.matchRegexpString() function description: > The `regexp.matchRegexpString()` function tests if a string contains any match to a regular expression. +aliases: + - /v2.0/reference/flux/functions/regexp/matchregexpstring/ menu: v2_0_ref: name: regexp.matchRegexpString diff --git a/content/v2.0/reference/flux/functions/regexp/quotemeta.md b/content/v2.0/reference/flux/stdlib/regexp/quotemeta.md similarity index 93% rename from content/v2.0/reference/flux/functions/regexp/quotemeta.md rename to content/v2.0/reference/flux/stdlib/regexp/quotemeta.md index 7a02a2f3e..92916a540 100644 --- a/content/v2.0/reference/flux/functions/regexp/quotemeta.md +++ b/content/v2.0/reference/flux/stdlib/regexp/quotemeta.md @@ -2,6 +2,8 @@ title: regexp.quoteMeta() function description: > The `regexp.quoteMeta()` function escapes all regular expression metacharacters inside of a string. +aliases: + - /v2.0/reference/flux/functions/regexp/quotemeta/ menu: v2_0_ref: name: regexp.quoteMeta diff --git a/content/v2.0/reference/flux/functions/regexp/replaceallstring.md b/content/v2.0/reference/flux/stdlib/regexp/replaceallstring.md similarity index 93% rename from content/v2.0/reference/flux/functions/regexp/replaceallstring.md rename to content/v2.0/reference/flux/stdlib/regexp/replaceallstring.md index 04c7383f7..7a84dd44c 100644 --- a/content/v2.0/reference/flux/functions/regexp/replaceallstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/replaceallstring.md @@ -3,6 +3,8 @@ title: regexp.replaceAllString() function description: > The `regexp.replaceAllString()` function replaces all regular expression matches in a string with a specified replacement. +aliases: + - /v2.0/reference/flux/functions/regexp/replaceallstring/ menu: v2_0_ref: name: regexp.replaceAllString diff --git a/content/v2.0/reference/flux/functions/regexp/splitregexp.md b/content/v2.0/reference/flux/stdlib/regexp/splitregexp.md similarity index 93% rename from content/v2.0/reference/flux/functions/regexp/splitregexp.md rename to content/v2.0/reference/flux/stdlib/regexp/splitregexp.md index 28d25fdad..eaddf0add 100644 --- a/content/v2.0/reference/flux/functions/regexp/splitregexp.md +++ b/content/v2.0/reference/flux/stdlib/regexp/splitregexp.md @@ -3,6 +3,8 @@ title: regexp.splitRegexp() function description: > The `regexp.splitRegexp()` function splits a string into substrings separated by regular expression matches and returns an array of `i` substrings between matches. +aliases: + - /v2.0/reference/flux/functions/regexp/splitregexp/ menu: v2_0_ref: name: regexp.splitRegexp diff --git a/content/v2.0/reference/flux/functions/runtime/_index.md b/content/v2.0/reference/flux/stdlib/runtime/_index.md similarity index 85% rename from content/v2.0/reference/flux/functions/runtime/_index.md rename to content/v2.0/reference/flux/stdlib/runtime/_index.md index b940e379a..690559ff1 100644 --- a/content/v2.0/reference/flux/functions/runtime/_index.md +++ b/content/v2.0/reference/flux/stdlib/runtime/_index.md @@ -4,10 +4,12 @@ list_title: Runtime package description: > The Flux runtime package includes functions that provide information about the current Flux runtime. Import the `runtime` package. +aliases: + - /v2.0/reference/flux/functions/runtime/ menu: v2_0_ref: name: Runtime - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [runtime, functions, package] --- diff --git a/content/v2.0/reference/flux/functions/runtime/version.md b/content/v2.0/reference/flux/stdlib/runtime/version.md similarity index 86% rename from content/v2.0/reference/flux/functions/runtime/version.md rename to content/v2.0/reference/flux/stdlib/runtime/version.md index 84333887b..f7aaddf27 100644 --- a/content/v2.0/reference/flux/functions/runtime/version.md +++ b/content/v2.0/reference/flux/stdlib/runtime/version.md @@ -1,6 +1,8 @@ --- title: runtime.version() function description: The `runtime.version()` function returns the current Flux version. +aliases: + - /v2.0/reference/flux/functions/runtime/version/ menu: v2_0_ref: name: runtime.version diff --git a/content/v2.0/reference/flux/functions/secrets/_index.md b/content/v2.0/reference/flux/stdlib/secrets/_index.md similarity index 87% rename from content/v2.0/reference/flux/functions/secrets/_index.md rename to content/v2.0/reference/flux/stdlib/secrets/_index.md index d27834ccf..fb9a57a5b 100644 --- a/content/v2.0/reference/flux/functions/secrets/_index.md +++ b/content/v2.0/reference/flux/stdlib/secrets/_index.md @@ -4,10 +4,12 @@ list_title: InfluxDB Secrets package description: > The Flux InfluxDB Secrets package provides functions for working with sensitive secrets managed by InfluxDB. Import the `influxdata/influxdb/secrets` package. +aliases: + - /v2.0/reference/flux/functions/secrets/ menu: v2_0_ref: name: InfluxDB Secrets - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, secrets, package] --- diff --git a/content/v2.0/reference/flux/functions/secrets/get.md b/content/v2.0/reference/flux/stdlib/secrets/get.md similarity index 93% rename from content/v2.0/reference/flux/functions/secrets/get.md rename to content/v2.0/reference/flux/stdlib/secrets/get.md index 342e6d380..1ce2fcb2b 100644 --- a/content/v2.0/reference/flux/functions/secrets/get.md +++ b/content/v2.0/reference/flux/stdlib/secrets/get.md @@ -2,6 +2,8 @@ title: secrets.get() function description: > The `secrets.get()` function retrieves a secret from the InfluxDB secret store. +aliases: + - /v2.0/reference/flux/functions/secrets/get/ menu: v2_0_ref: name: secrets.get diff --git a/content/v2.0/reference/flux/functions/slack/_index.md b/content/v2.0/reference/flux/stdlib/slack/_index.md similarity index 83% rename from content/v2.0/reference/flux/functions/slack/_index.md rename to content/v2.0/reference/flux/stdlib/slack/_index.md index 82e48c738..14c73c63b 100644 --- a/content/v2.0/reference/flux/functions/slack/_index.md +++ b/content/v2.0/reference/flux/stdlib/slack/_index.md @@ -4,10 +4,12 @@ list_title: Slack package description: > The Flux Slack package provides functions for sending data to Slack. Import the `slack` package. +aliases: + - /v2.0/reference/flux/functions/slack/ menu: v2_0_ref: name: Slack - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, slack, package] --- diff --git a/content/v2.0/reference/flux/functions/slack/endpoint.md b/content/v2.0/reference/flux/stdlib/slack/endpoint.md similarity index 97% rename from content/v2.0/reference/flux/functions/slack/endpoint.md rename to content/v2.0/reference/flux/stdlib/slack/endpoint.md index a4940de1a..ebfa28e0b 100644 --- a/content/v2.0/reference/flux/functions/slack/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/slack/endpoint.md @@ -2,6 +2,8 @@ title: slack.endpoint() function description: > The `slack.endpoint()` function sends a message to Slack that includes output data. +aliases: + - /v2.0/reference/flux/functions/slack/endpoint/ menu: v2_0_ref: name: slack.endpoint diff --git a/content/v2.0/reference/flux/functions/slack/message.md b/content/v2.0/reference/flux/stdlib/slack/message.md similarity index 98% rename from content/v2.0/reference/flux/functions/slack/message.md rename to content/v2.0/reference/flux/stdlib/slack/message.md index 70606b866..28b0ddcb8 100644 --- a/content/v2.0/reference/flux/functions/slack/message.md +++ b/content/v2.0/reference/flux/stdlib/slack/message.md @@ -3,6 +3,8 @@ title: slack.message() function description: > The `slack.message()` function sends a single message to a Slack channel. The function works with either with the chat.postMessage API or with a Slack webhook. +aliases: + - /v2.0/reference/flux/functions/slack/message/ menu: v2_0_ref: name: slack.message diff --git a/content/v2.0/reference/flux/functions/sql/_index.md b/content/v2.0/reference/flux/stdlib/sql/_index.md similarity index 85% rename from content/v2.0/reference/flux/functions/sql/_index.md rename to content/v2.0/reference/flux/stdlib/sql/_index.md index 77004614c..14574013c 100644 --- a/content/v2.0/reference/flux/functions/sql/_index.md +++ b/content/v2.0/reference/flux/stdlib/sql/_index.md @@ -4,10 +4,12 @@ list_title: SQL package description: > The Flux SQL package provides tools for working with data in SQL databases such as MySQL and PostgreSQL. Import the `sql` package. +aliases: + - /v2.0/reference/flux/functions/sql/ menu: v2_0_ref: name: SQL - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [functions, sql, package, mysql, postgres] --- diff --git a/content/v2.0/reference/flux/functions/sql/from.md b/content/v2.0/reference/flux/stdlib/sql/from.md similarity index 96% rename from content/v2.0/reference/flux/functions/sql/from.md rename to content/v2.0/reference/flux/stdlib/sql/from.md index fedbe981f..1931f2fc5 100644 --- a/content/v2.0/reference/flux/functions/sql/from.md +++ b/content/v2.0/reference/flux/stdlib/sql/from.md @@ -1,6 +1,8 @@ --- title: sql.from() function description: The `sql.from()` function retrieves data from a SQL data source. +aliases: + - /v2.0/reference/flux/functions/sql/from/ menu: v2_0_ref: name: sql.from diff --git a/content/v2.0/reference/flux/functions/sql/to.md b/content/v2.0/reference/flux/stdlib/sql/to.md similarity index 96% rename from content/v2.0/reference/flux/functions/sql/to.md rename to content/v2.0/reference/flux/stdlib/sql/to.md index f8aa134ba..6b9e7a0b4 100644 --- a/content/v2.0/reference/flux/functions/sql/to.md +++ b/content/v2.0/reference/flux/stdlib/sql/to.md @@ -1,6 +1,8 @@ --- title: sql.to() function description: The `sql.to()` function writes data to a SQL database. +aliases: + - /v2.0/reference/flux/functions/sql/to/ menu: v2_0_ref: name: sql.to diff --git a/content/v2.0/reference/flux/functions/strings/_index.md b/content/v2.0/reference/flux/stdlib/strings/_index.md similarity index 84% rename from content/v2.0/reference/flux/functions/strings/_index.md rename to content/v2.0/reference/flux/stdlib/strings/_index.md index 0adee39c4..9cdc9225c 100644 --- a/content/v2.0/reference/flux/functions/strings/_index.md +++ b/content/v2.0/reference/flux/stdlib/strings/_index.md @@ -4,10 +4,12 @@ list_title: Strings package description: > The Flux strings package provides functions to manipulate UTF-8 encoded strings. Import the `strings` package. +aliases: + - /v2.0/reference/flux/functions/strings/ menu: v2_0_ref: name: Strings - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [strings, functions, package] --- diff --git a/content/v2.0/reference/flux/functions/strings/compare.md b/content/v2.0/reference/flux/stdlib/strings/compare.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/compare.md rename to content/v2.0/reference/flux/stdlib/strings/compare.md index c1496f2eb..2f265cf1d 100644 --- a/content/v2.0/reference/flux/functions/strings/compare.md +++ b/content/v2.0/reference/flux/stdlib/strings/compare.md @@ -1,6 +1,8 @@ --- title: strings.compare() function description: The strings.compare() function compares the lexicographical order of two strings. +aliases: + - /v2.0/reference/flux/functions/strings/compare/ menu: v2_0_ref: name: strings.compare diff --git a/content/v2.0/reference/flux/functions/strings/containsany.md b/content/v2.0/reference/flux/stdlib/strings/containsany.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/containsany.md rename to content/v2.0/reference/flux/stdlib/strings/containsany.md index 43eade2ea..0630f688d 100644 --- a/content/v2.0/reference/flux/functions/strings/containsany.md +++ b/content/v2.0/reference/flux/stdlib/strings/containsany.md @@ -3,6 +3,8 @@ title: strings.containsAny() function description: > The strings.containsAny() function reports whether a specified string contains any characters from from another string. +aliases: + - /v2.0/reference/flux/functions/strings/containsany/ menu: v2_0_ref: name: strings.containsAny diff --git a/content/v2.0/reference/flux/functions/strings/containsstr.md b/content/v2.0/reference/flux/stdlib/strings/containsstr.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/containsstr.md rename to content/v2.0/reference/flux/stdlib/strings/containsstr.md index fcb1edd75..82cef5e8e 100644 --- a/content/v2.0/reference/flux/functions/strings/containsstr.md +++ b/content/v2.0/reference/flux/stdlib/strings/containsstr.md @@ -1,6 +1,8 @@ --- title: strings.containsStr() function description: The strings.containsStr() function reports whether a string contains a specified substring. +aliases: + - /v2.0/reference/flux/functions/strings/containsstr/ menu: v2_0_ref: name: strings.containsStr diff --git a/content/v2.0/reference/flux/functions/strings/countstr.md b/content/v2.0/reference/flux/stdlib/strings/countstr.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/countstr.md rename to content/v2.0/reference/flux/stdlib/strings/countstr.md index 2639a9285..f7b71a4a0 100644 --- a/content/v2.0/reference/flux/functions/strings/countstr.md +++ b/content/v2.0/reference/flux/stdlib/strings/countstr.md @@ -3,6 +3,8 @@ title: strings.countStr() function description: > The strings.countStr() function counts the number of non-overlapping instances of a substring appears in a string. +aliases: + - /v2.0/reference/flux/functions/strings/countstr/ menu: v2_0_ref: name: strings.countStr diff --git a/content/v2.0/reference/flux/functions/strings/equalfold.md b/content/v2.0/reference/flux/stdlib/strings/equalfold.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/equalfold.md rename to content/v2.0/reference/flux/stdlib/strings/equalfold.md index 4e42e30c9..d49d0c4cb 100644 --- a/content/v2.0/reference/flux/functions/strings/equalfold.md +++ b/content/v2.0/reference/flux/stdlib/strings/equalfold.md @@ -3,6 +3,8 @@ title: strings.equalFold() function description: > The strings.equalFold() function reports whether two UTF-8 strings are equal under Unicode case-folding. +aliases: + - /v2.0/reference/flux/functions/strings/equalfold/ menu: v2_0_ref: name: strings.equalFold diff --git a/content/v2.0/reference/flux/functions/strings/hasprefix.md b/content/v2.0/reference/flux/stdlib/strings/hasprefix.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/hasprefix.md rename to content/v2.0/reference/flux/stdlib/strings/hasprefix.md index f76eea9f4..143ddf162 100644 --- a/content/v2.0/reference/flux/functions/strings/hasprefix.md +++ b/content/v2.0/reference/flux/stdlib/strings/hasprefix.md @@ -1,6 +1,8 @@ --- title: strings.hasPrefix() function description: The strings.hasPrefix() function indicates if a string begins with a specific prefix. +aliases: + - /v2.0/reference/flux/functions/strings/hasprefix/ menu: v2_0_ref: name: strings.hasPrefix diff --git a/content/v2.0/reference/flux/functions/strings/hassuffix.md b/content/v2.0/reference/flux/stdlib/strings/hassuffix.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/hassuffix.md rename to content/v2.0/reference/flux/stdlib/strings/hassuffix.md index 0647ad192..6ca5b6cc9 100644 --- a/content/v2.0/reference/flux/functions/strings/hassuffix.md +++ b/content/v2.0/reference/flux/stdlib/strings/hassuffix.md @@ -1,6 +1,8 @@ --- title: strings.hasSuffix() function description: The strings.hasSuffix() function indicates if a string ends with a specified suffix. +aliases: + - /v2.0/reference/flux/functions/strings/hassuffix/ menu: v2_0_ref: name: strings.hasSuffix diff --git a/content/v2.0/reference/flux/functions/strings/index-func.md b/content/v2.0/reference/flux/stdlib/strings/index-func.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/index-func.md rename to content/v2.0/reference/flux/stdlib/strings/index-func.md index c0d290cc3..45985e168 100644 --- a/content/v2.0/reference/flux/functions/strings/index-func.md +++ b/content/v2.0/reference/flux/stdlib/strings/index-func.md @@ -3,6 +3,8 @@ title: strings.index() function description: > The strings.index() function returns the index of the first instance of a substring in another string. +aliases: + - /v2.0/reference/flux/functions/strings/index-func/ menu: v2_0_ref: name: strings.index diff --git a/content/v2.0/reference/flux/functions/strings/indexany.md b/content/v2.0/reference/flux/stdlib/strings/indexany.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/indexany.md rename to content/v2.0/reference/flux/stdlib/strings/indexany.md index 6884dde4e..7a4931d58 100644 --- a/content/v2.0/reference/flux/functions/strings/indexany.md +++ b/content/v2.0/reference/flux/stdlib/strings/indexany.md @@ -2,6 +2,8 @@ title: strings.indexAny() function description: > The strings.indexAny() function returns the index of the first instance of specified characters in a string. +aliases: + - /v2.0/reference/flux/functions/strings/indexany/ menu: v2_0_ref: name: strings.indexAny diff --git a/content/v2.0/reference/flux/functions/strings/isdigit.md b/content/v2.0/reference/flux/stdlib/strings/isdigit.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/isdigit.md rename to content/v2.0/reference/flux/stdlib/strings/isdigit.md index 5cd7530bd..152b189b8 100644 --- a/content/v2.0/reference/flux/functions/strings/isdigit.md +++ b/content/v2.0/reference/flux/stdlib/strings/isdigit.md @@ -1,6 +1,8 @@ --- title: strings.isDigit() function description: The strings.isDigit() function tests if a single character string is a digit (0-9). +aliases: + - /v2.0/reference/flux/functions/strings/isdigit/ menu: v2_0_ref: name: strings.isDigit diff --git a/content/v2.0/reference/flux/functions/strings/isletter.md b/content/v2.0/reference/flux/stdlib/strings/isletter.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/isletter.md rename to content/v2.0/reference/flux/stdlib/strings/isletter.md index 3772a2ff6..92d04ec3c 100644 --- a/content/v2.0/reference/flux/functions/strings/isletter.md +++ b/content/v2.0/reference/flux/stdlib/strings/isletter.md @@ -1,6 +1,8 @@ --- title: strings.isLetter() function description: The strings.isLetter() function tests if a single character string is a letter (a-z, A-Z). +aliases: + - /v2.0/reference/flux/functions/strings/isletter/ menu: v2_0_ref: name: strings.isLetter diff --git a/content/v2.0/reference/flux/functions/strings/islower.md b/content/v2.0/reference/flux/stdlib/strings/islower.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/islower.md rename to content/v2.0/reference/flux/stdlib/strings/islower.md index db87b0587..28591137f 100644 --- a/content/v2.0/reference/flux/functions/strings/islower.md +++ b/content/v2.0/reference/flux/stdlib/strings/islower.md @@ -38,3 +38,4 @@ import "strings" data |> filter(fn: (r) => strings.isLower(v: r.host)) ``` +- /v2.0/reference/flux/functions/strings/islower/ diff --git a/content/v2.0/reference/flux/functions/strings/isupper.md b/content/v2.0/reference/flux/stdlib/strings/isupper.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/isupper.md rename to content/v2.0/reference/flux/stdlib/strings/isupper.md index c2dfcc30a..4335052cd 100644 --- a/content/v2.0/reference/flux/functions/strings/isupper.md +++ b/content/v2.0/reference/flux/stdlib/strings/isupper.md @@ -1,6 +1,8 @@ --- title: strings.isUpper() function description: The strings.isUpper() function tests if a single character string is uppercase. +aliases: + - /v2.0/reference/flux/functions/strings/isupper/ menu: v2_0_ref: name: strings.isUpper diff --git a/content/v2.0/reference/flux/functions/strings/joinstr.md b/content/v2.0/reference/flux/stdlib/strings/joinstr.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/joinstr.md rename to content/v2.0/reference/flux/stdlib/strings/joinstr.md index 7aa2c7bdb..19708d29b 100644 --- a/content/v2.0/reference/flux/functions/strings/joinstr.md +++ b/content/v2.0/reference/flux/stdlib/strings/joinstr.md @@ -3,6 +3,8 @@ title: strings.joinStr() function description: > The strings.joinStr() function concatenates the elements of a string array into a single string using a specified separator. +aliases: + - /v2.0/reference/flux/functions/strings/joinstr/ menu: v2_0_ref: name: strings.joinStr diff --git a/content/v2.0/reference/flux/functions/strings/lastindex.md b/content/v2.0/reference/flux/stdlib/strings/lastindex.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/lastindex.md rename to content/v2.0/reference/flux/stdlib/strings/lastindex.md index afe38b790..46b460c30 100644 --- a/content/v2.0/reference/flux/functions/strings/lastindex.md +++ b/content/v2.0/reference/flux/stdlib/strings/lastindex.md @@ -3,6 +3,8 @@ title: strings.lastIndex() function description: > The strings.lastIndex() function returns the index of the last instance of a substring in a string or `-1` if substring is not present. +aliases: + - /v2.0/reference/flux/functions/strings/lastindex/ menu: v2_0_ref: name: strings.lastIndex diff --git a/content/v2.0/reference/flux/functions/strings/lastindexany.md b/content/v2.0/reference/flux/stdlib/strings/lastindexany.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/lastindexany.md rename to content/v2.0/reference/flux/stdlib/strings/lastindexany.md index 8fa0cdf75..e1b0c804e 100644 --- a/content/v2.0/reference/flux/functions/strings/lastindexany.md +++ b/content/v2.0/reference/flux/stdlib/strings/lastindexany.md @@ -1,6 +1,8 @@ --- title: strings.lastIndexAny() function description: The `strings.lastIndexAny()` function returns the index of the last instance of any specified characters in a string. +aliases: + - /v2.0/reference/flux/functions/strings/lastindexany/ menu: v2_0_ref: name: strings.lastIndexAny diff --git a/content/v2.0/reference/flux/functions/strings/repeat.md b/content/v2.0/reference/flux/stdlib/strings/repeat.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/repeat.md rename to content/v2.0/reference/flux/stdlib/strings/repeat.md index a369afcec..07084055c 100644 --- a/content/v2.0/reference/flux/functions/strings/repeat.md +++ b/content/v2.0/reference/flux/stdlib/strings/repeat.md @@ -1,6 +1,8 @@ --- title: strings.repeat() function description: The strings.repeat() function returns a string consisting of `i` copies of a specified string. +aliases: + - /v2.0/reference/flux/functions/strings/repeat/ menu: v2_0_ref: name: strings.repeat diff --git a/content/v2.0/reference/flux/functions/strings/replace.md b/content/v2.0/reference/flux/stdlib/strings/replace.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/replace.md rename to content/v2.0/reference/flux/stdlib/strings/replace.md index 60aab2a20..89d372af2 100644 --- a/content/v2.0/reference/flux/functions/strings/replace.md +++ b/content/v2.0/reference/flux/stdlib/strings/replace.md @@ -3,6 +3,8 @@ title: strings.replace() function description: > The strings.replace() function replaces the first `i` non-overlapping instances of a substring with a specified replacement. +aliases: + - /v2.0/reference/flux/functions/strings/replace/ menu: v2_0_ref: name: strings.replace diff --git a/content/v2.0/reference/flux/functions/strings/replaceall.md b/content/v2.0/reference/flux/stdlib/strings/replaceall.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/replaceall.md rename to content/v2.0/reference/flux/stdlib/strings/replaceall.md index 0209850db..95eb56f92 100644 --- a/content/v2.0/reference/flux/functions/strings/replaceall.md +++ b/content/v2.0/reference/flux/stdlib/strings/replaceall.md @@ -3,6 +3,8 @@ title: strings.replaceAll() function description: > The strings.replaceAll() function replaces all non-overlapping instances of a substring with a specified replacement. +aliases: + - /v2.0/reference/flux/functions/strings/replaceall/ menu: v2_0_ref: name: strings.replaceAll diff --git a/content/v2.0/reference/flux/functions/strings/split.md b/content/v2.0/reference/flux/stdlib/strings/split.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/split.md rename to content/v2.0/reference/flux/stdlib/strings/split.md index 705ebac48..c6096c0cd 100644 --- a/content/v2.0/reference/flux/functions/strings/split.md +++ b/content/v2.0/reference/flux/stdlib/strings/split.md @@ -3,6 +3,8 @@ title: strings.split() function description: > The strings.split() function splits a string on a specified separator and returns an array of substrings. +aliases: + - /v2.0/reference/flux/functions/strings/split/ menu: v2_0_ref: name: strings.split diff --git a/content/v2.0/reference/flux/functions/strings/splitafter.md b/content/v2.0/reference/flux/stdlib/strings/splitafter.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/splitafter.md rename to content/v2.0/reference/flux/stdlib/strings/splitafter.md index dd5e8e1c1..fe6fb092b 100644 --- a/content/v2.0/reference/flux/functions/strings/splitafter.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitafter.md @@ -3,6 +3,8 @@ title: strings.splitAfter() function description: > The strings.splitAfter() function splits a string after a specified separator and returns an array of substrings. +aliases: + - /v2.0/reference/flux/functions/strings/splitafter/ menu: v2_0_ref: name: strings.splitAfter diff --git a/content/v2.0/reference/flux/functions/strings/splitaftern.md b/content/v2.0/reference/flux/stdlib/strings/splitaftern.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/splitaftern.md rename to content/v2.0/reference/flux/stdlib/strings/splitaftern.md index 213ee7814..54e26208f 100644 --- a/content/v2.0/reference/flux/functions/strings/splitaftern.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitaftern.md @@ -3,6 +3,8 @@ title: strings.splitAfterN() function description: > The strings.splitAfterN() function splits a string after a specified separator and returns an array of `i` substrings. +aliases: + - /v2.0/reference/flux/functions/strings/splitaftern/ menu: v2_0_ref: name: strings.splitAfterN diff --git a/content/v2.0/reference/flux/functions/strings/splitn.md b/content/v2.0/reference/flux/stdlib/strings/splitn.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/splitn.md rename to content/v2.0/reference/flux/stdlib/strings/splitn.md index 5575bb742..cd027bc92 100644 --- a/content/v2.0/reference/flux/functions/strings/splitn.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitn.md @@ -3,6 +3,8 @@ title: strings.splitN() function description: > The strings.splitN() function splits a string on a specified separator and returns an array of `i` substrings. +aliases: + - /v2.0/reference/flux/functions/strings/splitn/ menu: v2_0_ref: name: strings.splitN diff --git a/content/v2.0/reference/flux/functions/strings/strlen.md b/content/v2.0/reference/flux/stdlib/strings/strlen.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/strlen.md rename to content/v2.0/reference/flux/stdlib/strings/strlen.md index 7f07b6639..0e92561c9 100644 --- a/content/v2.0/reference/flux/functions/strings/strlen.md +++ b/content/v2.0/reference/flux/stdlib/strings/strlen.md @@ -3,6 +3,8 @@ title: strings.strlen() function description: > The strings.strlen() function returns the length of a string. String length is determined by the number of UTF code points a string contains. +aliases: + - /v2.0/reference/flux/functions/strings/strlen/ menu: v2_0_ref: name: strings.strlen diff --git a/content/v2.0/reference/flux/functions/strings/substring.md b/content/v2.0/reference/flux/stdlib/strings/substring.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/substring.md rename to content/v2.0/reference/flux/stdlib/strings/substring.md index 78d3f9cf6..64cc621fd 100644 --- a/content/v2.0/reference/flux/functions/strings/substring.md +++ b/content/v2.0/reference/flux/stdlib/strings/substring.md @@ -3,6 +3,8 @@ title: strings.substring() function description: > The strings.substring() function returns a substring based on `start` and `end` parameters. Indices are based on UTF code points. +aliases: + - /v2.0/reference/flux/functions/strings/substring/ menu: v2_0_ref: name: strings.substring diff --git a/content/v2.0/reference/flux/functions/strings/title.md b/content/v2.0/reference/flux/stdlib/strings/title.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/title.md rename to content/v2.0/reference/flux/stdlib/strings/title.md index 5122fb7ea..e438b82b3 100644 --- a/content/v2.0/reference/flux/functions/strings/title.md +++ b/content/v2.0/reference/flux/stdlib/strings/title.md @@ -1,6 +1,8 @@ --- title: strings.title() function description: The strings.title() function converts a string to title case. +aliases: + - /v2.0/reference/flux/functions/strings/title/ menu: v2_0_ref: name: strings.title diff --git a/content/v2.0/reference/flux/functions/strings/tolower.md b/content/v2.0/reference/flux/stdlib/strings/tolower.md similarity index 92% rename from content/v2.0/reference/flux/functions/strings/tolower.md rename to content/v2.0/reference/flux/stdlib/strings/tolower.md index e64ef7ac3..7de34c079 100644 --- a/content/v2.0/reference/flux/functions/strings/tolower.md +++ b/content/v2.0/reference/flux/stdlib/strings/tolower.md @@ -1,6 +1,8 @@ --- title: strings.toLower() function description: The strings.toLower() function converts a string to lowercase. +aliases: + - /v2.0/reference/flux/functions/strings/tolower/ menu: v2_0_ref: name: strings.toLower diff --git a/content/v2.0/reference/flux/functions/strings/totitle.md b/content/v2.0/reference/flux/stdlib/strings/totitle.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/totitle.md rename to content/v2.0/reference/flux/stdlib/strings/totitle.md index 197aa72ba..8b9b2c5dc 100644 --- a/content/v2.0/reference/flux/functions/strings/totitle.md +++ b/content/v2.0/reference/flux/stdlib/strings/totitle.md @@ -1,6 +1,8 @@ --- title: strings.toTitle() function description: The strings.toTitle() function converts all characters in a string to title case. +aliases: + - /v2.0/reference/flux/functions/strings/totitle/ menu: v2_0_ref: name: strings.toTitle diff --git a/content/v2.0/reference/flux/functions/strings/toupper.md b/content/v2.0/reference/flux/stdlib/strings/toupper.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/toupper.md rename to content/v2.0/reference/flux/stdlib/strings/toupper.md index 620cc2d19..6935824a2 100644 --- a/content/v2.0/reference/flux/functions/strings/toupper.md +++ b/content/v2.0/reference/flux/stdlib/strings/toupper.md @@ -1,6 +1,8 @@ --- title: strings.toUpper() function description: The strings.toUpper() function converts a string to uppercase. +aliases: + - /v2.0/reference/flux/functions/strings/toupper/ menu: v2_0_ref: name: strings.toUpper diff --git a/content/v2.0/reference/flux/functions/strings/trim.md b/content/v2.0/reference/flux/stdlib/strings/trim.md similarity index 95% rename from content/v2.0/reference/flux/functions/strings/trim.md rename to content/v2.0/reference/flux/stdlib/strings/trim.md index 8c9a31ece..7e20fd510 100644 --- a/content/v2.0/reference/flux/functions/strings/trim.md +++ b/content/v2.0/reference/flux/stdlib/strings/trim.md @@ -3,6 +3,8 @@ title: strings.trim() function description: > The strings.trim() function removes leading and trailing characters specified in the cutset from a string. +aliases: + - /v2.0/reference/flux/functions/strings/trim/ menu: v2_0_ref: name: strings.trim diff --git a/content/v2.0/reference/flux/functions/strings/trimleft.md b/content/v2.0/reference/flux/stdlib/strings/trimleft.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/trimleft.md rename to content/v2.0/reference/flux/stdlib/strings/trimleft.md index 5cae24ad7..513d1a262 100644 --- a/content/v2.0/reference/flux/functions/strings/trimleft.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimleft.md @@ -2,6 +2,8 @@ title: strings.trimLeft() function description: > The strings.trimLeft() function removes specified leading characters from a string. +aliases: + - /v2.0/reference/flux/functions/strings/trimleft/ menu: v2_0_ref: name: strings.trimLeft diff --git a/content/v2.0/reference/flux/functions/strings/trimprefix.md b/content/v2.0/reference/flux/stdlib/strings/trimprefix.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/trimprefix.md rename to content/v2.0/reference/flux/stdlib/strings/trimprefix.md index 4c5ee718b..ae5d4dc2b 100644 --- a/content/v2.0/reference/flux/functions/strings/trimprefix.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimprefix.md @@ -3,6 +3,8 @@ title: strings.trimPrefix() function description: > The `strings.trimPrefix()` function removes a prefix from a string. Strings that do not start with the prefix are returned unchanged. +aliases: + - /v2.0/reference/flux/functions/strings/trimprefix/ menu: v2_0_ref: name: strings.trimPrefix diff --git a/content/v2.0/reference/flux/functions/strings/trimright.md b/content/v2.0/reference/flux/stdlib/strings/trimright.md similarity index 95% rename from content/v2.0/reference/flux/functions/strings/trimright.md rename to content/v2.0/reference/flux/stdlib/strings/trimright.md index c48d02e8d..51e1d9bfa 100644 --- a/content/v2.0/reference/flux/functions/strings/trimright.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimright.md @@ -2,6 +2,8 @@ title: strings.trimRight() function description: > The strings.trimRight() function removes trailing characters specified in the cutset from a string. +aliases: + - /v2.0/reference/flux/functions/strings/trimright/ menu: v2_0_ref: name: strings.trimRight diff --git a/content/v2.0/reference/flux/functions/strings/trimspace.md b/content/v2.0/reference/flux/stdlib/strings/trimspace.md similarity index 93% rename from content/v2.0/reference/flux/functions/strings/trimspace.md rename to content/v2.0/reference/flux/stdlib/strings/trimspace.md index 03b13c638..e35c34809 100644 --- a/content/v2.0/reference/flux/functions/strings/trimspace.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimspace.md @@ -1,6 +1,8 @@ --- title: strings.trimSpace() function description: The strings.trimSpace() function removes leading and trailing spaces from a string. +aliases: + - /v2.0/reference/flux/functions/strings/trimspace/ menu: v2_0_ref: name: strings.trimSpace diff --git a/content/v2.0/reference/flux/functions/strings/trimsuffix.md b/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md similarity index 94% rename from content/v2.0/reference/flux/functions/strings/trimsuffix.md rename to content/v2.0/reference/flux/stdlib/strings/trimsuffix.md index a486d50ba..262c496ce 100644 --- a/content/v2.0/reference/flux/functions/strings/trimsuffix.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md @@ -3,6 +3,8 @@ title: strings.trimSuffix() function description: > The `strings.trimSuffix()` function removes a suffix from a string. Strings that do not end with the suffix are returned unchanged. +aliases: + - /v2.0/reference/flux/functions/strings/trimsuffix/ menu: v2_0_ref: name: strings.trimSuffix diff --git a/content/v2.0/reference/flux/functions/system/_index.md b/content/v2.0/reference/flux/stdlib/system/_index.md similarity index 84% rename from content/v2.0/reference/flux/functions/system/_index.md rename to content/v2.0/reference/flux/stdlib/system/_index.md index 2fd7c4527..8bd1d6c9f 100644 --- a/content/v2.0/reference/flux/functions/system/_index.md +++ b/content/v2.0/reference/flux/stdlib/system/_index.md @@ -4,10 +4,12 @@ list_title: System package description: > The Flux system package provides functions for reading values from the system. Import the `system` package. +aliases: + - /v2.0/reference/flux/functions/system/ menu: v2_0_ref: name: System - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [system, functions, package] --- diff --git a/content/v2.0/reference/flux/functions/system/time.md b/content/v2.0/reference/flux/stdlib/system/time.md similarity index 92% rename from content/v2.0/reference/flux/functions/system/time.md rename to content/v2.0/reference/flux/stdlib/system/time.md index 59a768a92..9d29a2ff9 100644 --- a/content/v2.0/reference/flux/functions/system/time.md +++ b/content/v2.0/reference/flux/stdlib/system/time.md @@ -4,6 +4,7 @@ description: The `system.time()` function returns the current system time. aliases: - /v2.0/reference/flux/functions/misc/systemtime - /v2.0/reference/flux/functions/built-in/misc/systemtime + - /v2.0/reference/flux/functions/system/time/ menu: v2_0_ref: name: system.time diff --git a/content/v2.0/reference/flux/functions/testing/_index.md b/content/v2.0/reference/flux/stdlib/testing/_index.md similarity index 85% rename from content/v2.0/reference/flux/functions/testing/_index.md rename to content/v2.0/reference/flux/stdlib/testing/_index.md index 284c9b070..e74845d88 100644 --- a/content/v2.0/reference/flux/functions/testing/_index.md +++ b/content/v2.0/reference/flux/stdlib/testing/_index.md @@ -4,10 +4,12 @@ list_title: Testing package description: > The Flux testing package provides functions that test piped-forward data in specific ways. Import the `testing` package. +aliases: + - /v2.0/reference/flux/functions/testing/ menu: v2_0_ref: name: Testing - parent: Flux packages and functions + parent: Flux standard library weight: 202 v2.0/tags: [testing, functions, package] --- diff --git a/content/v2.0/reference/flux/functions/testing/assertempty.md b/content/v2.0/reference/flux/stdlib/testing/assertempty.md similarity index 90% rename from content/v2.0/reference/flux/functions/testing/assertempty.md rename to content/v2.0/reference/flux/stdlib/testing/assertempty.md index 33b7a30b1..d85afa1de 100644 --- a/content/v2.0/reference/flux/functions/testing/assertempty.md +++ b/content/v2.0/reference/flux/stdlib/testing/assertempty.md @@ -1,6 +1,8 @@ --- title: testing.assertEmpty() function description: The testing.assertEmpty() function tests if an input stream is empty. +aliases: + - /v2.0/reference/flux/functions/testing/ menu: v2_0_ref: name: testing.assertEmpty @@ -39,3 +41,4 @@ got |> testing.diff(want: want) |> testing.assertEmpty() ``` +- /v2.0/reference/flux/functions/testing/assertempty/ diff --git a/content/v2.0/reference/flux/functions/testing/assertequals.md b/content/v2.0/reference/flux/stdlib/testing/assertequals.md similarity index 96% rename from content/v2.0/reference/flux/functions/testing/assertequals.md rename to content/v2.0/reference/flux/stdlib/testing/assertequals.md index 0c6fb733e..8fdee95ee 100644 --- a/content/v2.0/reference/flux/functions/testing/assertequals.md +++ b/content/v2.0/reference/flux/stdlib/testing/assertequals.md @@ -3,6 +3,7 @@ title: testing.assertEquals() function description: The testing.assertEquals() function tests whether two streams have identical data. aliases: - /v2.0/reference/flux/functions/tests/assertequals + - /v2.0/reference/flux/functions/testing/assertequals/ menu: v2_0_ref: name: testing.assertEquals diff --git a/content/v2.0/reference/flux/functions/testing/diff.md b/content/v2.0/reference/flux/stdlib/testing/diff.md similarity index 96% rename from content/v2.0/reference/flux/functions/testing/diff.md rename to content/v2.0/reference/flux/stdlib/testing/diff.md index db2e0af5f..8e3dd1e37 100644 --- a/content/v2.0/reference/flux/functions/testing/diff.md +++ b/content/v2.0/reference/flux/stdlib/testing/diff.md @@ -1,6 +1,8 @@ --- title: testing.diff() function description: The testing.diff() function produces a diff between two streams. +aliases: + - /v2.0/reference/flux/functions/testing/diff/ menu: v2_0_ref: name: testing.diff From 25f9dafcc421a5abc80cac1f43f8e190caf2927a Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 11:10:26 -0700 Subject: [PATCH 203/258] unlimited Slack endpoints for Free plan --- content/v2.0/cloud/pricing-plans.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index 2883dfddd..fbdc45459 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -35,6 +35,7 @@ Use this plan as much and as long as you want within the Free Plan rate limits: - Up to 2 buckets - Up to 2 checks - Up to 2 notification rules + - Unlimited Slack notification endpoints _To remove rate limits, [upgrade to a Pay As You Go Plan](/v2.0/cloud/account-management/upgrade-to-payg/)._ From 8011951a96fbe15df1ab834ec5997b664e329669 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 11:14:40 -0700 Subject: [PATCH 204/258] amounts on Billing page always same for Free plan --- content/v2.0/cloud/account-management/billing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/account-management/billing.md b/content/v2.0/cloud/account-management/billing.md index ac2ec2f5f..95f4ae50c 100644 --- a/content/v2.0/cloud/account-management/billing.md +++ b/content/v2.0/cloud/account-management/billing.md @@ -53,7 +53,7 @@ menu: ### View Free plan information -If you're on the Free plan, the Billing page monitors rate limits and lets you know how much data or options you have left to use. +- On the Billing page, view the total limits available for the Free plan. ### Exceeded rate limits From 4cd7d5f284d03eadd034064684d63d4cf89b8ca7 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 11:34:50 -0700 Subject: [PATCH 205/258] update PagerDuty Client URL --- content/v2.0/monitor-alert/notification-endpoints/create.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index 3c485876e..b51708d33 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -39,6 +39,6 @@ To send notifications about changes in your data, start by creating a notificati - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the PagerDuty client URL is https://events.pagerduty.com/v2/enqueue. For details, see [PagerDuty documentation](https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2). + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the **Client URL** is https://twodotoh.a.influxcloud.net/orgs//alert-history. When you click your notification in PagerDuty, this is the page that opens. 6. Click **Create Notification Endpoint**. From af4b99b188a14a05da26921ccf6a68f86552b784 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 12:38:38 -0600 Subject: [PATCH 206/258] updated links to flux functions --- content/v2.0/monitor-alert/checks/create.md | 2 +- .../common-tasks/downsample-data.md | 4 +-- content/v2.0/process-data/get-started.md | 8 ++--- content/v2.0/query-data/get-started/_index.md | 2 +- .../query-data/get-started/query-influxdb.md | 12 ++++---- .../query-data/get-started/transform-data.md | 18 +++++------ .../query-data/guides/conditional-logic.md | 12 ++++---- .../guides/custom-functions/_index.md | 6 ++-- .../custom-functions/custom-aggregate.md | 12 ++++---- content/v2.0/query-data/guides/group-data.md | 2 +- content/v2.0/query-data/guides/histograms.md | 6 ++-- content/v2.0/query-data/guides/join.md | 4 +-- .../guides/mathematic-operations.md | 6 ++-- content/v2.0/query-data/guides/sort-limit.md | 8 ++--- content/v2.0/query-data/guides/sql.md | 4 +-- .../query-data/guides/window-aggregate.md | 10 +++---- content/v2.0/reference/annotated-csv.md | 2 +- content/v2.0/reference/flux/_index.md | 4 +-- .../flux/language/string-interpolation.md | 2 +- .../flux/stdlib/built-in/misc/intervals.md | 2 +- .../flux/stdlib/built-in/misc/linearbins.md | 2 +- .../stdlib/built-in/misc/logarithmicbins.md | 2 +- .../transformations/aggregates/_index.md | 14 ++++----- .../aggregates/aggregatewindow.md | 2 +- .../transformations/aggregates/doubleema.md | 12 ++++---- .../aggregates/exponentialmovingaverage.md | 8 ++--- .../transformations/aggregates/holtwinters.md | 8 ++--- .../transformations/aggregates/kaufmansama.md | 2 +- .../transformations/aggregates/kaufmanser.md | 2 +- .../transformations/aggregates/median.md | 6 ++-- .../aggregates/movingaverage.md | 8 ++--- .../aggregates/relativestrengthindex.md | 6 ++-- .../aggregates/timedmovingaverage.md | 8 ++--- .../transformations/aggregates/tripleema.md | 14 ++++----- .../aggregates/tripleexponentialderivative.md | 12 ++++---- .../built-in/transformations/histogram.md | 4 +-- .../stdlib/built-in/transformations/keep.md | 2 +- .../stdlib/built-in/transformations/limit.md | 2 +- .../transformations/selectors/_index.md | 4 +-- .../transformations/stream-table/tablefind.md | 4 +-- .../transformations/truncatetimecolumn.md | 2 +- .../type-conversions/tobool.md | 4 +-- .../type-conversions/toduration.md | 4 +-- .../type-conversions/tofloat.md | 4 +-- .../transformations/type-conversions/toint.md | 4 +-- .../type-conversions/tostring.md | 4 +-- .../type-conversions/totime.md | 4 +-- .../type-conversions/touint.md | 4 +-- .../reference/flux/stdlib/http/endpoint.md | 2 +- .../flux/stdlib/influxdb-v1/fieldsascols.md | 2 +- .../flux/stdlib/influxdb-v1/measurements.md | 2 +- .../stdlib/influxdb-v1/measurementtagkeys.md | 2 +- .../influxdb-v1/measurementtagvalues.md | 2 +- .../flux/stdlib/influxdb-v1/tagkeys.md | 12 ++++---- .../flux/stdlib/influxdb-v1/tagvalues.md | 12 ++++---- .../v2.0/reference/flux/stdlib/math/ldexp.md | 2 +- .../flux/stdlib/pagerduty/endpoint.md | 2 +- .../flux/stdlib/pagerduty/sendevent.md | 4 +-- .../flux/stdlib/regexp/findstring.md | 2 +- .../flux/stdlib/regexp/findstringindex.md | 2 +- .../reference/flux/stdlib/regexp/getstring.md | 2 +- .../reference/flux/stdlib/slack/endpoint.md | 2 +- .../flux/stdlib/strings/containsany.md | 2 +- .../flux/stdlib/strings/containsstr.md | 2 +- .../flux/stdlib/strings/hasprefix.md | 2 +- .../flux/stdlib/strings/hassuffix.md | 2 +- .../flux/stdlib/strings/index-func.md | 6 ++-- .../reference/flux/stdlib/strings/indexany.md | 6 ++-- .../reference/flux/stdlib/strings/isdigit.md | 2 +- .../reference/flux/stdlib/strings/isletter.md | 2 +- .../reference/flux/stdlib/strings/islower.md | 5 ++-- .../reference/flux/stdlib/strings/isupper.md | 2 +- .../flux/stdlib/strings/lastindex.md | 6 ++-- .../flux/stdlib/strings/lastindexany.md | 6 ++-- .../reference/flux/stdlib/strings/replace.md | 2 +- .../flux/stdlib/strings/replaceall.md | 2 +- .../reference/flux/stdlib/strings/split.md | 6 ++-- .../flux/stdlib/strings/splitafter.md | 6 ++-- .../flux/stdlib/strings/splitaftern.md | 6 ++-- .../reference/flux/stdlib/strings/splitn.md | 6 ++-- .../reference/flux/stdlib/strings/title.md | 6 ++-- .../reference/flux/stdlib/strings/tolower.md | 6 ++-- .../reference/flux/stdlib/strings/totitle.md | 6 ++-- .../reference/flux/stdlib/strings/toupper.md | 6 ++-- .../reference/flux/stdlib/strings/trim.md | 10 +++---- .../reference/flux/stdlib/strings/trimleft.md | 10 +++---- .../flux/stdlib/strings/trimprefix.md | 10 +++---- .../flux/stdlib/strings/trimright.md | 10 +++---- .../flux/stdlib/strings/trimspace.md | 10 +++---- .../flux/stdlib/strings/trimsuffix.md | 10 +++---- .../flux/stdlib/testing/assertempty.md | 5 ++-- content/v2.0/reference/glossary.md | 6 ++-- content/v2.0/reference/release-notes/flux.md | 6 ++-- .../v2.0/visualize-data/variables/_index.md | 6 ++-- .../variables/common-variables.md | 30 +++++++++---------- .../variables/variable-types.md | 6 ++-- 96 files changed, 271 insertions(+), 271 deletions(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index 469ac6949..03e113c6c 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -82,7 +82,7 @@ A check consists of two parts – a query and check configuration. {{% note %}} #### Flux only interpolates string values Flux currently interpolates only string values. -Use the [string() function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string/) +Use the [string() function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string/) to convert non-string values to strings. ```js diff --git a/content/v2.0/process-data/common-tasks/downsample-data.md b/content/v2.0/process-data/common-tasks/downsample-data.md index 1b84563c2..1c4d83148 100644 --- a/content/v2.0/process-data/common-tasks/downsample-data.md +++ b/content/v2.0/process-data/common-tasks/downsample-data.md @@ -32,7 +32,7 @@ A separate bucket where aggregated, downsampled data is stored. To downsample data, it must be aggregated in some way. What specific method of aggregation you use depends on your specific use case, but examples include mean, median, top, bottom, etc. -View [Flux's aggregate functions](/v2.0/reference/flux/functions/built-in/transformations/aggregates/) +View [Flux's aggregate functions](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/) for more information and ideas. ## Create a destination bucket @@ -47,7 +47,7 @@ The example task script below is a very basic form of data downsampling that doe 1. Defines a task named "cq-mem-data-1w" that runs once a week. 2. Defines a `data` variable that represents all data from the last 2 weeks in the `mem` measurement of the `system-data` bucket. -3. Uses the [`aggregateWindow()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow/) +3. Uses the [`aggregateWindow()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow/) to window the data into 1 hour intervals and calculate the average of each interval. 4. Stores the aggregated data in the `system-data-downsampled` bucket under the `my-org` organization. diff --git a/content/v2.0/process-data/get-started.md b/content/v2.0/process-data/get-started.md index 45bb10c7e..ef146a4ad 100644 --- a/content/v2.0/process-data/get-started.md +++ b/content/v2.0/process-data/get-started.md @@ -54,8 +54,8 @@ in form fields when creating the task. {{% /note %}} ## Define a data source -Define a data source using Flux's [`from()` function](/v2.0/reference/flux/functions/built-in/inputs/from/) -or any other [Flux input functions](/v2.0/reference/flux/functions/built-in/inputs/). +Define a data source using Flux's [`from()` function](/v2.0/reference/flux/stdlib/built-in/inputs/from/) +or any other [Flux input functions](/v2.0/reference/flux/stdlib/built-in/inputs/). For convenience, consider creating a variable that includes the sourced data with the required time range and any relevant filters. @@ -88,7 +88,7 @@ specific use case. The example below illustrates a task that downsamples data by calculating the average of set intervals. It uses the `data` variable defined [above](#define-a-data-source) as the data source. It then windows the data into 5 minute intervals and calculates the average of each -window using the [`aggregateWindow()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow/). +window using the [`aggregateWindow()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow/). ```js data @@ -104,7 +104,7 @@ _See [Common tasks](/v2.0/process-data/common-tasks) for examples of tasks commo In the vast majority of task use cases, once data is transformed, it needs to sent and stored somewhere. This could be a separate bucket with a different retention policy, another measurement, or even an alert endpoint _(Coming)_. -The example below uses Flux's [`to()` function](/v2.0/reference/flux/functions/built-in/outputs/to) +The example below uses Flux's [`to()` function](/v2.0/reference/flux/stdlib/built-in/outputs/to) to send the transformed data to another bucket: ```js diff --git a/content/v2.0/query-data/get-started/_index.md b/content/v2.0/query-data/get-started/_index.md index 56162f606..54834da2e 100644 --- a/content/v2.0/query-data/get-started/_index.md +++ b/content/v2.0/query-data/get-started/_index.md @@ -11,7 +11,7 @@ menu: parent: Query data related: - /v2.0/reference/flux/ - - /v2.0/reference/flux/functions/ + - /v2.0/reference/flux/stdlib/ --- Flux is InfluxData's functional data scripting language designed for querying, diff --git a/content/v2.0/query-data/get-started/query-influxdb.md b/content/v2.0/query-data/get-started/query-influxdb.md index f454e2d93..f2a024736 100644 --- a/content/v2.0/query-data/get-started/query-influxdb.md +++ b/content/v2.0/query-data/get-started/query-influxdb.md @@ -9,9 +9,9 @@ menu: weight: 201 related: - /v2.0/query-data/guides/ - - /v2.0/reference/flux/functions/built-in/inputs/from - - /v2.0/reference/flux/functions/built-in/transformations/range - - /v2.0/reference/flux/functions/built-in/transformations/filter + - /v2.0/reference/flux/stdlib/built-in/inputs/from + - /v2.0/reference/flux/stdlib/built-in/transformations/range + - /v2.0/reference/flux/stdlib/built-in/transformations/filter --- This guide walks through the basics of using Flux to query data from InfluxDB. @@ -23,8 +23,8 @@ Every Flux query needs the following: ## 1. Define your data source -Flux's [`from()`](/v2.0/reference/flux/functions/built-in/inputs/from) function defines an InfluxDB data source. -It requires a [`bucket`](/v2.0/reference/flux/functions/built-in/inputs/from#bucket) parameter. +Flux's [`from()`](/v2.0/reference/flux/stdlib/built-in/inputs/from) function defines an InfluxDB data source. +It requires a [`bucket`](/v2.0/reference/flux/stdlib/built-in/inputs/from#bucket) parameter. The following examples use `example-bucket` as the bucket name. ```js @@ -36,7 +36,7 @@ Flux requires a time range when querying time series data. "Unbounded" queries are very resource-intensive and as a protective measure, Flux will not query the database without a specified range. -Use the pipe-forward operator (`|>`) to pipe data from your data source into the [`range()`](/v2.0/reference/flux/functions/built-in/transformations/range) +Use the pipe-forward operator (`|>`) to pipe data from your data source into the [`range()`](/v2.0/reference/flux/stdlib/built-in/transformations/range) function, which specifies a time range for your query. It accepts two properties: `start` and `stop`. Ranges can be **relative** using negative [durations](/v2.0/reference/flux/language/lexical-elements#duration-literals) diff --git a/content/v2.0/query-data/get-started/transform-data.md b/content/v2.0/query-data/get-started/transform-data.md index 534544858..b65335a54 100644 --- a/content/v2.0/query-data/get-started/transform-data.md +++ b/content/v2.0/query-data/get-started/transform-data.md @@ -8,15 +8,15 @@ menu: parent: Get started with Flux weight: 202 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow - - /v2.0/reference/flux/functions/built-in/transformations/window + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow + - /v2.0/reference/flux/stdlib/built-in/transformations/window --- When [querying data from InfluxDB](/v2.0/query-data/get-started/query-influxdb), you often need to transform that data in some way. Common examples are aggregating data into averages, downsampling data, etc. -This guide demonstrates using [Flux functions](/v2.0/reference/flux/functions) to transform your data. +This guide demonstrates using [Flux functions](/v2.0/reference/flux/stdlib) to transform your data. It walks through creating a Flux script that partitions data into windows of time, averages the `_value`s in each window, and outputs the averages as a new table. @@ -39,13 +39,13 @@ from(bucket:"example-bucket") ## Flux functions Flux provides a number of functions that perform specific operations, transformations, and tasks. You can also [create custom functions](/v2.0/query-data/guides/custom-functions) in your Flux queries. -_Functions are covered in detail in the [Flux functions](/v2.0/reference/flux/functions) documentation._ +_Functions are covered in detail in the [Flux functions](/v2.0/reference/flux/stdlib) documentation._ A common type of function used when transforming data queried from InfluxDB is an aggregate function. Aggregate functions take a set of `_value`s in a table, aggregate them, and transform them into a new value. -This example uses the [`mean()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean) +This example uses the [`mean()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean) to average values within each time window. {{% note %}} @@ -55,7 +55,7 @@ It's just good to understand the steps in the process. {{% /note %}} ## Window your data -Flux's [`window()` function](/v2.0/reference/flux/functions/built-in/transformations/window) partitions records based on a time value. +Flux's [`window()` function](/v2.0/reference/flux/stdlib/built-in/transformations/window) partitions records based on a time value. Use the `every` parameter to define a duration of each window. For this example, window data in five minute intervals (`5m`). @@ -78,7 +78,7 @@ When visualized, each table is assigned a unique color. ## Aggregate windowed data Flux aggregate functions take the `_value`s in each table and aggregate them in some way. -Use the [`mean()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean) to average the `_value`s of each table. +Use the [`mean()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean) to average the `_value`s of each table. ```js from(bucket:"example-bucket") @@ -104,7 +104,7 @@ Aggregate functions don't infer what time should be used for the aggregate value Therefore the `_time` column is dropped. A `_time` column is required in the [next operation](#unwindow-aggregate-tables). -To add one, use the [`duplicate()` function](/v2.0/reference/flux/functions/built-in/transformations/duplicate) +To add one, use the [`duplicate()` function](/v2.0/reference/flux/stdlib/built-in/transformations/duplicate) to duplicate the `_stop` column as the `_time` column for each windowed table. ```js @@ -149,7 +149,7 @@ process helps to understand how data changes "shape" as it is passed through eac Flux provides (and allows you to create) "helper" functions that abstract many of these steps. The same operation performed in this guide can be accomplished using the -[`aggregateWindow()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow). +[`aggregateWindow()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow). ```js from(bucket:"example-bucket") diff --git a/content/v2.0/query-data/guides/conditional-logic.md b/content/v2.0/query-data/guides/conditional-logic.md index 63ac17ee6..22c7494c0 100644 --- a/content/v2.0/query-data/guides/conditional-logic.md +++ b/content/v2.0/query-data/guides/conditional-logic.md @@ -27,9 +27,9 @@ Conditional expressions are most useful in the following contexts: - When defining variables. - When using functions that operate on a single row at a time ( - [`filter()`](/v2.0/reference/flux/functions/built-in/transformations/filter/), - [`map()`](/v2.0/reference/flux/functions/built-in/transformations/map/), - [`reduce()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce) ). + [`filter()`](/v2.0/reference/flux/stdlib/built-in/transformations/filter/), + [`map()`](/v2.0/reference/flux/stdlib/built-in/transformations/map/), + [`reduce()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce) ). ## Examples @@ -72,7 +72,7 @@ from(bucket: "example-bucket") ### Conditionally transform column values with map() -The following example uses the [`map()` function](/v2.0/reference/flux/functions/built-in/transformations/map/) +The following example uses the [`map()` function](/v2.0/reference/flux/stdlib/built-in/transformations/map/) to conditionally transform column values. It sets the `level` column to a specific string based on `_value` column. @@ -119,8 +119,8 @@ from(bucket: "example-bucket") {{< /code-tabs-wrapper >}} ### Conditionally increment a count with reduce() -The following example uses the [`aggregateWindow()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow/) -and [`reduce()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/) +The following example uses the [`aggregateWindow()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow/) +and [`reduce()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/) functions to count the number of records in every five minute window that exceed a defined threshold. {{< code-tabs-wrapper >}} diff --git a/content/v2.0/query-data/guides/custom-functions/_index.md b/content/v2.0/query-data/guides/custom-functions/_index.md index 06341d146..d15716bcd 100644 --- a/content/v2.0/query-data/guides/custom-functions/_index.md +++ b/content/v2.0/query-data/guides/custom-functions/_index.md @@ -70,7 +70,7 @@ functionName = (tables=<-) => tables |> functionOperations ###### Multiply row values by x The example below defines a `multByX` function that multiplies the `_value` column of each row in the input table by the `x` parameter. -It uses the [`map()` function](/v2.0/reference/flux/functions/built-in/transformations/map) +It uses the [`map()` function](/v2.0/reference/flux/stdlib/built-in/transformations/map) to modify each `_value`. ```js @@ -104,9 +104,9 @@ Defaults are overridden by explicitly defining the parameter in the function cal ###### Get the winner or the "winner" The example below defines a `getWinner` function that returns the record with the highest or lowest `_value` (winner versus "winner") depending on the `noSarcasm` parameter which defaults to `true`. -It uses the [`sort()` function](/v2.0/reference/flux/functions/built-in/transformations/sort) +It uses the [`sort()` function](/v2.0/reference/flux/stdlib/built-in/transformations/sort) to sort records in either descending or ascending order. -It then uses the [`limit()` function](/v2.0/reference/flux/functions/built-in/transformations/limit) +It then uses the [`limit()` function](/v2.0/reference/flux/stdlib/built-in/transformations/limit) to return the first record from the sorted table. ```js diff --git a/content/v2.0/query-data/guides/custom-functions/custom-aggregate.md b/content/v2.0/query-data/guides/custom-functions/custom-aggregate.md index 60e580ab6..b56d68dfc 100644 --- a/content/v2.0/query-data/guides/custom-functions/custom-aggregate.md +++ b/content/v2.0/query-data/guides/custom-functions/custom-aggregate.md @@ -10,9 +10,9 @@ weight: 301 --- To aggregate your data, use the Flux -[built-in aggregate functions](/v2.0/reference/flux/functions/built-in/transformations/aggregates/) +[built-in aggregate functions](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/) or create custom aggregate functions using the -[`reduce()`function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/). +[`reduce()`function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/). ## Aggregate function characteristics Aggregate functions all have the same basic characteristics: @@ -22,7 +22,7 @@ Aggregate functions all have the same basic characteristics: ## How reduce() works The `reduce()` function operates on one row at a time using the function defined in -the [`fn` parameter](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/#fn). +the [`fn` parameter](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/#fn). The `fn` function maps keys to specific values using two [objects](/v2.0/query-data/get-started/syntax-basics/#objects) specified by the following parameters: @@ -32,7 +32,7 @@ specified by the following parameters: | `accumulator` | An object that contains values used in each row's aggregate calculation. | {{% note %}} -The `reduce()` function's [`identity` parameter](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/#identity) +The `reduce()` function's [`identity` parameter](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/#identity) defines the initial `accumulator` object. {{% /note %}} @@ -50,7 +50,7 @@ in an input table. ``` {{% note %}} -To preserve existing columns, [use the `with` operator](/v2.0/reference/flux/functions/built-in/transformations/aggregates/reduce/#preserve-columns) +To preserve existing columns, [use the `with` operator](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/#preserve-columns) when mapping values in the `r` object. {{% /note %}} @@ -150,7 +150,7 @@ and the `reduce()` function to aggregate rows in each input table. ### Create a custom average function This example illustrates how to create a function that averages values in a table. _This is meant for demonstration purposes only. -The built-in [`mean()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean/) +The built-in [`mean()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean/) does the same thing and is much more performant._ {{< code-tabs-wrapper >}} diff --git a/content/v2.0/query-data/guides/group-data.md b/content/v2.0/query-data/guides/group-data.md index 50a3c4fde..fd3c56eb9 100644 --- a/content/v2.0/query-data/guides/group-data.md +++ b/content/v2.0/query-data/guides/group-data.md @@ -28,7 +28,7 @@ Understanding how modifying group keys shapes output data is key to successfully grouping and transforming data into your desired output. ## group() Function -Flux's [`group()` function](/v2.0/reference/flux/functions/built-in/transformations/group) defines the +Flux's [`group()` function](/v2.0/reference/flux/stdlib/built-in/transformations/group) defines the group key for output tables, i.e. grouping records based on values for specific columns. ###### group() example diff --git a/content/v2.0/query-data/guides/histograms.md b/content/v2.0/query-data/guides/histograms.md index fc87430a9..a0be7ac6d 100644 --- a/content/v2.0/query-data/guides/histograms.md +++ b/content/v2.0/query-data/guides/histograms.md @@ -14,7 +14,7 @@ Histograms provide valuable insight into the distribution of your data. This guide walks through using Flux's `histogram()` function to transform your data into a **cumulative histogram**. ## histogram() function -The [`histogram()` function](/v2.0/reference/flux/functions/built-in/transformations/histogram) approximates the +The [`histogram()` function](/v2.0/reference/flux/stdlib/built-in/transformations/histogram) approximates the cumulative distribution of a dataset by counting data frequencies for a list of "bins." A **bin** is simply a range in which a data point falls. All data points that are less than or equal to the bound are counted in the bin. @@ -41,7 +41,7 @@ Flux provides two helper functions for generating histogram bins. Each generates an array of floats designed to be used in the `histogram()` function's `bins` parameter. ### linearBins() -The [`linearBins()` function](/v2.0/reference/flux/functions/built-in/misc/linearbins) generates a list of linearly separated floats. +The [`linearBins()` function](/v2.0/reference/flux/stdlib/built-in/misc/linearbins) generates a list of linearly separated floats. ```js linearBins(start: 0.0, width: 10.0, count: 10) @@ -50,7 +50,7 @@ linearBins(start: 0.0, width: 10.0, count: 10) ``` ### logarithmicBins() -The [`logarithmicBins()` function](/v2.0/reference/flux/functions/built-in/misc/logarithmicbins) generates a list of exponentially separated floats. +The [`logarithmicBins()` function](/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins) generates a list of exponentially separated floats. ```js logarithmicBins(start: 1.0, factor: 2.0, count: 10, infinity: true) diff --git a/content/v2.0/query-data/guides/join.md b/content/v2.0/query-data/guides/join.md index bb97dc73b..e0932ba3c 100644 --- a/content/v2.0/query-data/guides/join.md +++ b/content/v2.0/query-data/guides/join.md @@ -10,7 +10,7 @@ menu: weight: 205 --- -The [`join()` function](/v2.0/reference/flux/functions/built-in/transformations/join) merges two or more +The [`join()` function](/v2.0/reference/flux/stdlib/built-in/transformations/join) merges two or more input streams, whose values are equal on a set of common columns, into a single output stream. Flux allows you to join on any columns common between two data streams and opens the door for operations such as cross-measurement joins and math across measurements. @@ -205,7 +205,7 @@ These represent the columns with values unique to the two input tables. ## Calculate and create a new table With the two streams of data joined into a single table, use the -[`map()` function](/v2.0/reference/flux/functions/built-in/transformations/map) +[`map()` function](/v2.0/reference/flux/stdlib/built-in/transformations/map) to build a new table by mapping the existing `_time` column to a new `_time` column and dividing `_value_mem` by `_value_proc` and mapping it to a new `_value` column. diff --git a/content/v2.0/query-data/guides/mathematic-operations.md b/content/v2.0/query-data/guides/mathematic-operations.md index 0c8c9f27b..39cbb7380 100644 --- a/content/v2.0/query-data/guides/mathematic-operations.md +++ b/content/v2.0/query-data/guides/mathematic-operations.md @@ -40,7 +40,7 @@ Otherwise, you will get an error similar to: Error: type error: float != int ``` -To convert operands to the same type, use [type-conversion functions](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/) +To convert operands to the same type, use [type-conversion functions](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/) or manually format operands. The operand data type determines the output data type. For example: @@ -82,7 +82,7 @@ percent(sample: 20.0, total: 80.0) To transform multiple values in an input stream, your function needs to: - [Handle piped-forward data](/v2.0/query-data/guides/custom-functions/#functions-that-manipulate-piped-forward-data). -- Use the [`map()` function](/v2.0/reference/flux/functions/built-in/transformations/map) to iterate over each row. +- Use the [`map()` function](/v2.0/reference/flux/stdlib/built-in/transformations/map) to iterate over each row. The example `multiplyByX()` function below includes: @@ -146,7 +146,7 @@ data #### Include partial gigabytes Because the original metric (bytes) is an integer, the output of the operation is an integer and does not include partial GBs. To calculate partial GBs, convert the `_value` column and its values to floats using the -[`float()` function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float) +[`float()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/float) and format the denominator in the division operation as a float. ```js diff --git a/content/v2.0/query-data/guides/sort-limit.md b/content/v2.0/query-data/guides/sort-limit.md index 4dd175588..5d053a0ad 100644 --- a/content/v2.0/query-data/guides/sort-limit.md +++ b/content/v2.0/query-data/guides/sort-limit.md @@ -12,7 +12,7 @@ menu: weight: 206 --- -The [`sort()`function](/v2.0/reference/flux/functions/built-in/transformations/sort) +The [`sort()`function](/v2.0/reference/flux/stdlib/built-in/transformations/sort) orders the records within each table. The following example orders system uptime first by region, then host, then value. @@ -26,7 +26,7 @@ from(bucket:"example-bucket") |> sort(columns:["region", "host", "_value"]) ``` -The [`limit()` function](/v2.0/reference/flux/functions/built-in/transformations/limit) +The [`limit()` function](/v2.0/reference/flux/stdlib/built-in/transformations/limit) limits the number of records in output tables to a fixed number, `n`. The following example shows up to 10 records from the past hour. @@ -52,6 +52,6 @@ from(bucket:"example-bucket") ``` You now have created a Flux query that sorts and limits data. -Flux also provides the [`top()`](/v2.0/reference/flux/functions/built-in/transformations/selectors/top) -and [`bottom()`](/v2.0/reference/flux/functions/built-in/transformations/selectors/bottom) +Flux also provides the [`top()`](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/top) +and [`bottom()`](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/bottom) functions to perform both of these functions at the same time. diff --git a/content/v2.0/query-data/guides/sql.md b/content/v2.0/query-data/guides/sql.md index 19d49c54d..2a3d6dc46 100644 --- a/content/v2.0/query-data/guides/sql.md +++ b/content/v2.0/query-data/guides/sql.md @@ -12,7 +12,7 @@ weight: 207 --- The [Flux](/v2.0/reference/flux) `sql` package provides functions for working with SQL data sources. -[`sql.from()`](/v2.0/reference/flux/functions/sql/from/) lets you query SQL data sources +[`sql.from()`](/v2.0/reference/flux/stdlib/sql/from/) lets you query SQL data sources like [PostgreSQL](https://www.postgresql.org/) and [MySQL](https://www.mysql.com/) and use the results with InfluxDB dashboards, tasks, and other operations. @@ -59,7 +59,7 @@ sql.from( {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -_See the [`sql.from()` documentation](/v2.0/reference/flux/functions/sql/from/) for +_See the [`sql.from()` documentation](/v2.0/reference/flux/stdlib/sql/from/) for information about required function parameters._ ## Join SQL data with data in InfluxDB diff --git a/content/v2.0/query-data/guides/window-aggregate.md b/content/v2.0/query-data/guides/window-aggregate.md index b47759063..d9320d394 100644 --- a/content/v2.0/query-data/guides/window-aggregate.md +++ b/content/v2.0/query-data/guides/window-aggregate.md @@ -86,7 +86,7 @@ Table: keys: [_start, _stop, _field, _measurement] {{% /truncate %}} ## Windowing data -Use the [`window()` function](/v2.0/reference/flux/functions/built-in/transformations/window) +Use the [`window()` function](/v2.0/reference/flux/stdlib/built-in/transformations/window) to group your data based on time bounds. The most common parameter passed with the `window()` is `every` which defines the duration of time between windows. @@ -170,14 +170,14 @@ When visualized in the InfluxDB UI, each window table is displayed in a differen ![Windowed data](/img/simple-windowed-data.png) ## Aggregate data -[Aggregate functions](/v2.0/reference/flux/functions/built-in/transformations/aggregates) take the values +[Aggregate functions](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates) take the values of all rows in a table and use them to perform an aggregate operation. The result is output as a new value in a single-row table. Since windowed data is split into separate tables, aggregate operations run against each table separately and output new tables containing only the aggregated value. -For this example, use the [`mean()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/mean) +For this example, use the [`mean()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/mean) to output the average of each window: ```js @@ -241,7 +241,7 @@ These represent the lower and upper bounds of the time window. Many Flux functions rely on the `_time` column. To further process your data after an aggregate function, you need to re-add `_time`. -Use the [`duplicate()` function](/v2.0/reference/flux/functions/built-in/transformations/duplicate) to +Use the [`duplicate()` function](/v2.0/reference/flux/stdlib/built-in/transformations/duplicate) to duplicate either the `_start` or `_stop` column as a new `_time` column. ```js @@ -329,7 +329,7 @@ With the aggregate values in a single table, data points in the visualization ar You have now created a Flux query that windows and aggregates data. The data transformation process outlined in this guide should be used for all aggregation operations. -Flux also provides the [`aggregateWindow()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) +Flux also provides the [`aggregateWindow()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow) which performs all these separate functions for you. The following Flux query will return the same results: diff --git a/content/v2.0/reference/annotated-csv.md b/content/v2.0/reference/annotated-csv.md index 0cf966ad5..001154163 100644 --- a/content/v2.0/reference/annotated-csv.md +++ b/content/v2.0/reference/annotated-csv.md @@ -8,7 +8,7 @@ menu: name: Annotated CSV --- -Annotated CSV (comma-separated values) format is used to encode HTTP responses and results returned to the Flux [`csv.from()` function](https://v2.docs.influxdata.com/v2.0/reference/flux/functions/csv/from/). +Annotated CSV (comma-separated values) format is used to encode HTTP responses and results returned to the Flux [`csv.from()` function](https://v2.docs.influxdata.com/v2.0/reference/flux/stdlib/csv/from/). CSV tables must be encoded in UTF-8 and Unicode Normal Form C as defined in [UAX15](http://www.unicode.org/reports/tr15/). Line endings must be CRLF (Carriage Return Line Feed) as defined by the `text/csv` MIME type in [RFC 4180](https://tools.ietf.org/html/rfc4180). diff --git a/content/v2.0/reference/flux/_index.md b/content/v2.0/reference/flux/_index.md index 647a0407d..a1b77af63 100644 --- a/content/v2.0/reference/flux/_index.md +++ b/content/v2.0/reference/flux/_index.md @@ -8,7 +8,7 @@ menu: weight: 4 --- -The following articles are meant as a reference for Flux functions and the -Flux language specification. +The following articles are meant as a reference for the Flux standard library and +the Flux language specification. {{< children >}} diff --git a/content/v2.0/reference/flux/language/string-interpolation.md b/content/v2.0/reference/flux/language/string-interpolation.md index 463233ae4..fcb2ea593 100644 --- a/content/v2.0/reference/flux/language/string-interpolation.md +++ b/content/v2.0/reference/flux/language/string-interpolation.md @@ -30,7 +30,7 @@ name = "John" {{% note %}} #### Flux only interpolates string values Flux currently interpolates only string values ([IMP#1775](https://github.com/influxdata/flux/issues/1775)). -Use the [string() function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string/) +Use the [string() function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string/) to convert non-string values to strings. ```js diff --git a/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md b/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md index 2a05e6179..3ee4a7f6c 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/intervals.md @@ -21,7 +21,7 @@ The set of intervals includes all intervals that intersect with the initial rang {{% note %}} The `intervals()` function is designed to be used with the intervals parameter -of the [`window()` function](/v2.0/reference/flux/functions/built-in/transformations/window). +of the [`window()` function](/v2.0/reference/flux/stdlib/built-in/transformations/window). {{% /note %}} By default the end boundary of an interval will align with the Unix epoch (zero time) diff --git a/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md b/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md index 10d031879..658ec2d5a 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/linearbins.md @@ -13,7 +13,7 @@ weight: 401 The `linearBins()` function generates a list of linearly separated floats. It is a helper function meant to generate bin bounds for the -[`histogram()` function](/v2.0/reference/flux/functions/built-in/transformations/histogram). +[`histogram()` function](/v2.0/reference/flux/stdlib/built-in/transformations/histogram). _**Function type:** Miscellaneous_ _**Output data type:** Array of floats_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md b/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md index 9604a6008..5a6c2d59e 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md +++ b/content/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins.md @@ -13,7 +13,7 @@ weight: 401 The `logarithmicBins()` function generates a list of exponentially separated floats. It is a helper function meant to generate bin bounds for the -[`histogram()` function](/v2.0/reference/flux/functions/built-in/transformations/histogram). +[`histogram()` function](/v2.0/reference/flux/stdlib/built-in/transformations/histogram). _**Function type:** Miscellaneous_ _**Output data type:** Array of floats_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md index 4b0caccc6..9fa9aea45 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md @@ -30,7 +30,7 @@ Any output table will have the following properties: - It will not have a `_time` column. ### aggregateWindow helper function -The [`aggregateWindow()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) +The [`aggregateWindow()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow) does most of the work needed when aggregating data. It windows and aggregates the data, then combines windowed tables into a single output table. @@ -44,9 +44,9 @@ The following functions are both aggregates and selectors. Each returns `n` values after performing an aggregate operation. They are categorized as selector functions in this documentation: -- [highestAverage](/v2.0/reference/flux/functions/transformations/selectors/highestaverage) -- [highestCurrent](/v2.0/reference/flux/functions/transformations/selectors/highestcurrent) -- [highestMax](/v2.0/reference/flux/functions/transformations/selectors/highestmax) -- [lowestAverage](/v2.0/reference/flux/functions/transformations/selectors/lowestaverage) -- [lowestCurrent](/v2.0/reference/flux/functions/transformations/selectors/lowestcurrent) -- [lowestMin](/v2.0/reference/flux/functions/transformations/selectors/lowestmin) +- [highestAverage](/v2.0/reference/flux/stdlib/transformations/selectors/highestaverage) +- [highestCurrent](/v2.0/reference/flux/stdlib/transformations/selectors/highestcurrent) +- [highestMax](/v2.0/reference/flux/stdlib/transformations/selectors/highestmax) +- [lowestAverage](/v2.0/reference/flux/stdlib/transformations/selectors/lowestaverage) +- [lowestCurrent](/v2.0/reference/flux/stdlib/transformations/selectors/lowestcurrent) +- [lowestMin](/v2.0/reference/flux/stdlib/transformations/selectors/lowestmin) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md index 9901cf15e..ce15d9685 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow.md @@ -49,7 +49,7 @@ _**Data type:** Duration_ ### fn -The [aggregate function](/v2.0/reference/flux/functions/built-in/transformations/aggregates) used in the operation. +The [aggregate function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates) used in the operation. _**Data type:** Function_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md index ee230e4a2..33661396e 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md @@ -12,16 +12,16 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#double-exponential-moving-average, InfluxQL DOUBLE_EXPONENTIAL_MOVING_AVERAGE() --- The `doubleEMA()` function calculates the exponential moving average of values in the `_value` column grouped into `n` number of points, giving more weight to recent -data at double the rate of [`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/). +data at double the rate of [`exponentialMovingAverage()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/). _**Function type:** Aggregate_ @@ -35,7 +35,7 @@ doubleEMA(n: 5) - `N = n` is the period used to calculate the EMA. - A true double exponential moving average requires at least `2 * n - 1` values. If not enough values exist to calculate the double EMA, it returns a `NaN` value. -- `doubleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). +- `doubleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). ## Parameters diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md index 4a57a1e55..c8394a2a1 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md @@ -11,10 +11,10 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md index 632a0eb61..2fd9bc218 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/holtwinters.md @@ -52,10 +52,10 @@ To ensure `holtWinters()` values are spaced evenly in time, the following rules By default, `holtWinters()` uses the first value in each time bucket to run the Holt-Winters calculation. To specify other values to use in the calculation, use: -- [`window()`](/v2.0/reference/flux/functions/built-in/transformations/window/) - with [selectors](/v2.0/reference/flux/functions/built-in/transformations/selectors/) - or [aggregates](/v2.0/reference/flux/functions/built-in/transformations/aggregates/) -- [`aggregateWindow()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/aggregatewindow) +- [`window()`](/v2.0/reference/flux/stdlib/built-in/transformations/window/) + with [selectors](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/) + or [aggregates](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/) +- [`aggregateWindow()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/aggregatewindow) #### Fitted model The `holtWinters()` function applies the [Nelder-Mead optimization](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md index eb4bb39f7..d5c937d97 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md @@ -11,7 +11,7 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmanser/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-adaptive-moving-average, InfluxQL KAUFMANS_ADAPTIVE_MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md index 6a54686ca..f135b1fc2 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md @@ -11,7 +11,7 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/kaufmansama/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-efficiency-ratio, InfluxQL KAUFMANS_EFFICIENCY_RATIO() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md index af65f83c0..271ca394f 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median.md @@ -13,7 +13,7 @@ menu: weight: 501 --- -The `median()` function is a special application of the [`quantile()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile) +The `median()` function is a special application of the [`quantile()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile) that returns the median `_value` of an input table or all non-null records in the input table with values that fall within the `0.5` quantile (50th percentile) depending on the [method](#method) used. @@ -37,9 +37,9 @@ value that represents the `0.5` quantile. {{% note %}} The `median()` function can only be used with float value types. -It is a special application of the [`quantile()` function](/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile) +It is a special application of the [`quantile()` function](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile) which uses an approximation implementation that requires floats. -You can convert your value column to a float column using the [`toFloat()` function](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/tofloat). +You can convert your value column to a float column using the [`toFloat()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat). {{% /note %}} ## Parameters diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md index 5f87f19d5..7daeee63c 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage.md @@ -10,10 +10,10 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md index 4e3bc1fb1..58f3e283d 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md @@ -11,9 +11,9 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#relative-strength-index, InfluxQL RELATIVE_STRENGTH_INDEX() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md index be44b38dc..2d1b0be01 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage.md @@ -11,10 +11,10 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - https://docs.influxdata.com/influxdb/latest/query_language/functions/#moving-average, InfluxQL MOVING_AVERAGE() --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md index 70d71c0c4..aa55e2527 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md @@ -12,18 +12,18 @@ menu: parent: built-in-aggregates weight: 501 related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() --- The `tripleEMA()` function calculates the exponential moving average of values in the `_value` column grouped into `n` number of points, giving more weight to recent data with less lag than -[`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/) -and [`doubleEMA()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/). +[`exponentialMovingAverage()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/) +and [`doubleEMA()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/). _**Function type:** Aggregate_ @@ -38,7 +38,7 @@ tripleEMA(n: 5) - `EMA_3` is the exponential moving average of `EMA_2`. - A true triple exponential moving average requires at least requires at least `3 * n - 2` values. If not enough values exist to calculate the triple EMA, it returns a `NaN` value. -- `tripleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). +- `tripleEMA()` inherits all [exponential moving average rules](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/#exponential-moving-average-rules). ## Parameters diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md index 4ebaa982d..15380d849 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -12,11 +12,11 @@ menu: weight: 501 v2.0/tags: [technical analysis] related: - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/movingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/doubleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/tripleema/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/timedmovingaverage/ - - /v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ + - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-derivative, InfluxQL TRIPLE_EXPONENTIAL_DERIVATIVE() --- @@ -48,7 +48,7 @@ a negative value indicates decreasing momentum. - `EMA_3 = EMA(EMA(EMA(data)))` - If there are not enough values to calculate a triple exponential derivative, the output `_value` is `NaN`; all other columns are the same as the _last_ record of the input table. -- The function behaves the same way as the [`exponentialMovingAverage()`](/v2.0/reference/flux/functions/built-in/transformations/aggregates/exponentialmovingaverage/) function: +- The function behaves the same way as the [`exponentialMovingAverage()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/) function: - The function does not include `null` values in the calculation. - The function acts only on the `_value` column. diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md index bc98d44ed..a4e04bb96 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/histogram.md @@ -57,8 +57,8 @@ _**Data type:** Array of floats_ #### Bin helper functions The following helper functions can be used to generated bins. -[linearBins()](/v2.0/reference/flux/functions/built-in/misc/linearbins) -[logarithmicBins()](/v2.0/reference/flux/functions/built-in/misc/logarithmicbins) +[linearBins()](/v2.0/reference/flux/stdlib/built-in/misc/linearbins) +[logarithmicBins()](/v2.0/reference/flux/stdlib/built-in/misc/logarithmicbins) ### normalize When `true`, will convert the counts into frequency values between 0 and 1. diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md index c54f3a62b..6c4f0dada 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/keep.md @@ -13,7 +13,7 @@ weight: 401 The `keep()` function returns a table containing only the specified columns, ignoring all others. Only columns in the group key that are also specified in the `keep()` function will be kept in the resulting group key. -_It is the inverse of [`drop`](/v2.0/reference/flux/functions/built-in/transformations/drop)._ +_It is the inverse of [`drop`](/v2.0/reference/flux/stdlib/built-in/transformations/drop)._ _**Function type:** Transformation_ _**Output data type:** Object_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md index b7036f282..dd7915862 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/limit.md @@ -10,7 +10,7 @@ menu: parent: built-in-transformations weight: 401 related: - - /v2.0/reference/flux/functions/built-in/transformations/tail/ + - /v2.0/reference/flux/stdlib/built-in/transformations/tail/ - https://docs.influxdata.com/influxdb/latest/query_language/data_exploration/#the-limit-and-slimit-clauses, InfluxQL LIMIT --- diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md index 2739e6036..62cbf6955 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/selectors/_index.md @@ -26,5 +26,5 @@ The following selector functions are available: The following functions can be used as both selectors or aggregates, but they are categorized as aggregate functions in this documentation: -- [median](/v2.0/reference/flux/functions/built-in/transformations/aggregates/median) -- [quantile](/v2.0/reference/flux/functions/built-in/transformations/aggregates/quantile) +- [median](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/median) +- [quantile](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/quantile) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md index 69b89798d..8d7fc25f4 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md @@ -54,6 +54,6 @@ t = from(bucket:"example-bucket") ``` {{% note %}} -You can use `t` from the example above as input for [`getColumn()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn/) -and [`getRecord()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord/). +You can use `t` from the example above as input for [`getColumn()`](/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn/) +and [`getRecord()`](/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord/). {{% /note %}} diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md index 6813d0730..6b0a0b053 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/truncatetimecolumn.md @@ -10,7 +10,7 @@ menu: parent: built-in-transformations weight: 401 related: - - /v2.0/reference/flux/functions/date/truncate/ + - /v2.0/reference/flux/stdlib/date/truncate/ --- The `truncateTimeColumn()` function truncates all input table `_time` values to a specified unit. diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md index 41a97df96..2cad528d3 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tobool.md @@ -44,5 +44,5 @@ toBool = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[bool()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/bool)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[bool()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/bool)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md index 78967cf1c..6ffa8ad51 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toduration.md @@ -48,5 +48,5 @@ toDuration = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[duration()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/duration)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[duration()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/duration)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md index f5f233414..cabaf654b 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tofloat.md @@ -44,5 +44,5 @@ toFloat = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[float()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/float)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[float()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/float)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md index 39a14ed37..4053d716b 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/toint.md @@ -44,5 +44,5 @@ toInt = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[int()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/int)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[int()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/int)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md index c9256b8f9..99645fa1e 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/tostring.md @@ -44,5 +44,5 @@ toString = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[string()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/string)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[string()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md index 5b6b2a6c8..ea36402ee 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/totime.md @@ -44,5 +44,5 @@ toTime = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[time()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/time)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[time()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time)_ diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md index d50ac5a7e..d113d28a1 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/touint.md @@ -44,5 +44,5 @@ toUInt = (tables=<-) => ``` _**Used functions:** -[map()](/v2.0/reference/flux/functions/built-in/transformations/map), -[uint()](/v2.0/reference/flux/functions/built-in/transformations/type-conversions/uint)_ +[map()](/v2.0/reference/flux/stdlib/built-in/transformations/map), +[uint()](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/uint)_ diff --git a/content/v2.0/reference/flux/stdlib/http/endpoint.md b/content/v2.0/reference/flux/stdlib/http/endpoint.md index 7dd176e99..054f6b54b 100644 --- a/content/v2.0/reference/flux/stdlib/http/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/http/endpoint.md @@ -47,7 +47,7 @@ The returned object must include the following fields: - `headers` - `data` -_For more information, see [`http.post()`](/v2.0/reference/flux/functions/http/post/)_ +_For more information, see [`http.post()`](/v2.0/reference/flux/stdlib/http/post/)_ ## Examples diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md index 93a94f978..a1596f8a6 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/fieldsascols.md @@ -46,4 +46,4 @@ fieldsAsCols = (tables=<-) => ``` _**Used functions:** -[pivot()](/v2.0/reference/flux/functions/built-in/transformations/pivot)_ +[pivot()](/v2.0/reference/flux/stdlib/built-in/transformations/pivot)_ diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md index 9034836ee..8ffd2b9bb 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurements.md @@ -34,4 +34,4 @@ measurements = (bucket) => ``` _**Used functions:** -[tagValues()](/v2.0/reference/flux/functions/influxdb-v1/tagvalues)_ +[tagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues)_ diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md index 84b1b74f2..460908f39 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagkeys.md @@ -44,4 +44,4 @@ measurementTagKeys = (bucket, measurement) => ``` _**Used functions:** -[tagKeys()](/v2.0/reference/flux/functions/influxdb-v1/tagkeys)_ +[tagKeys()](/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys)_ diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md index 90643cd64..89a2281c7 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues.md @@ -55,4 +55,4 @@ measurementTagValues = (bucket, measurement, tag) => ``` _**Used functions:** -[tagValues()](/v2.0/reference/flux/functions/influxdb-v1/tagvalues)_ +[tagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues)_ diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md index 154a261dc..63d8a370d 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagkeys.md @@ -67,9 +67,9 @@ tagKeys = (bucket, predicate=(r) => true, start=-30d) => ``` _**Used functions:** -[from](/v2.0/reference/flux/functions/built-in/inputs/from/), -[range](/v2.0/reference/flux/functions/built-in/transformations/range/), -[filter](/v2.0/reference/flux/functions/built-in/transformations/filter/), -[keys](/v2.0/reference/flux/functions/built-in/transformations/keys/), -[keep](/v2.0/reference/flux/functions/built-in/transformations/keep/), -[distinct](/v2.0/reference/flux/functions/built-in/transformations/selectors/distinct/)_ +[from](/v2.0/reference/flux/stdlib/built-in/inputs/from/), +[range](/v2.0/reference/flux/stdlib/built-in/transformations/range/), +[filter](/v2.0/reference/flux/stdlib/built-in/transformations/filter/), +[keys](/v2.0/reference/flux/stdlib/built-in/transformations/keys/), +[keep](/v2.0/reference/flux/stdlib/built-in/transformations/keep/), +[distinct](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/distinct/)_ diff --git a/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md index 47525e8bd..51266ccce 100644 --- a/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md +++ b/content/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues.md @@ -75,9 +75,9 @@ tagValues = (bucket, tag, predicate=(r) => true, start=-30d) => ``` _**Used functions:** -[from](/v2.0/reference/flux/functions/built-in/inputs/from/), -[range](/v2.0/reference/flux/functions/built-in/transformations/range/), -[filter](/v2.0/reference/flux/functions/built-in/transformations/filter/), -[group](/v2.0/reference/flux/functions/built-in/transformations/group/), -[distinct](/v2.0/reference/flux/functions/built-in/transformations/selectors/distinct/), -[keep](/v2.0/reference/flux/functions/built-in/transformations/keep/)_ +[from](/v2.0/reference/flux/stdlib/built-in/inputs/from/), +[range](/v2.0/reference/flux/stdlib/built-in/transformations/range/), +[filter](/v2.0/reference/flux/stdlib/built-in/transformations/filter/), +[group](/v2.0/reference/flux/stdlib/built-in/transformations/group/), +[distinct](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/distinct/), +[keep](/v2.0/reference/flux/stdlib/built-in/transformations/keep/)_ diff --git a/content/v2.0/reference/flux/stdlib/math/ldexp.md b/content/v2.0/reference/flux/stdlib/math/ldexp.md index 207ef02dc..9213320a7 100644 --- a/content/v2.0/reference/flux/stdlib/math/ldexp.md +++ b/content/v2.0/reference/flux/stdlib/math/ldexp.md @@ -10,7 +10,7 @@ menu: weight: 301 --- -The `math.ldexp()` function is the inverse of [`math.frexp()`](/v2.0/reference/flux/functions/math/frexp). +The `math.ldexp()` function is the inverse of [`math.frexp()`](/v2.0/reference/flux/stdlib/math/frexp). It returns `frac × 2**exp`. _**Output data type:** Float_ diff --git a/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md b/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md index 3fa4fde63..e42bd1e7a 100644 --- a/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/endpoint.md @@ -56,7 +56,7 @@ The returned object must include the following fields: - `summary` - `timestamp` -_For more information, see [`pagerduty.message()`](/v2.0/reference/flux/functions/pagerduty/message/)_ +_For more information, see [`pagerduty.sendEvent()`](/v2.0/reference/flux/stdlib/pagerduty/sendevent/)_ ## Examples diff --git a/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md b/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md index 46ee68120..51bf4abaf 100644 --- a/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md +++ b/content/v2.0/reference/flux/stdlib/pagerduty/sendevent.md @@ -63,8 +63,8 @@ change the severity of previous messages. Supports a maximum of 255 characters. {{% note %}} -When using [`pagerduty.endpoint()`](/v2.0/reference/flux/functions/pagerduty/endpoint/) -to send data to PagerDuty, the function uses the [`pagerduty.dedupKey()` function](/v2.0/reference/flux/functions/pagerduty/dedupkey/) to populate the `dedupkey` parameter. +When using [`pagerduty.endpoint()`](/v2.0/reference/flux/stdlib/pagerduty/endpoint/) +to send data to PagerDuty, the function uses the [`pagerduty.dedupKey()` function](/v2.0/reference/flux/stdlib/pagerduty/dedupkey/) to populate the `dedupkey` parameter. {{% /note %}} _**Data type:** String_ diff --git a/content/v2.0/reference/flux/stdlib/regexp/findstring.md b/content/v2.0/reference/flux/stdlib/regexp/findstring.md index 979d69a33..d26a1a688 100644 --- a/content/v2.0/reference/flux/stdlib/regexp/findstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/findstring.md @@ -9,7 +9,7 @@ menu: parent: Regular expressions weight: 301 related: - - /v2.0/reference/flux/functions/regexp/splitregexp + - /v2.0/reference/flux/stdlib/regexp/splitregexp --- The `regexp.findString()` function returns the left-most regular expression match in a string. diff --git a/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md b/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md index bc9ee1ddb..80e4d4ff1 100644 --- a/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md +++ b/content/v2.0/reference/flux/stdlib/regexp/findstringindex.md @@ -11,7 +11,7 @@ menu: parent: Regular expressions weight: 301 related: - - /v2.0/reference/flux/functions/regexp/compile + - /v2.0/reference/flux/stdlib/regexp/compile --- The `regexp.findStringIndex()` function returns a two-element array of integers defining diff --git a/content/v2.0/reference/flux/stdlib/regexp/getstring.md b/content/v2.0/reference/flux/stdlib/regexp/getstring.md index 34dbaf2b0..7c3c39992 100644 --- a/content/v2.0/reference/flux/stdlib/regexp/getstring.md +++ b/content/v2.0/reference/flux/stdlib/regexp/getstring.md @@ -9,7 +9,7 @@ menu: parent: Regular expressions weight: 301 related: - - /v2.0/reference/flux/functions/regexp/compile + - /v2.0/reference/flux/stdlib/regexp/compile --- The `regexp.getString()` function returns the source string used to compile a regular expression. diff --git a/content/v2.0/reference/flux/stdlib/slack/endpoint.md b/content/v2.0/reference/flux/stdlib/slack/endpoint.md index ebfa28e0b..22b99da8e 100644 --- a/content/v2.0/reference/flux/stdlib/slack/endpoint.md +++ b/content/v2.0/reference/flux/stdlib/slack/endpoint.md @@ -69,7 +69,7 @@ The returned object must include the following fields: - `iconEmoji` - `color` -_For more information, see [`slack.message()`](/v2.0/reference/flux/functions/slack/message/)_ +_For more information, see [`slack.message()`](/v2.0/reference/flux/stdlib/slack/message/)_ ## Examples diff --git a/content/v2.0/reference/flux/stdlib/strings/containsany.md b/content/v2.0/reference/flux/stdlib/strings/containsany.md index 0630f688d..1398d51e0 100644 --- a/content/v2.0/reference/flux/stdlib/strings/containsany.md +++ b/content/v2.0/reference/flux/stdlib/strings/containsany.md @@ -11,7 +11,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/containsstr + - /v2.0/reference/flux/stdlib/strings/containsstr --- The `strings.containsAny()` function reports whether a specified string contains diff --git a/content/v2.0/reference/flux/stdlib/strings/containsstr.md b/content/v2.0/reference/flux/stdlib/strings/containsstr.md index 82cef5e8e..fded2ed3a 100644 --- a/content/v2.0/reference/flux/stdlib/strings/containsstr.md +++ b/content/v2.0/reference/flux/stdlib/strings/containsstr.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/containsany + - /v2.0/reference/flux/stdlib/strings/containsany --- The `strings.containsStr()` function reports whether a string contains a specified substring. diff --git a/content/v2.0/reference/flux/stdlib/strings/hasprefix.md b/content/v2.0/reference/flux/stdlib/strings/hasprefix.md index 143ddf162..200aca3cf 100644 --- a/content/v2.0/reference/flux/stdlib/strings/hasprefix.md +++ b/content/v2.0/reference/flux/stdlib/strings/hasprefix.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/hassuffix + - /v2.0/reference/flux/stdlib/strings/hassuffix --- The `strings.hasPrefix()` function indicates if a string begins with a specified prefix. diff --git a/content/v2.0/reference/flux/stdlib/strings/hassuffix.md b/content/v2.0/reference/flux/stdlib/strings/hassuffix.md index 6ca5b6cc9..dfc66563a 100644 --- a/content/v2.0/reference/flux/stdlib/strings/hassuffix.md +++ b/content/v2.0/reference/flux/stdlib/strings/hassuffix.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/hasprefix + - /v2.0/reference/flux/stdlib/strings/hasprefix --- The `strings.hasSuffix()` function indicates if a string ends with a specified suffix. diff --git a/content/v2.0/reference/flux/stdlib/strings/index-func.md b/content/v2.0/reference/flux/stdlib/strings/index-func.md index 45985e168..7e7119871 100644 --- a/content/v2.0/reference/flux/stdlib/strings/index-func.md +++ b/content/v2.0/reference/flux/stdlib/strings/index-func.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/indexany/ - - /v2.0/reference/flux/functions/strings/lastindex/ - - /v2.0/reference/flux/functions/strings/lastindexany/ + - /v2.0/reference/flux/stdlib/strings/indexany/ + - /v2.0/reference/flux/stdlib/strings/lastindex/ + - /v2.0/reference/flux/stdlib/strings/lastindexany/ --- The `strings.index()` function returns the index of the first instance of a substring diff --git a/content/v2.0/reference/flux/stdlib/strings/indexany.md b/content/v2.0/reference/flux/stdlib/strings/indexany.md index 7a4931d58..e72b922fa 100644 --- a/content/v2.0/reference/flux/stdlib/strings/indexany.md +++ b/content/v2.0/reference/flux/stdlib/strings/indexany.md @@ -10,9 +10,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/index-func/ - - /v2.0/reference/flux/functions/strings/lastindex/ - - /v2.0/reference/flux/functions/strings/lastindexany/ + - /v2.0/reference/flux/stdlib/strings/index-func/ + - /v2.0/reference/flux/stdlib/strings/lastindex/ + - /v2.0/reference/flux/stdlib/strings/lastindexany/ --- The `strings.indexAny()` function returns the index of the first instance of specified characters in a string. diff --git a/content/v2.0/reference/flux/stdlib/strings/isdigit.md b/content/v2.0/reference/flux/stdlib/strings/isdigit.md index 152b189b8..1fb0b4c63 100644 --- a/content/v2.0/reference/flux/stdlib/strings/isdigit.md +++ b/content/v2.0/reference/flux/stdlib/strings/isdigit.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/isletter/ + - /v2.0/reference/flux/stdlib/strings/isletter/ --- The `strings.isDigit()` function tests if a single-character string is a digit (0-9). diff --git a/content/v2.0/reference/flux/stdlib/strings/isletter.md b/content/v2.0/reference/flux/stdlib/strings/isletter.md index 92d04ec3c..1ba665e0c 100644 --- a/content/v2.0/reference/flux/stdlib/strings/isletter.md +++ b/content/v2.0/reference/flux/stdlib/strings/isletter.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/isdigit/ + - /v2.0/reference/flux/stdlib/strings/isdigit/ --- The `strings.isLetter()` function tests if a single character string is a letter (a-z, A-Z). diff --git a/content/v2.0/reference/flux/stdlib/strings/islower.md b/content/v2.0/reference/flux/stdlib/strings/islower.md index 28591137f..1f06c7ff8 100644 --- a/content/v2.0/reference/flux/stdlib/strings/islower.md +++ b/content/v2.0/reference/flux/stdlib/strings/islower.md @@ -1,13 +1,15 @@ --- title: strings.isLower() function description: The strings.isLower() function tests if a single-character string is lowercase. +aliases: + - /v2.0/reference/flux/functions/strings/islower/ menu: v2_0_ref: name: strings.isLower parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/isupper + - /v2.0/reference/flux/stdlib/strings/isupper --- The `strings.isLower()` function tests if a single-character string is lowercase. @@ -38,4 +40,3 @@ import "strings" data |> filter(fn: (r) => strings.isLower(v: r.host)) ``` -- /v2.0/reference/flux/functions/strings/islower/ diff --git a/content/v2.0/reference/flux/stdlib/strings/isupper.md b/content/v2.0/reference/flux/stdlib/strings/isupper.md index 4335052cd..389faecf9 100644 --- a/content/v2.0/reference/flux/stdlib/strings/isupper.md +++ b/content/v2.0/reference/flux/stdlib/strings/isupper.md @@ -9,7 +9,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/islower + - /v2.0/reference/flux/stdlib/strings/islower --- The `strings.isUpper()` function tests if a single character string is uppercase. diff --git a/content/v2.0/reference/flux/stdlib/strings/lastindex.md b/content/v2.0/reference/flux/stdlib/strings/lastindex.md index 46b460c30..de47b378c 100644 --- a/content/v2.0/reference/flux/stdlib/strings/lastindex.md +++ b/content/v2.0/reference/flux/stdlib/strings/lastindex.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/index/ - - /v2.0/reference/flux/functions/strings/indexany/ - - /v2.0/reference/flux/functions/strings/lastindexany/ + - /v2.0/reference/flux/stdlib/strings/index/ + - /v2.0/reference/flux/stdlib/strings/indexany/ + - /v2.0/reference/flux/stdlib/strings/lastindexany/ --- The `strings.lastIndex()` function returns the index of the last instance of a substring diff --git a/content/v2.0/reference/flux/stdlib/strings/lastindexany.md b/content/v2.0/reference/flux/stdlib/strings/lastindexany.md index e1b0c804e..3f93e97a6 100644 --- a/content/v2.0/reference/flux/stdlib/strings/lastindexany.md +++ b/content/v2.0/reference/flux/stdlib/strings/lastindexany.md @@ -9,9 +9,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/index/ - - /v2.0/reference/flux/functions/strings/indexany/ - - /v2.0/reference/flux/functions/strings/lastindex/ + - /v2.0/reference/flux/stdlib/strings/index/ + - /v2.0/reference/flux/stdlib/strings/indexany/ + - /v2.0/reference/flux/stdlib/strings/lastindex/ --- The `strings.lastIndexAny()` function returns the index of the last instance of any specified characters in a string. diff --git a/content/v2.0/reference/flux/stdlib/strings/replace.md b/content/v2.0/reference/flux/stdlib/strings/replace.md index 89d372af2..caa1bcbd1 100644 --- a/content/v2.0/reference/flux/stdlib/strings/replace.md +++ b/content/v2.0/reference/flux/stdlib/strings/replace.md @@ -11,7 +11,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/replaceall + - /v2.0/reference/flux/stdlib/strings/replaceall --- The `strings.replace()` function replaces the first `i` non-overlapping instances diff --git a/content/v2.0/reference/flux/stdlib/strings/replaceall.md b/content/v2.0/reference/flux/stdlib/strings/replaceall.md index 95eb56f92..e129c6405 100644 --- a/content/v2.0/reference/flux/stdlib/strings/replaceall.md +++ b/content/v2.0/reference/flux/stdlib/strings/replaceall.md @@ -11,7 +11,7 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/replace + - /v2.0/reference/flux/stdlib/strings/replace --- The `strings.replaceAll()` function replaces all non-overlapping instances of a diff --git a/content/v2.0/reference/flux/stdlib/strings/split.md b/content/v2.0/reference/flux/stdlib/strings/split.md index c6096c0cd..aeea22df0 100644 --- a/content/v2.0/reference/flux/stdlib/strings/split.md +++ b/content/v2.0/reference/flux/stdlib/strings/split.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/splitafter - - /v2.0/reference/flux/functions/strings/splitaftern - - /v2.0/reference/flux/functions/strings/splitn + - /v2.0/reference/flux/stdlib/strings/splitafter + - /v2.0/reference/flux/stdlib/strings/splitaftern + - /v2.0/reference/flux/stdlib/strings/splitn --- The `strings.split()` function splits a string on a specified separator and returns diff --git a/content/v2.0/reference/flux/stdlib/strings/splitafter.md b/content/v2.0/reference/flux/stdlib/strings/splitafter.md index fe6fb092b..65e0542c7 100644 --- a/content/v2.0/reference/flux/stdlib/strings/splitafter.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitafter.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/split - - /v2.0/reference/flux/functions/strings/splitaftern - - /v2.0/reference/flux/functions/strings/splitn + - /v2.0/reference/flux/stdlib/strings/split + - /v2.0/reference/flux/stdlib/strings/splitaftern + - /v2.0/reference/flux/stdlib/strings/splitn --- The `strings.splitAfter()` function splits a string after a specified separator and returns diff --git a/content/v2.0/reference/flux/stdlib/strings/splitaftern.md b/content/v2.0/reference/flux/stdlib/strings/splitaftern.md index 54e26208f..f37feef5c 100644 --- a/content/v2.0/reference/flux/stdlib/strings/splitaftern.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitaftern.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/split - - /v2.0/reference/flux/functions/strings/splitafter - - /v2.0/reference/flux/functions/strings/splitn + - /v2.0/reference/flux/stdlib/strings/split + - /v2.0/reference/flux/stdlib/strings/splitafter + - /v2.0/reference/flux/stdlib/strings/splitn --- The `strings.splitAfterN()` function splits a string after a specified separator and returns diff --git a/content/v2.0/reference/flux/stdlib/strings/splitn.md b/content/v2.0/reference/flux/stdlib/strings/splitn.md index cd027bc92..c3481beb6 100644 --- a/content/v2.0/reference/flux/stdlib/strings/splitn.md +++ b/content/v2.0/reference/flux/stdlib/strings/splitn.md @@ -11,9 +11,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/split - - /v2.0/reference/flux/functions/strings/splitafter - - /v2.0/reference/flux/functions/strings/splitaftern + - /v2.0/reference/flux/stdlib/strings/split + - /v2.0/reference/flux/stdlib/strings/splitafter + - /v2.0/reference/flux/stdlib/strings/splitaftern --- The `strings.splitN()` function splits a string on a specified separator and returns diff --git a/content/v2.0/reference/flux/stdlib/strings/title.md b/content/v2.0/reference/flux/stdlib/strings/title.md index e438b82b3..53357507b 100644 --- a/content/v2.0/reference/flux/stdlib/strings/title.md +++ b/content/v2.0/reference/flux/stdlib/strings/title.md @@ -9,9 +9,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/tolower - - /v2.0/reference/flux/functions/strings/totitle - - /v2.0/reference/flux/functions/strings/toupper + - /v2.0/reference/flux/stdlib/strings/tolower + - /v2.0/reference/flux/stdlib/strings/totitle + - /v2.0/reference/flux/stdlib/strings/toupper --- The `strings.title()` function converts a string to title case. diff --git a/content/v2.0/reference/flux/stdlib/strings/tolower.md b/content/v2.0/reference/flux/stdlib/strings/tolower.md index 7de34c079..1a58ccdc8 100644 --- a/content/v2.0/reference/flux/stdlib/strings/tolower.md +++ b/content/v2.0/reference/flux/stdlib/strings/tolower.md @@ -9,9 +9,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/totitle - - /v2.0/reference/flux/functions/strings/toupper - - /v2.0/reference/flux/functions/strings/title + - /v2.0/reference/flux/stdlib/strings/totitle + - /v2.0/reference/flux/stdlib/strings/toupper + - /v2.0/reference/flux/stdlib/strings/title --- The `strings.toLower()` function converts a string to lowercase. diff --git a/content/v2.0/reference/flux/stdlib/strings/totitle.md b/content/v2.0/reference/flux/stdlib/strings/totitle.md index 8b9b2c5dc..733219824 100644 --- a/content/v2.0/reference/flux/stdlib/strings/totitle.md +++ b/content/v2.0/reference/flux/stdlib/strings/totitle.md @@ -9,9 +9,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/toupper - - /v2.0/reference/flux/functions/strings/tolower - - /v2.0/reference/flux/functions/strings/title + - /v2.0/reference/flux/stdlib/strings/toupper + - /v2.0/reference/flux/stdlib/strings/tolower + - /v2.0/reference/flux/stdlib/strings/title --- The `strings.toTitle()` function converts all characters in a string to title case. diff --git a/content/v2.0/reference/flux/stdlib/strings/toupper.md b/content/v2.0/reference/flux/stdlib/strings/toupper.md index 6935824a2..948f520a1 100644 --- a/content/v2.0/reference/flux/stdlib/strings/toupper.md +++ b/content/v2.0/reference/flux/stdlib/strings/toupper.md @@ -9,9 +9,9 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/totitle - - /v2.0/reference/flux/functions/strings/tolower - - /v2.0/reference/flux/functions/strings/title + - /v2.0/reference/flux/stdlib/strings/totitle + - /v2.0/reference/flux/stdlib/strings/tolower + - /v2.0/reference/flux/stdlib/strings/title --- The `strings.toUpper()` function converts a string to uppercase. diff --git a/content/v2.0/reference/flux/stdlib/strings/trim.md b/content/v2.0/reference/flux/stdlib/strings/trim.md index 7e20fd510..c9ba4fc0c 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trim.md +++ b/content/v2.0/reference/flux/stdlib/strings/trim.md @@ -11,11 +11,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trimleft - - /v2.0/reference/flux/functions/strings/trimright - - /v2.0/reference/flux/functions/strings/trimprefix - - /v2.0/reference/flux/functions/strings/trimsuffix - - /v2.0/reference/flux/functions/strings/trimspace + - /v2.0/reference/flux/stdlib/strings/trimleft + - /v2.0/reference/flux/stdlib/strings/trimright + - /v2.0/reference/flux/stdlib/strings/trimprefix + - /v2.0/reference/flux/stdlib/strings/trimsuffix + - /v2.0/reference/flux/stdlib/strings/trimspace --- The `strings.trim()` function removes leading and trailing characters specified diff --git a/content/v2.0/reference/flux/stdlib/strings/trimleft.md b/content/v2.0/reference/flux/stdlib/strings/trimleft.md index 513d1a262..f4cf088bc 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trimleft.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimleft.md @@ -10,11 +10,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trim - - /v2.0/reference/flux/functions/strings/trimright - - /v2.0/reference/flux/functions/strings/trimprefix - - /v2.0/reference/flux/functions/strings/trimsuffix - - /v2.0/reference/flux/functions/strings/trimspace + - /v2.0/reference/flux/stdlib/strings/trim + - /v2.0/reference/flux/stdlib/strings/trimright + - /v2.0/reference/flux/stdlib/strings/trimprefix + - /v2.0/reference/flux/stdlib/strings/trimsuffix + - /v2.0/reference/flux/stdlib/strings/trimspace --- The `strings.trimLeft()` function removes specified leading characters from a string. diff --git a/content/v2.0/reference/flux/stdlib/strings/trimprefix.md b/content/v2.0/reference/flux/stdlib/strings/trimprefix.md index ae5d4dc2b..441b64823 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trimprefix.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimprefix.md @@ -11,11 +11,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trim - - /v2.0/reference/flux/functions/strings/trimleft - - /v2.0/reference/flux/functions/strings/trimright - - /v2.0/reference/flux/functions/strings/trimsuffix - - /v2.0/reference/flux/functions/strings/trimspace + - /v2.0/reference/flux/stdlib/strings/trim + - /v2.0/reference/flux/stdlib/strings/trimleft + - /v2.0/reference/flux/stdlib/strings/trimright + - /v2.0/reference/flux/stdlib/strings/trimsuffix + - /v2.0/reference/flux/stdlib/strings/trimspace --- The `strings.trimPrefix()` function removes a prefix from a string. diff --git a/content/v2.0/reference/flux/stdlib/strings/trimright.md b/content/v2.0/reference/flux/stdlib/strings/trimright.md index 51e1d9bfa..35419498d 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trimright.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimright.md @@ -10,11 +10,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trim - - /v2.0/reference/flux/functions/strings/trimleft - - /v2.0/reference/flux/functions/strings/trimprefix - - /v2.0/reference/flux/functions/strings/trimsuffix - - /v2.0/reference/flux/functions/strings/trimspace + - /v2.0/reference/flux/stdlib/strings/trim + - /v2.0/reference/flux/stdlib/strings/trimleft + - /v2.0/reference/flux/stdlib/strings/trimprefix + - /v2.0/reference/flux/stdlib/strings/trimsuffix + - /v2.0/reference/flux/stdlib/strings/trimspace --- The `strings.trimRight()` function removes trailing characters specified in the diff --git a/content/v2.0/reference/flux/stdlib/strings/trimspace.md b/content/v2.0/reference/flux/stdlib/strings/trimspace.md index e35c34809..0645b8b71 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trimspace.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimspace.md @@ -9,11 +9,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trim - - /v2.0/reference/flux/functions/strings/trimleft - - /v2.0/reference/flux/functions/strings/trimright - - /v2.0/reference/flux/functions/strings/trimprefix - - /v2.0/reference/flux/functions/strings/trimsuffix + - /v2.0/reference/flux/stdlib/strings/trim + - /v2.0/reference/flux/stdlib/strings/trimleft + - /v2.0/reference/flux/stdlib/strings/trimright + - /v2.0/reference/flux/stdlib/strings/trimprefix + - /v2.0/reference/flux/stdlib/strings/trimsuffix --- The `strings.trimSpace()` function removes leading and trailing spaces from a string. diff --git a/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md b/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md index 262c496ce..7d6d12f79 100644 --- a/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md +++ b/content/v2.0/reference/flux/stdlib/strings/trimsuffix.md @@ -11,11 +11,11 @@ menu: parent: Strings weight: 301 related: - - /v2.0/reference/flux/functions/strings/trim - - /v2.0/reference/flux/functions/strings/trimleft - - /v2.0/reference/flux/functions/strings/trimright - - /v2.0/reference/flux/functions/strings/trimprefix - - /v2.0/reference/flux/functions/strings/trimspace + - /v2.0/reference/flux/stdlib/strings/trim + - /v2.0/reference/flux/stdlib/strings/trimleft + - /v2.0/reference/flux/stdlib/strings/trimright + - /v2.0/reference/flux/stdlib/strings/trimprefix + - /v2.0/reference/flux/stdlib/strings/trimspace --- The `strings.trimSuffix()` function removes a suffix from a string. diff --git a/content/v2.0/reference/flux/stdlib/testing/assertempty.md b/content/v2.0/reference/flux/stdlib/testing/assertempty.md index d85afa1de..f5d56d680 100644 --- a/content/v2.0/reference/flux/stdlib/testing/assertempty.md +++ b/content/v2.0/reference/flux/stdlib/testing/assertempty.md @@ -2,7 +2,7 @@ title: testing.assertEmpty() function description: The testing.assertEmpty() function tests if an input stream is empty. aliases: - - /v2.0/reference/flux/functions/testing/ + - /v2.0/reference/flux/functions/testing/assertempty/ menu: v2_0_ref: name: testing.assertEmpty @@ -26,7 +26,7 @@ _The `testing.assertEmpty()` function can be used to perform in-line tests in a ## Examples #### Check if there is a difference between streams -This example uses the [`testing.diff()` function](/v2.0/reference/flux/functions/testing/diff) +This example uses the [`testing.diff()` function](/v2.0/reference/flux/stdlib/testing/diff) which outputs the diff for the two streams. The `.testing.assertEmpty()` function checks to see if the diff is empty. @@ -41,4 +41,3 @@ got |> testing.diff(want: want) |> testing.assertEmpty() ``` -- /v2.0/reference/flux/functions/testing/assertempty/ diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index 1111627d2..285fe1278 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -30,7 +30,7 @@ Related entries: [input plugin](#input-plugin), [output plugin](#output-plugin), ### aggregate A function that returns an aggregated value across a set of points. -For a list of available aggregation functions, see [Flux built-in aggregate functions](/v2.0/reference/flux/functions/built-in/transformations/aggregates/). +For a list of available aggregation functions, see [Flux built-in aggregate functions](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/). Related entries: [function](#function), [selector](#selector), [transformation](#transformation) @@ -336,7 +336,7 @@ A lightweight scripting language for querying databases (like InfluxDB) and work ### function -Flux functions aggregate, select, and transform time series data. For a complete list of Flux functions, see [Flux functions](/v2.0/reference/flux/functions/all-functions/). +Flux functions aggregate, select, and transform time series data. For a complete list of Flux functions, see [Flux functions](/v2.0/reference/flux/stdlib/all-functions/). Related entries: [aggregation](#aggregation), [selector](#selector), [transformation](#transformation) @@ -711,7 +711,7 @@ InfluxDB scrapes data from specified targets at regular intervals and writes the ### selector A Flux function that returns a single point from the range of specified points. -See [Flux built-in selector functions](/v2.0/reference/flux/functions/built-in/transformations/selectors/) for a complete list of available built-in selector functions. +See [Flux built-in selector functions](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/) for a complete list of available built-in selector functions. Related entries: [aggregation](#aggregation), [function](#function), [transformation](#transformation) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 8d5d09809..87ad2ec31 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -394,9 +394,9 @@ In Flux 0.39.0, `holtWinters()` can cause the query engine to panic. ### Features - Add stream table index functions ( - [`tableFind()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind/), - [`getRecord()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/getrecord/), - [`getColumn()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/getcolumn/) + [`tableFind()`](/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind/), + [`getRecord()`](/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord/), + [`getColumn()`](/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn/) ). - Construct invalid binary expressions when given multiple expressions. diff --git a/content/v2.0/visualize-data/variables/_index.md b/content/v2.0/visualize-data/variables/_index.md index a05853f1a..2ee717f8f 100644 --- a/content/v2.0/visualize-data/variables/_index.md +++ b/content/v2.0/visualize-data/variables/_index.md @@ -40,14 +40,14 @@ The InfluxDB user interface (UI) provides the following predefined dashboard var #### v.timeRangeStart Specifies the beginning of the queried time range. -This variable is typically used to define the [`start` parameter](/v2.0/reference/flux/functions/built-in/transformations/range#start) +This variable is typically used to define the [`start` parameter](/v2.0/reference/flux/stdlib/built-in/transformations/range#start) of the `range()` function. The **Time Range** selector defines the value of this variable. #### v.timeRangeStop Specifies the end of the queried time range. -This variable is typically used to define the [`stop` parameter](/v2.0/reference/flux/functions/built-in/transformations/range#stop) +This variable is typically used to define the [`stop` parameter](/v2.0/reference/flux/stdlib/built-in/transformations/range#stop) of the `range()` function. The **Time Range** selector defines the value of this variable. @@ -56,7 +56,7 @@ It defaults to `now`. #### v.windowPeriod Specifies the period of windowed data. This variable is typically used to define the `every` or `period` parameters of the -[`window()` function](/v2.0/reference/flux/functions/built-in/transformations/window) +[`window()` function](/v2.0/reference/flux/stdlib/built-in/transformations/window) in data aggregation operations. The value of this variable is calculated by analyzing the duration of the Flux diff --git a/content/v2.0/visualize-data/variables/common-variables.md b/content/v2.0/visualize-data/variables/common-variables.md index c05f9065b..77d57e749 100644 --- a/content/v2.0/visualize-data/variables/common-variables.md +++ b/content/v2.0/visualize-data/variables/common-variables.md @@ -13,9 +13,9 @@ weight: 208 List all buckets in the current organization. _**Flux functions:** -[buckets()](/v2.0/reference/flux/functions/built-in/inputs/buckets/), -[rename()](/v2.0/reference/flux/functions/built-in/transformations/rename/), -[keep()](/v2.0/reference/flux/functions/built-in/transformations/keep/)_ +[buckets()](/v2.0/reference/flux/stdlib/built-in/inputs/buckets/), +[rename()](/v2.0/reference/flux/stdlib/built-in/transformations/rename/), +[keep()](/v2.0/reference/flux/stdlib/built-in/transformations/keep/)_ ```js buckets() @@ -26,8 +26,8 @@ buckets() ## List measurements List all measurements in a specified bucket. -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/) -**Flux functions:** [v1.measurements()](/v2.0/reference/flux/functions/influxdb-v1/measurements/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/) +**Flux functions:** [v1.measurements()](/v2.0/reference/flux/stdlib/influxdb-v1/measurements/)_ ```js import "influxdata/influxdb/v1" @@ -37,8 +37,8 @@ v1.measurements(bucket: "bucket-name") ## List fields in a measurement List all fields in a specified bucket and measurement. -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/) -**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/) +**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues/)_ ```js import "influxdata/influxdb/v1" @@ -53,8 +53,8 @@ v1.measurementTagValues( List all unique tag values for a specific tag in a specified bucket. The example below lists all unique values of the `host` tag. -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/)_ -_**Flux functions:** [v1.measurements()](/v2.0/reference/flux/functions/influxdb-v1/measurements/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/)_ +_**Flux functions:** [v1.measurements()](/v2.0/reference/flux/stdlib/influxdb-v1/measurements/)_ ```js import "influxdata/influxdb/v1" @@ -65,8 +65,8 @@ v1.tagValues(bucket: "bucket-name", tag: "host") List all Docker containers when using the Docker Telegraf plugin. _**Telegraf plugin:** [Docker](https://docs.influxdata.com/telegraf/latest/plugins/inputs/#docker)_ -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/)_ -_**Flux functions:** [v1.tagValues()](/v2.0/reference/flux/functions/influxdb-v1/tagvalues/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/)_ +_**Flux functions:** [v1.tagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/tagvalues/)_ ```js import "influxdata/influxdb/v1" @@ -77,8 +77,8 @@ v1.tagValues(bucket: "bucket-name", tag: "container_name") List all Kubernetes pods when using the Kubernetes Telegraf plugin. _**Telegraf plugin:** [Kubernetes](https://docs.influxdata.com/telegraf/latest/plugins/inputs/#kubernetes)_ -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/)_ -_**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/)_ +_**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues/)_ ```js import "influxdata/influxdb/v1" @@ -93,8 +93,8 @@ v1.measurementTagValues( List all Kubernetes nodes when using the Kubernetes Telegraf plugin. _**Telegraf plugin:** [Kubernetes](https://docs.influxdata.com/telegraf/latest/plugins/inputs/#kubernetes)_ -_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/functions/influxdb-v1/)_ -_**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/functions/influxdb-v1/measurementtagvalues/)_ +_**Flux package:** [InfluxDB v1](/v2.0/reference/flux/stdlib/influxdb-v1/)_ +_**Flux functions:** [v1.measurementTagValues()](/v2.0/reference/flux/stdlib/influxdb-v1/measurementtagvalues/)_ ```js import "influxdata/influxdb/v1" diff --git a/content/v2.0/visualize-data/variables/variable-types.md b/content/v2.0/visualize-data/variables/variable-types.md index cc771cc68..f84ca59cc 100644 --- a/content/v2.0/visualize-data/variables/variable-types.md +++ b/content/v2.0/visualize-data/variables/variable-types.md @@ -49,11 +49,11 @@ _For examples of dashboard variable queries, see [Common variable queries](/v2.0 #### Important things to note about variable queries - The variable will only use values from the `_value` column. If the data you’re looking for is in a column other than `_value`, use the - [`rename()`](/v2.0/reference/flux/functions/built-in/transformations/rename/) or - [`map()`](/v2.0/reference/flux/functions/built-in/transformations/map/) functions + [`rename()`](/v2.0/reference/flux/stdlib/built-in/transformations/rename/) or + [`map()`](/v2.0/reference/flux/stdlib/built-in/transformations/map/) functions to change the name of that column to `_value`. - The variable will only use the first table in the output stream. - Use the [`group()` function](/v2.0/reference/flux/functions/built-in/transformations/group) + Use the [`group()` function](/v2.0/reference/flux/stdlib/built-in/transformations/group) to group everything into a single table. - Do not use any [predefined dashboard variables](/v2.0/visualize-data/variables/#predefined-dashboard-variables) in variable queries. {{% /note %}} From 70d382e87f6fe03298461602b8efec1faff03f6a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 13:40:31 -0600 Subject: [PATCH 207/258] fixed broken links related to flux functions --- content/v2.0/cloud/get-started.md | 2 +- .../built-in/transformations/aggregates/_index.md | 12 ++++++------ .../built-in/transformations/aggregates/tripleema.md | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/v2.0/cloud/get-started.md b/content/v2.0/cloud/get-started.md index be12978cf..ef490de8c 100644 --- a/content/v2.0/cloud/get-started.md +++ b/content/v2.0/cloud/get-started.md @@ -117,7 +117,7 @@ The primary differences between InfluxDB OSS 2.0 and InfluxDB Cloud 2.0 are: targets are not available in {{< cloud-name "short" >}}. - {{< cloud-name "short" >}} instances are currently limited to a single organization with a single user. - Retrieving data from a file based CSV source using the `file` parameter of the - [`csv.from()`](/v2/reference/flux/functions/csv/from) function is not supported; + [`csv.from()`](/v2.0/reference/flux/functions/csv/from) function is not supported; however you can use raw CSV data with the `csv` parameter. - Multi-organization accounts and multi-user organizations are currently not available in {{< cloud-name >}}. diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md index 9fa9aea45..b14244358 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/_index.md @@ -44,9 +44,9 @@ The following functions are both aggregates and selectors. Each returns `n` values after performing an aggregate operation. They are categorized as selector functions in this documentation: -- [highestAverage](/v2.0/reference/flux/stdlib/transformations/selectors/highestaverage) -- [highestCurrent](/v2.0/reference/flux/stdlib/transformations/selectors/highestcurrent) -- [highestMax](/v2.0/reference/flux/stdlib/transformations/selectors/highestmax) -- [lowestAverage](/v2.0/reference/flux/stdlib/transformations/selectors/lowestaverage) -- [lowestCurrent](/v2.0/reference/flux/stdlib/transformations/selectors/lowestcurrent) -- [lowestMin](/v2.0/reference/flux/stdlib/transformations/selectors/lowestmin) +- [highestAverage](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestaverage) +- [highestCurrent](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestcurrent) +- [highestMax](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/highestmax) +- [lowestAverage](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestaverage) +- [lowestCurrent](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestcurrent) +- [lowestMin](/v2.0/reference/flux/stdlib/built-in/transformations/selectors/lowestmin) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md index aa55e2527..846660cf2 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md @@ -16,7 +16,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() --- The `tripleEMA()` function calculates the exponential moving average of values in From 9ff4ff6d13a103f0daf42d437dff8f02822ef2ce Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 10 Sep 2019 13:55:15 -0600 Subject: [PATCH 208/258] added monitoring and alerts release to cloud release notes --- .../reference/release-notes/influxdb-cloud.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/content/v2.0/reference/release-notes/influxdb-cloud.md b/content/v2.0/reference/release-notes/influxdb-cloud.md index ecc8371ae..fac08da6c 100644 --- a/content/v2.0/reference/release-notes/influxdb-cloud.md +++ b/content/v2.0/reference/release-notes/influxdb-cloud.md @@ -10,12 +10,23 @@ aliases: - /cloud/about/release-notes --- +## 2019-09-10 _Monitoring & Alerts_ + +## Features +- **InfluxDB 2.0 alpha-17** – + _See the [alpha-17 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-17-2019-08-14) for details._ +- Alerts and Notifications to Slack (Free Tier), PagerDuty and HTTP (Pay As You Go). +- Rate limiting on cardinality for Free Tier. +- Billing notifications. +- Pricing calculator. +- Improved Signup flow. + ## 2019-07-23 _General Availability_ ### Features - **InfluxDB 2.0 alpha-15** – -_See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-15-2019-07-11) for details._ + _See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-15-2019-07-11) for details._ - Pay As You Go Pricing Plan. - Adjusted Free Plan rate limits. - Timezone selection in the user interface. @@ -42,7 +53,7 @@ _See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0- ### Features - **InfluxDB 2.0 alpha-9** – -_See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-9-2019-05-01) for details._ + _See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-9-2019-05-01) for details._ ### Bug fixes @@ -59,7 +70,7 @@ _See the [alpha-9 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0- ### Features - **InfluxDB 2.0 alpha-7** – -_See the [alpha-7 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-7-2019-03-28) for details._ + _See the [alpha-7 release notes](/v2.0/reference/release-notes/influxdb/#v2-0-0-alpha-7-2019-03-28) for details._ ### Bug fixes From 41172ca400b4e01a2d777113f06122e098fecd33 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 13:01:14 -0700 Subject: [PATCH 209/258] add edits from Russ --- content/v2.0/monitor-alert/_index.md | 6 +++--- content/v2.0/monitor-alert/notification-endpoints/create.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index 946e0b88b..ad72da7b7 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -16,9 +16,9 @@ Monitor your time series data and send alerts by creating checks, notification rules, and notification endpoints. ## The monitoring workflow -1. InfluxDB uses a [check](/v2.0/reference/glossary/#check) to query data and - assign a status or `_level` based on specific conditions. -2. InfluxDB stores the output the check in the `statuses` measurement in the `_monitoring` system bucket. + +1. A [check](/v2.0/reference/glossary/#check) in InfluxDB queries data and assigns a status with a `_level` based on specific conditions. +2. InfluxDB stores the output of a check in the `statuses` measurement in the `_monitoring` system bucket. 3. [Notification rules](/v2.0/reference/glossary/#notification-rule) check data in the `statuses` measurement and, based on conditions set in the notification rule, send a message to a [notification endpoint](/v2.0/reference/glossary/#notification-endpoint). diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index b51708d33..2e4f97043 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -39,6 +39,6 @@ To send notifications about changes in your data, start by creating a notificati - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. By default, the **Client URL** is https://twodotoh.a.influxcloud.net/orgs//alert-history. When you click your notification in PagerDuty, this is the page that opens. + - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. The **Client URL** provides a useful link in your PagerDuty notification; set to any URL that you'd like to use to investigate issues. By default, the **Client URL** is set to your Monitoring & Alerting History page. 6. Click **Create Notification Endpoint**. From 01b31a2f23bfaa567814d6db00ba8a170fbadd73 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 15:38:54 -0700 Subject: [PATCH 210/258] fix format and update content in pricing calc --- content/v2.0/cloud/pricing-calculator.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/content/v2.0/cloud/pricing-calculator.md b/content/v2.0/cloud/pricing-calculator.md index 8f8197725..bca77ea4b 100644 --- a/content/v2.0/cloud/pricing-calculator.md +++ b/content/v2.0/cloud/pricing-calculator.md @@ -31,16 +31,14 @@ Guidelines used to estimate costs for default configurations: **To estimate costs** -1. If you're using the Free plan, hover over the **Usage** icon in the left navigation bar and select **Billing**. +1. Do one of the following: -{{< nav-icon "cloud" >}} + - Free plan. Hover over the **Usage** icon in the left navigation bar and select **Billing**. -2. Click the **Pricing Calculator** link at the bottom of the page. - -{{% note %}} -If you're using the Pay As You Go plan, open the pricing calculator [here](https://cloud2.influxdata.com/pricing). -{{% /note %}} + {{< nav-icon "cloud" >}} + Then click the **Pricing Calculator** link at the bottom of the page. + - Pay As You Go plan. Open the pricing calculator [here](https://cloud2.influxdata.com/pricing). 3. Choose your region. 4. Select your configuration: - **Hobby**. For a single user monitoring a few machines or sensors. From 7ccf5b6749537e7290623bd524c9dbd64d50f51c Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 15:58:22 -0700 Subject: [PATCH 211/258] add edits from Tim --- content/v2.0/monitor-alert/notification-endpoints/create.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index 2e4f97043..d692eaafa 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -39,6 +39,8 @@ To send notifications about changes in your data, start by creating a notificati - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - - For PagerDuty, [create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. The **Client URL** provides a useful link in your PagerDuty notification; set to any URL that you'd like to use to investigate issues. By default, the **Client URL** is set to your Monitoring & Alerting History page. + - For PagerDuty: + - [Create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. + - The **Client URL** provides a useful link in your PagerDuty notification. Enter any URL that you'd like to use to investigate issues. This URL is sent as the `client_url` property in the PagerDuty trigger event. By default, the **Client URL** is set to your Monitoring & Alerting History page, and the following included in the PagerDuty trigger event: `"client_url": "https://twodotoh.a.influxcloud.net/orgs//alert-history”` 6. Click **Create Notification Endpoint**. From 6ef23bec94fb60d4327b16cadb70a37809dbb36d Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 16:28:54 -0700 Subject: [PATCH 212/258] remove extra heading; correct note format --- content/v2.0/cloud/account-management/billing.md | 2 -- content/v2.0/monitor-alert/notification-endpoints/update.md | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/content/v2.0/cloud/account-management/billing.md b/content/v2.0/cloud/account-management/billing.md index 95f4ae50c..b6622a065 100644 --- a/content/v2.0/cloud/account-management/billing.md +++ b/content/v2.0/cloud/account-management/billing.md @@ -10,8 +10,6 @@ menu: name: Add payment and view billing --- -## Manage your InfluxDB Cloud payment and billing information - - Hover over the **Usage** icon in the left navigation bar and select **Billing**. {{< nav-icon "cloud" >}} diff --git a/content/v2.0/monitor-alert/notification-endpoints/update.md b/content/v2.0/monitor-alert/notification-endpoints/update.md index a49675a4d..585a13932 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/update.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -13,9 +13,7 @@ related: cloud_all: true --- -To update the notification endpoint details, complete the following procedures as needed. - -> **Note:** To update the notification endpoint selected for a notification rule, see [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/). +To update the notification endpoint details, complete the procedures below as needed. To update the notification endpoint selected for a notification rule, see [update notification rules](/v2.0/cloud/monitor-alert/update-notification-rules/). ## Add a label to notification endpoint From bb5dc69ccf6fe9e5c417d5f2d8cfe891937991bb Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 10 Sep 2019 16:50:08 -0700 Subject: [PATCH 213/258] add csv example with all required annotations --- content/v2.0/reference/annotated-csv.md | 93 +++++++++---------------- 1 file changed, 34 insertions(+), 59 deletions(-) diff --git a/content/v2.0/reference/annotated-csv.md b/content/v2.0/reference/annotated-csv.md index 0cf966ad5..98babc166 100644 --- a/content/v2.0/reference/annotated-csv.md +++ b/content/v2.0/reference/annotated-csv.md @@ -13,6 +13,7 @@ Annotated CSV (comma-separated values) format is used to encode HTTP responses a CSV tables must be encoded in UTF-8 and Unicode Normal Form C as defined in [UAX15](http://www.unicode.org/reports/tr15/). Line endings must be CRLF (Carriage Return Line Feed) as defined by the `text/csv` MIME type in [RFC 4180](https://tools.ietf.org/html/rfc4180). ## Examples + In this topic, you'll find examples of valid CSV syntax for responses to the following query: ```js @@ -23,12 +24,15 @@ from(bucket:"mydb/autogen") ``` ## CSV response format + Flux supports encodings listed below. ### Tables + A table may have the following rows and columns. #### Rows + - **Annotation rows**: describe column properties. - **Header row**: defines column labels (one header row per table). @@ -36,6 +40,7 @@ A table may have the following rows and columns. - **Record row**: describes data in the table (one record per row). ##### Example + Encoding of a table with and without a header row. {{< code-tabs-wrapper >}} @@ -63,6 +68,7 @@ my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east, {{< /code-tabs-wrapper >}} #### Columns + In addition to the data columns, a table may include the following columns: - **Annotation column**: Only used in annotation rows. Always the first column. Displays the name of an annotation. Value can be empty or a supported [annotation](#annotations). You'll notice a space for this column for the entire length of the table, so rows appear to start with `,`. @@ -72,6 +78,7 @@ In addition to the data columns, a table may include the following columns: - **Table column**: Contains a unique ID for each table in a result. ### Multiple tables and results + If a file or data stream contains multiple tables or results, the following requirements must be met: - A table column indicates which table a row belongs to. @@ -82,6 +89,7 @@ If a file or data stream contains multiple tables or results, the following requ - Each new table boundary starts with new annotation and header rows. ##### Example + Encoding of two tables in the same result with the same schema (header row) and different schema. {{< code-tabs-wrapper >}} @@ -119,6 +127,7 @@ my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,west, {{< /code-tabs-wrapper >}} ### Dialect options + Flux supports the following dialect options for `text/csv` format. | Option | Description| Default | @@ -130,7 +139,8 @@ Flux supports the following dialect options for `text/csv` format. | **commentPrefix** | String prefix to identify a comment. Always added to annotations. |`#`| ### Annotations -Annotation rows are optional, describe column properties, and start with `#` (or commentPrefix value). The first column in an annotation row always contains the annotation name. Subsequent columns contain annotation values as shown in the table below. + +Annotation rows describe column properties, and start with `#` (or commentPrefix value). The first column in an annotation row always contains the annotation name. Subsequent columns contain annotation values as shown in the table below. |Annotation name | Values| Description | | :-------- | :--------- | :-------| @@ -138,67 +148,30 @@ Annotation rows are optional, describe column properties, and start with `#` (or | **group** | boolean flag `true` or `false` | Indicates the column is part of the group key.| | **default** | a [valid data type](#Valid-data-types) |Value to use for rows with an empty string value.| -##### Example -Encoding of datatype and group annotations for two tables. - -{{< code-tabs-wrapper >}} -{{% code-tabs %}} -[Datatype annotation](#) -[Group annotation](#) -[Datatype and group annotations](#) -{{% /code-tabs %}} - -{{% code-tab-content %}} -```js -#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,string,string,double -,result,table,_start,_stop,_time,region,host,_value -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,west,A,62.73 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,west,B,12.83 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,west,C,51.62 -``` -{{% /code-tab-content %}} - -{{% code-tab-content %}} -```js -#group,false,false,true,true,false,true,false,false -,result,table,_start,_stop,_time,region,host,_value -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,west,A,62.73 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,west,B,12.83 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,west,C,51.62 -``` -{{% /code-tab-content %}} - - -{{% code-tab-content %}} -```js -#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,string,string,double -,result,table,_start,_stop,_time,region,host,_value -#group,false,false,true,true,false,true,false,false -,result,table,_start,_stop,_time,region,host,_value -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 -,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,west,A,62.73 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,west,B,12.83 -,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,west,C,51.62 -``` -{{% /code-tab-content %}} -{{< /code-tabs-wrapper >}} - - -**Notes:** {{% note %}} -To encode a table with its group key, the `datatype`, `group`, and `default` annotations must be included. - -If a table has no rows, the `default` annotation provides the group key values. +To encode a table with its group key, the `datatype`, `group`, and `default` annotations must be included. If a table has no rows, the `default` annotation provides the group key values. {{% /note %}} +##### Example + +Example encoding of datatype, group, and default annotations. + +```js +import "csv" +a = "#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,string,string,double +#group,false,false,false,false,false,false,false,false +#default,,,,,,,, +,result,table,_start,_stop,_time,region,host,_value +,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,east,A,15.43 +,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,east,B,59.25 +,my-result,0,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,east,C,52.62 +,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:00Z,west,A,62.73 +,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:20Z,west,B,12.83 +,my-result,1,2018-05-08T20:50:00Z,2018-05-08T20:51:00Z,2018-05-08T20:50:40Z,west,C,51.62 +" +csv.from(csv:a) |> yield() +``` + ### Valid data types | Datatype | Flux type | Description | @@ -213,6 +186,7 @@ If a table has no rows, the `default` annotation provides the group key values. | duration | duration | a length of time represented as an unsigned 64-bit integer number of nanoseconds | ## Errors + If an error occurs during execution, a table returns with: - An error column that contains an error message. @@ -225,6 +199,7 @@ If an error occurs: - After partial results are sent to the client, the error is encoded as the next table and remaining results are discarded. In this case, the HTTP status code remains 200 OK. ##### Example + Encoding for an error with the datatype annotation: ```js #datatype,string,long From 70f91ad990d777c1a0c37766fbfa1570f5b3765b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 11 Sep 2019 08:39:16 -0600 Subject: [PATCH 214/258] updated content on flux stdlib landing page --- content/v2.0/reference/flux/stdlib/_index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/v2.0/reference/flux/stdlib/_index.md b/content/v2.0/reference/flux/stdlib/_index.md index 7091b6e78..22acf492c 100644 --- a/content/v2.0/reference/flux/stdlib/_index.md +++ b/content/v2.0/reference/flux/stdlib/_index.md @@ -12,8 +12,7 @@ menu: weight: 102 --- -The Flux standard library of packages and functions allows you to retrieve, -transform, process, and output data easily. -There the standard library includes built-in functions and importable packages: +The Flux standard library includes built-in functions and importable packages that retrieve, transform, +process, and output data. {{< children >}} From ba9e59eb5f8950260f8fc1e587fc5cde59b9cebe Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 11 Sep 2019 08:47:24 -0600 Subject: [PATCH 215/258] updated description on flux stdlib landing --- content/v2.0/reference/flux/stdlib/_index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/v2.0/reference/flux/stdlib/_index.md b/content/v2.0/reference/flux/stdlib/_index.md index 22acf492c..a3b1b89e1 100644 --- a/content/v2.0/reference/flux/stdlib/_index.md +++ b/content/v2.0/reference/flux/stdlib/_index.md @@ -1,8 +1,8 @@ --- title: Flux standard library description: > - The Flux standard library of packages and functions allows you to retrieve, - transform, process, and output data easily. + The Flux standard library includes built-in functions and importable packages + that retrieve, transform, process, and output data. aliases: - /v2.0/reference/flux/functions/ v2.0/tags: [flux, functions, package] @@ -12,7 +12,7 @@ menu: weight: 102 --- -The Flux standard library includes built-in functions and importable packages that retrieve, transform, -process, and output data. +The Flux standard library includes built-in functions and importable packages +that retrieve, transform,rocess, and output data. {{< children >}} From 5517ccb51174ed25cf01737744a26404b632e0bc Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 11 Sep 2019 11:29:41 -0600 Subject: [PATCH 216/258] updated influxdb 1.7 links to latest --- .../aggregates/chandemomentumoscillator.md | 2 +- .../built-in/transformations/aggregates/doubleema.md | 2 +- .../aggregates/exponentialmovingaverage.md | 2 +- .../built-in/transformations/aggregates/kaufmansama.md | 2 +- .../built-in/transformations/aggregates/kaufmanser.md | 2 +- .../aggregates/relativestrengthindex.md | 2 +- .../built-in/transformations/aggregates/tripleema.md | 2 +- .../aggregates/tripleexponentialderivative.md | 2 +- content/v2.0/reference/glossary.md | 10 +++++----- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md index e9cfd5413..781a5bbd4 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/chandemomentumoscillator.md @@ -11,7 +11,7 @@ menu: parent: built-in-aggregates weight: 501 related: - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL CHANDE_MOMENTUM_OSCILLATOR() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#triple-exponential-moving-average, InfluxQL CHANDE_MOMENTUM_OSCILLATOR() --- The `chandeMomentumOscillator()` function applies the technical momentum indicator diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md index 33661396e..54799e1e1 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema.md @@ -16,7 +16,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#double-exponential-moving-average, InfluxQL DOUBLE_EXPONENTIAL_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#double-exponential-moving-average, InfluxQL DOUBLE_EXPONENTIAL_MOVING_AVERAGE() --- The `doubleEMA()` function calculates the exponential moving average of values in diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md index c8394a2a1..960768f25 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage.md @@ -15,7 +15,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#exponential-moving-average, InfluxQL EXPONENTIAL_MOVING_AVERAGE() --- The `exponentialMovingAverage()` function calculates the exponential moving average of values diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md index d5c937d97..dfa323057 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama.md @@ -12,7 +12,7 @@ menu: weight: 501 related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-adaptive-moving-average, InfluxQL KAUFMANS_ADAPTIVE_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#kaufmans-adaptive-moving-average, InfluxQL KAUFMANS_ADAPTIVE_MOVING_AVERAGE() --- The `kaufmansAMA()` function calculates the Kaufman's Adaptive Moving Average (KAMA) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md index f135b1fc2..cca6731c7 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmanser.md @@ -12,7 +12,7 @@ menu: weight: 501 related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/kaufmansama/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#kaufmans-efficiency-ratio, InfluxQL KAUFMANS_EFFICIENCY_RATIO() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#kaufmans-efficiency-ratio, InfluxQL KAUFMANS_EFFICIENCY_RATIO() --- The `kaufmansER()` function calculates the Kaufman's Efficiency Ratio (KER) using diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md index 58f3e283d..58a8cb856 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/relativestrengthindex.md @@ -14,7 +14,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/movingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#relative-strength-index, InfluxQL RELATIVE_STRENGTH_INDEX() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#relative-strength-index, InfluxQL RELATIVE_STRENGTH_INDEX() --- The `relativeStrengthIndex()` function measures the relative speed and change of diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md index 846660cf2..140882c33 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema.md @@ -16,7 +16,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/doubleema/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#triple-exponential-moving-average, InfluxQL TRIPLE_EXPONENTIAL_MOVING_AVERAGE() --- The `tripleEMA()` function calculates the exponential moving average of values in diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md index 15380d849..9d6aee924 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleexponentialderivative.md @@ -17,7 +17,7 @@ related: - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/tripleema/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/timedmovingaverage/ - /v2.0/reference/flux/stdlib/built-in/transformations/aggregates/exponentialmovingaverage/ - - https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#triple-exponential-derivative, InfluxQL TRIPLE_EXPONENTIAL_DERIVATIVE() + - https://docs.influxdata.com/influxdb/latest/query_language/functions/#triple-exponential-derivative, InfluxQL TRIPLE_EXPONENTIAL_DERIVATIVE() --- The `tripleExponentialDerivative()` function calculates a triple exponential diff --git a/content/v2.0/reference/glossary.md b/content/v2.0/reference/glossary.md index 285fe1278..9f3fd3243 100644 --- a/content/v2.0/reference/glossary.md +++ b/content/v2.0/reference/glossary.md @@ -755,7 +755,7 @@ The series cardinality would remain unchanged at 6, as `firstname` is already sc | cliff@influxdata.com| start | clifford | | cliff@influxdata.com| finish | clifford | - + Related entries: [field key](#field-key),[measurement](#measurement), [tag key](#tag-key), [tag set](#tag-set) @@ -786,7 +786,7 @@ Related entries: [series](#series), [shard duration](#shard-duration), [shard gr The shard duration determines how much time each shard group spans. The specific interval is determined by the `SHARD DURATION` of the retention policy. - [user](#user) ### date-time @@ -246,7 +245,7 @@ Aggregating high resolution data into lower resolution data to preserve disk spa A data type that represents a duration of time (1s, 1m, 1h, 1d). Retention policies are set using durations. Data older than the duration is automatically dropped from the database. -Related entries: [retention policy](#retention-policy-rp) + ## E @@ -259,8 +258,8 @@ Metrics gathered at irregular time intervals. In Flux, a an explicit block is a possibly empty sequence of statements within matching braces (`{ }`) that is defined in the source code, for example: ``` -Block = "{" StatementList "} -StatementList = { Statement } +Block = "{" StatementList "} +StatementList = { Statement } ``` Related entries: [implicit block](#implicit-block), [block](#block) @@ -338,7 +337,7 @@ A lightweight scripting language for querying databases (like InfluxDB) and work Flux functions aggregate, select, and transform time series data. For a complete list of Flux functions, see [Flux functions](/v2.0/reference/flux/stdlib/all-functions/). -Related entries: [aggregation](#aggregation), [selector](#selector), [transformation](#transformation) +Related entries: [aggregate](#aggregate), [selector](#selector), [transformation](#transformation) ### function block @@ -384,7 +383,7 @@ Related entries: [bucket](#bucket) [field key](#field-key), [measurement](#measurement), -[retention policy](#retention-policy-rp), + [tag key](#tag-key), [user](#user) @@ -424,7 +423,7 @@ The SQL-like query language used to query data in InfluxDB 1.x. Telegraf input plugins actively gather metrics and deliver them to the core agent, where aggregator, processor, and output plugins can operate on the metrics. In order to activate an input plugin, it needs to be enabled and configured in Telegraf's configuration file. -Related entries: [aggregator plugin](/telegraf/v1.10/concepts/glossary/#aggregator-plugin), [collection interval](/telegraf/v1.10/concepts/glossary/#collection-interval), [output plugin](/telegraf/v1.10/concepts/glossary/#output-plugin), [processor plugin](/telegraf/v1.10/concepts/glossary/#processor-plugin) +Related entries: [aggregator plugin](#aggregator-plugin), [collection interval](#collection-interval), [output plugin](#output-plugin), [processor plugin](#processor-plugin) ### instance @@ -466,7 +465,7 @@ A literal is value in an expression, a number, character, string, function, obje See examples of [Flux literals](/v2.0/reference/flux/language/expressions/#examples-of-function-literals). - @@ -849,7 +848,7 @@ The key-value pair in InfluxDB's data structure that records metadata. Tags are an optional part of InfluxDB's data structure but they are useful for storing commonly-queried metadata; tags are indexed so queries on tags are performant. *Query tip:* Compare tags to fields; fields are not indexed. -Related entries: [field](/influxdb/latest/concepts/glossary/#field), [tag key](/influxdb/latest/concepts/glossary/#tag-key), [tag set](/influxdb/latest/concepts/glossary/#tag-set), [tag value](/influxdb/latest/concepts/glossary/#tag-value) +Related entries: [field](#field), [tag key](#tag-key), [tag set](#tag-set), [tag value](#tag-value) ### tag key @@ -858,7 +857,7 @@ Tag keys are indexed so queries on tag keys are processed quickly. *Query tip:* Compare tag keys to field keys. Field keys are not indexed. -Related entries: [field key](/#field-key), [tag](#tag), [tag set](#tag-set), [tag value](#tag-value) +Related entries: [field key](#field-key), [tag](#tag), [tag set](#tag-set), [tag value](#tag-value) ### tag set @@ -917,9 +916,9 @@ By default, tracing is disabled in InfluxDB. To enable tracing or set other Infl ### transformation An InfluxQL function that returns a value or a set of values calculated from specified points, but does not return an aggregated value across those points. -See [InfluxQL functions](/influxdb/latest/query_language/functions/#transformations) for a complete list of the available and upcoming aggregations. +See [InfluxQL functions](http://docs.influxdata.com/influxdb/latest/query_language/functions/#transformations) for a complete list of the available and upcoming aggregations. -Related entries: [aggregation](/influxdb/latest/concepts/glossary/#aggregation), [function](/influxdb/latest/concepts/glossary/#function), [selector](/influxdb/latest/concepts/glossary/#selector) +Related entries: [aggregate](#aggregate), [function](#function), [selector](#selector) ## TSI (Time Series Index) @@ -933,7 +932,7 @@ The Time Series Logs (TSL) extension (.tsl) identifies Time Series Index (TSI) l A data storage format that allows greater compaction and higher write and read throughput than B+ or LSM tree implementations. For more information, see [Storage engine](http://docs.influxdata.com/influxdb/latest/concepts/storage_engine/). -Related entries: [TSI](#TSI) +Related entries: [TSI](#tsi-time-series-index) ## U @@ -957,7 +956,7 @@ The preferred measurement of the rate at which data are persisted to InfluxDB. W To calculate the values per second rate, multiply the number of points written per second by the number of values stored per point. For example, if the points have four fields each, and a batch of 5000 points is written 10 times per second, the values per second rate is `4 field values per point * 5000 points per batch * 10 batches per second = 200,000 values per second`. -Related entries: [batch](#batch), [field](#field), [point](#point), [points per second](#points-per-second) +Related entries: [batch](#batch), [field](#field), [point](#point) ### variable diff --git a/content/v2.0/visualize-data/visualization-types/graph.md b/content/v2.0/visualize-data/visualization-types/graph.md index d5af696a9..b32cc360c 100644 --- a/content/v2.0/visualize-data/visualization-types/graph.md +++ b/content/v2.0/visualize-data/visualization-types/graph.md @@ -12,7 +12,7 @@ menu: --- The Graph visualization provides several types of graphs, each configured through -the [Graph options](#graph-options). +the [Graph controls](#graph-controls). {{< img-hd src="/img/2-0-visualizations-line-graph-example.png" alt="Line Graph example" />}} From 54b5df563069a8e3953a42eef4510782f2820051 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 12 Sep 2019 14:14:07 -0600 Subject: [PATCH 218/258] changed name of air sensor dashboard download --- content/v2.0/query-data/guides/sql.md | 2 +- .../{air_sensors_dashboard.json => air-sensors-dashboard.json} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename static/downloads/{air_sensors_dashboard.json => air-sensors-dashboard.json} (100%) diff --git a/content/v2.0/query-data/guides/sql.md b/content/v2.0/query-data/guides/sql.md index 2a3d6dc46..66dd75169 100644 --- a/content/v2.0/query-data/guides/sql.md +++ b/content/v2.0/query-data/guides/sql.md @@ -212,6 +212,6 @@ To use `air-sensor-data.rb`: #### Import the sample data dashboard Download and import the Air Sensors dashboard to visualize the generated data: -Download Air Sensors dashboard +Download Air Sensors dashboard _For information about importing a dashboard, see [Create a dashboard](/v2.0/visualize-data/dashboards/create-dashboard/#create-a-new-dashboard)._ diff --git a/static/downloads/air_sensors_dashboard.json b/static/downloads/air-sensors-dashboard.json similarity index 100% rename from static/downloads/air_sensors_dashboard.json rename to static/downloads/air-sensors-dashboard.json From b5ff2880aacd8b62c5385e1aefb535978faad5e1 Mon Sep 17 00:00:00 2001 From: Kelly Date: Thu, 12 Sep 2019 16:26:56 -0700 Subject: [PATCH 219/258] add link to Usage from PAYG pricing plan --- content/v2.0/cloud/pricing-plans.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/pricing-plans.md b/content/v2.0/cloud/pricing-plans.md index fbdc45459..3582ffd0b 100644 --- a/content/v2.0/cloud/pricing-plans.md +++ b/content/v2.0/cloud/pricing-plans.md @@ -42,7 +42,7 @@ _To remove rate limits, [upgrade to a Pay As You Go Plan](/v2.0/cloud/account-ma ## Pay As You Go Plan -Pay As You Go Plans offer more flexibility and ensure you only pay for what you use. +The Pay As You Go Plan offers more flexibility and ensures you only pay for what you [use]((/v2.0/cloud/account-management/data-usage/). #### Pay As You Go Plan rate limits From 2f616c104f065cf52a8d2fe4ed773e2e4ff5044c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 09:57:00 -0600 Subject: [PATCH 220/258] updated cloudformation lambda template --- deploy/docs-website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/docs-website.yml b/deploy/docs-website.yml index ca23dd41f..5a1c1b64b 100644 --- a/deploy/docs-website.yml +++ b/deploy/docs-website.yml @@ -163,7 +163,7 @@ Resources: const { uri, headers, origin } = request; const extension = uri.substr(uri.lastIndexOf('.') + 1); - const validExtensions = ['.html', '.css', '.js', '.xml', '.png', '.jpg', '.svg', '.otf', '.eot', '.ttf', '.woff']; + const validExtensions = ['.html', '.css', '.js', '.xml', '.png', '.jpg', '.svg', '.json', '.csv', '.rb', '.otf', '.eot', '.ttf', '.woff']; const indexPath = 'index.html'; const defaultPath = '/v2.0/' From 06940d8750a82fc909830cf20188bbf2070f940c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 10:09:08 -0600 Subject: [PATCH 221/258] removed empty special cases block from math.NaN, resolves #452 --- content/v2.0/reference/flux/stdlib/math/isnan.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/content/v2.0/reference/flux/stdlib/math/isnan.md b/content/v2.0/reference/flux/stdlib/math/isnan.md index 2d9424592..f2736f93e 100644 --- a/content/v2.0/reference/flux/stdlib/math/isnan.md +++ b/content/v2.0/reference/flux/stdlib/math/isnan.md @@ -28,8 +28,3 @@ math.isNaN(f: 12.345) The value used in the evaluation. _**Data type:** Float_ - -## Special cases -```js - -``` From 8aab6b4ecead1ad6e6a0f5d7b59fc15061eab928 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 11:15:18 -0600 Subject: [PATCH 222/258] added flux 0.45-0.47 to changelog --- content/v2.0/reference/release-notes/flux.md | 46 +++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 87ad2ec31..2fe40ffe0 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,11 +11,55 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.45.1**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} +## v0.47.0 [2019-09-13] + +### Bug fixes +- Introduce ParenExpression. +- Make fmt runs cargo fmt on Rust directories. +- Update `Hex.Dump` to `hex.EncodeToString`. +- Integrate the Promql transpiler into Flux. + +--- + +## v0.46.2 [2019-09-12] + +### Bug fixes +- Make `to` use URL validator. +- Add filesystem to default test dependencies. + +--- + +## v0.46.1 [2019-09-11] + +### Bug fixes +- Add a filesystem service. +- Do a pointer comparison for table objects instead of a deep compare. + +--- + +## v0.46.0 [2019-09-10] + +### Features +- Replace EnvironmentSecretService with EmptySecret…. +- Source location for rust parser. + +### Bug fixes +- Push error for bad string expression. +- Remove `token` parameter from `pagerduty.endpoint`. + +--- + +## v0.45.2 [2019-09-10] + +### Bug fixes +- Push the tag before running goreleaser. +- Additional opentracing spans for debugging query flow. + --- ## v0.45.1 [2019-09-09] From 4a83d60b4c5dad8651a0356294dd850bd0821d08 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 14:32:11 -0600 Subject: [PATCH 223/258] added influx inspect export-index command, resolves #462 --- .../reference/cli/influxd/inspect/_index.md | 1 + .../cli/influxd/inspect/export-index.md | 26 +++++++++++++++++++ .../cli/influxd/inspect/report-tsm.md | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 content/v2.0/reference/cli/influxd/inspect/export-index.md diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index 6dc44f8f0..1e64912c5 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -21,6 +21,7 @@ influxd inspect [subcommand] | [dump-tsi](/v2.0/reference/cli/influxd/inspect/dump-tsi/) | Output low level TSI information | | [dumpwal](/v2.0/reference/cli/influxd/inspect/dumpwal/) | Output TSM data from WAL files | | [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | +| [export-index](/v2.0/reference/cli/influxd/inspect/export-index/) | Export TSI index data | | [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | | [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | | [verify-seriesfile](/v2.0/reference/cli/influxd/inspect/verify-seriesfile/) | Verify the integrity of series files | diff --git a/content/v2.0/reference/cli/influxd/inspect/export-index.md b/content/v2.0/reference/cli/influxd/inspect/export-index.md new file mode 100644 index 000000000..222e4e835 --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/export-index.md @@ -0,0 +1,26 @@ +--- +title: influxd inspect export-index +description: > + The `influxd inspect export-index` command exports all series in a TSI index to + SQL format for inspection and debugging. +v2.0/tags: [inspect] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect export-index` command exports all series in a TSI index to +SQL format for inspection and debugging. + +## Usage +```sh +influxd inspect export-index [flags] +``` + +## Flags +| Flag | Description | Input type | +|:---- |:----------- |:----------:| +| `-h`, `--help` | Help for `export-index`. | | +| `--index-path` | Path to the index directory (defaults to `~/.influxdbv2/engine/index`) | string | +| `--series-path` | Path to series file (defaults to `~/.influxdbv2/engine/_series`) | string | diff --git a/content/v2.0/reference/cli/influxd/inspect/report-tsm.md b/content/v2.0/reference/cli/influxd/inspect/report-tsm.md index 85413c1a2..80e23c00f 100644 --- a/content/v2.0/reference/cli/influxd/inspect/report-tsm.md +++ b/content/v2.0/reference/cli/influxd/inspect/report-tsm.md @@ -49,7 +49,7 @@ in the following ways: | Flag | Description | Input Type | |:---- |:----------- |:----------:| | `--bucket-id` | Process only data belonging to bucket ID. _Requires `org-id` flag to be set._ | string | -| `--data-dir` | Use provided data directory (defaults to ~/.influxdbv2/engine/data). | string | +| `--data-dir` | Use provided data directory (defaults to `~/.influxdbv2/engine/data`). | string | | `--detailed` | Emit series cardinality segmented by measurements, tag keys, and fields. _**May take a while**_. | | | `--exact` | Calculate an exact cardinality count. _**May use significant memory**_. | | | `-h`, `--help` | Help for `report-tsm`. | | From a230d3d788fdbd5b2866eb9bbb8ec68d47918495 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 15:54:30 -0600 Subject: [PATCH 224/258] added influx inspect build-tsi command, resolve #461 --- .../cli/influxd/inspect/build-tsi.md | 58 +++++++++++++++++++ .../cli/influxd/inspect/export-index.md | 10 ++-- 2 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 content/v2.0/reference/cli/influxd/inspect/build-tsi.md diff --git a/content/v2.0/reference/cli/influxd/inspect/build-tsi.md b/content/v2.0/reference/cli/influxd/inspect/build-tsi.md new file mode 100644 index 000000000..7d873b4a6 --- /dev/null +++ b/content/v2.0/reference/cli/influxd/inspect/build-tsi.md @@ -0,0 +1,58 @@ +--- +title: influxd inspect build-tsi +description: > + The `influxd inspect build-tsi` command rebuilds the TSI index and, if necessary, + the series file. +v2.0/tags: [tsi] +menu: + v2_0_ref: + parent: influxd inspect +weight: 301 +--- + +The `influxd inspect build-tsi` command rebuilds the TSI index and, if necessary, +the series file. + +## Usage +```sh +influxd inspect build-tsi [flags] +``` + +InfluxDB builds the index by reading all Time-Structured Merge tree (TSM) indexes +and Write Ahead Log (WAL) entries in the TSM and WAL data directories. +If the series file directory is missing, it rebuilds the series file. +If the TSI index directory already exists, the command will fail. + +### Adjust performance +Use the following options to adjust the performance of the indexing process: + +##### --max-log-file-size +`--max-log-file-size` determines how much of an index to store in memory before +compacting it into memory-mappable index files. +If you find the memory requirements of your TSI index are too high, consider +decreasing this setting. + +##### --max-cache-size +`--max-cache-size` defines the maximum cache size. +The indexing process replays WAL files into a `tsm1.Cache`. +If the maximum cache size is too low, the indexing process will fail. +Increase `--max-cache-size` to account for the size of your WAL files. + +##### --batch-size +`--batch-size` defines the size of the batches written into the index. +Altering the batch size can improve performance but may result in significantly +higher memory usage. + +## Flags +| Flag | Description | Input Type | +|:---- |:----------- |:----------:| +| `--batch-size` | The size of the batches to write to the index. Defaults to `10000`. [See above](#batch-size). | integer | +| `--concurrency` | Number of workers to dedicate to shard index building. Defaults to `GOMAXPROCS` (8 by default). | integer | +| `-h`, `--help` | Help for `build-tsi`. | | +| `--max-cache-size` | Maximum cache size. Defaults to `1073741824`. [See above](#max-cache-size). | uinteger | +| `--max-log-file-size` | Maximum log file size. Defaults to `1048576`. [See above](#max-log-file-size) . | integer | +| `--sfile-path` | Path to the series file directory. Defaults to `~/.influxdbv2/engine/_series`. | string | +| `--tsi-path` | Path to the TSI index directory. Defaults to `~/.influxdbv2/engine/index`. | string | +| `--tsm-path` | Path to the TSM data directory. Defaults to `~/.influxdbv2/engine/data`. | string | +| `-v`, `--verbose` | Enable verbose output. | | +| `--wal-path` | Path to the WAL data directory. Defaults to `~/.influxdbv2/engine/wal`. | string | diff --git a/content/v2.0/reference/cli/influxd/inspect/export-index.md b/content/v2.0/reference/cli/influxd/inspect/export-index.md index 222e4e835..71d0e260a 100644 --- a/content/v2.0/reference/cli/influxd/inspect/export-index.md +++ b/content/v2.0/reference/cli/influxd/inspect/export-index.md @@ -19,8 +19,8 @@ influxd inspect export-index [flags] ``` ## Flags -| Flag | Description | Input type | -|:---- |:----------- |:----------:| -| `-h`, `--help` | Help for `export-index`. | | -| `--index-path` | Path to the index directory (defaults to `~/.influxdbv2/engine/index`) | string | -| `--series-path` | Path to series file (defaults to `~/.influxdbv2/engine/_series`) | string | +| Flag | Description | Input type | +|:---- |:----------- |:----------:| +| `-h`, `--help` | Help for `export-index`. | | +| `--index-path` | Path to the index directory. Defaults to `~/.influxdbv2/engine/index`). | string | +| `--series-path` | Path to series file. Defaults to `~/.influxdbv2/engine/_series`). | string | From 3dc291986819604f877b3a209724e0decae82947 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 15:57:10 -0600 Subject: [PATCH 225/258] added build-tsi to influx inspect landing page --- .../reference/cli/influxd/inspect/_index.md | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/content/v2.0/reference/cli/influxd/inspect/_index.md b/content/v2.0/reference/cli/influxd/inspect/_index.md index 1e64912c5..0c3dd0e90 100644 --- a/content/v2.0/reference/cli/influxd/inspect/_index.md +++ b/content/v2.0/reference/cli/influxd/inspect/_index.md @@ -16,17 +16,18 @@ influxd inspect [subcommand] ``` ## Subcommands -| Subcommand | Description | -|:---------- |:----------- | -| [dump-tsi](/v2.0/reference/cli/influxd/inspect/dump-tsi/) | Output low level TSI information | -| [dumpwal](/v2.0/reference/cli/influxd/inspect/dumpwal/) | Output TSM data from WAL files | -| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | -| [export-index](/v2.0/reference/cli/influxd/inspect/export-index/) | Export TSI index data | -| [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | -| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | -| [verify-seriesfile](/v2.0/reference/cli/influxd/inspect/verify-seriesfile/) | Verify the integrity of series files | -| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | -| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | +| Subcommand | Description | +|:---------- |:----------- | +| [build-tsi](/v2.0/reference/cli/influxd/inspect/build-tsi/) | Rebuild the TSI index and series file. | +| [dump-tsi](/v2.0/reference/cli/influxd/inspect/dump-tsi/) | Output low level TSI information | +| [dumpwal](/v2.0/reference/cli/influxd/inspect/dumpwal/) | Output TSM data from WAL files | +| [export-blocks](/v2.0/reference/cli/influxd/inspect/export-blocks/) | Export block data | +| [export-index](/v2.0/reference/cli/influxd/inspect/export-index/) | Export TSI index data | +| [report-tsi](/v2.0/reference/cli/influxd/inspect/report-tsi/) | Report the cardinality of TSI files | +| [report-tsm](/v2.0/reference/cli/influxd/inspect/report-tsm/) | Run TSM report | +| [verify-seriesfile](/v2.0/reference/cli/influxd/inspect/verify-seriesfile/) | Verify the integrity of series files | +| [verify-tsm](/v2.0/reference/cli/influxd/inspect/verify-tsm/) | Check the consistency of TSM files | +| [verify-wal](/v2.0/reference/cli/influxd/inspect/verify-wal/) | Check for corrupt WAL files | ## Flags | Flag | Description | From a2d00b5fbb745f1bf82382080b4ba90a59c4df0a Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 13 Sep 2019 16:00:43 -0600 Subject: [PATCH 226/258] added python client library, resolves #464 --- content/v2.0/reference/client-libraries.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/v2.0/reference/client-libraries.md b/content/v2.0/reference/client-libraries.md index 6c47537f3..7411ec317 100644 --- a/content/v2.0/reference/client-libraries.md +++ b/content/v2.0/reference/client-libraries.md @@ -22,3 +22,4 @@ This list will continue to grow as more client libraries are released. - [Go](https://github.com/influxdata/influxdb-client-go) - [Java](https://github.com/influxdata/influxdb-client-java) - [JavaScript/Node.js](https://github.com/influxdata/influxdb-client-js) +- [Python](https://github.com/influxdata/influxdb-client-python) From 9aa7a9a6a13114905285ad5272c04b6f479bdfd9 Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 13 Sep 2019 16:31:57 -0700 Subject: [PATCH 227/258] updated billing info --- .../v2.0/cloud/account-management/billing.md | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/content/v2.0/cloud/account-management/billing.md b/content/v2.0/cloud/account-management/billing.md index b6622a065..de4e41ff4 100644 --- a/content/v2.0/cloud/account-management/billing.md +++ b/content/v2.0/cloud/account-management/billing.md @@ -12,9 +12,23 @@ menu: - Hover over the **Usage** icon in the left navigation bar and select **Billing**. -{{< nav-icon "cloud" >}} + {{< nav-icon "cloud" >}} -### Add or update your {{< cloud-name >}} payment method + Complete the following procedures as needed: + + - [Add or update your {{< cloud-name >}} payment method](#add-or-update-your-influxdb-cloud-2-0-payment-method) + - [Add or update your contact information](#add-or-update-your-contact-information) + - [Send notifications when usage exceeds an amount](#send-notifications-when-usage-exceeds-an-amount) + + View information about: + + - [Pay As You Go billing](#view-pay-as-you-go-billing-information) + - [Free plan](#view-free-plan-information) + - [Exceeded rate limits](#exceeded-rate-limits) + - [Billing cycle](#billing-cycle) + - [Declined or late payments](#declined-or-late-payments) + +### Add or update your InfluxDB Cloud 2.0 payment method 1. On the Billing page: - To update, click the **Change Payment** button on the Billing page. @@ -26,16 +40,6 @@ menu: 2. Click **Add Card**. -### View Pay As You Go billing information - -- On the Billing page, view your billing information, including: - - Account balance - - Last billing update (updated hourly) - - Past invoices - - Payment method - - Contact information - - Notification settings - ### Add or update your contact information 1. On the Billing page: @@ -49,6 +53,16 @@ menu: 2. Select the **Send email notification** toggle, and then enter the email address to notify. 3. Enter the dollar amount to trigger a notification email. By default, an email is triggered when the amount exceeds $10. (Whole dollar amounts only. For example, $10.50 is not a supported amount.) +### View Pay As You Go billing information + +- On the Billing page, view your billing information, including: + - Account balance + - Last billing update (updated hourly) + - Past invoices + - Payment method + - Contact information + - Notification settings + ### View Free plan information - On the Billing page, view the total limits available for the Free plan. @@ -70,3 +84,16 @@ When a request exceeds your plan's rate limit, the InfluxDB API returns the foll HTTP 429 “Too Many Requests” Retry-After: xxx (seconds to wait before retrying the request) ``` + +### Billing cycle + +Billing occurs on the first day of the month for the previous month. For example, if you start the Pay As You Go plan on September 15, you're billed on October 1 for your usage from September 15-30. + +### Declined or late payments + +| Timeline | Action | +|:----------------------------|:------------------------------------------------------------------------------------------------------------------------| +| **Initial declined payment**| We'll retry charge every 72 hours. During this period, update your payment method to successfully process your payment. | +| **One week later** | Account disabled except data writes. Update your payment method to successfully process your payment and enable your account. | +| **10-14 days later** | Account completely disabled. During this period, you must contact us at support@influxdata.com to process your payment and enable your account. | +| **21 days later** | Account suspended. Contact support@influxdata.com to settle your final bill and retrieve a copy of your data or access to InfluxDB Cloud dashboards, tasks, Telegraf configurations, and so on.| From d772e5096d18036be52508c59b2dc489d0266a2c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 16 Sep 2019 14:52:53 -0600 Subject: [PATCH 228/258] added mqtt and bigtable packages to experimental package --- .../flux/stdlib/experimental/_index.md | 23 ++++++++ .../stdlib/experimental/bigtable/_index.md | 28 +++++++++ .../flux/stdlib/experimental/bigtable/from.md | 58 +++++++++++++++++++ .../stdlib/{ => experimental}/mqtt/_index.md | 16 +++-- .../flux/stdlib/{ => experimental}/mqtt/to.md | 9 ++- 5 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 content/v2.0/reference/flux/stdlib/experimental/_index.md create mode 100644 content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md create mode 100644 content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md rename content/v2.0/reference/flux/stdlib/{ => experimental}/mqtt/_index.md (51%) rename content/v2.0/reference/flux/stdlib/{ => experimental}/mqtt/to.md (94%) diff --git a/content/v2.0/reference/flux/stdlib/experimental/_index.md b/content/v2.0/reference/flux/stdlib/experimental/_index.md new file mode 100644 index 000000000..d5f086106 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/_index.md @@ -0,0 +1,23 @@ +--- +title: Flux Experimental package +list_title: Experimental package +description: > + The Flux Experimental package includes experimental functions that perform various tasks. + Experimental functions are subject to change at any time and are not recommended for production use. +menu: + v2_0_ref: + name: Experimental + parent: Flux standard library +weight: 202 +v2.0/tags: [functions, experimental, package] +--- + +The Flux Experimental package includes experimental functions that perform various tasks. + +{{% warn %}} +Experimental functions are subject to change at any time and are not recommended for production use. +{{% /warn %}} + +{{< children type="functions" show="pages" >}} + +{{< children >}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md new file mode 100644 index 000000000..86e403171 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md @@ -0,0 +1,28 @@ +--- +title: Flux Bigtable package +list_title: Bigtable package +description: > + The Flux Bigtable package provides tools for working with data in Google Cloud Bigtable databases. + Import the `experimental/bigtable` package. +menu: + v2_0_ref: + name: Bigtable + parent: Experimental +weight: 202 +v2.0/tags: [functions, bigtable, package, google] +--- + +The Flux Bigtable package provides tools for working with data in +[Google Cloud Bigtable](https://cloud.google.com/bigtable/) databases. + +{{% warn %}} +The Bigtable package is currently experimental and is subject to change at any time. +{{% /warn %}} + +Import the `experimental/bigtable` package: + +```js +import "experimental/bigtable" +``` + +{{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md new file mode 100644 index 000000000..5daa64b7f --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md @@ -0,0 +1,58 @@ +--- +title: bigtable.from() function +description: > + The `bigtable.from()` function retrieves data from a Google Cloud Bigtable data source. +menu: + v2_0_ref: + name: bigtable.from + parent: Bigtable +weight: 202 +--- + +The `bigtable.from()` function retrieves data from a [Google Cloud Bigtable](https://cloud.google.com/bigtable/) +data source. + +_**Function type:** Input_ + +{{% warn %}} +The `bigtable.from()` function is currently experimental and is subject to change at any time. +{{% /warn %}} + +```js +import "experimental/bigtable" + +bigtable.from( + token: "mySuPeRseCretTokEn", + project: "exampleProjectID", + instance: "exampleInstanceID", + table: "example-table" +) +``` + +## Parameters + +### token +The Google Cloud IAM token to use to access the Cloud Bigtable database. + +_For more information, see the following:_ + +- [Cloud Bigtable Access Control](https://cloud.google.com/bigtable/docs/access-control) +- [Google Cloud IAM How-to guides](https://cloud.google.com/iam/docs/how-to) +- [Setting Up Authentication for Server to Server Production Applications on Google Cloud](https://cloud.google.com/docs/authentication/production) + +_**Data type: String**_ + +### project +The project ID of the Cloud Bigtable project to retrieve data from. + +_**Data type: String**_ + +### instance +The instance ID of the Cloud Bigtable instance to retrieve data from. + +_**Data type: String**_ + +### table +The name of the Cloud Bigtable table to retrieve data from. + +_**Data type: String**_ diff --git a/content/v2.0/reference/flux/stdlib/mqtt/_index.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md similarity index 51% rename from content/v2.0/reference/flux/stdlib/mqtt/_index.md rename to content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md index 4c9232f67..4ae78c53f 100644 --- a/content/v2.0/reference/flux/stdlib/mqtt/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md @@ -3,21 +3,25 @@ title: Flux MQTT package list_title: MQTT package description: > The Flux MQTT package provides functions for working with MQTT protocol. - Import the `mqtt` package. + Import the `experimental/mqtt` package. menu: v2_0_ref: name: MQTT - parent: Flux standard library + parent: Experimental weight: 202 v2.0/tags: [functions, mqtt, package] -draft: true --- -MQTT Flux functions provide tools for working with Message Queuing Telemetry Transport (MQTT) protocol. -Import the `mqtt` package: +Flux MQTT functions provide tools for working with Message Queuing Telemetry Transport (MQTT) protocol. + +{{% warn %}} +The MQTT package is currently experimental and is subject to change at any time. +{{% /warn %}} + +Import the `experimental/mqtt` package: ```js -import "mqtt" +import "experimental/mqtt" ``` {{< children type="functions" show="pages" >}} diff --git a/content/v2.0/reference/flux/stdlib/mqtt/to.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md similarity index 94% rename from content/v2.0/reference/flux/stdlib/mqtt/to.md rename to content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md index e67566895..fd794069d 100644 --- a/content/v2.0/reference/flux/stdlib/mqtt/to.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md @@ -7,15 +7,18 @@ menu: name: mqtt.to parent: MQTT weight: 202 -draft: true --- The `mqtt.to()` function outputs data to an MQTT broker using MQTT protocol. _**Function type:** Output_ +{{% warn %}} +The `mqtt.to()` function is currently experimental and is subject to change at any time. +{{% /warn %}} + ```js -import "mqtt" +import "experimental/mqtt" mqtt.to( broker: "tcp://localhost:8883", @@ -115,7 +118,7 @@ _**Data type: Array of strings**_ ### Send data to an MQTT endpoint ```js -import "mqtt" +import "experimental/mqtt" from(bucket: "example-bucket") |> range(start: -5m) From cb5fb6e848144b414543c9e7bc5032f5e88f2e11 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 16 Sep 2019 16:10:24 -0600 Subject: [PATCH 229/258] added experimental duration functions --- .../flux/stdlib/experimental/_index.md | 4 +- .../flux/stdlib/experimental/addduration.md | 57 +++++++++++++++++++ .../stdlib/experimental/bigtable/_index.md | 2 +- .../flux/stdlib/experimental/bigtable/from.md | 2 +- .../flux/stdlib/experimental/mqtt/_index.md | 2 +- .../flux/stdlib/experimental/mqtt/to.md | 2 +- .../flux/stdlib/experimental/subduration.md | 57 +++++++++++++++++++ 7 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 content/v2.0/reference/flux/stdlib/experimental/addduration.md create mode 100644 content/v2.0/reference/flux/stdlib/experimental/subduration.md diff --git a/content/v2.0/reference/flux/stdlib/experimental/_index.md b/content/v2.0/reference/flux/stdlib/experimental/_index.md index d5f086106..3b08a4d3e 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/_index.md @@ -18,6 +18,8 @@ The Flux Experimental package includes experimental functions that perform vario Experimental functions are subject to change at any time and are not recommended for production use. {{% /warn %}} +## Experimental functions {{< children type="functions" show="pages" >}} -{{< children >}} +## Experimental packages +{{< children show="sections" >}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/addduration.md b/content/v2.0/reference/flux/stdlib/experimental/addduration.md new file mode 100644 index 000000000..7aa42e40f --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/addduration.md @@ -0,0 +1,57 @@ +--- +title: experimental.addDuration() function +description: > + The `experimental.addDuration()` function adds a duration to a time value and + returns the resulting time. +menu: + v2_0_ref: + name: experimental.addDuration + parent: Experimental +weight: 201 +related: + - /v2.0/reference/flux/stdlib/experimental/subduration/ +--- + +The `experimental.addDuration()` function adds a duration to a time value and +returns a the resulting time value. + +_**Function type:** Transformation_ + +{{% warn %}} +The `experimental.addDuration()` function is currently experimental and is subject to change at any time. +This specific function will be removed once duration vectors are implemented. +See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). +{{% /warn %}} + +```js +import "experimental" + +experimental.addDuration( + d: 12h, + to: now(), +) +``` + +## Parameters + +### d +The duration to add. + +_**Data type: Duration**_ + +### to +The time to add the [duration](#d) to. + +## Examples + +### Add six hours to a timestamp +```js +import "experimental" + +experimental.addDuration( + d: 6h, + to: 2019-09-16T12:00:00Z, +) + +// Returns 2019-09-16T18:00:00.000000000Z +``` diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md index 86e403171..b046221c9 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md @@ -8,7 +8,7 @@ menu: v2_0_ref: name: Bigtable parent: Experimental -weight: 202 +weight: 201 v2.0/tags: [functions, bigtable, package, google] --- diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md index 5daa64b7f..cc7fa15e2 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md @@ -6,7 +6,7 @@ menu: v2_0_ref: name: bigtable.from parent: Bigtable -weight: 202 +weight: 301 --- The `bigtable.from()` function retrieves data from a [Google Cloud Bigtable](https://cloud.google.com/bigtable/) diff --git a/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md index 4ae78c53f..79441f15d 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md @@ -8,7 +8,7 @@ menu: v2_0_ref: name: MQTT parent: Experimental -weight: 202 +weight: 201 v2.0/tags: [functions, mqtt, package] --- diff --git a/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md index fd794069d..3610a332b 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md @@ -6,7 +6,7 @@ menu: v2_0_ref: name: mqtt.to parent: MQTT -weight: 202 +weight: 301 --- The `mqtt.to()` function outputs data to an MQTT broker using MQTT protocol. diff --git a/content/v2.0/reference/flux/stdlib/experimental/subduration.md b/content/v2.0/reference/flux/stdlib/experimental/subduration.md new file mode 100644 index 000000000..ceb574541 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/subduration.md @@ -0,0 +1,57 @@ +--- +title: experimental.subDuration() function +description: > + The `experimental.subDuration()` function subtracts a duration from a time value and + returns a the resulting time value. +menu: + v2_0_ref: + name: experimental.subDuration + parent: Experimental +weight: 201 +related: + - /v2.0/reference/flux/stdlib/experimental/addduration/ +--- + +The `experimental.subDuration()` function subtracts a duration from a time value and +returns a the resulting time value. + +_**Function type:** Transformation_ + +{{% warn %}} +The `experimental.subDuration()` function is currently experimental and is subject to change at any time. +This specific function will be removed once duration vectors are implemented. +See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). +{{% /warn %}} + +```js +import "experimental" + +experimental.subDuration( + d: 12h, + from: now(), +) +``` + +## Parameters + +### d +The duration to subtract. + +_**Data type: Duration**_ + +### from +The time to subtract the [duration](#d) from. + +## Examples + +### Subtract six hours from a timestamp +```js +import "experimental" + +experimental.subDuration( + d: 6h, + from: 2019-09-16T12:00:00Z, +) + +// Returns 2019-09-16T06:00:00.000000000Z +``` From e299ae97812c143c49064b105da70700ed414327 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 16 Sep 2019 17:06:06 -0600 Subject: [PATCH 230/258] added experimental group and set functions --- .../flux/stdlib/experimental/addduration.md | 4 +- .../flux/stdlib/experimental/group.md | 59 +++++++++++++++ .../flux/stdlib/experimental/objectkeys.md | 52 +++++++++++++ .../reference/flux/stdlib/experimental/set.md | 74 +++++++++++++++++++ .../flux/stdlib/experimental/subduration.md | 4 +- 5 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 content/v2.0/reference/flux/stdlib/experimental/group.md create mode 100644 content/v2.0/reference/flux/stdlib/experimental/objectkeys.md create mode 100644 content/v2.0/reference/flux/stdlib/experimental/set.md diff --git a/content/v2.0/reference/flux/stdlib/experimental/addduration.md b/content/v2.0/reference/flux/stdlib/experimental/addduration.md index 7aa42e40f..dd85ca4c0 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/addduration.md +++ b/content/v2.0/reference/flux/stdlib/experimental/addduration.md @@ -13,12 +13,12 @@ related: --- The `experimental.addDuration()` function adds a duration to a time value and -returns a the resulting time value. +returns the resulting time value. _**Function type:** Transformation_ {{% warn %}} -The `experimental.addDuration()` function is currently experimental and is subject to change at any time. +The `experimental.addDuration()` function is subject to change at any time. This specific function will be removed once duration vectors are implemented. See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). {{% /warn %}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/group.md b/content/v2.0/reference/flux/stdlib/experimental/group.md new file mode 100644 index 000000000..e20bfc7b2 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/group.md @@ -0,0 +1,59 @@ +--- +title: experimental.group() function +description: > + The `experimental.group()` function introduces an `extend` mode to the existing + `group()` function. +menu: + v2_0_ref: + name: experimental.group + parent: Experimental +weight: 201 +related: + - /v2.0/reference/flux/stdlib/built-in/transformations/group/ +--- + +The `experimental.group()` function introduces an `extend` mode to the existing +[`group()`](/v2.0/reference/flux/stdlib/built-in/transformations/group/) function. + +_**Function type:** Transformation_ + +{{% warn %}} +The `experimental.group()` function is subject to change at any time. +This specific function will be removed once the proposed `extend` mode is sufficiently vetted. +{{% /warn %}} + +```js +import "experimental" + +experimental.group(columns: ["host", "_measurement"], mode:"extend") +``` + +## Parameters + +### columns +List of columns to use in the grouping operation. +Defaults to `[]`. + +_**Data type:** Array of strings_ + +### mode +The mode used to group columns. + +_**Data type:** String_ + +{{% note %}} +`extend` is the only mode available to `experimental.group()`. +{{% /note %}} + +#### extend +Appends columns defined in the [`columns` parameter](#columns) to all existing +[group keys](/v2.0/query-data/get-started/#group-keys). + +## Examples + +###### Include the value column in each groups' group key +```js +from(bucket: "example-bucket") + |> range(start: -1m) + |> group(columns: ["_value"], mode: "extend") +``` diff --git a/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md b/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md new file mode 100644 index 000000000..3b5229298 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md @@ -0,0 +1,52 @@ +--- +title: experimental.objectKeys() function +description: > + The `experimental.objectKeys()` function returns an array of keys in a specified object. +menu: + v2_0_ref: + name: experimental.objectKeys + parent: Experimental +weight: 201 +--- + +The `experimental.objectKeys()` function returns an array of keys in a specified object. + +_**Function type:** Transformation_ + +{{% warn %}} +The `experimental.objectKeys()` function is subject to change at any time. +{{% /warn %}} + +```js +import "experimental" + +experimental.objectKeys( + o: {key1: "value1", key2: "value2"} +) + +// Returns [key1, key2] +``` + +## Parameters + +### o +The object to return keys from. + +_**Data type: Object**_ + +## Examples + +### Return all keys in an object +```js +import "experimental" + +user = { + firstName: "John", + lastName: "Doe", + age: 42 +} + +experimental.objectKeys(o: user) + +// Returns [firstName, lastName, age] +``` diff --git a/content/v2.0/reference/flux/stdlib/experimental/set.md b/content/v2.0/reference/flux/stdlib/experimental/set.md new file mode 100644 index 000000000..c9f6d6f11 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/set.md @@ -0,0 +1,74 @@ +--- +title: experimental.set() function +description: > + The `experimental.set()` function sets multiple static column values on all records. +menu: + v2_0_ref: + name: experimental.set + parent: Experimental +weight: 201 +related: + - /v2.0/reference/flux/stdlib/built-in/transformations/set/ +--- + +The `experimental.set()` function sets multiple static column values on all records. +If a column already exists, the function updates the existing value. +If a column does not exist, the function adds it with the specified value. + +_Once sufficiently vetted, `experimental.set()` will replace the existing +[`set()` function](/v2.0/reference/flux/stdlib/built-in/transformations/set/)._ + +_**Function type:** Transformation_ + +{{% warn %}} +The `experimental.set()` function is subject to change at any time. +{{% /warn %}} + +```js +import "experimental" + +experimental.set( + o: {column1: "value1", column2: "value2"} +) +``` + +## Parameters + +### o +An object that defines the columns and values to set. +The key of each key-value pair defines the column name. +The value of each key-value pair defines the column value. + +_**Data type: Object**_ + +## Examples + +### Set values for multiple columns + +##### Example input table +| _time | _field | _value | +|:----- |:------ | ------:| +| 2019-09-16T12:00:00Z | temp | 71.2 | +| 2019-09-17T12:00:00Z | temp | 68.4 | +| 2019-09-18T12:00:00Z | temp | 70.8 | + +##### Example query +```js +import "experimental" + +data + |> experimental.set( + o: { + _field: "temperature", + unit: "°F", + location: "San Francisco" + } + ) +``` + +##### Example output table +| _time | _field | _value | unit | location | +|:----- |:------ | ------:|:----:| -------- | +| 2019-09-16T12:00:00Z | temperature | 71.2 | °F | San Francisco | +| 2019-09-17T12:00:00Z | temperature | 68.4 | °F | San Francisco | +| 2019-09-18T12:00:00Z | temperature | 70.8 | °F | San Francisco | diff --git a/content/v2.0/reference/flux/stdlib/experimental/subduration.md b/content/v2.0/reference/flux/stdlib/experimental/subduration.md index ceb574541..617d2b761 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/subduration.md +++ b/content/v2.0/reference/flux/stdlib/experimental/subduration.md @@ -13,12 +13,12 @@ related: --- The `experimental.subDuration()` function subtracts a duration from a time value and -returns a the resulting time value. +returns the resulting time value. _**Function type:** Transformation_ {{% warn %}} -The `experimental.subDuration()` function is currently experimental and is subject to change at any time. +The `experimental.subDuration()` function is subject to change at any time. This specific function will be removed once duration vectors are implemented. See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). {{% /warn %}} From dfabc6fdba6fcf0c08de37abe56002386ebdcc3e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 17 Sep 2019 12:11:56 -0600 Subject: [PATCH 231/258] added experimental.to function --- .../flux/stdlib/built-in/outputs/to.md | 31 +++-- .../reference/flux/stdlib/experimental/to.md | 109 ++++++++++++++++++ 2 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 content/v2.0/reference/flux/stdlib/experimental/to.md diff --git a/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md b/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md index 97a62a776..63ec618b5 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md +++ b/content/v2.0/reference/flux/stdlib/built-in/outputs/to.md @@ -52,38 +52,30 @@ All output data must include the following columns: ## Parameters {{% note %}} -`bucket` OR `bucketID` is **required**. +You must provide a `bucket` or `bucketID` and an `org` or `orgID`. {{% /note %}} ### bucket - -The bucket to which data is written. Mutually exclusive with `bucketID`. +The bucket to write data to. +`bucket` and `bucketID` are mutually exclusive. _**Data type:** String_ ### bucketID - -The ID of the bucket to which data is written. Mutually exclusive with `bucket`. +The ID of the bucket to write data to. +`bucketID` and `bucket` are mutually exclusive. _**Data type:** String_ ### org - The organization name of the specified [`bucket`](#bucket). -Only required when writing to a remote host. -Mutually exclusive with `orgID` +`org` and `orgID` are mutually exclusive. _**Data type:** String_ -{{% note %}} -Specify either an `org` or an `orgID`, but not both. -{{% /note %}} - ### orgID - The organization ID of the specified [`bucket`](#bucket). -Only required when writing to a remote host. -Mutually exclusive with `org`. +`orgID` and `org` are mutually exclusive. _**Data type:** String_ @@ -109,21 +101,24 @@ _**Data type:** String_ ### tagColumns The tag columns of the output. -Defaults to all columns with type `string`, excluding all value columns and the `_field` column if present. +Defaults to all columns with type `string`, excluding all value columns and the +`_field` column if present. _**Data type:** Array of strings_ ### fieldFn Function that takes a record from the input table and returns an object. -For each record from the input table, `fieldFn` returns an object that maps output the field key to the output value. +For each record from the input table, `fieldFn` returns an object that maps output +the field key to the output value. Default is `(r) => ({ [r._field]: r._value })` _**Data type:** Function_ _**Output data type:** Object_ {{% note %}} -Make sure `fieldFn` parameter names match each specified parameter. To learn why, see [Match parameter names](/v2.0/reference/flux/language/data-model/#match-parameter-names). +Make sure `fieldFn` parameter names match each specified parameter. +To learn why, see [Match parameter names](/v2.0/reference/flux/language/data-model/#match-parameter-names). {{% /note %}} ## Examples diff --git a/content/v2.0/reference/flux/stdlib/experimental/to.md b/content/v2.0/reference/flux/stdlib/experimental/to.md new file mode 100644 index 000000000..f0863da89 --- /dev/null +++ b/content/v2.0/reference/flux/stdlib/experimental/to.md @@ -0,0 +1,109 @@ +--- +title: experimental.to() function +description: > + The `experimental.to()` function writes data to an InfluxDB v2.0 bucket. + The function structures data differently than the built-in `to()` function. +menu: + v2_0_ref: + name: experimental.to + parent: Experimental +weight: 201 +related: + - /v2.0/reference/flux/stdlib/built-in/outputs/to/ +--- + +The `experimental.to()` function writes data to an InfluxDB v2.0 bucket, but in +a [different structure](#expected-data-structure) than the +[built-in `to()` function](/v2.0/reference/flux/stdlib/built-in/outputs/to/). + +_**Function type:** Output_ + +{{% warn %}} +The `experimental.to()` function is subject to change at any time. +{{% /warn %}} + +```js +import "experimental" + +experimental.to( + bucket: "my-bucket", + org: "my-org" +) + +// OR + +experimental.to( + bucketID: "1234567890", + orgID: "0987654321" +) +``` + +### Expected data structure + +#### Data structure expected by built-in to() +The built-in `to()` function requires `_time`, `_measurement`, `_field`, and `_value` columns. +The `_field` column stores the **field key** and the `_value` column stores the **field value**. + +| _time | _measurement | _field | _value | +| ----- | ------------ | ------ | ------ | +| timestamp | measurement-name | field key | field value | + +#### Data structure expected by experimental to() +`experimental.to()` requires `_time` and `measurement` columns, but field keys +and values are stored in single columns with the **field key** as the **column name** and +the **field value** as the **column value**. + +| _time | _measurement | field_key | +| ----- | ------------ | --------- | +| timestamp | measurement-name | field value | + +If using the built-in `from()` function, use [`pivot()`](/v2.0/reference/flux/stdlib/transformations/pivot/) +to transform data into the structure `experimetnal.to()` expects. +_[See the example below](#use-pivot-to-shape-data-for-experimental-to)._ + +## Parameters + +### bucket +The bucket to write data to. +`bucket` and `bucketID` are mutually exclusive. + +_**Data type: String**_ + +### bucketID +The ID of the bucket to write data to. +`bucketID` and `bucket` are mutually exclusive. + +_**Data type: String**_ + +### org +The organization name of the specified [`bucket`](#bucket). +Only required when writing to a different organization or a remote host. +`org` and `orgID` are mutually exclusive. + +_**Data type: String**_ + +### orgID +The organization ID of the specified [`bucket`](#bucket). +Only required when writing to a different organization or a remote host. +`orgID` and `org` are mutually exclusive. + +_**Data type: String**_ + + +## Examples + +##### Use pivot() to shape data for experimental.to() +```js +import "experimental" + +from(bucket: "example-bucket") + |> range(start: -1h) + |> pivot( + rowKey:["_time"], + columnKey: ["_field"], + valueColumn: "_value") + |> experimental.to( + bucket: "bucket-name", + org: "org-name" + ) +``` From 71d8297506130e7c77694b42d4fd8e8187d06ea3 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 17 Sep 2019 15:27:17 -0600 Subject: [PATCH 232/258] added risks of using experimental functions with links back --- .../flux/stdlib/experimental/_index.md | 20 ++++++++++++++++++- .../flux/stdlib/experimental/addduration.md | 2 ++ .../stdlib/experimental/bigtable/_index.md | 1 + .../flux/stdlib/experimental/bigtable/from.md | 1 + .../flux/stdlib/experimental/group.md | 2 ++ .../flux/stdlib/experimental/mqtt/_index.md | 1 + .../flux/stdlib/experimental/mqtt/to.md | 1 + .../flux/stdlib/experimental/objectkeys.md | 1 + .../reference/flux/stdlib/experimental/set.md | 1 + .../flux/stdlib/experimental/subduration.md | 2 ++ .../reference/flux/stdlib/experimental/to.md | 1 + 11 files changed, 32 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/flux/stdlib/experimental/_index.md b/content/v2.0/reference/flux/stdlib/experimental/_index.md index 3b08a4d3e..678830f89 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/_index.md @@ -15,11 +15,29 @@ v2.0/tags: [functions, experimental, package] The Flux Experimental package includes experimental functions that perform various tasks. {{% warn %}} -Experimental functions are subject to change at any time and are not recommended for production use. +### Use experimental functions at your own risk +Experimental functions are subject to change and are **not recommended for production use**. +At any time, experimental functions and packages may: + +- be moved or promoted to a permanent location +- undergo API changes +- stop working with no planned fixes +- be removed without warning nor published explanation + +**By using experimental functions and packages, you agree to these risks.** {{% /warn %}} ## Experimental functions +The following functions are part of the base experimental package. +To use them, import the `experimental` package. + +```js +import "experimental" +``` + {{< children type="functions" show="pages" >}} ## Experimental packages +Experimental packages require different import paths than base experimental functions. + {{< children show="sections" >}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/addduration.md b/content/v2.0/reference/flux/stdlib/experimental/addduration.md index dd85ca4c0..656e796c2 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/addduration.md +++ b/content/v2.0/reference/flux/stdlib/experimental/addduration.md @@ -19,6 +19,8 @@ _**Function type:** Transformation_ {{% warn %}} The `experimental.addDuration()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). + This specific function will be removed once duration vectors are implemented. See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). {{% /warn %}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md index b046221c9..73fa1244d 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/_index.md @@ -17,6 +17,7 @@ The Flux Bigtable package provides tools for working with data in {{% warn %}} The Bigtable package is currently experimental and is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} Import the `experimental/bigtable` package: diff --git a/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md index cc7fa15e2..af10c5e2b 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md +++ b/content/v2.0/reference/flux/stdlib/experimental/bigtable/from.md @@ -16,6 +16,7 @@ _**Function type:** Input_ {{% warn %}} The `bigtable.from()` function is currently experimental and is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} ```js diff --git a/content/v2.0/reference/flux/stdlib/experimental/group.md b/content/v2.0/reference/flux/stdlib/experimental/group.md index e20bfc7b2..69c73889c 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/group.md +++ b/content/v2.0/reference/flux/stdlib/experimental/group.md @@ -19,6 +19,8 @@ _**Function type:** Transformation_ {{% warn %}} The `experimental.group()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). + This specific function will be removed once the proposed `extend` mode is sufficiently vetted. {{% /warn %}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md index 79441f15d..2b80764d6 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/_index.md @@ -16,6 +16,7 @@ Flux MQTT functions provide tools for working with Message Queuing Telemetry Tra {{% warn %}} The MQTT package is currently experimental and is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} Import the `experimental/mqtt` package: diff --git a/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md index 3610a332b..8b55904da 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md +++ b/content/v2.0/reference/flux/stdlib/experimental/mqtt/to.md @@ -15,6 +15,7 @@ _**Function type:** Output_ {{% warn %}} The `mqtt.to()` function is currently experimental and is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} ```js diff --git a/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md b/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md index 3b5229298..a40b5dd02 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md +++ b/content/v2.0/reference/flux/stdlib/experimental/objectkeys.md @@ -15,6 +15,7 @@ _**Function type:** Transformation_ {{% warn %}} The `experimental.objectKeys()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} ```js diff --git a/content/v2.0/reference/flux/stdlib/experimental/set.md b/content/v2.0/reference/flux/stdlib/experimental/set.md index c9f6d6f11..33c6ce380 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/set.md +++ b/content/v2.0/reference/flux/stdlib/experimental/set.md @@ -22,6 +22,7 @@ _**Function type:** Transformation_ {{% warn %}} The `experimental.set()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} ```js diff --git a/content/v2.0/reference/flux/stdlib/experimental/subduration.md b/content/v2.0/reference/flux/stdlib/experimental/subduration.md index 617d2b761..060227568 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/subduration.md +++ b/content/v2.0/reference/flux/stdlib/experimental/subduration.md @@ -19,6 +19,8 @@ _**Function type:** Transformation_ {{% warn %}} The `experimental.subDuration()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). + This specific function will be removed once duration vectors are implemented. See [influxdata/flux#413](https://github.com/influxdata/flux/issues/413). {{% /warn %}} diff --git a/content/v2.0/reference/flux/stdlib/experimental/to.md b/content/v2.0/reference/flux/stdlib/experimental/to.md index f0863da89..2eece5f3d 100644 --- a/content/v2.0/reference/flux/stdlib/experimental/to.md +++ b/content/v2.0/reference/flux/stdlib/experimental/to.md @@ -20,6 +20,7 @@ _**Function type:** Output_ {{% warn %}} The `experimental.to()` function is subject to change at any time. +By using it, you accept the [risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). {{% /warn %}} ```js From 144f83fece47dc095550bc987261f281dc1e8ddc Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 17 Sep 2019 17:11:51 -0600 Subject: [PATCH 233/258] reverted flux changelog changes --- content/v2.0/reference/release-notes/flux.md | 48 +------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 2fe40ffe0..e45836164 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,57 +11,11 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.45.1**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} -## v0.47.0 [2019-09-13] - -### Bug fixes -- Introduce ParenExpression. -- Make fmt runs cargo fmt on Rust directories. -- Update `Hex.Dump` to `hex.EncodeToString`. -- Integrate the Promql transpiler into Flux. - ---- - -## v0.46.2 [2019-09-12] - -### Bug fixes -- Make `to` use URL validator. -- Add filesystem to default test dependencies. - ---- - -## v0.46.1 [2019-09-11] - -### Bug fixes -- Add a filesystem service. -- Do a pointer comparison for table objects instead of a deep compare. - ---- - -## v0.46.0 [2019-09-10] - -### Features -- Replace EnvironmentSecretService with EmptySecret…. -- Source location for rust parser. - -### Bug fixes -- Push error for bad string expression. -- Remove `token` parameter from `pagerduty.endpoint`. - ---- - -## v0.45.2 [2019-09-10] - -### Bug fixes -- Push the tag before running goreleaser. -- Additional opentracing spans for debugging query flow. - ---- - ## v0.45.1 [2019-09-09] ### Bug fixes From 76e4ab76713583eba70d61af6aa3df39dfd9c712 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 17 Sep 2019 17:14:53 -0600 Subject: [PATCH 234/258] readded flux 0.47 to changelog --- content/v2.0/reference/release-notes/flux.md | 48 +++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index e45836164..2fe40ffe0 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,11 +11,57 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.45.1**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} +## v0.47.0 [2019-09-13] + +### Bug fixes +- Introduce ParenExpression. +- Make fmt runs cargo fmt on Rust directories. +- Update `Hex.Dump` to `hex.EncodeToString`. +- Integrate the Promql transpiler into Flux. + +--- + +## v0.46.2 [2019-09-12] + +### Bug fixes +- Make `to` use URL validator. +- Add filesystem to default test dependencies. + +--- + +## v0.46.1 [2019-09-11] + +### Bug fixes +- Add a filesystem service. +- Do a pointer comparison for table objects instead of a deep compare. + +--- + +## v0.46.0 [2019-09-10] + +### Features +- Replace EnvironmentSecretService with EmptySecret…. +- Source location for rust parser. + +### Bug fixes +- Push error for bad string expression. +- Remove `token` parameter from `pagerduty.endpoint`. + +--- + +## v0.45.2 [2019-09-10] + +### Bug fixes +- Push the tag before running goreleaser. +- Additional opentracing spans for debugging query flow. + +--- + ## v0.45.1 [2019-09-09] ### Bug fixes From 223727398a1746450abd3e1309f2802d181d638b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 09:54:47 -0600 Subject: [PATCH 235/258] removed cloud tags from alerts docs, updated notification endpoints table, resolves #471 --- content/v2.0/monitor-alert/_index.md | 1 - content/v2.0/monitor-alert/checks/_index.md | 1 - content/v2.0/monitor-alert/checks/create.md | 1 - content/v2.0/monitor-alert/checks/delete.md | 1 - content/v2.0/monitor-alert/checks/update.md | 1 - content/v2.0/monitor-alert/checks/view.md | 1 - .../monitor-alert/notification-endpoints/_index.md | 1 - .../monitor-alert/notification-endpoints/create.md | 13 ++++++------- .../monitor-alert/notification-endpoints/delete.md | 1 - .../monitor-alert/notification-endpoints/update.md | 1 - .../monitor-alert/notification-endpoints/view.md | 1 - .../v2.0/monitor-alert/notification-rules/_index.md | 1 - .../v2.0/monitor-alert/notification-rules/create.md | 1 - .../v2.0/monitor-alert/notification-rules/delete.md | 1 - .../v2.0/monitor-alert/notification-rules/update.md | 1 - .../v2.0/monitor-alert/notification-rules/view.md | 1 - 16 files changed, 6 insertions(+), 22 deletions(-) diff --git a/content/v2.0/monitor-alert/_index.md b/content/v2.0/monitor-alert/_index.md index ad72da7b7..cd52ba5b2 100644 --- a/content/v2.0/monitor-alert/_index.md +++ b/content/v2.0/monitor-alert/_index.md @@ -9,7 +9,6 @@ menu: name: Monitor & alert weight: 6 v2.0/tags: [monitor, alert, checks, notification, endpoints] -cloud_all: true --- Monitor your time series data and send alerts by creating checks, notification diff --git a/content/v2.0/monitor-alert/checks/_index.md b/content/v2.0/monitor-alert/checks/_index.md index 490bb8645..2c84bb054 100644 --- a/content/v2.0/monitor-alert/checks/_index.md +++ b/content/v2.0/monitor-alert/checks/_index.md @@ -11,7 +11,6 @@ v2.0/tags: [monitor, checks, notifications, alert] related: - /v2.0/monitor-alert/notification-rules/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- Checks in InfluxDB query data and apply a status or level to each data point based on specified conditions. diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index 03e113c6c..5c73bd58e 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -10,7 +10,6 @@ weight: 201 related: - /v2.0/monitor-alert/notification-rules/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- Create a check in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/checks/delete.md b/content/v2.0/monitor-alert/checks/delete.md index 3d42b1bac..8e884679f 100644 --- a/content/v2.0/monitor-alert/checks/delete.md +++ b/content/v2.0/monitor-alert/checks/delete.md @@ -10,7 +10,6 @@ weight: 204 related: - /v2.0/monitor-alert/notification-rules/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- If you no longer need a check, use the InfluxDB user interface (UI) to delete it. diff --git a/content/v2.0/monitor-alert/checks/update.md b/content/v2.0/monitor-alert/checks/update.md index 935509b05..d2c9af61c 100644 --- a/content/v2.0/monitor-alert/checks/update.md +++ b/content/v2.0/monitor-alert/checks/update.md @@ -10,7 +10,6 @@ weight: 203 related: - /v2.0/monitor-alert/notification-rules/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- Update checks in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/checks/view.md b/content/v2.0/monitor-alert/checks/view.md index b27e7a202..a41f90713 100644 --- a/content/v2.0/monitor-alert/checks/view.md +++ b/content/v2.0/monitor-alert/checks/view.md @@ -10,7 +10,6 @@ weight: 202 related: - /v2.0/monitor-alert/notification-rules/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- View check details and statuses and notifications generated by checks in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/notification-endpoints/_index.md b/content/v2.0/monitor-alert/notification-endpoints/_index.md index 2362d0f5e..f3d6fef42 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/_index.md +++ b/content/v2.0/monitor-alert/notification-endpoints/_index.md @@ -11,7 +11,6 @@ weight: 102 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ -cloud_all: true --- Notification endpoints store information to connect to a third party service. diff --git a/content/v2.0/monitor-alert/notification-endpoints/create.md b/content/v2.0/monitor-alert/notification-endpoints/create.md index d692eaafa..829158886 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/create.md +++ b/content/v2.0/monitor-alert/notification-endpoints/create.md @@ -10,7 +10,6 @@ weight: 201 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ -cloud_all: true --- To send notifications about changes in your data, start by creating a notification endpoint to a third party service. After creating notification endpoints, [create notification rules](/v2.0/monitor-alert/notification-rules/create) to send alerts to third party services on [check statuses](/v2.0/monitor-alert/checks/create). @@ -26,11 +25,11 @@ To send notifications about changes in your data, start by creating a notificati The following endpoints are available for InfluxDB 2.0 OSS, the InfluxDB Cloud 2.0 Free Plan, and the InfluxDB Cloud 2.0 Pay As You Go (PAYG) Plan: - | Endpoint | OSS | Free Plan _(Cloud)_ | PAYG Plan _(Cloud)_ | - |:-------- |:--------:|:-------------------: |:----------------------------:| - | **Slack** | _Coming_ | **{{< icon "check" >}}** | **{{< icon "check" >}}** | - | **PagerDuty** | _Coming_ | | **{{< icon "check" >}}** | - | **HTTP** | _Coming_ | | **{{< icon "check" >}}** | + | Endpoint | OSS | Free Plan _(Cloud)_ | PAYG Plan _(Cloud)_ | + |:-------- |:--------: |:-------------------: |:----------------------------:| + | **Slack** | **{{< icon "check" >}}** | **{{< icon "check" >}}** | **{{< icon "check" >}}** | + | **PagerDuty** | **{{< icon "check" >}}** | | **{{< icon "check" >}}** | + | **HTTP** | **{{< icon "check" >}}** | | **{{< icon "check" >}}** | 4. In the **Name** and **Description** fields, enter a name and description for the endpoint. 5. Enter enter information to connect to the endpoint: @@ -40,7 +39,7 @@ To send notifications about changes in your data, start by creating a notificati - For Slack, create an [Incoming WebHook](https://api.slack.com/incoming-webhooks#posting_with_webhooks) in Slack, and then enter your webHook URL in the **Slack Incoming WebHook URL** field. - For PagerDuty: - - [Create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. + - [Create a new service](https://support.pagerduty.com/docs/services-and-integrations#section-create-a-new-service), [add an integration for your service](https://support.pagerduty.com/docs/services-and-integrations#section-add-integrations-to-an-existing-service), and then enter the PagerDuty integration key for your new service in the **Routing Key** field. - The **Client URL** provides a useful link in your PagerDuty notification. Enter any URL that you'd like to use to investigate issues. This URL is sent as the `client_url` property in the PagerDuty trigger event. By default, the **Client URL** is set to your Monitoring & Alerting History page, and the following included in the PagerDuty trigger event: `"client_url": "https://twodotoh.a.influxcloud.net/orgs//alert-history”` 6. Click **Create Notification Endpoint**. diff --git a/content/v2.0/monitor-alert/notification-endpoints/delete.md b/content/v2.0/monitor-alert/notification-endpoints/delete.md index 88d2448b0..24a0dc71b 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/delete.md +++ b/content/v2.0/monitor-alert/notification-endpoints/delete.md @@ -10,7 +10,6 @@ weight: 204 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ -cloud_all: true --- If notifications are no longer sent to an endpoint, complete the steps below to delete the endpoint, and then [update notification rules](/v2.0/monitor-alert/notification-rules/update) with a new notification endpoint as needed. diff --git a/content/v2.0/monitor-alert/notification-endpoints/update.md b/content/v2.0/monitor-alert/notification-endpoints/update.md index a35ff0011..d2624e5e4 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/update.md +++ b/content/v2.0/monitor-alert/notification-endpoints/update.md @@ -10,7 +10,6 @@ weight: 203 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ -cloud_all: true --- To update the notification endpoint details, complete the procedures below as needed. To update the notification endpoint selected for a notification rule, see [update notification rules](/v2.0/monitor-alert/notification-rules/update/). diff --git a/content/v2.0/monitor-alert/notification-endpoints/view.md b/content/v2.0/monitor-alert/notification-endpoints/view.md index a4c5342d9..982fa4c42 100644 --- a/content/v2.0/monitor-alert/notification-endpoints/view.md +++ b/content/v2.0/monitor-alert/notification-endpoints/view.md @@ -11,7 +11,6 @@ weight: 202 related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-rules/ -cloud_all: true --- View notification endpoint details and history in the InfluxDB user interface (UI). diff --git a/content/v2.0/monitor-alert/notification-rules/_index.md b/content/v2.0/monitor-alert/notification-rules/_index.md index 0b7115605..bc99a9114 100644 --- a/content/v2.0/monitor-alert/notification-rules/_index.md +++ b/content/v2.0/monitor-alert/notification-rules/_index.md @@ -10,7 +10,6 @@ menu: related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- The following articles provide information on managing your notification rules: diff --git a/content/v2.0/monitor-alert/notification-rules/create.md b/content/v2.0/monitor-alert/notification-rules/create.md index 5bed355ea..471f65aff 100644 --- a/content/v2.0/monitor-alert/notification-rules/create.md +++ b/content/v2.0/monitor-alert/notification-rules/create.md @@ -9,7 +9,6 @@ menu: related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- Once you've set up checks and notification endpoints, create notification rules to alert you. diff --git a/content/v2.0/monitor-alert/notification-rules/delete.md b/content/v2.0/monitor-alert/notification-rules/delete.md index 7ebfca923..dea28950d 100644 --- a/content/v2.0/monitor-alert/notification-rules/delete.md +++ b/content/v2.0/monitor-alert/notification-rules/delete.md @@ -9,7 +9,6 @@ menu: related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- ## Delete a notification rule in the UI diff --git a/content/v2.0/monitor-alert/notification-rules/update.md b/content/v2.0/monitor-alert/notification-rules/update.md index 7b9960fb5..f88a832d0 100644 --- a/content/v2.0/monitor-alert/notification-rules/update.md +++ b/content/v2.0/monitor-alert/notification-rules/update.md @@ -9,7 +9,6 @@ menu: related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- ## Add a label to notification rules diff --git a/content/v2.0/monitor-alert/notification-rules/view.md b/content/v2.0/monitor-alert/notification-rules/view.md index 5dad401c4..bbbcbe130 100644 --- a/content/v2.0/monitor-alert/notification-rules/view.md +++ b/content/v2.0/monitor-alert/notification-rules/view.md @@ -9,7 +9,6 @@ menu: related: - /v2.0/monitor-alert/checks/ - /v2.0/monitor-alert/notification-endpoints/ -cloud_all: true --- View notification rule details and statuses and notifications generated by notification rules in the InfluxDB user interface (UI). From 236c5f230814cb07529fe278ad6d8fb45e61d78b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 14:22:06 -0600 Subject: [PATCH 236/258] restructured check creation guide --- content/v2.0/monitor-alert/checks/create.md | 70 +++++++++++---------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index 03e113c6c..bfb10bb9a 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -14,18 +14,29 @@ cloud_all: true --- Create a check in the InfluxDB user interface (UI). +Checks query data and apply a status to each point based on specified conditions. + +## Check types +There are two types of checks – a threshold check and a deadman check. + +#### Threshold check +A threshold check assigns a status based on a value being above, below, +inside, or outside of defined thresholds. +[Create a threshold check](#create-a-threshold-check). + +#### Deadman check +A deadman check assigns a status to data when a series or group doesn't not +report in a specified amount of time. +[Create a deadman check](#create-a-deadman-check). + +## Parts of a check A check consists of two parts – a query and check configuration. -##### Check query +#### Check query - Specifies the dataset to monitor. -- Requires a bucket, measurement, field, and an aggregate function. - - {{% note %}}The aggregate function aggregates data points between the specified check intervals - and returns a single value for the check to process. - {{% /note %}} - May include tags to narrow results. -##### Check configuration +#### Check configuration - Defines check properties, including the check interval and status message. - Evaluates specified conditions and applies a status (if applicable) to each data point: - `crit` @@ -35,23 +46,28 @@ A check consists of two parts – a query and check configuration. - Stores status in the `_level` column. ## Create a check in the InfluxDB UI -1. Click **Monitoring & Alerting** in the sidebar. +1. Click **Monitoring & Alerting** in the sidebar in the InfluxDB UI. {{< nav-icon "alerts" >}} -2. In the top right corner of the **Checks** column, click **{{< icon "plus" >}} Create**. +2. In the top right corner of the **Checks** column, click **{{< icon "plus" >}} Create** + and select the [type of check](#check-types) to create. +3. Click **Name this check** in the top left corner and provide a unique name for the check. -3. Click **Name this check** in the top left corner and provide a unique name for the check. +#### Configure the check query +1. Select the **bucket**, **measurement**, **field** and **tag sets** to query. +2. If creating a threshold checks, select an **aggregate function**. + Aggregate functions aggregate data between the specified check intervals and + return a single value for the check to process. + + In the **Aggregate functions** column, select an interval from the interval drop-down list + (for example, "Every 5 minutes") and an aggregate function from the list of functions. -### Configure the query -1. In the **Query view**, select the bucket, measurement, field and tag sets to query. -2. In the **Aggregate functions** column, select an interval from the interval drop-down list - (for example, "Every 5 minutes") and an aggregate function from the list of functions. 3. Click **Submit** to run the query and preview the results. To see the raw query results, click the **{{< icon "toggle" >}} View Raw Data** toggle. -### Configure the check -1. Click **2. Check** near the top of the window to display the **Check view**. +#### Configure the check +1. Click **2. Check** near the top of the window. 2. In the **Properties** column, configure the following: ##### Schedule Every @@ -113,32 +129,22 @@ count = 12 When a check generates a status, it stores the message in the `_message` column. -4. In the **Conditions** column, define the logic that assigns a status or level to data. - Select the type of check to configure: - - ##### Threshold - A threshold check assigns a status based on a value being above, below, - inside, or outside of defined thresholds. - [Configure a threshold check](#configure-a-threshold-check). - - ##### Deadman - A deadman check assigns a status to data when a series or group has not - reported in a specified amount of time. - [Configure a deadman check](#configure-a-deadman-check). +4. Define check conditions that assign statuses to points. ##### Configure a threshold check - 1. For each status you want to configure, click the status name (CRIT, WARN, INFO, or OK). + 1. In the **Thresholds** column, click the status name (CRIT, WARN, INFO, or OK) + to define conditions for that specific status. 2. From the **When value** drop-down list, select a threshold: is above, is below, is inside of, is outside of. 3. Enter a value or values for the threshold. You can also use the threshold sliders in the data visualization to define threshold values. ##### Configure a deadman check - 1. In the **for** field, enter a duration for the deadman check. - For example, `5m`, `1h`, or `2h30m`. + 1. In the **Deadman** column, enter a duration for the deadman check in the **for** field. + For example, `90s`, `5m`, `2h30m`, etc. 2. Use the **set status to** drop-down list to select a status to set on a dead series. 3. In the **And stop checking after** field, enter the time to stop monitoring the series. - For example, `30m`, `2h`, `3h15m`. + For example, `30m`, `2h`, `3h15m`, etc. 5. Click the green **{{< icon "check" >}}** in the top right corner to save the check. From dcdc630b6aa75d148620fc0dc8d4074d0ca022a2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 15:59:13 -0600 Subject: [PATCH 237/258] updated bucket management and writing data workflows, resolves #467 --- .../organizations/buckets/create-bucket.md | 6 +-- .../organizations/buckets/delete-bucket.md | 2 +- .../organizations/buckets/update-bucket.md | 10 ++-- .../organizations/buckets/view-buckets.md | 3 +- content/v2.0/write-data/_index.md | 51 +++++++++++++------ .../manage-scrapers/create-a-scraper.md | 3 +- .../manage-scrapers/delete-a-scraper.md | 7 ++- .../manage-scrapers/update-a-scraper.md | 2 +- .../v2.0/write-data/use-telegraf/_index.md | 2 +- 9 files changed, 52 insertions(+), 34 deletions(-) diff --git a/content/v2.0/organizations/buckets/create-bucket.md b/content/v2.0/organizations/buckets/create-bucket.md index ff8715cb3..c856f2548 100644 --- a/content/v2.0/organizations/buckets/create-bucket.md +++ b/content/v2.0/organizations/buckets/create-bucket.md @@ -21,9 +21,9 @@ to create a bucket. 2. Select **Buckets**. 3. Click **{{< icon "plus" >}} Create Bucket** in the upper right. 4. Enter a **Name** for the bucket. -5. Select **Delete Data older than**: +5. Select when to **Delete Data**. Select **Never** to retain data forever. - Select **Periodically** to define a specific retention policy. + Select **Older than** to choose a specific retention policy. 5. Click **Create** to create the bucket. ## Create a bucket using the influx CLI @@ -32,7 +32,7 @@ Use the [`influx bucket create` command](/v2.0/reference/cli/influx/bucket/creat to create a new bucket. A bucket requires the following: - A name -- The name or ID of the organization to which it belongs +- The name or ID of the organization the bucket belongs to - A retention period in nanoseconds ```sh diff --git a/content/v2.0/organizations/buckets/delete-bucket.md b/content/v2.0/organizations/buckets/delete-bucket.md index e1652ce12..8c25b4948 100644 --- a/content/v2.0/organizations/buckets/delete-bucket.md +++ b/content/v2.0/organizations/buckets/delete-bucket.md @@ -20,7 +20,7 @@ to delete a bucket. 2. Select **Buckets**. 3. Hover over the bucket you would like to delete. -4. Click **{{< icon "delete" >}} Delete Bucket** and **Delete** to delete the bucket. +4. Click **{{< icon "delete" >}} Delete Bucket** and **Confirm** to delete the bucket. ## Delete a bucket using the influx CLI diff --git a/content/v2.0/organizations/buckets/update-bucket.md b/content/v2.0/organizations/buckets/update-bucket.md index 76e5b11f7..0bbfef353 100644 --- a/content/v2.0/organizations/buckets/update-bucket.md +++ b/content/v2.0/organizations/buckets/update-bucket.md @@ -8,6 +8,7 @@ menu: parent: Manage buckets weight: 202 --- + Use the `influx` command line interface (CLI) or the InfluxDB user interface (UI) to update a bucket. Note that updating an bucket's name will affect any assets that reference the bucket by name, including the following: @@ -28,10 +29,9 @@ If you change a bucket name, be sure to update the bucket in the above places as {{< nav-icon "load data" >}} 2. Select **Buckets**. -3. Hover over the name of the bucket you want to rename in the list. -4. Click **Rename**. -5. Review the information in the window that appears and click **I understand, let's rename my bucket**. -6. Update the bucket's name and click **Change Bucket Name**. +3. Click **Rename** under the bucket you want to rename. +4. Review the information in the window that appears and click **I understand, let's rename my bucket**. +5. Update the bucket's name and click **Change Bucket Name**. ## Update a bucket's retention policy in the InfluxDB UI @@ -50,7 +50,7 @@ Use the [`influx bucket update` command](/v2.0/reference/cli/influx/bucket/updat to update a bucket. Updating a bucket requires the following: - The bucket ID _(provided in the output of `influx bucket find`)_ -- The name or ID of the organization to which the bucket belongs +- The name or ID of the organization the bucket belongs to. ##### Update the name of a bucket ```sh diff --git a/content/v2.0/organizations/buckets/view-buckets.md b/content/v2.0/organizations/buckets/view-buckets.md index 2fd8049e9..5dd6e91a9 100644 --- a/content/v2.0/organizations/buckets/view-buckets.md +++ b/content/v2.0/organizations/buckets/view-buckets.md @@ -21,8 +21,7 @@ weight: 202 ## View buckets using the influx CLI Use the [`influx bucket find` command](/v2.0/reference/cli/influx/bucket/find) -to view a buckets in an organization. Viewing bucket requires the following: - +to view a buckets in an organization. ```sh influx bucket find diff --git a/content/v2.0/write-data/_index.md b/content/v2.0/write-data/_index.md index d5b856dd8..542844b19 100644 --- a/content/v2.0/write-data/_index.md +++ b/content/v2.0/write-data/_index.md @@ -119,24 +119,43 @@ influx write -b bucketName -o orgName -p s @/path/to/line-protocol.txt {{< nav-icon "load data" >}} 2. Select **Buckets**. -3. Hover over the bucket to write data to and click **{{< icon "plus" >}} Add Data**. -4. Select **Line Protocol**. - _You can also [use Telegraf](/v2.0/write-data/use-telegraf/) or - [scrape data](/v2.0/write-data/scrape-data/)._ -5. Select **Upload File** or **Enter Manually**. +3. Under the bucket you want to write data to, click **{{< icon "plus" >}} Add Data**. +4. Select from the following options: - - **Upload File:** - Select the time precision of your data. - Drag and drop the line protocol file into the UI or click to select the - file from your file manager. - - **Enter Manually:** - Select the time precision of your data. - Manually enter line protocol. + - [Configure Telegraf Agent](#configure-telegraf-agent) + - [Line Protocol](#line-protocol-1) + - [Scrape Metrics](#scrape-metrics) -6. Click **Continue**. - A message indicates whether data is successfully written to InfluxDB. -7. To add more data or correct line protocol, click **Previous**. -8. Click **Finish**. + --- + + #### Configure Telegraf Agent + 1. _See [Automatically create a Telegraf configuration](/v2.0/write-data/use-telegraf/auto-config/#create-a-telegraf-configuration) + for more details._ + + --- + + #### Line Protocol + 1. Select **Upload File** or **Enter Manually**. + - **Upload File:** + Select the time precision of your data. + Drag and drop the line protocol file into the UI or click to select the + file from your file manager. + - **Enter Manually:** + Select the time precision of your data. + Manually enter line protocol. + 2. Click **Continue**. + A message indicates whether data is successfully written to InfluxDB. + 3. To add more data or correct line protocol, click **Previous**. + 4. Click **Finish**. + + --- + + #### Scrape Metrics + 1. _See [Create a scraper](/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper/#create-a-scraper-in-the-influxdb-ui) + for more details._ + + {{% cloud-msg %}}{{< cloud-name >}} does not support scrapers. + {{% /cloud-msg %}} ## Other ways to write data to InfluxDB diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md index c4fcae5b7..5abec8bb1 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper.md @@ -21,7 +21,8 @@ Create a new scraper in the InfluxDB user interface (UI). 3. Click **{{< icon "plus" >}} Create Scraper**. 4. Enter a **Name** for the scraper. 5. Select a **Bucket** to store the scraped data. -6. Enter the **Target URL** to scrape. The default URL value is `http://localhost:9999/metrics`, +6. Enter the **Target URL** to scrape. + The default URL value is `http://localhost:9999/metrics`, which provides InfluxDB-specific metrics in the [Prometheus data format](https://prometheus.io/docs/instrumenting/exposition_formats/). 7. Click **Create**. diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md index 4e5580729..e65ea251c 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/delete-a-scraper.md @@ -17,7 +17,6 @@ Delete a scraper from the InfluxDB user interface (UI). {{< nav-icon "load data" >}} -2. Click **Scrapers**. A listing of any existing scrapers appears with the - **Name**, **URL**, and **Bucket** for each scraper. -3. Hover over the scraper you want to delete and click **Delete**. -4. Click **Confirm**. +2. Click **Scrapers**. +3. Hover over the scraper you want to delete and click the **{{< icon "delete" >}}** icon. +4. Click **Delete**. diff --git a/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md b/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md index 25a163387..1edb06f29 100644 --- a/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md +++ b/content/v2.0/write-data/scrape-data/manage-scrapers/update-a-scraper.md @@ -22,7 +22,7 @@ To modify either, [create a new scraper](/v2.0/write-data/scrape-data/manage-scr {{< nav-icon "load data" >}} -2. Click **Scrapers**. A list of existing scrapers appears. +2. Click **Scrapers**. 3. Hover over the scraper you would like to update and click the **{{< icon "pencil" >}}** that appears next to the scraper name. 4. Enter a new name for the scraper. Press Return or click out of the name field to save the change. diff --git a/content/v2.0/write-data/use-telegraf/_index.md b/content/v2.0/write-data/use-telegraf/_index.md index e7afee4a9..508516b3e 100644 --- a/content/v2.0/write-data/use-telegraf/_index.md +++ b/content/v2.0/write-data/use-telegraf/_index.md @@ -21,7 +21,7 @@ Its vast library of input plugins and "plug-and-play" architecture lets you quic and easily collect metrics from many different sources. This article describes how to use Telegraf to collect and store data in InfluxDB v2.0. -_See [Telegraf plugins](/v2.0/reference/telegraf-plugins/) for a list of available plugins._ +_For a list of available plugins, see [Telegraf plugins](/v2.0/reference/telegraf-plugins/)._ #### Requirements - **Telegraf 1.9.2 or greater**. From b16cbf574bdebbac8abd5c0dc744b90d0fb7f154 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 16:01:27 -0600 Subject: [PATCH 238/258] added flux 0.47.1 to flux changelog --- content/v2.0/reference/release-notes/flux.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 2fe40ffe0..44c899d14 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,11 +11,18 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.1**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} +## v0.47.1 [2019-09-18] + +### Bug fixes +- Pass dependencies to WalkIR + +--- + ## v0.47.0 [2019-09-13] ### Bug fixes From ae206fc243f9c0a477318d88301fbf8318f4c7a2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 16:25:29 -0600 Subject: [PATCH 239/258] added a note to line protocol doc recommending including timestamps, resolves #466 --- content/v2.0/reference/line-protocol.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/line-protocol.md b/content/v2.0/reference/line-protocol.md index 8d89d9ecb..0498bd217 100644 --- a/content/v2.0/reference/line-protocol.md +++ b/content/v2.0/reference/line-protocol.md @@ -93,7 +93,12 @@ The Unix nanosecond timestamp for the data point. InfluxDB accepts one timestamp per point. If no timestamp is provided, InfluxDB uses the system time (UTC) of its host machine. -_**Data type:** [Unix timestamp](#unix-timestamp)_ +_**Data type:** [Unix timestamp](#unix-timestamp)_ + +{{% note %}} +Though timestamps are optional, you should include them to ensure times associated with points +are the actual times metrics were observed rather than when InfluxDB received them. +{{% /note %}} {{% note %}} _Use the default nanosecond precision timestamp or specify an alternative precision From 06de76528fe3bcef85d287dfc2fbf9f00b6b459b Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 16:27:02 -0600 Subject: [PATCH 240/258] minor update to line protocol doc --- content/v2.0/reference/line-protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/line-protocol.md b/content/v2.0/reference/line-protocol.md index 0498bd217..276a2aee6 100644 --- a/content/v2.0/reference/line-protocol.md +++ b/content/v2.0/reference/line-protocol.md @@ -96,7 +96,7 @@ If no timestamp is provided, InfluxDB uses the system time (UTC) of its host mac _**Data type:** [Unix timestamp](#unix-timestamp)_ {{% note %}} -Though timestamps are optional, you should include them to ensure times associated with points +Though timestamps are optional, include them to ensure times associated with points are the actual times metrics were observed rather than when InfluxDB received them. {{% /note %}} From f35688d51f8bcaeb75f7e8ac6c07ec33bc7e4309 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 18:37:13 -0600 Subject: [PATCH 241/258] updated create check to address PR feedback --- content/v2.0/monitor-alert/checks/create.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/v2.0/monitor-alert/checks/create.md b/content/v2.0/monitor-alert/checks/create.md index bfb10bb9a..41631062b 100644 --- a/content/v2.0/monitor-alert/checks/create.md +++ b/content/v2.0/monitor-alert/checks/create.md @@ -25,8 +25,8 @@ inside, or outside of defined thresholds. [Create a threshold check](#create-a-threshold-check). #### Deadman check -A deadman check assigns a status to data when a series or group doesn't not -report in a specified amount of time. +A deadman check assigns a status to data when a series or group doesn't report +in a specified amount of time. [Create a deadman check](#create-a-deadman-check). ## Parts of a check @@ -56,7 +56,7 @@ A check consists of two parts – a query and check configuration. #### Configure the check query 1. Select the **bucket**, **measurement**, **field** and **tag sets** to query. -2. If creating a threshold checks, select an **aggregate function**. +2. If creating a threshold check, select an **aggregate function**. Aggregate functions aggregate data between the specified check intervals and return a single value for the check to process. @@ -129,7 +129,8 @@ count = 12 When a check generates a status, it stores the message in the `_message` column. -4. Define check conditions that assign statuses to points. +4. Define check conditions that assign statuses to points. + Condition options depend on your check type. ##### Configure a threshold check 1. In the **Thresholds** column, click the status name (CRIT, WARN, INFO, or OK) From fd72e0017f9b3d45a2db42e1a4ac9af58f6919b6 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 18:42:00 -0600 Subject: [PATCH 242/258] updated write docs to address PR feedback --- content/v2.0/organizations/buckets/create-bucket.md | 6 +++--- content/v2.0/write-data/_index.md | 6 ++---- content/v2.0/write-data/use-telegraf/_index.md | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/content/v2.0/organizations/buckets/create-bucket.md b/content/v2.0/organizations/buckets/create-bucket.md index c856f2548..6616e838a 100644 --- a/content/v2.0/organizations/buckets/create-bucket.md +++ b/content/v2.0/organizations/buckets/create-bucket.md @@ -21,9 +21,9 @@ to create a bucket. 2. Select **Buckets**. 3. Click **{{< icon "plus" >}} Create Bucket** in the upper right. 4. Enter a **Name** for the bucket. -5. Select when to **Delete Data**. - Select **Never** to retain data forever. - Select **Older than** to choose a specific retention policy. +5. Select when to **Delete Data**: + - **Never** to retain data forever. + - **Older than** to choose a specific retention policy. 5. Click **Create** to create the bucket. ## Create a bucket using the influx CLI diff --git a/content/v2.0/write-data/_index.md b/content/v2.0/write-data/_index.md index 542844b19..909e9ba52 100644 --- a/content/v2.0/write-data/_index.md +++ b/content/v2.0/write-data/_index.md @@ -129,8 +129,7 @@ influx write -b bucketName -o orgName -p s @/path/to/line-protocol.txt --- #### Configure Telegraf Agent - 1. _See [Automatically create a Telegraf configuration](/v2.0/write-data/use-telegraf/auto-config/#create-a-telegraf-configuration) - for more details._ + 1. To configure a Telegraf agent, see [Automatically create a Telegraf configuration](/v2.0/write-data/use-telegraf/auto-config/#create-a-telegraf-configuration). --- @@ -151,8 +150,7 @@ influx write -b bucketName -o orgName -p s @/path/to/line-protocol.txt --- #### Scrape Metrics - 1. _See [Create a scraper](/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper/#create-a-scraper-in-the-influxdb-ui) - for more details._ + 1. To scrape metrics, see [Create a scraper](/v2.0/write-data/scrape-data/manage-scrapers/create-a-scraper/#create-a-scraper-in-the-influxdb-ui). {{% cloud-msg %}}{{< cloud-name >}} does not support scrapers. {{% /cloud-msg %}} diff --git a/content/v2.0/write-data/use-telegraf/_index.md b/content/v2.0/write-data/use-telegraf/_index.md index 508516b3e..ed233bab4 100644 --- a/content/v2.0/write-data/use-telegraf/_index.md +++ b/content/v2.0/write-data/use-telegraf/_index.md @@ -21,7 +21,7 @@ Its vast library of input plugins and "plug-and-play" architecture lets you quic and easily collect metrics from many different sources. This article describes how to use Telegraf to collect and store data in InfluxDB v2.0. -_For a list of available plugins, see [Telegraf plugins](/v2.0/reference/telegraf-plugins/)._ +For a list of available plugins, see [Telegraf plugins](/v2.0/reference/telegraf-plugins/). #### Requirements - **Telegraf 1.9.2 or greater**. From 32185c2a266424f739d03815a75bd8f443663985 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 18 Sep 2019 18:43:56 -0600 Subject: [PATCH 243/258] updated line protocol doc to address PR feedback --- content/v2.0/reference/line-protocol.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/line-protocol.md b/content/v2.0/reference/line-protocol.md index 276a2aee6..5d43cfa63 100644 --- a/content/v2.0/reference/line-protocol.md +++ b/content/v2.0/reference/line-protocol.md @@ -96,8 +96,8 @@ If no timestamp is provided, InfluxDB uses the system time (UTC) of its host mac _**Data type:** [Unix timestamp](#unix-timestamp)_ {{% note %}} -Though timestamps are optional, include them to ensure times associated with points -are the actual times metrics were observed rather than when InfluxDB received them. +To ensure a data point includes the time a metric is observed (not received by InfluxDB), +include the timestamp. {{% /note %}} {{% note %}} From 3a6d855fa43bf8d48f37623e38b75f1d51883d2d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 19 Sep 2019 09:31:28 -0600 Subject: [PATCH 244/258] added gzip compression to query guide, resolves #384 --- content/v2.0/query-data/execute-queries.md | 41 +++++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/content/v2.0/query-data/execute-queries.md b/content/v2.0/query-data/execute-queries.md index 462db6f40..d001a9a7e 100644 --- a/content/v2.0/query-data/execute-queries.md +++ b/content/v2.0/query-data/execute-queries.md @@ -60,35 +60,50 @@ In your request, set the following: - Your organization via the `org` or `orgID` URL parameters. - `Authorization` header to `Token ` + your authentication token. -- `accept` header to `application/csv`. -- `content-type` header to `application/vnd.flux`. +- `Accept` header to `application/csv`. +- `Content-type` header to `application/vnd.flux`. +- Your plain text query as the request's raw data. -This lets you POST the Flux query in plain text and receive the annotated CSV response. +InfluxDB returns the query results in [annotated CSV](/v2.0/reference/annotated-csv/). + +{{% note %}} +#### Use gzip to compress the query response +To compress the query response, set the `Accept-Encoding` header to `gzip`. +This saves network bandwidth, but increases server-side load. +{{% /note %}} Below is an example `curl` command that queries InfluxDB: {{< code-tabs-wrapper >}} {{% code-tabs %}} -[Multi-line](#) -[Single-line](#) +[Without compression](#) +[With compression](#) {{% /code-tabs %}} {{% code-tab-content %}} ```bash curl http://localhost:9999/api/v2/query?org=my-org -XPOST -sS \ --H 'Authorization: Token YOURAUTHTOKEN' \ --H 'accept:application/csv' \ --H 'content-type:application/vnd.flux' \ --d 'from(bucket:“test”) - |> range(start:-1000h) - |> group(columns:[“_measurement”], mode:“by”) - |> sum()' + -H 'Authorization: Token YOURAUTHTOKEN' \ + -H 'Accept: application/csv' \ + -H 'Content-type: application/vnd.flux' \ + -d 'from(bucket:“test”) + |> range(start:-1000h) + |> group(columns:[“_measurement”], mode:“by”) + |> sum()' ``` {{% /code-tab-content %}} {{% code-tab-content %}} ```bash -curl http://localhost:9999/api/v2/query?org=my-org -XPOST -sS -H 'Authorization: Token TOKENSTRINGHERE' -H 'accept:application/csv' -H 'content-type:application/vnd.flux' -d 'from(bucket:“test”) |> range(start:-1000h) |> group(columns:[“_measurement”], mode:“by”) |> sum()' +curl http://localhost:9999/api/v2/query?org=my-org -XPOST -sS \ + -H 'Authorization: Token YOURAUTHTOKEN' \ + -H 'Accept: application/csv' \ + -H 'Content-type: application/vnd.flux' \ + -H 'Accept-Encoding: gzip' \ + -d 'from(bucket:“test”) + |> range(start:-1000h) + |> group(columns:[“_measurement”], mode:“by”) + |> sum()' ``` {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} From 34c4a9b462f5fc896595a2ef3d4dec2875503c33 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 19 Sep 2019 11:33:19 -0600 Subject: [PATCH 245/258] added guide for using exists operator, resolves #428 --- content/v2.0/query-data/guides/exists.md | 69 +++++++++++++++++++ .../transformations/aggregates/reduce.md | 3 +- .../stdlib/built-in/transformations/filter.md | 16 +++++ .../stdlib/built-in/transformations/map.md | 1 + 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 content/v2.0/query-data/guides/exists.md diff --git a/content/v2.0/query-data/guides/exists.md b/content/v2.0/query-data/guides/exists.md new file mode 100644 index 000000000..15b172bb9 --- /dev/null +++ b/content/v2.0/query-data/guides/exists.md @@ -0,0 +1,69 @@ +--- +title: Check if a value exists +seotitle: Use Flux to check if a value exists +description: > + Use the Flux `exists` operator to check if an object contains a key or if that + key's value is `null`. +v2.0/tags: [exists] +menu: + v2_0: + name: Check if a value exists + parent: How-to guides +weight: 209 +--- + +Use the Flux `exists` operator to check if an object contains a key or if that +key's value is `null`. + +```js +p = {firstName: "John", lastName: "Doe", age: 42} + +exists p.firstName +// Returns true + +exists p.height +// Returns false +``` + +Use `exists` with row functions ( +[`filter()`](/v2.0/reference/flux/stdlib/built-in/transformations/filter/), +[`map()`](/v2.0/reference/flux/stdlib/built-in/transformations/map/), +[`reduce()`](/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce/)) +to check if a row includes a column or if the value for that column is `null`. + +#### Filter out null values +```js +from(bucket: "example-bucket") + |> range(start: -5m) + |> filter(fn: (r) => exists r._value) +``` + +#### Map values based on existence +```js +from(bucket: "default") + |> range(start: -30s) + |> map(fn: (r) => ({ + r with + human_readable: + if exists r._value then "${r._field} is ${string(v:r._value)}." + else "${r._field} has no value." + })) +``` + +#### Ignore null values in a custom aggregate function +```js +customSumProduct = (tables=<-) => + tables + |> reduce( + identity: {sum: 0.0, product: 1.0}, + fn: (r, accumulator) => ({ + r with + sum: + if exists r._value then r._value + accumulator.sum + else accumulator.sum, + product: + if exists r._value then r.value * accumulator.product + else accumulator.product + }) + ) +``` diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md index 293e020c3..72f453a62 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/aggregates/reduce.md @@ -10,6 +10,7 @@ menu: name: reduce parent: built-in-aggregates weight: 501 +v2.0/tags: [exists] --- The `reduce()` function aggregates records in each table according to the reducer, @@ -96,7 +97,7 @@ creates a new column if it doesn't exist, and includes all existing columns in the output table. ```js -recduce(fn: (r) => ({ r with newColumn: r._value * 2 })) +reduce(fn: (r) => ({ r with newColumn: r._value * 2 })) ``` diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md index d52681b23..7dec4df8c 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/filter.md @@ -9,6 +9,7 @@ menu: name: filter parent: built-in-transformations weight: 401 +v2.0/tags: [exists] --- The `filter()` function filters data based on conditions defined in a predicate function ([`fn`](#fn)). @@ -42,6 +43,7 @@ Objects evaluated in `fn` functions are represented by `r`, short for "record" o ## Examples +##### Filter based on measurement, field, and tag ```js from(bucket:"example-bucket") |> range(start:-1h) @@ -52,6 +54,20 @@ from(bucket:"example-bucket") ) ``` +##### Filter out null values +```js +from(bucket:"example-bucket") + |> range(start:-1h) + |> filter(fn: (r) => exists r._value ) +``` + +##### Filter values based on thresholds +```js +from(bucket:"example-bucket") + |> range(start:-1h) + |> filter(fn: (r) => r._value > 50.0 and r._value < 65.0 ) +``` +
##### Related InfluxQL functions and statements: diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md index 8a4d8505f..b5327c361 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/map.md @@ -9,6 +9,7 @@ menu: name: map parent: built-in-transformations weight: 401 +v2.0/tags: [exists] --- The `map()` function applies a function to each record in the input tables. From 833300755967aa474a7ee72479fa09c8e207f0f2 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 19 Sep 2019 16:27:36 -0600 Subject: [PATCH 246/258] added timestamp manipulation guide, resolves #476 --- .../guides/manipulate-timestamps.md | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 content/v2.0/query-data/guides/manipulate-timestamps.md diff --git a/content/v2.0/query-data/guides/manipulate-timestamps.md b/content/v2.0/query-data/guides/manipulate-timestamps.md new file mode 100644 index 000000000..bf6c1335d --- /dev/null +++ b/content/v2.0/query-data/guides/manipulate-timestamps.md @@ -0,0 +1,111 @@ +--- +title: Manipulate timestamps with Flux +description: > + Use Flux to process and manipulate timestamps. +menu: + v2_0: + name: Manipulate timestamps + parent: How-to guides +weight: 209 +--- + +Every point stored in InfluxDB has an associated timestamp. +Flux includes tools to process and manipulate timestamps to suit your needs. + +- [Timestamp conversions](#timestamp-conversions) +- [Common scenarios](#common-scenarios) +- [Time-related Flux functions](#time-related-flux-functions) + +## Timestamp conversions + +### Convert nanosecond epoch timestamp to RFC3339 +Use the [`time()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time/) +to convert a **nanosecond** epoch timestamp to RFC3339 format. + +```js +time(v: 1568808000000000000) +// Returns 2019-09-18T12:00:00.000000000Z +``` + +### Convert RFC3339 timestamp to nanosecond epoch timestamp +Use the [`uint()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/unit/) +to convert an RFC3339 timestamp to a nanosecond epoch timestamp. + +```js +uint(v: 2019-09-18T12:00:00.000000000Z) +// Returns 1568808000000000000 +``` + +## Common scenarios + +### Calculate the duration between two timestamps +Flux doesn't support mathematical operations with time values. +To calculate the duration between two timestamps: + +1. Use the `uint()` function to convert each timestamp to a nanosecond epoch timestamp. +2. Subtract one nanosecond epoch timestamp from the other. +3. Use the `duration()` function to convert the result into a duration. + +```js +time1 = uint(v: 2019-09-17T21:12:05Z) +time2 = uint(v: 2019-09-18T22:16:35Z) + +duration(v: time2 - time1) +// Returns 25h4m30s +``` + +{{% note %}} +Flux doesn't support duration column types. +To store a duration in a column, use the [`string()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string/) +to convert it to a string. +{{% /note %}} + +## Time-related Flux functions + +#### now() +Use the [`now()` function](/v2.0/reference/flux/stdlib/built-in/misc/now/) to +return the current UTC time in RFC3339 format. + +```js +now() +``` + +#### experimental.addDuration() +The [`experimental.addDuration()` function](/v2.0/reference/flux/stdlib/experimental/addduration/) +adds a duration to a specified time and returns the resulting time. + +{{% warn %}} +By using `experimental.addDuration()`, you accept the +[risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). +{{% /warn %}} + +```js +import "experimental" + +experimental.addDuration( + d: 6h, + to: 2019-09-16T12:00:00Z, +) + +// Returns 2019-09-16T18:00:00.000000000Z +``` + +#### experimental.subDuration() +The [`experimental.addDuration()` function](/v2.0/reference/flux/stdlib/experimental/subduration/) +subtracts a duration from a specified time and returns the resulting time. + +{{% warn %}} +By using `experimental.addDuration()`, you accept the +[risks of experimental functions](/v2.0/reference/flux/stdlib/experimental/#use-experimental-functions-at-your-own-risk). +{{% /warn %}} + +```js +import "experimental" + +experimental.subDuration( + d: 6h, + from: 2019-09-16T12:00:00Z, +) + +// Returns 2019-09-16T06:00:00.000000000Z +``` From 4d23e5c2b3514148b13e4fea23cd612622ab8a24 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 20 Sep 2019 09:09:03 -0600 Subject: [PATCH 247/258] updated timestamp guide with PR feedback --- .../guides/manipulate-timestamps.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/content/v2.0/query-data/guides/manipulate-timestamps.md b/content/v2.0/query-data/guides/manipulate-timestamps.md index bf6c1335d..c15afdf6f 100644 --- a/content/v2.0/query-data/guides/manipulate-timestamps.md +++ b/content/v2.0/query-data/guides/manipulate-timestamps.md @@ -10,24 +10,23 @@ weight: 209 --- Every point stored in InfluxDB has an associated timestamp. -Flux includes tools to process and manipulate timestamps to suit your needs. +Use Flux to process and manipulate timestamps to suit your needs. -- [Timestamp conversions](#timestamp-conversions) -- [Common scenarios](#common-scenarios) +- [Convert timestamp format](#convert-timestamp-format) - [Time-related Flux functions](#time-related-flux-functions) -## Timestamp conversions +## Convert timestamp format ### Convert nanosecond epoch timestamp to RFC3339 Use the [`time()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/time/) -to convert a **nanosecond** epoch timestamp to RFC3339 format. +to convert a **nanosecond** epoch timestamp to an RFC3339 timestamp. ```js time(v: 1568808000000000000) // Returns 2019-09-18T12:00:00.000000000Z ``` -### Convert RFC3339 timestamp to nanosecond epoch timestamp +### Convert RFC3339 to nanosecond epoch timestamp Use the [`uint()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/unit/) to convert an RFC3339 timestamp to a nanosecond epoch timestamp. @@ -36,10 +35,8 @@ uint(v: 2019-09-18T12:00:00.000000000Z) // Returns 1568808000000000000 ``` -## Common scenarios - ### Calculate the duration between two timestamps -Flux doesn't support mathematical operations with time values. +Flux doesn't support mathematical operations using [time type](/v2.0/reference/flux/language/types/#time-types) values. To calculate the duration between two timestamps: 1. Use the `uint()` function to convert each timestamp to a nanosecond epoch timestamp. @@ -57,12 +54,12 @@ duration(v: time2 - time1) {{% note %}} Flux doesn't support duration column types. To store a duration in a column, use the [`string()` function](/v2.0/reference/flux/stdlib/built-in/transformations/type-conversions/string/) -to convert it to a string. +to convert the duration to a string. {{% /note %}} ## Time-related Flux functions -#### now() +### Retrieve the current time Use the [`now()` function](/v2.0/reference/flux/stdlib/built-in/misc/now/) to return the current UTC time in RFC3339 format. @@ -70,7 +67,7 @@ return the current UTC time in RFC3339 format. now() ``` -#### experimental.addDuration() +### Add a duration to a timestamp The [`experimental.addDuration()` function](/v2.0/reference/flux/stdlib/experimental/addduration/) adds a duration to a specified time and returns the resulting time. @@ -90,7 +87,7 @@ experimental.addDuration( // Returns 2019-09-16T18:00:00.000000000Z ``` -#### experimental.subDuration() +### Subtract a duration from a timestamps The [`experimental.addDuration()` function](/v2.0/reference/flux/stdlib/experimental/subduration/) subtracts a duration from a specified time and returns the resulting time. From 843bdfba49e1cbbac7f8bd5ee70680b0b1fcaab0 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 20 Sep 2019 09:54:02 -0600 Subject: [PATCH 248/258] added flux 0.48.0 to the flux changelog --- content/v2.0/reference/release-notes/flux.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 44c899d14..44df4f439 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,11 +11,27 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.47.1**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.48.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} +## v0.48.0 [2019-09-20] + +### Breaking changes +- Convert the Flux memory allocator into an arrow allocator. + +### Features +- New dependency injection framework. +- Add planner options to Flux language. +- Make flux `quantile()` behavior match PromQL `quantile()` aggregate. + +### Bug fixes +- Passing context to WalkIR. +- Make `join()` reject input tables lacking `on` columns. + +--- + ## v0.47.1 [2019-09-18] ### Bug fixes From 78e86d18d8b9e8296a59cef4b15dabc0a6b80955 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Fri, 20 Sep 2019 10:01:30 -0600 Subject: [PATCH 249/258] clarified promql/quantile update in flux 0.48.0 changelog --- content/v2.0/reference/release-notes/flux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 44df4f439..4ad1f3d13 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -24,7 +24,7 @@ InfluxDB until the next InfluxDB v2.0 release._ ### Features - New dependency injection framework. - Add planner options to Flux language. -- Make flux `quantile()` behavior match PromQL `quantile()` aggregate. +- Make Flux `internal/promql/quantile` behavior match PromQL `quantile` aggregate. ### Bug fixes - Passing context to WalkIR. From 7b49273d6cc2fddd624e6cf2edb30859495b276d Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 23 Sep 2019 10:31:21 -0600 Subject: [PATCH 250/258] clarified telegraf/cloud connections, resolves #481 --- .../v2.0/write-data/use-telegraf/auto-config/_index.md | 5 ++++- content/v2.0/write-data/use-telegraf/manual-config.md | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/content/v2.0/write-data/use-telegraf/auto-config/_index.md b/content/v2.0/write-data/use-telegraf/auto-config/_index.md index 64f426274..4a1b18417 100644 --- a/content/v2.0/write-data/use-telegraf/auto-config/_index.md +++ b/content/v2.0/write-data/use-telegraf/auto-config/_index.md @@ -70,7 +70,10 @@ export INFLUX_TOKEN=YourAuthenticationToken Start the Telegraf service using the `-config` flag to specify the URL of your generated configuration file. Telegraf starts using the Telegraf configuration pulled from InfluxDB API. -_See the configuration **Setup Instructions** for the exact command._ +{{% note %}} +InfluxDB host URLs and ports differ between InfluxDB OSS and InfluxDB Cloud. +For the exact command, see the Telegraf configuration **Setup Instructions** in the InfluxDB UI. +{{% /note %}} ```sh telegraf -config http://localhost:9999/api/v2/telegrafs/0xoX00oOx0xoX00o diff --git a/content/v2.0/write-data/use-telegraf/manual-config.md b/content/v2.0/write-data/use-telegraf/manual-config.md index 403e67d68..65eecfa1b 100644 --- a/content/v2.0/write-data/use-telegraf/manual-config.md +++ b/content/v2.0/write-data/use-telegraf/manual-config.md @@ -40,8 +40,11 @@ An array of URLs for your InfluxDB v2.0 instances. _By default, InfluxDB runs on port `9999`._ {{% cloud-msg %}} -To write data to an {{< cloud-name "short" >}} instance, use the URL of your {{< cloud-name "short" >}} -user interface (UI). +###### {{< cloud-name "short" >}} URL +To write data to an {{< cloud-name "short" >}} instance, use the URL of your +{{< cloud-name "short" >}} user interface (UI). +{{< cloud-name >}} requires HTTPS. + For example: https://us-west-2-1.aws.cloud2.influxdata.com {{% /cloud-msg %}} @@ -69,6 +72,8 @@ The name of the organization that owns the target bucket. The name of the bucket to write data to. #### Example influxdb_v2 configuration +The example below illustrates `influxdb_v2` configurations that write to InfluxDB OSS or {{< cloud-name >}}. + {{< code-tabs-wrapper >}} {{% code-tabs %}} [InfluxDB OSS](#) From b137d153a666409e99e3ef1c93a06cdc13e5d9bf Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 24 Sep 2019 09:37:31 -0600 Subject: [PATCH 251/258] added flux 0.49.0 to flux changelog --- content/v2.0/reference/release-notes/flux.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/content/v2.0/reference/release-notes/flux.md b/content/v2.0/reference/release-notes/flux.md index 4ad1f3d13..1c7ddff29 100644 --- a/content/v2.0/reference/release-notes/flux.md +++ b/content/v2.0/reference/release-notes/flux.md @@ -11,11 +11,26 @@ aliases: --- {{% note %}} -_The latest release of InfluxDB v2.0 alpha includes **Flux v0.48.0**. +_The latest release of InfluxDB v2.0 alpha includes **Flux v0.49.0**. Though newer versions of Flux may be available, they will not be included with InfluxDB until the next InfluxDB v2.0 release._ {{% /note %}} +## v0.49.0 [2019-09-24] + +### Features +- Optimize `filter()` to pass through tables when possible. +- Additional arrow builder utilities. +- Add a `benchmark()` function to the testing package. +- Add an arrow backed version of the table buffer. + +### Bug fixes +- Fix `sql.from()` connection leak. +- Fix some of the memory leaks within the standard library. +- Fix `mqtt.to()` topic parameter. + +--- + ## v0.48.0 [2019-09-20] ### Breaking changes From 8b2f44d45dbc7f7093f8fbc2108cc3c111cb1844 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 24 Sep 2019 09:11:21 -0700 Subject: [PATCH 252/258] fix broken link --- content/v2.0/write-data/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/write-data/_index.md b/content/v2.0/write-data/_index.md index 909e9ba52..ded47f2cd 100644 --- a/content/v2.0/write-data/_index.md +++ b/content/v2.0/write-data/_index.md @@ -48,7 +48,7 @@ InfluxDB accepts the following precisions: - `s` - Seconds ### Authentication token -All InfluxDB write interactions require an [authentication token](http://localhost:1313/v2.0/security/tokens/). +All InfluxDB write interactions require an [authentication token](/v2.0/security/tokens/). ### Line protocol Use line protocol to write data points to InfluxDB. From f62acb66fc2281283c22f177973ca8324dc7e2a4 Mon Sep 17 00:00:00 2001 From: Kelly Date: Tue, 24 Sep 2019 11:30:03 -0700 Subject: [PATCH 253/258] fix typo --- content/v2.0/cloud/get-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/v2.0/cloud/get-started.md b/content/v2.0/cloud/get-started.md index 3147cdd5c..7a1e9fb23 100644 --- a/content/v2.0/cloud/get-started.md +++ b/content/v2.0/cloud/get-started.md @@ -43,7 +43,7 @@ Once you're ready to grow, [upgrade to the Pay As You Go Plan](/v2.0/cloud/accou 5. Click **Continue**. {{< cloud-name >}} opens with a default organization and bucket (both created from your email address). - _To update organization and bucket names, see [Update an organtization](/v2.0/organizations/update-org/) + _To update organization and bucket names, see [Update an organization](/v2.0/organizations/update-org/) and [Update a bucket](/v2.0/organizations/buckets/update-bucket/#update-a-bucket-s-name-in-the-influxdb-ui)._ {{% cloud-msg %}} From c5fcc84e3e7aad81c681422713f5c736d06ad348 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 26 Sep 2019 09:41:33 -0600 Subject: [PATCH 254/258] removed dashboard screenshots and updated dashboard delete doc --- .../dashboards/create-dashboard.md | 4 +--- .../dashboards/delete-dashboard.md | 4 +--- static/img/2-0-dashboard-clone.png | Bin 64649 -> 0 bytes static/img/2-0-dashboard-delete.png | Bin 61982 -> 0 bytes 4 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 static/img/2-0-dashboard-clone.png delete mode 100644 static/img/2-0-dashboard-delete.png diff --git a/content/v2.0/visualize-data/dashboards/create-dashboard.md b/content/v2.0/visualize-data/dashboards/create-dashboard.md index 1aa1f1caa..66b025b4f 100644 --- a/content/v2.0/visualize-data/dashboards/create-dashboard.md +++ b/content/v2.0/visualize-data/dashboards/create-dashboard.md @@ -55,7 +55,7 @@ weight: 201 2. Select the **Templates** tab. - - In the **Static Templates** tab, a list of pre-created templates appears. + - In the **Static Templates** tab, a list of pre-created templates appears. - In the **User Templates** tab, a list of custom user-created templates appears. 3. Hover over the name of the template you want to create a dashboard from, then click **Create**. @@ -66,8 +66,6 @@ weight: 201 1. Hover over the dashboard name in the list of dashboard to show options. 2. Click **Clone**. The cloned dashboard opens. - ![Clone a dashboard](/img/2-0-dashboard-clone.png) - #### Add data to your dashboard diff --git a/content/v2.0/visualize-data/dashboards/delete-dashboard.md b/content/v2.0/visualize-data/dashboards/delete-dashboard.md index 0aa1a60db..1709d3175 100644 --- a/content/v2.0/visualize-data/dashboards/delete-dashboard.md +++ b/content/v2.0/visualize-data/dashboards/delete-dashboard.md @@ -13,9 +13,7 @@ To delete a dashboard from the InfluxDB user interface (UI): 1. Hover over the dashboard name in the list of dashboards to show options. 2. Click **{{< icon "trash" >}}**. -3. Click **Confirm** to delete your dashboard. - - ![Delete a dashboard](/img/2-0-dashboard-delete.png) +3. Click **Delete** to delete your dashboard. {{% warn %}} Deleting a dashboard cannot be undone. diff --git a/static/img/2-0-dashboard-clone.png b/static/img/2-0-dashboard-clone.png deleted file mode 100644 index 009ec04d62b1aa6258d690ea771d954d1fef182d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64649 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 diff --git a/static/img/2-0-dashboard-delete.png b/static/img/2-0-dashboard-delete.png deleted file mode 100644 index 21ebfb33fbe227654e6e0d2a08ebafe7dd529b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61982 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 From 26c4d9acd824f860c5772b049a5c2782aaac231c Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 26 Sep 2019 14:41:08 -0600 Subject: [PATCH 255/258] fixed tableFind function example --- .../built-in/transformations/stream-table/tablefind.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md index 8d7fc25f4..409ea3dbc 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/tablefind.md @@ -18,13 +18,14 @@ group key values match a predicate. If no table is found, the function errors. _**Function type:** Stream and table_ ```js -tableFind(column: "_value") +tableFind(fn: (key) => key._field == "fieldName") ``` ## Parameters {{% note %}} -Make sure `fn` parameter names match each specified parameter. To learn why, see [Match parameter names](/v2.0/reference/flux/language/data-model/#match-parameter-names). +Make sure `fn` parameter names match each specified parameter. +To learn why, see [Match parameter names](/v2.0/reference/flux/language/data-model/#match-parameter-names). {{% /note %}} ### fn From d126775b91d876edc4c27c7c971a0d837532dddc Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Thu, 26 Sep 2019 15:11:23 -0600 Subject: [PATCH 256/258] added notes about using tableFind with getRecord and getColumn --- .../built-in/transformations/stream-table/getcolumn.md | 7 +++++++ .../built-in/transformations/stream-table/getrecord.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md index fa4285d9b..cbc976099 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getcolumn.md @@ -21,6 +21,13 @@ _**Function type:** Stream and table_ getColumn(column: "_value") ``` +{{% note %}} +#### Use tableFind() to extract a single table +`getColumn()` requires a single table as input. +Use [`tableFind()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind/) +to extract a single table from a stream of tables. +{{% /note %}} + ## Parameters ### column diff --git a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md index 4e16469e5..f660be331 100644 --- a/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md +++ b/content/v2.0/reference/flux/stdlib/built-in/transformations/stream-table/getrecord.md @@ -21,6 +21,13 @@ _**Function type:** Stream and table_ getRecord(idx: 0) ``` +{{% note %}} +#### Use tableFind() to extract a single table +`getRecord()` requires a single table as input. +Use [`tableFind()`](/v2.0/reference/flux/functions/built-in/transformations/stream-table/tablefind/) +to extract a single table from a stream of tables. +{{% /note %}} + ## Parameters ### idx From 717b2bc70f1d34759f491c96e28a9dd94bcfa015 Mon Sep 17 00:00:00 2001 From: Nora Date: Thu, 26 Sep 2019 15:44:44 -0700 Subject: [PATCH 257/258] Alpha 18 changelog --- .../v2.0/reference/release-notes/influxdb.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/content/v2.0/reference/release-notes/influxdb.md b/content/v2.0/reference/release-notes/influxdb.md index cc311538f..7535474e1 100644 --- a/content/v2.0/reference/release-notes/influxdb.md +++ b/content/v2.0/reference/release-notes/influxdb.md @@ -6,6 +6,28 @@ menu: name: InfluxDB parent: Release notes weight: 101 +--- +## v2.0.0-alpha.18 [2019-09-26] + +### Features +- Add jsonweb package for future JWT support. +- Added the JMeter Template dashboard. + +## UI Improvements +- Display dashboards index as a grid. +- Add viewport scaling to html meta for responsive mobile scaling. +- Remove rename and delete functionality from system buckets. +- Prevent new buckets from being named with the reserved `_` prefix. +- Prevent user from selecting system buckets when creating Scrapers, Telegraf configurations, read/write tokens, and when saving as a task. +- Limit values from draggable threshold handles to 2 decimal places. +- Redesign check builder UI to fill the screen and make more room for composing message templates. +- Move Tokens tab from Settings to Load Data page. +- Expose all Settings tabs in navigation menu. +- Added Stream and table functions to query builder. + +## Bug Fixes +- Remove scrollbars blocking onboarding UI step. + --- ## v2.0.0-alpha.17 [2019-08-14] From b7f46ec6d377ea975c56e0508b34a5ab68cb96c2 Mon Sep 17 00:00:00 2001 From: Nora Date: Thu, 26 Sep 2019 16:06:23 -0700 Subject: [PATCH 258/258] Fix formatting --- content/v2.0/reference/release-notes/influxdb.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/v2.0/reference/release-notes/influxdb.md b/content/v2.0/reference/release-notes/influxdb.md index 7535474e1..0dccc200c 100644 --- a/content/v2.0/reference/release-notes/influxdb.md +++ b/content/v2.0/reference/release-notes/influxdb.md @@ -13,7 +13,7 @@ weight: 101 - Add jsonweb package for future JWT support. - Added the JMeter Template dashboard. -## UI Improvements +### UI Improvements - Display dashboards index as a grid. - Add viewport scaling to html meta for responsive mobile scaling. - Remove rename and delete functionality from system buckets. @@ -25,7 +25,7 @@ weight: 101 - Expose all Settings tabs in navigation menu. - Added Stream and table functions to query builder. -## Bug Fixes +### Bug Fixes - Remove scrollbars blocking onboarding UI step. ---