chore(ci): Improve CI lint and test runners
- Reconfigures prettier linting. - Adds .editorconfig to help with consistent editor settings - Refactors test runs: - Removes test configuration from compose.yaml (not suited for this use case). - Splits test runner into test content setup and pytest that can be run separately or together (and with other test runners in the future). - Configuration is in Dockerfiles and command line (`.lintstagedrc.mjs`) - Updates CONTRIBUTING.md - Updates client library write examples in cloud-dedicated and clustered.pull/5503/head
parent
37dd3eaa8d
commit
5c74f013a1
|
@ -0,0 +1,6 @@
|
||||||
|
charset = utf-8
|
||||||
|
insert_final_newline = true
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
max_line_length = 80
|
|
@ -3,6 +3,8 @@
|
||||||
public
|
public
|
||||||
.*.swp
|
.*.swp
|
||||||
node_modules
|
node_modules
|
||||||
|
.config*
|
||||||
|
**/.env*
|
||||||
*.log
|
*.log
|
||||||
/resources
|
/resources
|
||||||
.hugo_build.lock
|
.hugo_build.lock
|
||||||
|
@ -10,4 +12,6 @@ node_modules
|
||||||
/api-docs/redoc-static.html*
|
/api-docs/redoc-static.html*
|
||||||
.vscode/*
|
.vscode/*
|
||||||
.idea
|
.idea
|
||||||
|
config.toml
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
tmp
|
|
@ -1,2 +1 @@
|
||||||
npx lint-staged --relative --verbose
|
npx lint-staged --relative
|
||||||
yarn run test
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Lint-staged configuration. This file must export a lint-staged configuration object.
|
||||||
|
|
||||||
|
function lintStagedContent(paths, productPath) {
|
||||||
|
const name = `staged-${productPath.replace(/\//g, '-')}`;
|
||||||
|
|
||||||
|
return [
|
||||||
|
`prettier --write ${paths.join(' ')}`,
|
||||||
|
|
||||||
|
`docker build . -f Dockerfile.tests -t influxdata-docs/tests:latest`,
|
||||||
|
|
||||||
|
// Remove any existing test container.
|
||||||
|
`docker rm -f ${name} || true`,
|
||||||
|
|
||||||
|
`docker run --name ${name} --mount type=volume,target=/app/content --mount type=bind,src=./content,dst=/src/content --mount type=bind,src=./static/downloads,dst=/app/data
|
||||||
|
influxdata-docs/tests --files "${paths.join(' ')}"`,
|
||||||
|
|
||||||
|
`docker build . -f Dockerfile.pytest -t influxdata-docs/pytest:latest`,
|
||||||
|
|
||||||
|
// Run test runners. If tests fail, the container will be removed,
|
||||||
|
//but the "test-" container will remain until the next run.
|
||||||
|
`docker run --env-file ${productPath}/.env.test
|
||||||
|
--volumes-from ${name} --rm
|
||||||
|
influxdata-docs/pytest --codeblocks ${productPath}/`
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
"*.{js,css}": paths => `prettier --write ${paths.join(' ')}`,
|
||||||
|
|
||||||
|
// Don't let prettier check or write Markdown files for now;
|
||||||
|
// it indents code blocks within list items, which breaks Hugo's rendering.
|
||||||
|
// "*.md": paths => `prettier --check ${paths.join(' ')}`,
|
||||||
|
|
||||||
|
"content/influxdb/cloud-dedicated/**/*.md":
|
||||||
|
paths => lintStagedContent(paths, 'content/influxdb/cloud-dedicated'),
|
||||||
|
"content/influxdb/clustered/**/*.md":
|
||||||
|
paths => lintStagedContent(paths, 'content/influxdb/clustered'),
|
||||||
|
|
||||||
|
// "content/influxdb/cloud-serverless/**/*.md": "docker compose run -T lint --config=content/influxdb/cloud-serverless/.vale.ini --minAlertLevel=error",
|
||||||
|
|
||||||
|
// "content/influxdb/clustered/**/*.md": "docker compose run -T lint --config=content/influxdb/clustered/.vale.ini --minAlertLevel=error",
|
||||||
|
|
||||||
|
// "content/influxdb/{cloud,v2,telegraf}/**/*.md": "docker compose run -T lint --config=.vale.ini --minAlertLevel=error"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Ignore Prettier checking for files
|
||||||
|
**/.git
|
||||||
|
**/.svn
|
||||||
|
**/.hg
|
||||||
|
**/node_modules
|
|
@ -1,4 +1,14 @@
|
||||||
trailingComma: "es5"
|
# ~/.prettierrc.yaml
|
||||||
tabWidth: 2
|
printWidth: 80
|
||||||
semi: true
|
semi: true
|
||||||
singleQuote: true
|
singleQuote: true
|
||||||
|
tabWidth: 2
|
||||||
|
trailingComma: "es5"
|
||||||
|
useTabs: false
|
||||||
|
overrides:
|
||||||
|
- files:
|
||||||
|
- "*.md"
|
||||||
|
- "*.markdown"
|
||||||
|
options:
|
||||||
|
proseWrap: "preserve"
|
||||||
|
# Prettier also uses settings, such as indent, specified in .editorconfig
|
293
CONTRIBUTING.md
293
CONTRIBUTING.md
|
@ -1,6 +1,7 @@
|
||||||
# Contributing to InfluxData Documentation
|
# Contributing to InfluxData Documentation
|
||||||
|
|
||||||
## Sign the InfluxData CLA
|
## Sign the InfluxData CLA
|
||||||
|
|
||||||
The InfluxData Contributor License Agreement (CLA) is part of the legal framework
|
The InfluxData Contributor License Agreement (CLA) is part of the legal framework
|
||||||
for the open source ecosystem that protects both you and InfluxData.
|
for the open source ecosystem that protects both you and InfluxData.
|
||||||
To make substantial contributions to InfluxData documentation, first sign the InfluxData CLA.
|
To make substantial contributions to InfluxData documentation, first sign the InfluxData CLA.
|
||||||
|
@ -10,76 +11,175 @@ What constitutes a "substantial" change is at the discretion of InfluxData docum
|
||||||
|
|
||||||
_**Note:** Typo and broken link fixes are greatly appreciated and do not require signing the CLA._
|
_**Note:** Typo and broken link fixes are greatly appreciated and do not require signing the CLA._
|
||||||
|
|
||||||
*If you're new to contributing or you're looking for an easy update, see [`docs-v2` good-first-issues](https://github.com/influxdata/docs-v2/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue).*
|
_If you're new to contributing or you're looking for an easy update, see [`docs-v2` good-first-issues](https://github.com/influxdata/docs-v2/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue)._
|
||||||
|
|
||||||
## Make suggested updates
|
## Make suggested updates
|
||||||
|
|
||||||
### Fork and clone InfluxData Documentation Repository
|
### Fork and clone InfluxData Documentation Repository
|
||||||
|
|
||||||
[Fork this repository](https://help.github.com/articles/fork-a-repo/) and
|
[Fork this repository](https://help.github.com/articles/fork-a-repo/) and
|
||||||
[clone it](https://help.github.com/articles/cloning-a-repository/) to your local machine.
|
[clone it](https://help.github.com/articles/cloning-a-repository/) to your local machine.
|
||||||
|
|
||||||
|
## Install project dependencies
|
||||||
|
|
||||||
|
docs-v2 automatically runs format (Markdown, JS, and CSS) linting and code block tests for staged files that you try to commit.
|
||||||
|
|
||||||
|
For the linting and tests to run, you need to install Docker and Node.js
|
||||||
|
dependencies.
|
||||||
|
|
||||||
|
\_**Note:**
|
||||||
|
We strongly recommend running linting and tests, but you can skip them
|
||||||
|
(and avoid installing dependencies)
|
||||||
|
by including the `--no-verify` flag with your commit--for example, enter the following command in your terminal:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git commit -m "<COMMIT_MESSAGE>" --no-verify
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Node.js dependencies
|
||||||
|
|
||||||
|
To install dependencies listed in package.json:
|
||||||
|
|
||||||
|
1. Install [Node.js](https://nodejs.org/en) for your system.
|
||||||
|
2. Install [Yarn](https://yarnpkg.com/getting-started/install) for your system.
|
||||||
|
3. Run `yarn` to install dependencies (including Hugo).
|
||||||
|
4. Install the Yarn package manager and run `yarn` to install project dependencies.
|
||||||
|
|
||||||
|
`package.json` contains dependencies for linting and running Git hooks.
|
||||||
|
|
||||||
|
- **[husky](https://github.com/typicode/husky)**: manages Git hooks, including the pre-commit hook for linting and testing
|
||||||
|
- **[lint-staged](https://github.com/lint-staged/lint-staged)**: passes staged files to commands
|
||||||
|
- **[prettier](https://prettier.io/docs/en/)**: formats code, including Markdown, according to style rules for consistency
|
||||||
|
|
||||||
|
### Install Docker
|
||||||
|
|
||||||
|
Install [Docker](https://docs.docker.com/get-docker/) for your system.
|
||||||
|
|
||||||
|
docs-v2 includes Docker configurations (`compose.yaml` and Dockerfiles) for running the Vale style linter and tests for code blocks (Shell, Bash, and Python) in Markdown files.
|
||||||
|
|
||||||
### Run the documentation locally (optional)
|
### Run the documentation locally (optional)
|
||||||
|
|
||||||
To run the documentation locally, follow the instructions provided in the README.
|
To run the documentation locally, follow the instructions provided in the README.
|
||||||
|
|
||||||
### Install and run Vale
|
### Make your changes
|
||||||
|
|
||||||
Use the [Vale](https://vale.sh/) style linter for spellchecking and enforcing style guidelines.
|
Make your suggested changes being sure to follow the [style and formatting guidelines](#style--formatting) outline below.
|
||||||
The docs-v2 `package.json` includes a Vale dependency that installs the Vale binary when you run `yarn`.
|
|
||||||
After you use `yarn` to install Vale, you can run `npx vale` to execute Vale commands.
|
|
||||||
|
|
||||||
_To install Vale globally or use a different package manager, follow the [Vale CLI installation](https://vale.sh/docs/vale-cli/installation/) for your system._
|
## Lint and test your changes
|
||||||
|
|
||||||
#### Integrate with your editor
|
### Automatic pre-commit checks
|
||||||
|
|
||||||
|
docs-v2 uses Husky to manage Git hook scripts.
|
||||||
|
When you try to commit your changes (for example, `git commit`), Git runs
|
||||||
|
scripts configured in `.husky/pre-commit`, including linting and tests for your staged files.
|
||||||
|
|
||||||
|
### Skip pre-commit hooks
|
||||||
|
|
||||||
|
**We strongly recommend running linting and tests**, but you can skip them
|
||||||
|
(and avoid installing dependencies)
|
||||||
|
by including the `--no-verify` flag with your commit--for example, enter the following command in your terminal:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git commit -m "<COMMIT_MESSAGE>" --no-verify
|
||||||
|
```
|
||||||
|
|
||||||
|
For more options, see the [Husky documentation](https://typicode.github.io/husky/how-to.html#skipping-git-hooks).
|
||||||
|
|
||||||
|
### Pre-commit linting and testing
|
||||||
|
|
||||||
|
When you try to commit your changes using `git commit` or your editor,
|
||||||
|
the project automatically runs pre-commit checks for spelling, punctuation,
|
||||||
|
and style on your staged files.
|
||||||
|
|
||||||
|
The pre-commit hook calls [`lint-staged`](https://github.com/lint-staged/lint-staged) using the configuration in `package.json`.
|
||||||
|
|
||||||
|
To run `lint-staged` scripts manually (without committing), enter the following
|
||||||
|
command in your terminal:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npx lint-staged --relative --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
The pre-commit linting configuration checks for _error-level_ problems.
|
||||||
|
An error-level rule violation fails the commit and you must
|
||||||
|
fix the problems before you can commit your changes.
|
||||||
|
|
||||||
|
If an error doesn't warrant a fix (for example, a term that should be allowed),
|
||||||
|
you can override the check and try the commit again or you can edit the linter
|
||||||
|
style rules to permanently allow the content. See **Configure style rules**.
|
||||||
|
|
||||||
|
### Vale style linting
|
||||||
|
|
||||||
|
docs-v2 includes Vale writing style linter configurations to enforce documentation writing style rules, guidelines, branding, and vocabulary terms.
|
||||||
|
|
||||||
|
To run Vale, use the Vale extension for your editor or the included Docker configuration.
|
||||||
|
For example, the following command runs Vale in a container and lints `*.md` (Markdown) files in the path `./content/influxdb/cloud-dedicated/write-data/` using the specified configuration for `cloud-dedicated`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose run -T vale --config=content/influxdb/cloud-dedicated/.vale.ini --minAlertLevel=error content/influxdb/cloud-dedicated/write-data/**/*.md
|
||||||
|
```
|
||||||
|
|
||||||
|
The output contains error-level style alerts for the Markdown content.
|
||||||
|
|
||||||
|
**Note**: We strongly recommend running Vale, but it's not included in the
|
||||||
|
docs-v2 pre-commit hooks](#automatic-pre-commit-checks) for now.
|
||||||
|
You can include it in your own Git hooks.
|
||||||
|
|
||||||
|
If a file contains style, spelling, or punctuation problems,
|
||||||
|
the Vale linter can raise one of the following alert levels:
|
||||||
|
|
||||||
|
- **Error**:
|
||||||
|
- Problems that can cause content to render incorrectly
|
||||||
|
- Violations of branding guidelines or trademark guidelines
|
||||||
|
- Rejected vocabulary terms
|
||||||
|
- **Warning**: General style guide rules and best practices
|
||||||
|
- **Suggestion**: Style preferences that may require refactoring or updates to an exceptions list
|
||||||
|
|
||||||
|
### Integrate Vale with your editor
|
||||||
|
|
||||||
To integrate Vale with VSCode:
|
To integrate Vale with VSCode:
|
||||||
|
|
||||||
1. Install the [Vale VSCode](https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode) extension.
|
1. Install the [Vale VSCode](https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode) extension.
|
||||||
2. In the extension settings, set the `Vale:Vale CLI:Path` value to the path of your Vale binary.
|
2. In the extension settings, set the `Vale:Vale CLI:Path` value to the path of your Vale binary (`${workspaceFolder}/node_modules/.bin/vale` for Yarn-installed Vale).
|
||||||
Use the path `${workspaceFolder}/node_modules/.bin/vale` for the Vale binary that you installed with Yarn.
|
|
||||||
|
|
||||||
To use with an editor other than VSCode, see the [Vale integration guide](https://vale.sh/docs/integrations/guide/).
|
To use with an editor other than VSCode, see the [Vale integration guide](https://vale.sh/docs/integrations/guide/).
|
||||||
|
|
||||||
#### Lint product directories
|
### Configure style rules
|
||||||
|
|
||||||
The `docs-v2` repository includes a shell script that lints product directories using the `InfluxDataDocs` style rules and product-specific vocabularies, and then generates a report.
|
`<docs-v2>/.ci/vale/styles/` contains configuration files for the custom `InfluxDataDocs` style.
|
||||||
To run the script, enter the following command in your terminal:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sh .ci/vale/vale.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Configure style rules
|
|
||||||
|
|
||||||
The `docs-v2` repository contains `.vale.ini` files that configure a custom `InfluxDataDocs` style with spelling and style rules.
|
|
||||||
When you run `vale <file path>` (from the CLI or an editor extension), it searches for a `.vale.ini` file in the directory of the file being linted.
|
|
||||||
|
|
||||||
`docs-v2` style rules are located at `.ci/vale/styles/`.
|
|
||||||
The easiest way to add accepted or rejected spellings is to enter your terms (or regular expression patterns) into the Vocabulary files at `.ci/vale/styles/config/vocabularies`.
|
The easiest way to add accepted or rejected spellings is to enter your terms (or regular expression patterns) into the Vocabulary files at `.ci/vale/styles/config/vocabularies`.
|
||||||
|
|
||||||
|
To add accepted/rejected terms for specific products, configure a style for the product and include a `Branding.yml` configuration. As an example, see `content/influxdb/cloud-dedicated/.vale.ini` and `.ci/vale/styles/Cloud-Dedicated/Branding.yml`.
|
||||||
|
|
||||||
To learn more about configuration and rules, see [Vale configuration](https://vale.sh/docs/topics/config).
|
To learn more about configuration and rules, see [Vale configuration](https://vale.sh/docs/topics/config).
|
||||||
|
|
||||||
### Make your changes
|
|
||||||
Make your suggested changes being sure to follow the [style and formatting guidelines](#style--formatting) outline below.
|
|
||||||
|
|
||||||
### Submit a pull request
|
### Submit a pull request
|
||||||
|
|
||||||
Push your changes up to your forked repository, then [create a new pull request](https://help.github.com/articles/creating-a-pull-request/).
|
Push your changes up to your forked repository, then [create a new pull request](https://help.github.com/articles/creating-a-pull-request/).
|
||||||
|
|
||||||
## Style & Formatting
|
## Style & Formatting
|
||||||
|
|
||||||
### Markdown
|
### Markdown
|
||||||
All of our documentation is written in [Markdown](https://en.wikipedia.org/wiki/Markdown).
|
|
||||||
|
Most docs-v2 documentation content uses [Markdown](https://en.wikipedia.org/wiki/Markdown).
|
||||||
|
|
||||||
|
_Some parts of the documentation, such as `./api-docs`, contain Markdown within YAML and rely on additional tooling._
|
||||||
|
|
||||||
### Semantic line feeds
|
### Semantic line feeds
|
||||||
|
|
||||||
Use [semantic line feeds](http://rhodesmill.org/brandon/2012/one-sentence-per-line/).
|
Use [semantic line feeds](http://rhodesmill.org/brandon/2012/one-sentence-per-line/).
|
||||||
Separating each sentence with a new line makes it easy to parse diffs with the human eye.
|
Separating each sentence with a new line makes it easy to parse diffs with the human eye.
|
||||||
|
|
||||||
**Diff without semantic line feeds:**
|
**Diff without semantic line feeds:**
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
-Data is taking off. This data is time series. You need a database that specializes in time series. You should check out InfluxDB.
|
-Data is taking off. This data is time series. You need a database that specializes in time series. You should check out InfluxDB.
|
||||||
+Data is taking off. This data is time series. You need a database that specializes in time series. You need InfluxDB.
|
+Data is taking off. This data is time series. You need a database that specializes in time series. You need InfluxDB.
|
||||||
```
|
```
|
||||||
|
|
||||||
**Diff with semantic line feeds:**
|
**Diff with semantic line feeds:**
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
Data is taking off.
|
Data is taking off.
|
||||||
This data is time series.
|
This data is time series.
|
||||||
|
@ -89,16 +189,19 @@ You need a database that specializes in time series.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Article headings
|
### Article headings
|
||||||
|
|
||||||
Use only h2-h6 headings in markdown content.
|
Use only h2-h6 headings in markdown content.
|
||||||
h1 headings act as the page title and are populated automatically from the `title` frontmatter.
|
h1 headings act as the page title and are populated automatically from the `title` frontmatter.
|
||||||
h2-h6 headings act as section headings.
|
h2-h6 headings act as section headings.
|
||||||
|
|
||||||
### Image naming conventions
|
### Image naming conventions
|
||||||
|
|
||||||
Save images using the following naming format: `project/version-context-description.png`.
|
Save images using the following naming format: `project/version-context-description.png`.
|
||||||
For example, `influxdb/2-0-visualizations-line-graph.png` or `influxdb/2-0-tasks-add-new.png`.
|
For example, `influxdb/2-0-visualizations-line-graph.png` or `influxdb/2-0-tasks-add-new.png`.
|
||||||
Specify a version other than 2.0 only if the image is specific to that version.
|
Specify a version other than 2.0 only if the image is specific to that version.
|
||||||
|
|
||||||
## Page frontmatter
|
## Page frontmatter
|
||||||
|
|
||||||
Every documentation page includes frontmatter which specifies information about the page.
|
Every documentation page includes frontmatter which specifies information about the page.
|
||||||
Frontmatter populates variables in page templates and the site's navigation menu.
|
Frontmatter populates variables in page templates and the site's navigation menu.
|
||||||
|
|
||||||
|
@ -138,22 +241,27 @@ updated_in: # Product and version the referenced feature was updated in (display
|
||||||
### Title usage
|
### Title usage
|
||||||
|
|
||||||
##### `title`
|
##### `title`
|
||||||
|
|
||||||
The `title` frontmatter populates each page's HTML `h1` heading tag.
|
The `title` frontmatter populates each page's HTML `h1` heading tag.
|
||||||
It shouldn't be overly long, but should set the context for users coming from outside sources.
|
It shouldn't be overly long, but should set the context for users coming from outside sources.
|
||||||
|
|
||||||
##### `seotitle`
|
##### `seotitle`
|
||||||
|
|
||||||
The `seotitle` frontmatter populates each page's HTML `title` attribute.
|
The `seotitle` frontmatter populates each page's HTML `title` attribute.
|
||||||
Search engines use this in search results (not the page's h1) and therefore it should be keyword optimized.
|
Search engines use this in search results (not the page's h1) and therefore it should be keyword optimized.
|
||||||
|
|
||||||
##### `list_title`
|
##### `list_title`
|
||||||
|
|
||||||
The `list_title` frontmatter determines an article title when in a list generated
|
The `list_title` frontmatter determines an article title when in a list generated
|
||||||
by the [`{{< children >}}` shortcode](#generate-a-list-of-children-articles).
|
by the [`{{< children >}}` shortcode](#generate-a-list-of-children-articles).
|
||||||
|
|
||||||
##### `menu > name`
|
##### `menu > name`
|
||||||
|
|
||||||
The `name` attribute under the `menu` frontmatter determines the text used in each page's link in the site navigation.
|
The `name` attribute under the `menu` frontmatter determines the text used in each page's link in the site navigation.
|
||||||
It should be short and assume the context of its parent if it has one.
|
It should be short and assume the context of its parent if it has one.
|
||||||
|
|
||||||
#### Page Weights
|
#### Page Weights
|
||||||
|
|
||||||
To ensure pages are sorted both by weight and their depth in the directory
|
To ensure pages are sorted both by weight and their depth in the directory
|
||||||
structure, pages should be weighted in "levels."
|
structure, pages should be weighted in "levels."
|
||||||
All top level pages are weighted 1-99.
|
All top level pages are weighted 1-99.
|
||||||
|
@ -163,6 +271,7 @@ Then 201-299 and so on.
|
||||||
_**Note:** `_index.md` files should be weighted one level up from the other `.md` files in the same directory._
|
_**Note:** `_index.md` files should be weighted one level up from the other `.md` files in the same directory._
|
||||||
|
|
||||||
### Related content
|
### Related content
|
||||||
|
|
||||||
Use the `related` frontmatter to include links to specific articles at the bottom of an article.
|
Use the `related` frontmatter to include links to specific articles at the bottom of an article.
|
||||||
|
|
||||||
- If the page exists inside of this documentation, just include the path to the page.
|
- If the page exists inside of this documentation, just include the path to the page.
|
||||||
|
@ -181,6 +290,7 @@ related:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Canonical URLs
|
### Canonical URLs
|
||||||
|
|
||||||
Search engines use canonical URLs to accurately rank pages with similar or identical content.
|
Search engines use canonical URLs to accurately rank pages with similar or identical content.
|
||||||
The `canonical` HTML meta tag identifies which page should be used as the source of truth.
|
The `canonical` HTML meta tag identifies which page should be used as the source of truth.
|
||||||
|
|
||||||
|
@ -200,6 +310,7 @@ canonical: /{{< latest "influxdb" "v2" >}}/path/to/canonical/doc/
|
||||||
```
|
```
|
||||||
|
|
||||||
### v2 equivalent documentation
|
### v2 equivalent documentation
|
||||||
|
|
||||||
To display a notice on a 1.x page that links to an equivalent 2.0 page,
|
To display a notice on a 1.x page that links to an equivalent 2.0 page,
|
||||||
add the following frontmatter to the 1.x page:
|
add the following frontmatter to the 1.x page:
|
||||||
|
|
||||||
|
@ -208,6 +319,7 @@ v2: /influxdb/v2.0/get-started/
|
||||||
```
|
```
|
||||||
|
|
||||||
### Prepend and append content to a page
|
### Prepend and append content to a page
|
||||||
|
|
||||||
Use the `prepend` and `append` frontmatter to add content to the top or bottom of a page.
|
Use the `prepend` and `append` frontmatter to add content to the top or bottom of a page.
|
||||||
Each has the following fields:
|
Each has the following fields:
|
||||||
|
|
||||||
|
@ -235,6 +347,7 @@ cascade:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Cascade
|
### Cascade
|
||||||
|
|
||||||
To automatically apply frontmatter to a page and all of its children, use the
|
To automatically apply frontmatter to a page and all of its children, use the
|
||||||
[`cascade` frontmatter](https://gohugo.io/content-management/front-matter/#front-matter-cascade)
|
[`cascade` frontmatter](https://gohugo.io/content-management/front-matter/#front-matter-cascade)
|
||||||
built in into Hugo.
|
built in into Hugo.
|
||||||
|
@ -253,6 +366,7 @@ those frontmatter keys. Frontmatter defined on the page overrides frontmatter
|
||||||
## Shortcodes
|
## Shortcodes
|
||||||
|
|
||||||
### Notes and warnings
|
### Notes and warnings
|
||||||
|
|
||||||
Shortcodes are available for formatting notes and warnings in each article:
|
Shortcodes are available for formatting notes and warnings in each article:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
|
@ -266,6 +380,7 @@ Insert warning markdown content here.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Enterprise Content
|
### Enterprise Content
|
||||||
|
|
||||||
For sections content that relate specifically to InfluxDB Enterprise, use the `{{% enterprise %}}` shortcode.
|
For sections content that relate specifically to InfluxDB Enterprise, use the `{{% enterprise %}}` shortcode.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
|
@ -275,6 +390,7 @@ Insert enterprise-specific markdown content here.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Enterprise name
|
#### Enterprise name
|
||||||
|
|
||||||
The name used to refer to InfluxData's enterprise offering is subject to change.
|
The name used to refer to InfluxData's enterprise offering is subject to change.
|
||||||
To facilitate easy updates in the future, use the `enterprise-name` shortcode
|
To facilitate easy updates in the future, use the `enterprise-name` shortcode
|
||||||
when referencing the enterprise product.
|
when referencing the enterprise product.
|
||||||
|
@ -288,6 +404,7 @@ This is content that references {{< enterprise-name "short" >}}.
|
||||||
Product names are stored in `data/products.yml`.
|
Product names are stored in `data/products.yml`.
|
||||||
|
|
||||||
#### Enterprise link
|
#### Enterprise link
|
||||||
|
|
||||||
References to InfluxDB Enterprise are often accompanied with a link to a page where
|
References to InfluxDB Enterprise are often accompanied with a link to a page where
|
||||||
visitors can get more information about the Enterprise offering.
|
visitors can get more information about the Enterprise offering.
|
||||||
This link is subject to change.
|
This link is subject to change.
|
||||||
|
@ -299,6 +416,7 @@ Find more info [here][{{< enterprise-link >}}]
|
||||||
```
|
```
|
||||||
|
|
||||||
### InfluxDB Cloud Content
|
### InfluxDB Cloud Content
|
||||||
|
|
||||||
For sections of content that relate specifically to InfluxDB Cloud, use the `{{% cloud %}}` shortcode.
|
For sections of content that relate specifically to InfluxDB Cloud, use the `{{% cloud %}}` shortcode.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
|
@ -308,6 +426,7 @@ Insert cloud-specific markdown content here.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### InfluxDB Cloud name
|
#### InfluxDB Cloud name
|
||||||
|
|
||||||
The name used to refer to InfluxData's cloud offering is subject to change.
|
The name used to refer to InfluxData's cloud offering is subject to change.
|
||||||
To facilitate easy updates in the future, use the `cloud-name` short-code when
|
To facilitate easy updates in the future, use the `cloud-name` short-code when
|
||||||
referencing the cloud product.
|
referencing the cloud product.
|
||||||
|
@ -321,6 +440,7 @@ This is content that references {{< cloud-name "short" >}}.
|
||||||
Product names are stored in `data/products.yml`.
|
Product names are stored in `data/products.yml`.
|
||||||
|
|
||||||
#### InfluxDB Cloud link
|
#### InfluxDB Cloud link
|
||||||
|
|
||||||
References to InfluxDB Cloud are often accompanied with a link to a page where
|
References to InfluxDB Cloud are often accompanied with a link to a page where
|
||||||
visitors can get more information.
|
visitors can get more information.
|
||||||
This link is subject to change.
|
This link is subject to change.
|
||||||
|
@ -332,6 +452,7 @@ Find more info [here][{{< cloud-link >}}]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Latest links
|
### Latest links
|
||||||
|
|
||||||
Each of the InfluxData projects have different "latest" versions.
|
Each of the InfluxData projects have different "latest" versions.
|
||||||
Use the `{{< latest >}}` shortcode to populate link paths with the latest version
|
Use the `{{< latest >}}` shortcode to populate link paths with the latest version
|
||||||
for the specified project.
|
for the specified project.
|
||||||
|
@ -365,6 +486,7 @@ Use the following for project names:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Latest patch version
|
### Latest patch version
|
||||||
|
|
||||||
Use the `{{< latest-patch >}}` shortcode to add the latest patch version of a product.
|
Use the `{{< latest-patch >}}` shortcode to add the latest patch version of a product.
|
||||||
By default, this shortcode parses the product and minor version from the URL.
|
By default, this shortcode parses the product and minor version from the URL.
|
||||||
To specify a specific product and minor version, use the `product` and `version` arguments.
|
To specify a specific product and minor version, use the `product` and `version` arguments.
|
||||||
|
@ -379,6 +501,7 @@ Easier to maintain being you update the version number in the `data/products.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
### Latest influx CLI version
|
### Latest influx CLI version
|
||||||
|
|
||||||
Use the `{{< latest-cli >}}` shortcode to add the latest version of the `influx`
|
Use the `{{< latest-cli >}}` shortcode to add the latest version of the `influx`
|
||||||
CLI supported by the minor version of InfluxDB.
|
CLI supported by the minor version of InfluxDB.
|
||||||
By default, this shortcode parses the minor version from the URL.
|
By default, this shortcode parses the minor version from the URL.
|
||||||
|
@ -392,6 +515,7 @@ Maintain CLI version numbers in the `data/products.yml` file instead of updating
|
||||||
```
|
```
|
||||||
|
|
||||||
### API endpoint
|
### API endpoint
|
||||||
|
|
||||||
Use the `{{< api-endpoint >}}` shortcode to generate a code block that contains
|
Use the `{{< api-endpoint >}}` shortcode to generate a code block that contains
|
||||||
a colored request method, a specified API endpoint, and an optional link to
|
a colored request method, a specified API endpoint, and an optional link to
|
||||||
the API reference documentation.
|
the API reference documentation.
|
||||||
|
@ -420,6 +544,7 @@ Provide the following arguments:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tabbed Content
|
### Tabbed Content
|
||||||
|
|
||||||
To create "tabbed" content (content that is changed by a users' selection), use the following three shortcodes in combination:
|
To create "tabbed" content (content that is changed by a users' selection), use the following three shortcodes in combination:
|
||||||
|
|
||||||
`{{< tabs-wrapper >}}`
|
`{{< tabs-wrapper >}}`
|
||||||
|
@ -453,6 +578,7 @@ This shortcode must be closed with `{{% /tab-content %}}`.
|
||||||
**Note**: The `%` characters used in this shortcode indicate that the contents should be processed as Markdown.
|
**Note**: The `%` characters used in this shortcode indicate that the contents should be processed as Markdown.
|
||||||
|
|
||||||
#### Example tabbed content group
|
#### Example tabbed content group
|
||||||
|
|
||||||
```md
|
```md
|
||||||
{{< tabs-wrapper >}}
|
{{< tabs-wrapper >}}
|
||||||
|
|
||||||
|
@ -473,6 +599,7 @@ Markdown content for tab 2.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Tabbed code blocks
|
#### Tabbed code blocks
|
||||||
|
|
||||||
Shortcodes are also available for tabbed code blocks primarily used to give users
|
Shortcodes are also available for tabbed code blocks primarily used to give users
|
||||||
the option to choose between different languages and syntax.
|
the option to choose between different languages and syntax.
|
||||||
The shortcode structure is the same as above, but the shortcode names are different:
|
The shortcode structure is the same as above, but the shortcode names are different:
|
||||||
|
@ -481,7 +608,7 @@ The shortcode structure is the same as above, but the shortcode names are differ
|
||||||
`{{% code-tabs %}}`
|
`{{% code-tabs %}}`
|
||||||
`{{% code-tab-content %}}`
|
`{{% code-tab-content %}}`
|
||||||
|
|
||||||
~~~md
|
````md
|
||||||
{{< code-tabs-wrapper >}}
|
{{< code-tabs-wrapper >}}
|
||||||
|
|
||||||
{{% code-tabs %}}
|
{{% code-tabs %}}
|
||||||
|
@ -490,6 +617,7 @@ The shortcode structure is the same as above, but the shortcode names are differ
|
||||||
{{% /code-tabs %}}
|
{{% /code-tabs %}}
|
||||||
|
|
||||||
{{% code-tab-content %}}
|
{{% code-tab-content %}}
|
||||||
|
|
||||||
```js
|
```js
|
||||||
data = from(bucket: "example-bucket")
|
data = from(bucket: "example-bucket")
|
||||||
|> range(start: -15m)
|
|> range(start: -15m)
|
||||||
|
@ -498,18 +626,21 @@ data = from(bucket: "example-bucket")
|
||||||
r._field == "used_percent"
|
r._field == "used_percent"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
{{% /code-tab-content %}}
|
||||||
|
|
||||||
{{% code-tab-content %}}
|
{{% code-tab-content %}}
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT "used_percent"
|
SELECT "used_percent"
|
||||||
FROM "telegraf"."autogen"."mem"
|
FROM "telegraf"."autogen"."mem"
|
||||||
WHERE time > now() - 15m
|
WHERE time > now() - 15m
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
{{% /code-tab-content %}}
|
||||||
|
|
||||||
{{< /code-tabs-wrapper >}}
|
{{< /code-tabs-wrapper >}}
|
||||||
~~~
|
````
|
||||||
|
|
||||||
#### Link to tabbed content
|
#### Link to tabbed content
|
||||||
|
|
||||||
|
@ -522,6 +653,7 @@ For example:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Required elements
|
### Required elements
|
||||||
|
|
||||||
Use the `{{< req >}}` shortcode to identify required elements in documentation with
|
Use the `{{< req >}}` shortcode to identify required elements in documentation with
|
||||||
orange text and/or asterisks. By default, the shortcode outputs the text, "Required," but
|
orange text and/or asterisks. By default, the shortcode outputs the text, "Required," but
|
||||||
you can customize the text by passing a string argument with the shortcode.
|
you can customize the text by passing a string argument with the shortcode.
|
||||||
|
@ -546,8 +678,9 @@ customize the text of the required message.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Required elements in a list
|
#### Required elements in a list
|
||||||
|
|
||||||
When identifying required elements in a list, use `{{< req type="key" >}}` to generate
|
When identifying required elements in a list, use `{{< req type="key" >}}` to generate
|
||||||
a "* Required" key before the list. For required elements in the list, include
|
a "\* Required" key before the list. For required elements in the list, include
|
||||||
{{< req "\*" >}} before the text of the list item. For example:
|
{{< req "\*" >}} before the text of the list item. For example:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
|
@ -559,6 +692,7 @@ a "* Required" key before the list. For required elements in the list, include
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Change color of required text
|
#### Change color of required text
|
||||||
|
|
||||||
Use the `color` argument to change the color of required text.
|
Use the `color` argument to change the color of required text.
|
||||||
The following colors are available:
|
The following colors are available:
|
||||||
|
|
||||||
|
@ -571,6 +705,7 @@ The following colors are available:
|
||||||
```
|
```
|
||||||
|
|
||||||
### Page navigation buttons
|
### Page navigation buttons
|
||||||
|
|
||||||
Use the `{{< page-nav >}}` shortcode to add page navigation buttons to a page.
|
Use the `{{< page-nav >}}` shortcode to add page navigation buttons to a page.
|
||||||
These are useful for guiding users through a set of docs that should be read in sequential order.
|
These are useful for guiding users through a set of docs that should be read in sequential order.
|
||||||
The shortcode has the following parameters:
|
The shortcode has the following parameters:
|
||||||
|
@ -587,16 +722,20 @@ document, but you can use `prevText` and `nextText` to override button text.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
<!-- Simple example -->
|
<!-- Simple example -->
|
||||||
|
|
||||||
{{ page-nav prev="/path/to/prev/" next="/path/to/next" >}}
|
{{ page-nav prev="/path/to/prev/" next="/path/to/next" >}}
|
||||||
|
|
||||||
<!-- Override button text -->
|
<!-- Override button text -->
|
||||||
|
|
||||||
{{ page-nav prev="/path/to/prev/" prevText="Previous" next="/path/to/next" nextText="Next" >}}
|
{{ page-nav prev="/path/to/prev/" prevText="Previous" next="/path/to/next" nextText="Next" >}}
|
||||||
|
|
||||||
<!-- Add currently selected tab to button link -->
|
<!-- Add currently selected tab to button link -->
|
||||||
|
|
||||||
{{ page-nav prev="/path/to/prev/" next="/path/to/next" keepTab=true>}}
|
{{ page-nav prev="/path/to/prev/" next="/path/to/next" keepTab=true>}}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Keybinds
|
### Keybinds
|
||||||
|
|
||||||
Use the `{{< keybind >}}` shortcode to include OS-specific keybindings/hotkeys.
|
Use the `{{< keybind >}}` shortcode to include OS-specific keybindings/hotkeys.
|
||||||
The following parameters are available:
|
The following parameters are available:
|
||||||
|
|
||||||
|
@ -608,16 +747,20 @@ The following parameters are available:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
<!-- Provide keybinding for one OS and another for all others -->
|
<!-- Provide keybinding for one OS and another for all others -->
|
||||||
|
|
||||||
{{< keybind mac="⇧⌘P" other="Ctrl+Shift+P" >}}
|
{{< keybind mac="⇧⌘P" other="Ctrl+Shift+P" >}}
|
||||||
|
|
||||||
<!-- Provide a keybind for all OSs -->
|
<!-- Provide a keybind for all OSs -->
|
||||||
|
|
||||||
{{< keybind all="Ctrl+Shift+P" >}}
|
{{< keybind all="Ctrl+Shift+P" >}}
|
||||||
|
|
||||||
<!-- Provide unique keybindings for each OS -->
|
<!-- Provide unique keybindings for each OS -->
|
||||||
|
|
||||||
{{< keybind mac="⇧⌘P" linux="Ctrl+Shift+P" win="Ctrl+Shift+Alt+P" >}}
|
{{< keybind mac="⇧⌘P" linux="Ctrl+Shift+P" win="Ctrl+Shift+Alt+P" >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Diagrams
|
### Diagrams
|
||||||
|
|
||||||
Use the `{{< diagram >}}` shortcode to dynamically build diagrams.
|
Use the `{{< diagram >}}` shortcode to dynamically build diagrams.
|
||||||
The shortcode uses [mermaid.js](https://github.com/mermaid-js/mermaid) to convert
|
The shortcode uses [mermaid.js](https://github.com/mermaid-js/mermaid) to convert
|
||||||
simple text into SVG diagrams.
|
simple text into SVG diagrams.
|
||||||
|
@ -632,12 +775,15 @@ flowchart TB
|
||||||
```
|
```
|
||||||
|
|
||||||
### File system diagrams
|
### File system diagrams
|
||||||
|
|
||||||
Use the `{{< filesystem-diagram >}}` shortcode to create a styled file system
|
Use the `{{< filesystem-diagram >}}` shortcode to create a styled file system
|
||||||
diagram using a Markdown unordered list.
|
diagram using a Markdown unordered list.
|
||||||
|
|
||||||
##### Example filesystem diagram shortcode
|
##### Example filesystem diagram shortcode
|
||||||
|
|
||||||
```md
|
```md
|
||||||
{{< filesystem-diagram >}}
|
{{< filesystem-diagram >}}
|
||||||
|
|
||||||
- Dir1/
|
- Dir1/
|
||||||
- Dir2/
|
- Dir2/
|
||||||
- ChildDir/
|
- ChildDir/
|
||||||
|
@ -648,6 +794,7 @@ diagram using a Markdown unordered list.
|
||||||
```
|
```
|
||||||
|
|
||||||
### High-resolution images
|
### High-resolution images
|
||||||
|
|
||||||
In many cases, screenshots included in the docs are taken from high-resolution (retina) screens.
|
In many cases, screenshots included in the docs are taken from high-resolution (retina) screens.
|
||||||
Because of this, the actual pixel dimension is 2x larger than it needs to be and is rendered 2x bigger than it should be.
|
Because of this, the actual pixel dimension is 2x larger than it needs to be and is rendered 2x bigger than it should be.
|
||||||
The following shortcode automatically sets a fixed width on the image using half of its actual pixel dimension.
|
The following shortcode automatically sets a fixed width on the image using half of its actual pixel dimension.
|
||||||
|
@ -659,12 +806,14 @@ cause by browser image resizing.
|
||||||
```
|
```
|
||||||
|
|
||||||
###### Notes
|
###### Notes
|
||||||
|
|
||||||
- This should only be used on screenshots takes from high-resolution screens.
|
- This should only be used on screenshots takes from high-resolution screens.
|
||||||
- The `src` should be relative to the `static` directory.
|
- The `src` should be relative to the `static` directory.
|
||||||
- Image widths are limited to the width of the article content container and will scale accordingly,
|
- Image widths are limited to the width of the article content container and will scale accordingly,
|
||||||
even with the `width` explicitly set.
|
even with the `width` explicitly set.
|
||||||
|
|
||||||
### Truncated content blocks
|
### Truncated content blocks
|
||||||
|
|
||||||
In some cases, it may be appropriate to shorten or truncate blocks of content.
|
In some cases, it may be appropriate to shorten or truncate blocks of content.
|
||||||
Use cases include long examples of output data or tall images.
|
Use cases include long examples of output data or tall images.
|
||||||
The following shortcode truncates blocks of content and allows users to opt into
|
The following shortcode truncates blocks of content and allows users to opt into
|
||||||
|
@ -677,6 +826,7 @@ Truncated markdown content here.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Expandable accordion content blocks
|
### Expandable accordion content blocks
|
||||||
|
|
||||||
Use the `{{% expand "Item label" %}}` shortcode to create expandable, accordion-style content blocks.
|
Use the `{{% expand "Item label" %}}` shortcode to create expandable, accordion-style content blocks.
|
||||||
Each expandable block needs a label that users can click to expand or collapse the content block.
|
Each expandable block needs a label that users can click to expand or collapse the content block.
|
||||||
Pass the label as a string to the shortcode.
|
Pass the label as a string to the shortcode.
|
||||||
|
@ -711,6 +861,7 @@ Markdown content associated with label 2.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Captions
|
### Captions
|
||||||
|
|
||||||
Use the `{{% caption %}}` shortcode to add captions to images and code blocks.
|
Use the `{{% caption %}}` shortcode to add captions to images and code blocks.
|
||||||
Captions are styled with a smaller font size, italic text, slight transparency,
|
Captions are styled with a smaller font size, italic text, slight transparency,
|
||||||
and appear directly under the previous image or code block.
|
and appear directly under the previous image or code block.
|
||||||
|
@ -722,6 +873,7 @@ Markdown content for the caption.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Generate a list of children articles
|
### Generate a list of children articles
|
||||||
|
|
||||||
Section landing pages often contain just a list of articles with links and descriptions for each.
|
Section landing pages often contain just a list of articles with links and descriptions for each.
|
||||||
This can be cumbersome to maintain as content is added.
|
This can be cumbersome to maintain as content is added.
|
||||||
To automate the listing of articles in a section, use the `{{< children >}}` shortcode.
|
To automate the listing of articles in a section, use the `{{< children >}}` shortcode.
|
||||||
|
@ -735,7 +887,9 @@ or only "page" articles (those with no children) using the `show` argument:
|
||||||
|
|
||||||
```md
|
```md
|
||||||
{{< children show="sections" >}}
|
{{< children show="sections" >}}
|
||||||
|
|
||||||
<!-- OR -->
|
<!-- OR -->
|
||||||
|
|
||||||
{{< children show="pages" >}}
|
{{< children show="pages" >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -757,6 +911,7 @@ The following list types are available:
|
||||||
- **functions:** a special use-case designed for listing Flux functions.
|
- **functions:** a special use-case designed for listing Flux functions.
|
||||||
|
|
||||||
#### Include a "Read more" link
|
#### Include a "Read more" link
|
||||||
|
|
||||||
To include a "Read more" link with each child summary, set `readmore=true`.
|
To include a "Read more" link with each child summary, set `readmore=true`.
|
||||||
_Only the `articles` list type supports "Read more" links._
|
_Only the `articles` list type supports "Read more" links._
|
||||||
|
|
||||||
|
@ -765,6 +920,7 @@ _Only the `articles` list type supports "Read more" links._
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Include a horizontal rule
|
#### Include a horizontal rule
|
||||||
|
|
||||||
To include a horizontal rule after each child summary, set `hr=true`.
|
To include a horizontal rule after each child summary, set `hr=true`.
|
||||||
_Only the `articles` list type supports horizontal rules._
|
_Only the `articles` list type supports horizontal rules._
|
||||||
|
|
||||||
|
@ -773,17 +929,19 @@ _Only the `articles` list type supports horizontal rules._
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Include a code example with a child summary
|
#### Include a code example with a child summary
|
||||||
|
|
||||||
Use the `list_code_example` frontmatter to provide a code example with an article
|
Use the `list_code_example` frontmatter to provide a code example with an article
|
||||||
in an articles list.
|
in an articles list.
|
||||||
|
|
||||||
~~~yaml
|
````yaml
|
||||||
list_code_example: |
|
list_code_example: |
|
||||||
```sh
|
```sh
|
||||||
This is a code example
|
This is a code example
|
||||||
```
|
```
|
||||||
~~~
|
````
|
||||||
|
|
||||||
#### Organize and include native code examples
|
#### Organize and include native code examples
|
||||||
|
|
||||||
To include text from a file in `/shared/text/`, use the
|
To include text from a file in `/shared/text/`, use the
|
||||||
`{{< get-shared-text >}}` shortcode and provide the relative path and filename.
|
`{{< get-shared-text >}}` shortcode and provide the relative path and filename.
|
||||||
|
|
||||||
|
@ -791,12 +949,14 @@ This is useful for maintaining and referencing sample code variants in their
|
||||||
native file formats.
|
native file formats.
|
||||||
|
|
||||||
1. Store code examples in their native formats at `/shared/text/`.
|
1. Store code examples in their native formats at `/shared/text/`.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
/shared/text/example1/example.js
|
/shared/text/example1/example.js
|
||||||
/shared/text/example1/example.py
|
/shared/text/example1/example.py
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Include the files--for example, in code tabs:
|
2. Include the files--for example, in code tabs:
|
||||||
|
|
||||||
````md
|
````md
|
||||||
{{% code-tabs-wrapper %}}
|
{{% code-tabs-wrapper %}}
|
||||||
{{% code-tabs %}}
|
{{% code-tabs %}}
|
||||||
|
@ -804,23 +964,28 @@ This is useful for maintaining and referencing sample code variants in their
|
||||||
[Python](#py)
|
[Python](#py)
|
||||||
{{% /code-tabs %}}
|
{{% /code-tabs %}}
|
||||||
{{% code-tab-content %}}
|
{{% code-tab-content %}}
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{{< get-shared-text "example1/example.js" >}}
|
{{< get-shared-text "example1/example.js" >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
{{% /code-tab-content %}}
|
||||||
{{% code-tab-content %}}
|
{{% code-tab-content %}}
|
||||||
|
|
||||||
```py
|
```py
|
||||||
{{< get-shared-text "example1/example.py" >}}
|
{{< get-shared-text "example1/example.py" >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
{{% /code-tab-content %}}
|
||||||
{{% /code-tabs-wrapper %}}
|
{{% /code-tabs-wrapper %}}
|
||||||
````
|
````
|
||||||
|
|
||||||
#### Include specific files from the same directory
|
#### Include specific files from the same directory
|
||||||
|
|
||||||
To include the text from one file in another file in the same
|
To include the text from one file in another file in the same
|
||||||
directory, use the `{{< get-leaf-text >}}` shortcode.
|
directory, use the `{{< get-leaf-text >}}` shortcode.
|
||||||
The directory that contains both files must be a
|
The directory that contains both files must be a
|
||||||
Hugo [*Leaf Bundle*](https://gohugo.io/content-management/page-bundles/#leaf-bundles),
|
Hugo [_Leaf Bundle_](https://gohugo.io/content-management/page-bundles/#leaf-bundles),
|
||||||
a directory that doesn't have any child directories.
|
a directory that doesn't have any child directories.
|
||||||
|
|
||||||
In the following example, `api` is a leaf bundle. `content` isn't.
|
In the following example, `api` is a leaf bundle. `content` isn't.
|
||||||
|
@ -831,24 +996,28 @@ content
|
||||||
|--- api
|
|--- api
|
||||||
| query.pdmc
|
| query.pdmc
|
||||||
| query.sh
|
| query.sh
|
||||||
| _index.md
|
| \_index.md
|
||||||
```
|
```
|
||||||
|
|
||||||
##### query.pdmc
|
##### query.pdmc
|
||||||
|
|
||||||
```md
|
```md
|
||||||
# Query examples
|
# Query examples
|
||||||
```
|
```
|
||||||
|
|
||||||
##### query.sh
|
##### query.sh
|
||||||
|
|
||||||
```md
|
```md
|
||||||
curl https://localhost:8086/query
|
curl https://localhost:8086/query
|
||||||
```
|
```
|
||||||
|
|
||||||
To include `query.sh` and `query.pdmc` in `api/_index.md`, use the following code:
|
To include `query.sh` and `query.pdmc` in `api/_index.md`, use the following code:
|
||||||
|
|
||||||
````md
|
````md
|
||||||
{{< get-leaf-text "query.pdmc" >}}
|
{{< get-leaf-text "query.pdmc" >}}
|
||||||
|
|
||||||
# Curl example
|
# Curl example
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
{{< get-leaf-text "query.sh" >}}
|
{{< get-leaf-text "query.sh" >}}
|
||||||
```
|
```
|
||||||
|
@ -858,6 +1027,7 @@ Avoid using the following file extensions when naming included text files since
|
||||||
`.ad`, `.adoc`, `.asciidoc`, `.htm`, `.html`, `.markdown`, `.md`, `.mdown`, `.mmark`, `.pandoc`, `.pdc`, `.org`, or `.rst`.
|
`.ad`, `.adoc`, `.asciidoc`, `.htm`, `.html`, `.markdown`, `.md`, `.mdown`, `.mmark`, `.pandoc`, `.pdc`, `.org`, or `.rst`.
|
||||||
|
|
||||||
#### Reference a query example in children
|
#### Reference a query example in children
|
||||||
|
|
||||||
To include a query example with the children in your list, update `data/query_examples.yml`
|
To include a query example with the children in your list, update `data/query_examples.yml`
|
||||||
with the example code, input, and output, and use the `list_query_example`
|
with the example code, input, and output, and use the `list_query_example`
|
||||||
frontmatter to reference the corresponding example.
|
frontmatter to reference the corresponding example.
|
||||||
|
@ -867,11 +1037,12 @@ list_query_example: cumulative_sum
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Children frontmatter
|
#### Children frontmatter
|
||||||
|
|
||||||
Each children list `type` uses [frontmatter properties](#page-frontmatter) when generating the list of articles.
|
Each children list `type` uses [frontmatter properties](#page-frontmatter) when generating the list of articles.
|
||||||
The following table shows which children types use which frontmatter properties:
|
The following table shows which children types use which frontmatter properties:
|
||||||
|
|
||||||
| Frontmatter | articles | list | functions |
|
| Frontmatter | articles | list | functions |
|
||||||
|:----------- |:--------:|:----:|:---------:|
|
| :------------------- | :------: | :--: | :-------: |
|
||||||
| `list_title` | ✓ | ✓ | ✓ |
|
| `list_title` | ✓ | ✓ | ✓ |
|
||||||
| `description` | ✓ | | |
|
| `description` | ✓ | | |
|
||||||
| `external_url` | ✓ | ✓ | |
|
| `external_url` | ✓ | ✓ | |
|
||||||
|
@ -881,6 +1052,7 @@ The following table shows which children types use which frontmatter properties:
|
||||||
| `list_query_example` | ✓ | | |
|
| `list_query_example` | ✓ | | |
|
||||||
|
|
||||||
### Inline icons
|
### Inline icons
|
||||||
|
|
||||||
The `icon` shortcode allows you to inject icons in paragraph text.
|
The `icon` shortcode allows you to inject icons in paragraph text.
|
||||||
It's meant to clarify references to specific elements in the InfluxDB user interface.
|
It's meant to clarify references to specific elements in the InfluxDB user interface.
|
||||||
This shortcode supports Clockface (the UI) v2 and v3.
|
This shortcode supports Clockface (the UI) v2 and v3.
|
||||||
|
@ -955,6 +1127,7 @@ Below is a list of available icons (some are aliases):
|
||||||
- x
|
- x
|
||||||
|
|
||||||
### InfluxDB UI left navigation icons
|
### InfluxDB UI left navigation icons
|
||||||
|
|
||||||
In many cases, documentation references an item in the left nav of the InfluxDB UI.
|
In many cases, documentation references an item in the left nav of the InfluxDB UI.
|
||||||
Provide a visual example of the navigation item using the `nav-icon` shortcode.
|
Provide a visual example of the navigation item using the `nav-icon` shortcode.
|
||||||
This shortcode supports Clockface (the UI) v2 and v3.
|
This shortcode supports Clockface (the UI) v2 and v3.
|
||||||
|
@ -978,6 +1151,7 @@ The following case insensitive values are supported:
|
||||||
- feedback
|
- feedback
|
||||||
|
|
||||||
### Flexbox-formatted content blocks
|
### Flexbox-formatted content blocks
|
||||||
|
|
||||||
CSS Flexbox formatting lets you create columns in article content that adjust and
|
CSS Flexbox formatting lets you create columns in article content that adjust and
|
||||||
flow based on the viewable width.
|
flow based on the viewable width.
|
||||||
In article content, this helps if you have narrow tables that could be displayed
|
In article content, this helps if you have narrow tables that could be displayed
|
||||||
|
@ -1010,6 +1184,7 @@ The following options are available:
|
||||||
- quarter
|
- quarter
|
||||||
|
|
||||||
### Tooltips
|
### Tooltips
|
||||||
|
|
||||||
Use the `{{< tooltip >}}` shortcode to add tooltips to text.
|
Use the `{{< tooltip >}}` shortcode to add tooltips to text.
|
||||||
The **first** argument is the text shown in the tooltip.
|
The **first** argument is the text shown in the tooltip.
|
||||||
The **second** argument is the highlighted text that triggers the tooltip.
|
The **second** argument is the highlighted text that triggers the tooltip.
|
||||||
|
@ -1022,6 +1197,7 @@ The rendered output is "I like butterflies" with "butterflies" highlighted.
|
||||||
When you hover over "butterflies," a tooltip appears with the text: "Butterflies are awesome!"
|
When you hover over "butterflies," a tooltip appears with the text: "Butterflies are awesome!"
|
||||||
|
|
||||||
### Flux sample data tables
|
### Flux sample data tables
|
||||||
|
|
||||||
The Flux `sample` package provides basic sample datasets that can be used to
|
The Flux `sample` package provides basic sample datasets that can be used to
|
||||||
illustrate how Flux functions work. To quickly display one of the raw sample
|
illustrate how Flux functions work. To quickly display one of the raw sample
|
||||||
datasets, use the `{{% flux/sample %}}` shortcode.
|
datasets, use the `{{% flux/sample %}}` shortcode.
|
||||||
|
@ -1030,6 +1206,7 @@ The `flux/sample` shortcode has the following arguments that can be specified
|
||||||
by name or positionally.
|
by name or positionally.
|
||||||
|
|
||||||
#### set
|
#### set
|
||||||
|
|
||||||
Sample dataset to output. Use either `set` argument name or provide the set
|
Sample dataset to output. Use either `set` argument name or provide the set
|
||||||
as the first argument. The following sets are available:
|
as the first argument. The following sets are available:
|
||||||
|
|
||||||
|
@ -1041,33 +1218,41 @@ as the first argument. The following sets are available:
|
||||||
- numericBool
|
- numericBool
|
||||||
|
|
||||||
#### includeNull
|
#### includeNull
|
||||||
|
|
||||||
Specify whether or not to include _null_ values in the dataset.
|
Specify whether or not to include _null_ values in the dataset.
|
||||||
Use either `includeNull` argument name or provide the boolean value as the second argument.
|
Use either `includeNull` argument name or provide the boolean value as the second argument.
|
||||||
|
|
||||||
#### includeRange
|
#### includeRange
|
||||||
|
|
||||||
Specify whether or not to include time range columns (`_start` and `_stop`) in the dataset.
|
Specify whether or not to include time range columns (`_start` and `_stop`) in the dataset.
|
||||||
This is only recommended when showing how functions that require a time range
|
This is only recommended when showing how functions that require a time range
|
||||||
(such as `window()`) operate on input data.
|
(such as `window()`) operate on input data.
|
||||||
Use either `includeRange` argument name or provide the boolean value as the third argument.
|
Use either `includeRange` argument name or provide the boolean value as the third argument.
|
||||||
|
|
||||||
##### Example Flux sample data shortcodes
|
##### Example Flux sample data shortcodes
|
||||||
|
|
||||||
```md
|
```md
|
||||||
<!-- No arguments, defaults to "float" set without nulls -->
|
<!-- No arguments, defaults to "float" set without nulls -->
|
||||||
|
|
||||||
{{% flux/sample %}}
|
{{% flux/sample %}}
|
||||||
|
|
||||||
<!-- Output the "string" set without nulls or time range columns -->
|
<!-- Output the "string" set without nulls or time range columns -->
|
||||||
|
|
||||||
{{% flux/sample set="string" includeNull=false %}}
|
{{% flux/sample set="string" includeNull=false %}}
|
||||||
|
|
||||||
<!-- Output the "int" set with nulls but without time range columns -->
|
<!-- Output the "int" set with nulls but without time range columns -->
|
||||||
|
|
||||||
{{% flux/sample "int" true %}}
|
{{% flux/sample "int" true %}}
|
||||||
|
|
||||||
<!-- Output the "int" set with nulls and time range columns -->
|
<!-- Output the "int" set with nulls and time range columns -->
|
||||||
<!-- The following shortcode examples render the same -->
|
<!-- The following shortcode examples render the same -->
|
||||||
|
|
||||||
{{% flux/sample set="int" includeNull=true includeRange=true %}}
|
{{% flux/sample set="int" includeNull=true includeRange=true %}}
|
||||||
{{% flux/sample "int" true true %}}
|
{{% flux/sample "int" true true %}}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Duplicate OSS content in Cloud
|
### Duplicate OSS content in Cloud
|
||||||
|
|
||||||
Docs for InfluxDB OSS and InfluxDB Cloud share a majority of content.
|
Docs for InfluxDB OSS and InfluxDB Cloud share a majority of content.
|
||||||
To prevent duplication of content between versions, use the following shortcodes:
|
To prevent duplication of content between versions, use the following shortcodes:
|
||||||
|
|
||||||
|
@ -1076,12 +1261,14 @@ To prevent duplication of content between versions, use the following shortcodes
|
||||||
- `{{% cloud-only %}}`
|
- `{{% cloud-only %}}`
|
||||||
|
|
||||||
#### duplicate-oss
|
#### duplicate-oss
|
||||||
|
|
||||||
The `{{< duplicate-oss >}}` shortcode copies the page content of the file located
|
The `{{< duplicate-oss >}}` shortcode copies the page content of the file located
|
||||||
at the identical file path in the most recent InfluxDB OSS version.
|
at the identical file path in the most recent InfluxDB OSS version.
|
||||||
The Cloud version of this markdown file should contain the frontmatter required
|
The Cloud version of this markdown file should contain the frontmatter required
|
||||||
for all pages, but the body content should just be the `{{< duplicate-oss >}}` shortcode.
|
for all pages, but the body content should just be the `{{< duplicate-oss >}}` shortcode.
|
||||||
|
|
||||||
#### oss-only
|
#### oss-only
|
||||||
|
|
||||||
Wrap content that should only appear in the OSS version of the doc with the `{{% oss-only %}}` shortcode.
|
Wrap content that should only appear in the OSS version of the doc with the `{{% oss-only %}}` shortcode.
|
||||||
Use the shortcode on both inline and content blocks:
|
Use the shortcode on both inline and content blocks:
|
||||||
|
|
||||||
|
@ -1123,6 +1310,7 @@ This is necessary to get the first sentence/paragraph to render correctly.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### cloud-only
|
#### cloud-only
|
||||||
|
|
||||||
Wrap content that should only appear in the Cloud version of the doc with the `{{% cloud-only %}}` shortcode.
|
Wrap content that should only appear in the Cloud version of the doc with the `{{% cloud-only %}}` shortcode.
|
||||||
Use the shortcode on both inline and content blocks:
|
Use the shortcode on both inline and content blocks:
|
||||||
|
|
||||||
|
@ -1164,6 +1352,7 @@ This is necessary to get the first sentence/paragraph to render correctly.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### All-Caps
|
#### All-Caps
|
||||||
|
|
||||||
Clockface v3 introduces many buttons with text formatted as all-caps.
|
Clockface v3 introduces many buttons with text formatted as all-caps.
|
||||||
Use the `{{< caps >}}` shortcode to format text to match those buttons.
|
Use the `{{< caps >}}` shortcode to format text to match those buttons.
|
||||||
|
|
||||||
|
@ -1172,20 +1361,24 @@ Click {{< caps >}}Add Data{{< /caps >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Code callouts
|
#### Code callouts
|
||||||
|
|
||||||
Use the `{{< code-callout >}}` shortcode to highlight and emphasize a specific
|
Use the `{{< code-callout >}}` shortcode to highlight and emphasize a specific
|
||||||
piece of code (for example, a variable, placeholder, or value) in a code block.
|
piece of code (for example, a variable, placeholder, or value) in a code block.
|
||||||
Provide the string to highlight in the code block.
|
Provide the string to highlight in the code block.
|
||||||
Include a syntax for the codeblock to properly style the called out code.
|
Include a syntax for the codeblock to properly style the called out code.
|
||||||
|
|
||||||
~~~md
|
````md
|
||||||
{{< code-callout "03a2bbf46249a000" >}}
|
{{< code-callout "03a2bbf46249a000" >}}
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
http://localhost:8086/orgs/03a2bbf46249a000/...
|
http://localhost:8086/orgs/03a2bbf46249a000/...
|
||||||
```
|
```
|
||||||
|
|
||||||
{{< /code-callout >}}
|
{{< /code-callout >}}
|
||||||
~~~
|
````
|
||||||
|
|
||||||
#### InfluxDB University banners
|
#### InfluxDB University banners
|
||||||
|
|
||||||
Use the `{{< influxdbu >}}` shortcode to add an InfluxDB University banner that
|
Use the `{{< influxdbu >}}` shortcode to add an InfluxDB University banner that
|
||||||
points to the InfluxDB University site or a specific course.
|
points to the InfluxDB University site or a specific course.
|
||||||
Use the default banner template, a predefined course template, or fully customize
|
Use the default banner template, a predefined course template, or fully customize
|
||||||
|
@ -1199,10 +1392,12 @@ the content of the banner.
|
||||||
{{< influxdbu "influxdb-101" >}}
|
{{< influxdbu "influxdb-101" >}}
|
||||||
|
|
||||||
<!-- Custom banner -->
|
<!-- Custom banner -->
|
||||||
{{< influxdbu title="Course title" summary="Short course summary." action="Take the course" link="https://university.influxdata.com/" >}}
|
{{< influxdbu title="Course title" summary="Short course summary." action="Take
|
||||||
|
the course" link="https://university.influxdata.com/" >}}
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Course templates
|
##### Course templates
|
||||||
|
|
||||||
Use one of the following course templates:
|
Use one of the following course templates:
|
||||||
|
|
||||||
- influxdb-101
|
- influxdb-101
|
||||||
|
@ -1210,6 +1405,7 @@ Use one of the following course templates:
|
||||||
- flux-103
|
- flux-103
|
||||||
|
|
||||||
##### Custom banner content
|
##### Custom banner content
|
||||||
|
|
||||||
Use the following shortcode parameters to customize the content of the InfluxDB
|
Use the following shortcode parameters to customize the content of the InfluxDB
|
||||||
University banner:
|
University banner:
|
||||||
|
|
||||||
|
@ -1219,6 +1415,7 @@ University banner:
|
||||||
- **link**: URL the button links to
|
- **link**: URL the button links to
|
||||||
|
|
||||||
### Reference content
|
### Reference content
|
||||||
|
|
||||||
The InfluxDB documentation is "task-based," meaning content primarily focuses on
|
The InfluxDB documentation is "task-based," meaning content primarily focuses on
|
||||||
what a user is **doing**, not what they are **using**.
|
what a user is **doing**, not what they are **using**.
|
||||||
However, there is a need to document tools and other things that don't necessarily
|
However, there is a need to document tools and other things that don't necessarily
|
||||||
|
@ -1242,6 +1439,7 @@ menu:
|
||||||
```
|
```
|
||||||
|
|
||||||
## InfluxDB URLs
|
## InfluxDB URLs
|
||||||
|
|
||||||
When a user selects an InfluxDB product and region, example URLs in code blocks
|
When a user selects an InfluxDB product and region, example URLs in code blocks
|
||||||
throughout the documentation are updated to match their product and region.
|
throughout the documentation are updated to match their product and region.
|
||||||
InfluxDB URLs are configured in `/data/influxdb_urls.yml`.
|
InfluxDB URLs are configured in `/data/influxdb_urls.yml`.
|
||||||
|
@ -1251,7 +1449,7 @@ Use this URL in all code examples that should be updated with a selected provide
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
~~~
|
````
|
||||||
```sh
|
```sh
|
||||||
# This URL will get updated
|
# This URL will get updated
|
||||||
http://localhost:8086
|
http://localhost:8086
|
||||||
|
@ -1259,37 +1457,40 @@ http://localhost:8086
|
||||||
# This URL will NOT get updated
|
# This URL will NOT get updated
|
||||||
http://example.com
|
http://example.com
|
||||||
```
|
```
|
||||||
~~~
|
````
|
||||||
|
|
||||||
If the user selects the **US West (Oregon)** region, all occurrences of `http://localhost:8086`
|
If the user selects the **US West (Oregon)** region, all occurrences of `http://localhost:8086`
|
||||||
in code blocks will get updated to `https://us-west-2-1.aws.cloud2.influxdata.com`.
|
in code blocks will get updated to `https://us-west-2-1.aws.cloud2.influxdata.com`.
|
||||||
|
|
||||||
### Exempt URLs from getting updated
|
### Exempt URLs from getting updated
|
||||||
|
|
||||||
To exempt a code block from being updated, include the `{{< keep-url >}}` shortcode
|
To exempt a code block from being updated, include the `{{< keep-url >}}` shortcode
|
||||||
just before the code block.
|
just before the code block.
|
||||||
|
|
||||||
~~~
|
````
|
||||||
{{< keep-url >}}
|
{{< keep-url >}}
|
||||||
```
|
```
|
||||||
// This URL won't get updated
|
// This URL won't get updated
|
||||||
http://localhost:8086
|
http://localhost:8086
|
||||||
```
|
```
|
||||||
~~~
|
````
|
||||||
|
|
||||||
### Code examples only supported in InfluxDB Cloud
|
### Code examples only supported in InfluxDB Cloud
|
||||||
|
|
||||||
Some functionality is only supported in InfluxDB Cloud and code examples should
|
Some functionality is only supported in InfluxDB Cloud and code examples should
|
||||||
only use InfluxDB Cloud URLs. In these cases, use `https://cloud2.influxdata.com`
|
only use InfluxDB Cloud URLs. In these cases, use `https://cloud2.influxdata.com`
|
||||||
as the placeholder in the code block. It will get updated on page load and when
|
as the placeholder in the code block. It will get updated on page load and when
|
||||||
users select a Cloud region in the URL select modal.
|
users select a Cloud region in the URL select modal.
|
||||||
|
|
||||||
~~~
|
````
|
||||||
```sh
|
```sh
|
||||||
# This URL will get updated
|
# This URL will get updated
|
||||||
https://cloud2.influxdata.com
|
https://cloud2.influxdata.com
|
||||||
```
|
```
|
||||||
~~~
|
````
|
||||||
|
|
||||||
### Automatically populate InfluxDB host placeholder
|
### Automatically populate InfluxDB host placeholder
|
||||||
|
|
||||||
The InfluxDB host placeholder that gets replaced by custom domains differs
|
The InfluxDB host placeholder that gets replaced by custom domains differs
|
||||||
between each InfluxDB product/version.
|
between each InfluxDB product/version.
|
||||||
Use the `influxdb/host` shortcode to automatically render the correct
|
Use the `influxdb/host` shortcode to automatically render the correct
|
||||||
|
@ -1313,6 +1514,7 @@ Supported argument values:
|
||||||
```
|
```
|
||||||
|
|
||||||
## New Versions of InfluxDB
|
## New Versions of InfluxDB
|
||||||
|
|
||||||
Version bumps occur regularly in the documentation.
|
Version bumps occur regularly in the documentation.
|
||||||
Each minor version has its own directory with unique content.
|
Each minor version has its own directory with unique content.
|
||||||
Patch versions within a minor version are updated in place.
|
Patch versions within a minor version are updated in place.
|
||||||
|
@ -1321,17 +1523,20 @@ To add a new minor version, go through the steps below.
|
||||||
_This example assumes v2.0 is the most recent version and v2.1 is the new version._
|
_This example assumes v2.0 is the most recent version and v2.1 is the new version._
|
||||||
|
|
||||||
1. Ensure your `master` branch is up to date:
|
1. Ensure your `master` branch is up to date:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git checkout master
|
git checkout master
|
||||||
git pull
|
git pull
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Create a new branch for the new minor version:
|
2. Create a new branch for the new minor version:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git checkout -b influxdb-2.1
|
git checkout -b influxdb-2.1
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Duplicate the most recent version's content directory:
|
3. Duplicate the most recent version's content directory:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# From the root of the project
|
# From the root of the project
|
||||||
cp content/influxdb/v2.0 content/influxdb/v2.1
|
cp content/influxdb/v2.0 content/influxdb/v2.1
|
||||||
|
@ -1355,6 +1560,7 @@ _This example assumes v2.0 is the most recent version and v2.1 is the new versio
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Update the `latest_version` in `data/products.yml`:
|
6. Update the `latest_version` in `data/products.yml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
latest_version: v2.1
|
latest_version: v2.1
|
||||||
```
|
```
|
||||||
|
@ -1370,6 +1576,7 @@ Once the necessary changes are in place and the new version is released,
|
||||||
merge the new branch into `master`.
|
merge the new branch into `master`.
|
||||||
|
|
||||||
## InfluxDB API documentation
|
## InfluxDB API documentation
|
||||||
|
|
||||||
InfluxData uses [Redoc](https://github.com/Redocly/redoc) to generate the full
|
InfluxData uses [Redoc](https://github.com/Redocly/redoc) to generate the full
|
||||||
InfluxDB API documentation when documentation is deployed.
|
InfluxDB API documentation when documentation is deployed.
|
||||||
Redoc generates HTML documentation using the InfluxDB `swagger.yml`.
|
Redoc generates HTML documentation using the InfluxDB `swagger.yml`.
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
FROM golang:latest
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
||||||
|
curl \
|
||||||
|
git \
|
||||||
|
gpg \
|
||||||
|
jq \
|
||||||
|
maven \
|
||||||
|
nodejs \
|
||||||
|
npm \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
wget
|
||||||
|
|
||||||
|
RUN ln -s /usr/bin/python3 /usr/bin/python
|
||||||
|
|
||||||
|
# Create a virtual environment for Python to avoid conflicts with the system Python and having to use the --break-system-packages flag when installing packages with pip.
|
||||||
|
RUN python -m venv /opt/venv
|
||||||
|
# Enable venv
|
||||||
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
|
# Prevents Python from writing pyc files.
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1
|
||||||
|
# the application crashes without emitting any logs due to buffering.
|
||||||
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Some Python test dependencies (pytest-dotenv and pytest-codeblocks) aren't
|
||||||
|
# available as packages in apt-cache, so use pip to download dependencies in a # separate step and use Docker's caching.
|
||||||
|
COPY ./test/src/pytest.ini pytest.ini
|
||||||
|
COPY ./test/src/requirements.txt requirements.txt
|
||||||
|
RUN pip install -Ur requirements.txt
|
||||||
|
|
||||||
|
# Activate the Python virtual environment configured in the Dockerfile.
|
||||||
|
RUN . /opt/venv/bin/activate
|
||||||
|
|
||||||
|
### Install InfluxDB clients for testing
|
||||||
|
# Install InfluxDB keys to verify client installs.
|
||||||
|
# Follow the install instructions (https://docs.influxdata.com/telegraf/v1/install/?t=curl), except for sudo (which isn't available in Docker).
|
||||||
|
# influxdata-archive_compat.key GPG fingerprint:
|
||||||
|
# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
|
||||||
|
ADD https://repos.influxdata.com/influxdata-archive_compat.key ./influxdata-archive_compat.key
|
||||||
|
RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
|
||||||
|
|
||||||
|
RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
|
||||||
|
|
||||||
|
# Install InfluxDB clients to use in tests.
|
||||||
|
RUN apt-get update && apt-get -y install telegraf influxdb2-cli influxctl
|
||||||
|
COPY --chmod=755 ./test/config.toml /root/.config/influxctl/config.toml
|
||||||
|
### End InfluxDB client installs
|
||||||
|
|
||||||
|
ENTRYPOINT [ "pytest" ]
|
||||||
|
CMD [ "" ]
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Use the Dockerfile 1.2 syntax to leverage BuildKit features like cache mounts and inline mounts--temporary mounts that are only available during the build step, not at runtime.
|
||||||
|
# syntax=docker/dockerfile:1.2
|
||||||
|
|
||||||
|
# Starting from a Go base image is easier than setting up the Go environment later.
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Install the necessary packages for the test environment.
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
||||||
|
rsync
|
||||||
|
|
||||||
|
COPY --chmod=755 ./test/src/parse_yaml.sh /usr/local/bin/parse_yaml
|
||||||
|
COPY --chmod=755 ./test/src/prepare-content.sh /usr/local/bin/prepare-content
|
||||||
|
COPY ./data/products.yml /app/appdata/products.yml
|
||||||
|
|
||||||
|
WORKDIR /src
|
||||||
|
ENTRYPOINT [ "prepare-content" ]
|
||||||
|
# The default command is an empty string to pass all command line arguments to the entrypoint and allow the entrypoint to run.
|
||||||
|
CMD [ "" ]
|
44
compose.yaml
44
compose.yaml
|
@ -1,27 +1,39 @@
|
||||||
# This is a Docker Compose file for the InfluxData documentation site.
|
# This is a Docker Compose file for the InfluxData documentation site.
|
||||||
## Run documentation tests for code samples.
|
## Run documentation tests for code samples.
|
||||||
|
name: influxdata-docs
|
||||||
|
volumes:
|
||||||
|
test-content:
|
||||||
services:
|
services:
|
||||||
test:
|
markdownlint:
|
||||||
image: docs-v2-tests
|
image: davidanson/markdownlint-cli2:v0.13.0
|
||||||
container_name: docs-v2-tests
|
container_name: markdownlint
|
||||||
profiles:
|
profiles:
|
||||||
- test
|
- ci
|
||||||
|
- lint
|
||||||
volumes:
|
volumes:
|
||||||
- type: bind
|
- type: bind
|
||||||
source: ./test
|
source: .
|
||||||
target: /usr/src/app/test
|
target: /workdir
|
||||||
- type: bind
|
working_dir: /workdir
|
||||||
source: ./data
|
|
||||||
target: /usr/src/app/test/data
|
|
||||||
- type: bind
|
|
||||||
source: ./static/downloads
|
|
||||||
target: /usr/src/app/test/tmp/data
|
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: test.Dockerfile
|
vale:
|
||||||
args:
|
image: jdkato/vale:latest
|
||||||
- SOURCE_DIR=test
|
container_name: vale
|
||||||
- DOCKER_IMAGE=docs-v2-tests
|
profiles:
|
||||||
|
- ci
|
||||||
|
- lint
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: .
|
||||||
|
target: /workdir
|
||||||
|
working_dir: /workdir
|
||||||
|
entrypoint: ["/bin/vale"]
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile_inline: |
|
||||||
|
COPY .ci /src/.ci
|
||||||
|
COPY **/.vale.ini /src/
|
||||||
## Run InfluxData documentation with the hugo development server on port 1313.
|
## Run InfluxData documentation with the hugo development server on port 1313.
|
||||||
## For more information about the hugomods/hugo image, see
|
## For more information about the hugomods/hugo image, see
|
||||||
## https://docker.hugomods.com/docs/development/docker-compose/
|
## https://docker.hugomods.com/docs/development/docker-compose/
|
||||||
|
|
|
@ -10,16 +10,16 @@ weight: 3
|
||||||
influxdb/cloud-dedicated/tags: [get-started]
|
influxdb/cloud-dedicated/tags: [get-started]
|
||||||
---
|
---
|
||||||
|
|
||||||
{{% product-name %}} is the platform purpose-built to collect, store, and
|
InfluxDB is the platform purpose-built to collect, store, and query
|
||||||
query time series data.
|
time series data.
|
||||||
It is powered by the InfluxDB 3.0 storage engine which provides a number of
|
{{% product-name %}} is powered by the InfluxDB 3.0 storage engine, that
|
||||||
benefits including nearly unlimited series cardinality, improved query performance,
|
provides nearly unlimited series cardinality,
|
||||||
and interoperability with widely used data processing tools and platforms.
|
improved query performance, and interoperability with widely used data
|
||||||
|
processing tools and platforms.
|
||||||
|
|
||||||
**Time series data** is a sequence of data points indexed in time order.
|
**Time series data** is a sequence of data points indexed in time order. Data
|
||||||
Data points typically consist of successive measurements made from the same
|
points typically consist of successive measurements made from the same source
|
||||||
source and are used to track changes over time.
|
and are used to track changes over time. Examples of time series data include:
|
||||||
Examples of time series data include:
|
|
||||||
|
|
||||||
- Industrial sensor data
|
- Industrial sensor data
|
||||||
- Server performance metrics
|
- Server performance metrics
|
||||||
|
@ -28,14 +28,14 @@ Examples of time series data include:
|
||||||
- Rainfall measurements
|
- Rainfall measurements
|
||||||
- Stock prices
|
- Stock prices
|
||||||
|
|
||||||
This multi-part tutorial walks you through writing time series data to {{% product-name %}},
|
This multi-part tutorial walks you through writing time series data to
|
||||||
querying, and then visualizing that data.
|
{{% product-name %}}, querying, and then visualizing that data.
|
||||||
|
|
||||||
## Key concepts before you get started
|
## Key concepts before you get started
|
||||||
|
|
||||||
Before you get started using InfluxDB, it's important to understand how time series
|
Before you get started using InfluxDB, it's important to understand how time
|
||||||
data is organized and stored in InfluxDB and some key definitions that are used
|
series data is organized and stored in InfluxDB and some key definitions that
|
||||||
throughout this documentation.
|
are used throughout this documentation.
|
||||||
|
|
||||||
- [Data organization](#data-organization)
|
- [Data organization](#data-organization)
|
||||||
- [Schema on write](#schema-on-write)
|
- [Schema on write](#schema-on-write)
|
||||||
|
@ -44,43 +44,53 @@ throughout this documentation.
|
||||||
### Data organization
|
### Data organization
|
||||||
|
|
||||||
The {{% product-name %}} data model organizes time series data into databases
|
The {{% product-name %}} data model organizes time series data into databases
|
||||||
and measurements.
|
and tables.
|
||||||
|
|
||||||
A database can contain multiple measurements.
|
A database can contain multiple tables.
|
||||||
Measurements contain multiple tags and fields.
|
Tables contain multiple tags and fields.
|
||||||
|
|
||||||
- **Database**: Named location where time series data is stored.
|
- **Database**: A named location where time series data is stored in _tables_.
|
||||||
A database can contain multiple _measurements_.
|
_Database_ is synonymous with _bucket_ in InfluxDB Cloud Serverless and InfluxDB TSM.
|
||||||
- **Measurement**: Logical grouping for time series data.
|
- **Table**: A logical grouping for time series data. All _points_ in a given
|
||||||
All _points_ in a given measurement should have the same _tags_.
|
table should have the same _tags_. A table contains _tags_ and
|
||||||
A measurement contains multiple _tags_ and _fields_.
|
_fields_. _Table_ is synonymous with _measurement_ in InfluxDB Cloud
|
||||||
- **Tags**: Key-value pairs that provide metadata for each point--for example,
|
Serverless and InfluxDB TSM.
|
||||||
something to identify the source or context of the data like host,
|
- **Tags**: Key-value pairs that provide metadata for each point--for
|
||||||
location, station, etc.
|
example, something to identify the source or context of the data like
|
||||||
Tag values may be null.
|
host, location, station, etc. Tag values may be null.
|
||||||
- **Fields**: Key-value pairs with values that change over time--for example,
|
- **Fields**: Key-value pairs with values that change over time--for
|
||||||
temperature, pressure, stock price, etc.
|
example, temperature, pressure, stock price, etc. Field values may be
|
||||||
Field values may be null, but at least one field value is not null on any given row.
|
null, but at least one field value is not null on any given row.
|
||||||
- **Timestamp**: Timestamp associated with the data.
|
- **Timestamp**: Timestamp associated with the data. When stored on disk and
|
||||||
When stored on disk and queried, all data is ordered by time.
|
queried, all data is ordered by time. A timestamp is never null.
|
||||||
A timestamp is never null.
|
|
||||||
|
{{% note %}}
|
||||||
|
|
||||||
|
#### What about buckets and measurements?
|
||||||
|
|
||||||
|
If coming from InfluxDB Cloud Serverless or InfluxDB powered by the TSM storage
|
||||||
|
engine, you're likely familiar with the concepts _bucket_ and _measurement_.
|
||||||
|
_Bucket_ in TSM or InfluxDB Cloud Serverless is synonymous with _database_ in
|
||||||
|
{{% product-name %}}. _Measurement_ in TSM or InfluxDB Cloud Serverless is
|
||||||
|
synonymous with _table_ in {{% product-name %}}.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
### Schema on write
|
### Schema on write
|
||||||
|
|
||||||
When using InfluxDB, you define your schema as you write your data.
|
As you write data to InfluxDB, the data defines the table schema. You don't need
|
||||||
You don't need to create measurements (equivalent to a relational table) or
|
to create tables or explicitly define the table schema.
|
||||||
explicitly define the schema of the measurement.
|
|
||||||
Measurement schemas are defined by the schema of data as it is written to the measurement.
|
|
||||||
|
|
||||||
### Important definitions
|
### Important definitions
|
||||||
|
|
||||||
The following definitions are important to understand when using InfluxDB:
|
The following definitions are important to understand when using InfluxDB:
|
||||||
|
|
||||||
- **Point**: Single data record identified by its _measurement, tag keys, tag values, field key, and timestamp_.
|
- **Point**: Single data record identified by its _measurement, tag keys, tag
|
||||||
- **Series**: A group of points with the same _measurement, tag keys and values, and field key_.
|
values, field key, and timestamp_.
|
||||||
- **Primary key**: Columns used to uniquely identify each row in a table.
|
- **Series**: A group of points with the same _measurement, tag keys and values,
|
||||||
Rows are uniquely identified by their _timestamp and tag set_.
|
and field key_.
|
||||||
A row's primary key _tag set_ does not include tags with null values.
|
- **Primary key**: Columns used to uniquely identify each row in a table. Rows
|
||||||
|
are uniquely identified by their _timestamp and tag set_. A row's primary key
|
||||||
|
_tag set_ does not include tags with null values.
|
||||||
|
|
||||||
##### Example InfluxDB query results
|
##### Example InfluxDB query results
|
||||||
|
|
||||||
|
@ -88,8 +98,8 @@ The following definitions are important to understand when using InfluxDB:
|
||||||
|
|
||||||
## Tools to use
|
## Tools to use
|
||||||
|
|
||||||
The following table compares tools that you can use to interact with {{% product-name %}}.
|
The following table compares tools that you can use to interact with
|
||||||
This tutorial covers many of the recommended tools.
|
{{% product-name %}}. This tutorial covers many of the recommended tools.
|
||||||
|
|
||||||
| Tool | Administration | Write | Query |
|
| Tool | Administration | Write | Query |
|
||||||
| :-------------------------------------------------------------------------------------------------- | :----------------------: | :----------------------: | :----------------------: |
|
| :-------------------------------------------------------------------------------------------------- | :----------------------: | :----------------------: | :----------------------: |
|
||||||
|
@ -114,39 +124,52 @@ This tutorial covers many of the recommended tools.
|
||||||
{{< /caption >}}
|
{{< /caption >}}
|
||||||
|
|
||||||
{{% warn %}}
|
{{% warn %}}
|
||||||
Avoid using the `influx` CLI with {{% product-name %}}.
|
Avoid using the `influx` CLI with {{% product-name %}}. While it
|
||||||
While it may coincidentally work, it isn't supported.
|
may coincidentally work, it isn't supported.
|
||||||
{{% /warn %}}
|
{{% /warn %}}
|
||||||
|
|
||||||
### `influxctl` CLI
|
### `influxctl` CLI
|
||||||
|
|
||||||
The [`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/)
|
The
|
||||||
|
[`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/)
|
||||||
writes, queries, and performs administrative tasks, such as managing databases
|
writes, queries, and performs administrative tasks, such as managing databases
|
||||||
and authorization tokens in a cluster.
|
and authorization tokens in a cluster.
|
||||||
|
|
||||||
### `influx3` data CLI
|
### `influx3` data CLI
|
||||||
|
|
||||||
The [`influx3` data CLI](/influxdb/cloud-dedicated/get-started/query/?t=influx3+CLI#execute-an-sql-query) is a community-maintained tool that lets you write and query data in {{% product-name %}} from a command line.
|
The
|
||||||
It uses the HTTP API to write data and uses Flight gRPC to query data.
|
[`influx3` data CLI](/influxdb/cloud-dedicated/get-started/query/?t=influx3+CLI#execute-an-sql-query)
|
||||||
|
is a community-maintained tool that lets you write and query data in
|
||||||
|
{{% product-name %}} from a command line. It uses the HTTP API to write data and
|
||||||
|
uses Flight gRPC to query data.
|
||||||
|
|
||||||
### InfluxDB HTTP API
|
### InfluxDB HTTP API
|
||||||
|
|
||||||
The [InfluxDB HTTP API](/influxdb/v2/reference/api/) provides a simple way to let you manage {{% product-name %}} and write and query data using HTTP(S) clients.
|
The [InfluxDB HTTP API](/influxdb/v2/reference/api/) provides a simple way to
|
||||||
Examples in this tutorial use cURL, but any HTTP(S) client will work.
|
let you manage {{% product-name %}} and write and query data using HTTP(S)
|
||||||
|
clients. Examples in this tutorial use cURL, but any HTTP(S) client will work.
|
||||||
|
|
||||||
The `/write` and `/query` v1-compatible endpoints work with the username/password authentication schemes and existing InfluxDB 1.x tools and code.
|
The `/write` and `/query` v1-compatible endpoints work with the
|
||||||
The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB 2.x tools and code.
|
username/password authentication schemes and existing InfluxDB 1.x tools and
|
||||||
|
code. The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB
|
||||||
|
2.x tools and code.
|
||||||
|
|
||||||
### InfluxDB client libraries
|
### InfluxDB client libraries
|
||||||
|
|
||||||
InfluxDB client libraries are community-maintained, language-specific clients that interact with InfluxDB APIs.
|
InfluxDB client libraries are community-maintained, language-specific clients
|
||||||
|
that interact with InfluxDB APIs.
|
||||||
|
|
||||||
[InfluxDB v3 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v3/) are the recommended client libraries for writing and querying data {{% product-name %}}.
|
[InfluxDB v3 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v3/)
|
||||||
They use the HTTP API to write data and use Flight gRPC to query data.
|
are the recommended client libraries for writing and querying data
|
||||||
|
{{% product-name %}}. They use the HTTP API to write data and use InfluxDB's
|
||||||
|
Flight gRPC API to query data.
|
||||||
|
|
||||||
[InfluxDB v2 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v2/) can use `/api/v2` HTTP endpoints to manage resources such as buckets and API tokens, and write data in {{% product-name %}}.
|
[InfluxDB v2 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v2/)
|
||||||
|
can use `/api/v2` HTTP endpoints to manage resources such as buckets and API
|
||||||
|
tokens, and write data in {{% product-name %}}.
|
||||||
|
|
||||||
[InfluxDB v1 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v1/) can write data to {{% product-name %}}.
|
[InfluxDB v1 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v1/)
|
||||||
|
can write data to {{% product-name %}}.
|
||||||
|
|
||||||
## Authorization
|
## Authorization
|
||||||
|
|
||||||
|
@ -158,13 +181,14 @@ There are two types of tokens:
|
||||||
- **Database token**: A token that grants read and write access to InfluxDB
|
- **Database token**: A token that grants read and write access to InfluxDB
|
||||||
databases.
|
databases.
|
||||||
- **Management token**: A short-lived (1 hour) [Auth0 token](#) used to
|
- **Management token**: A short-lived (1 hour) [Auth0 token](#) used to
|
||||||
administer your InfluxDB cluster.
|
administer your InfluxDB cluster. These are generated by the `influxctl` CLI
|
||||||
These are generated by the `influxctl` CLI and do not require any direct management.
|
and do not require any direct management. Management tokens authorize a user
|
||||||
Management tokens authorize a user to perform tasks related to:
|
to perform tasks related to:
|
||||||
|
|
||||||
- Account management
|
- Account management
|
||||||
- Database management
|
- Database management
|
||||||
- Database token management
|
- Database token management
|
||||||
- Pricing
|
- Pricing
|
||||||
<!-- - Infrastructure management -->
|
<!-- - Infrastructure management -->
|
||||||
{{< page-nav next="/influxdb/cloud-dedicated/get-started/setup/" >}}
|
|
||||||
|
{{< page-nav next="/influxdb/clustered/get-started/setup/" >}}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,8 @@
|
||||||
---
|
---
|
||||||
title: Use InfluxDB client libraries to write line protocol data
|
title: Use InfluxDB client libraries to write line protocol data
|
||||||
description: >
|
description: >
|
||||||
Use InfluxDB API clients to write line protocol data to InfluxDB Cloud Dedicated.
|
Use InfluxDB API clients to write points as line protocol data to InfluxDB
|
||||||
|
Cloud Dedicated.
|
||||||
menu:
|
menu:
|
||||||
influxdb_cloud_dedicated:
|
influxdb_cloud_dedicated:
|
||||||
name: Use client libraries
|
name: Use client libraries
|
||||||
|
@ -13,23 +14,35 @@ related:
|
||||||
- /influxdb/cloud-dedicated/get-started/write/
|
- /influxdb/cloud-dedicated/get-started/write/
|
||||||
---
|
---
|
||||||
|
|
||||||
Use InfluxDB client libraries to build line protocol, and then write it to an
|
Use InfluxDB client libraries to build time series points, and then write them
|
||||||
InfluxDB database.
|
line protocol to an {{% product-name %}} database.
|
||||||
|
|
||||||
- [Construct line protocol](#construct-line-protocol)
|
- [Construct line protocol](#construct-line-protocol)
|
||||||
|
- [Example home schema](#example-home-schema)
|
||||||
- [Set up your project](#set-up-your-project)
|
- [Set up your project](#set-up-your-project)
|
||||||
- [Construct points and write line protocol](#construct-points-and-write-line-protocol)
|
- [Construct points and write line protocol](#construct-points-and-write-line-protocol)
|
||||||
- [Run the example](#run-the-example)
|
|
||||||
- [Home sensor data line protocol](#home-sensor-data-line-protocol)
|
|
||||||
|
|
||||||
## Construct line protocol
|
## Construct line protocol
|
||||||
|
|
||||||
With a [basic understanding of line protocol](/influxdb/cloud-dedicated/write-data/line-protocol/),
|
With a
|
||||||
you can now construct line protocol and write data to InfluxDB.
|
[basic understanding of line protocol](/influxdb/cloud-dedicated/write-data/line-protocol/),
|
||||||
Consider a use case where you collect data from sensors in your home.
|
you can construct line protocol data and write it to InfluxDB.
|
||||||
Each sensor collects temperature, humidity, and carbon monoxide readings.
|
|
||||||
|
All InfluxDB client libraries write data in line protocol format to InfluxDB.
|
||||||
|
Client library `write` methods let you provide data as raw line protocol or as
|
||||||
|
`Point` objects that the client library converts to line protocol. If your
|
||||||
|
program creates the data you write to InfluxDB, use the client library `Point`
|
||||||
|
interface to take advantage of type safety in your program.
|
||||||
|
|
||||||
|
### Example home schema
|
||||||
|
|
||||||
|
Consider a use case where you collect data from sensors in your home. Each
|
||||||
|
sensor collects temperature, humidity, and carbon monoxide readings.
|
||||||
|
|
||||||
To collect this data, use the following schema:
|
To collect this data, use the following schema:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
- **measurement**: `home`
|
- **measurement**: `home`
|
||||||
- **tags**
|
- **tags**
|
||||||
- `room`: Living Room or Kitchen
|
- `room`: Living Room or Kitchen
|
||||||
|
@ -39,12 +52,16 @@ To collect this data, use the following schema:
|
||||||
- `co`: carbon monoxide in parts per million (integer)
|
- `co`: carbon monoxide in parts per million (integer)
|
||||||
- **timestamp**: Unix timestamp in _second_ precision
|
- **timestamp**: Unix timestamp in _second_ precision
|
||||||
|
|
||||||
The following example shows how to construct and write points that follow this schema.
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
|
The following example shows how to construct and write points that follow the
|
||||||
|
`home` schema.
|
||||||
|
|
||||||
## Set up your project
|
## Set up your project
|
||||||
|
|
||||||
The examples in this guide assume you followed [Set up InfluxDB](/influxdb/cloud-dedicated/get-started/setup/)
|
The examples in this guide assume you followed
|
||||||
and [Write data set up](/influxdb/cloud-dedicated/get-started/write/#set-up-your-project-and-credentials)
|
[Set up InfluxDB](/influxdb/cloud-dedicated/get-started/setup/) and
|
||||||
|
[Write data set up](/influxdb/cloud-dedicated/get-started/write/#set-up-your-project-and-credentials)
|
||||||
instructions in [Get started](/influxdb/cloud-dedicated/get-started/).
|
instructions in [Get started](/influxdb/cloud-dedicated/get-started/).
|
||||||
|
|
||||||
After setting up InfluxDB and your project, you should have the following:
|
After setting up InfluxDB and your project, you should have the following:
|
||||||
|
@ -57,213 +74,335 @@ After setting up InfluxDB and your project, you should have the following:
|
||||||
|
|
||||||
- A directory for your project.
|
- A directory for your project.
|
||||||
|
|
||||||
- Credentials stored as environment variables or in a project configuration file--for example, a `.env` ("dotenv") file.
|
- Credentials stored as environment variables or in a project configuration
|
||||||
|
file--for example, a `.env` ("dotenv") file.
|
||||||
|
|
||||||
- Client libraries installed for writing data to InfluxDB.
|
- Client libraries installed for writing data to InfluxDB.
|
||||||
|
|
||||||
The following example shows how to construct `Point` objects that follow the [example `home` schema](#example-home-schema), and then write the points as line protocol to an
|
The following example shows how to construct `Point` objects that follow the
|
||||||
{{% product-name %}} database.
|
[example `home` schema](#example-home-schema), and then write the data as line
|
||||||
|
protocol to an {{% product-name %}} database.
|
||||||
|
|
||||||
|
The examples use InfluxDB v3 client libraries. For examples using InfluxDB v2
|
||||||
|
client libraries to write data to InfluxDB v3, see
|
||||||
|
[InfluxDB v2 clients](/influxdb/cloud-dedicated/reference/client-libraries/v2/).
|
||||||
|
|
||||||
{{< tabs-wrapper >}}
|
{{< tabs-wrapper >}}
|
||||||
{{% tabs %}}
|
{{% tabs %}}
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
[Go](#)
|
[Go](#)
|
||||||
[Node.js](#)
|
[Node.js](#)
|
||||||
[Python](#)
|
[Python](#)
|
||||||
{{% /tabs %}}
|
{{% /tabs %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
|
The following steps set up a Go project using the
|
||||||
|
[InfluxDB v3 Go client](https://github.com/InfluxCommunity/influxdb3-go/):
|
||||||
|
|
||||||
<!-- BEGIN GO PROJECT SETUP -->
|
<!-- BEGIN GO PROJECT SETUP -->
|
||||||
|
|
||||||
1. Install [Go 1.13 or later](https://golang.org/doc/install).
|
1. Install [Go 1.13 or later](https://golang.org/doc/install).
|
||||||
|
|
||||||
2. Inside of your project directory, install the client package to your project dependencies.
|
1. Create a directory for your Go module and change to the directory--for
|
||||||
|
example:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go get github.com/influxdata/influxdb-client-go/v2
|
mkdir iot-starter-go && cd $_
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Initialize a Go module--for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go mod init iot-starter
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install [`influxdb3-go`](https://github.com/InfluxCommunity/influxdb3-go/),
|
||||||
|
which provides the InfluxDB `influxdb3` Go client library module.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/InfluxCommunity/influxdb3-go
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- END GO SETUP PROJECT -->
|
<!-- END GO SETUP PROJECT -->
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
<!-- BEGIN NODE.JS PROJECT SETUP -->
|
<!-- BEGIN NODE.JS PROJECT SETUP -->
|
||||||
|
|
||||||
Inside of your project directory, install the `@influxdata/influxdb-client` InfluxDB v2 JavaScript client library.
|
The following steps set up a JavaScript project using the
|
||||||
|
[InfluxDB v3 JavaScript client](https://github.com/InfluxCommunity/influxdb3-js/).
|
||||||
|
|
||||||
|
1. Install [Node.js](https://nodejs.org/en/download/).
|
||||||
|
|
||||||
|
1. Create a directory for your JavaScript project and change to the
|
||||||
|
directory--for example:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm install --save @influxdata/influxdb-client
|
mkdir -p iot-starter-js && cd $_
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Initialize a project--for example, using `npm`:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm init
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install the `@influxdata/influxdb3-client` InfluxDB v3 JavaScript client
|
||||||
|
library.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install @influxdata/influxdb3-client
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- END NODE.JS SETUP PROJECT -->
|
<!-- END NODE.JS SETUP PROJECT -->
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
<!-- BEGIN PYTHON SETUP PROJECT -->
|
<!-- BEGIN PYTHON SETUP PROJECT -->
|
||||||
|
|
||||||
1. **Optional, but recommended**: Use [`venv`](https://docs.python.org/3/library/venv.html)) or [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual environment for installing and executing code--for example:
|
The following steps set up a Python project using the
|
||||||
|
[InfluxDB v3 Python client](https://github.com/InfluxCommunity/influxdb3-python/):
|
||||||
|
|
||||||
Inside of your project directory, enter the following command using `venv` to create and activate a virtual environment for the project:
|
1. Install [Python](https://www.python.org/downloads/)
|
||||||
|
|
||||||
|
1. Inside of your project directory, create a directory for your Python module
|
||||||
|
and change to the module directory--for example:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
python3 -m venv envs/env1 && source ./envs/env1/bin/activate
|
mkdir -p iot-starter-py && cd $_
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Install the [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), which provides the InfluxDB `influxdb_client_3` Python client library module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data.
|
1. **Optional, but recommended**: Use
|
||||||
|
[`venv`](https://docs.python.org/3/library/venv.html) or
|
||||||
|
[`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual
|
||||||
|
environment for installing and executing code--for example, enter the
|
||||||
|
following command using `venv` to create and activate a virtual environment
|
||||||
|
for the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv envs/iot-starter && source ./envs/iot-starter/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install
|
||||||
|
[`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python),
|
||||||
|
which provides the InfluxDB `influxdb_client_3` Python client library module
|
||||||
|
and also installs the
|
||||||
|
[`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for
|
||||||
|
working with Arrow data.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install influxdb3-python
|
pip install influxdb3-python
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- END PYTHON SETUP PROJECT -->
|
<!-- END PYTHON SETUP PROJECT -->
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{< /tabs-wrapper >}}
|
{{< /tabs-wrapper >}}
|
||||||
|
|
||||||
## Construct points and write line protocol
|
## Construct points and write line protocol
|
||||||
|
|
||||||
|
Client libraries provide one or more `Point` constructor methods. Some libraries
|
||||||
|
support language-native data structures, such as Go's `struct`, for creating
|
||||||
|
points.
|
||||||
|
|
||||||
{{< tabs-wrapper >}}
|
{{< tabs-wrapper >}}
|
||||||
{{% tabs %}}
|
{{% tabs %}}
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
[Go](#)
|
[Go](#)
|
||||||
[Node.js](#)
|
[Node.js](#)
|
||||||
[Python](#)
|
[Python](#)
|
||||||
{{% /tabs %}}
|
{{% /tabs %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!-- BEGIN GO SETUP SAMPLE -->
|
<!-- BEGIN GO SETUP SAMPLE -->
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.go`.
|
1. Create a file for your module--for example: `main.go`.
|
||||||
|
|
||||||
2. In `write-point.go`, enter the following sample code:
|
1. In `main.go`, enter the following sample code:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/influxdata/influxdb-client-go/v2"
|
"time"
|
||||||
|
"github.com/InfluxCommunity/influxdb3-go/influxdb3"
|
||||||
|
"github.com/influxdata/line-protocol/v2/lineprotocol"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func Write() error {
|
||||||
// Set a log level constant
|
url := os.Getenv("INFLUX_HOST")
|
||||||
const debugLevel uint = 4
|
token := os.Getenv("INFLUX_TOKEN")
|
||||||
|
database := os.Getenv("INFLUX_DATABASE")
|
||||||
|
|
||||||
/**
|
// To instantiate a client, call New() with InfluxDB credentials.
|
||||||
* Define options for the client.
|
client, err := influxdb3.New(influxdb3.ClientConfig{
|
||||||
* Instantiate the client with the following arguments:
|
Host: url,
|
||||||
* - An object containing InfluxDB URL and token credentials.
|
Token: token,
|
||||||
* - Write options for batch size and timestamp precision.
|
Database: database,
|
||||||
|
})
|
||||||
|
|
||||||
|
/** Use a deferred function to ensure the client is closed when the
|
||||||
|
* function returns.
|
||||||
**/
|
**/
|
||||||
clientOptions := influxdb2.DefaultOptions().
|
defer func (client *influxdb3.Client) {
|
||||||
SetBatchSize(20).
|
err = client.Close()
|
||||||
SetLogLevel(debugLevel).
|
if err != nil {
|
||||||
SetPrecision(time.Second)
|
panic(err)
|
||||||
|
|
||||||
client := influxdb2.NewClientWithOptions(os.Getenv("INFLUX_URL"),
|
|
||||||
os.Getenv("INFLUX_TOKEN"),
|
|
||||||
clientOptions)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an asynchronous, non-blocking write client.
|
|
||||||
* Provide your InfluxDB org and database as arguments
|
|
||||||
**/
|
|
||||||
writeAPI := client.WriteAPI(os.Getenv("INFLUX_ORG"), "get-started")
|
|
||||||
|
|
||||||
// Get the errors channel for the asynchronous write client.
|
|
||||||
errorsCh := writeAPI.Errors()
|
|
||||||
|
|
||||||
/** Create a point.
|
|
||||||
* Provide measurement, tags, and fields as arguments.
|
|
||||||
**/
|
|
||||||
p := influxdb2.NewPointWithMeasurement("home").
|
|
||||||
AddTag("room", "Kitchen").
|
|
||||||
AddField("temp", 72.0).
|
|
||||||
AddField("hum", 20.2).
|
|
||||||
AddField("co", 9).
|
|
||||||
SetTime(time.Now())
|
|
||||||
|
|
||||||
// Define a proc for handling errors.
|
|
||||||
go func() {
|
|
||||||
for err := range errorsCh {
|
|
||||||
fmt.Printf("write error: %s\n", err.Error())
|
|
||||||
}
|
}
|
||||||
}()
|
}(client)
|
||||||
|
|
||||||
// Write the point asynchronously
|
/** Use the NewPoint method to construct a point.
|
||||||
writeAPI.WritePoint(p)
|
* NewPoint(measurement, tags map, fields map, time)
|
||||||
|
**/
|
||||||
|
point := influxdb3.NewPoint("home",
|
||||||
|
map[string]string{
|
||||||
|
"room": "Living Room",
|
||||||
|
},
|
||||||
|
map[string]any{
|
||||||
|
"temp": 24.5,
|
||||||
|
"hum": 40.5,
|
||||||
|
"co": 15i},
|
||||||
|
time.Now(),
|
||||||
|
)
|
||||||
|
|
||||||
// Send pending writes from the buffer to the database.
|
/** Use the NewPointWithMeasurement method to construct a point with
|
||||||
writeAPI.Flush()
|
* method chaining.
|
||||||
|
**/
|
||||||
|
point2 := influxdb3.NewPointWithMeasurement("home").
|
||||||
|
SetTag("room", "Living Room").
|
||||||
|
SetField("temp", 23.5).
|
||||||
|
SetField("hum", 38.0).
|
||||||
|
SetField("co", 16i).
|
||||||
|
SetTimestamp(time.Now())
|
||||||
|
|
||||||
// Ensure background processes finish and release resources.
|
fmt.Println("Writing points")
|
||||||
client.Close()
|
points := []*influxdb3.Point{point, point2}
|
||||||
|
|
||||||
|
/** Write points to InfluxDB.
|
||||||
|
* You can specify WriteOptions, such as Gzip threshold,
|
||||||
|
* default tags, and timestamp precision. Default precision is lineprotocol.Nanosecond
|
||||||
|
**/
|
||||||
|
err = client.WritePoints(context.Background(), points,
|
||||||
|
influxdb3.WithPrecision(lineprotocol.Second))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
Write()
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
<!-- END GO SETUP SAMPLE -->
|
|
||||||
{{% /tab-content %}}
|
1. To run the module and write the data to your {{% product-name %}} database,
|
||||||
{{% tab-content %}}
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go run main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END GO SAMPLE -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
<!-- BEGIN NODE.JS SETUP SAMPLE -->
|
<!-- BEGIN NODE.JS SETUP SAMPLE -->
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.js`.
|
1. Create a file for your module--for example: `write-points.js`.
|
||||||
|
|
||||||
2. In `write-point.js`, enter the following sample code:
|
1. In `write-points.js`, enter the following sample code:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
'use strict'
|
// write-points.js
|
||||||
/** @module write
|
import { InfluxDBClient, Point } from '@influxdata/influxdb3-client';
|
||||||
* Use the JavaScript client library for Node.js. to create a point and write it to InfluxDB
|
|
||||||
**/
|
|
||||||
|
|
||||||
import {InfluxDB, Point} from '@influxdata/influxdb-client'
|
|
||||||
|
|
||||||
/** Get credentials from the environment **/
|
|
||||||
const url = process.env.INFLUX_URL
|
|
||||||
const token = process.env.INFLUX_TOKEN
|
|
||||||
const org = process.env.INFLUX_ORG
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate a client with a configuration object
|
* Set InfluxDB credentials.
|
||||||
* that contains your InfluxDB URL and token.
|
*/
|
||||||
**/
|
const host = process.env.INFLUX_HOST ?? '';
|
||||||
const influxDB = new InfluxDB({url, token})
|
const database = process.env.INFLUX_DATABASE;
|
||||||
|
const token = process.env.INFLUX_TOKEN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a write client configured to write to the database.
|
* Write line protocol to InfluxDB using the JavaScript client library.
|
||||||
* Provide your InfluxDB org and database.
|
*/
|
||||||
**/
|
export async function writePoints() {
|
||||||
const writeApi = influxDB.getWriteApi(org, 'get-started')
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a point and add tags and fields.
|
* Instantiate an InfluxDBClient.
|
||||||
* To add a field, call the field method for your data type.
|
* Provide the host URL and the database token.
|
||||||
**/
|
*/
|
||||||
const point1 = new Point('home')
|
const client = new InfluxDBClient({ host, token });
|
||||||
.tag('room', 'Kitchen')
|
|
||||||
.floatField('temp', 72.0)
|
|
||||||
.floatField('hum', 20.2)
|
|
||||||
.intField('co', 9)
|
|
||||||
console.log(` ${point1}`)
|
|
||||||
|
|
||||||
/**
|
/** Use the fluent interface with chained methods to construct Points. */
|
||||||
* Add the point to the batch.
|
const point = Point.measurement('home')
|
||||||
**/
|
.setTag('room', 'Living Room')
|
||||||
writeApi.writePoint(point1)
|
.setFloatField('temp', 22.2)
|
||||||
|
.setFloatField('hum', 35.5)
|
||||||
|
.setIntegerField('co', 7)
|
||||||
|
.setTimestamp(new Date().getTime() / 1000);
|
||||||
|
|
||||||
/**
|
const point2 = Point.measurement('home')
|
||||||
* Flush pending writes in the batch from the buffer and close the write client.
|
.setTag('room', 'Kitchen')
|
||||||
|
.setFloatField('temp', 21.0)
|
||||||
|
.setFloatField('hum', 35.9)
|
||||||
|
.setIntegerField('co', 0)
|
||||||
|
.setTimestamp(new Date().getTime() / 1000);
|
||||||
|
|
||||||
|
/** Write points to InfluxDB.
|
||||||
|
* The write method accepts an array of points, the target database, and
|
||||||
|
* an optional configuration object.
|
||||||
|
* You can specify WriteOptions, such as Gzip threshold, default tags,
|
||||||
|
* and timestamp precision. Default precision is lineprotocol.Nanosecond
|
||||||
**/
|
**/
|
||||||
writeApi.close().then(() => {
|
|
||||||
console.log('WRITE FINISHED')
|
try {
|
||||||
})
|
await client.write([point, point2], database, '', { precision: 's' });
|
||||||
|
console.log('Data has been written successfully!');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error writing data to InfluxDB: ${error.body}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
writePoints();
|
||||||
```
|
```
|
||||||
<!-- END NODE.JS SETUP SAMPLE -->
|
|
||||||
{{% /tab-content %}}
|
1. To run the module and write the data to your {{\< product-name >}} database,
|
||||||
{{% tab-content %}}
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
node writePoints.js
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END NODE.JS SAMPLE -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
<!-- BEGIN PYTHON SETUP SAMPLE -->
|
<!-- BEGIN PYTHON SETUP SAMPLE -->
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.py`.
|
1. Create a file for your module--for example: `write-points.py`.
|
||||||
|
|
||||||
2. In `write-point.py`, enter the following sample code to write data in batching mode:
|
1. In `write-points.py`, enter the following sample code to write data in
|
||||||
|
batching mode:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import os
|
import os
|
||||||
from influxdb_client_3 import Point, write_client_options, WritePrecision, WriteOptions, InfluxDBError
|
from influxdb_client_3 import (
|
||||||
|
InfluxDBClient3, InfluxDBError, Point, WritePrecision,
|
||||||
|
WriteOptions, write_client_options)
|
||||||
|
|
||||||
|
host = os.getenv('INFLUX_HOST')
|
||||||
|
token = os.getenv('INFLUX_TOKEN')
|
||||||
|
database = os.getenv('INFLUX_DATABASE')
|
||||||
|
|
||||||
# Create an array of points with tags and fields.
|
# Create an array of points with tags and fields.
|
||||||
points = [Point("home")
|
points = [Point("home")
|
||||||
|
@ -272,7 +411,8 @@ npm install --save @influxdata/influxdb-client
|
||||||
.field('hum', 20.2)
|
.field('hum', 20.2)
|
||||||
.field('co', 9)]
|
.field('co', 9)]
|
||||||
|
|
||||||
# With batching mode, define callbacks to execute after a successful or failed write request.
|
# With batching mode, define callbacks to execute after a successful or
|
||||||
|
# failed write request.
|
||||||
# Callback methods receive the configuration and data sent in the request.
|
# Callback methods receive the configuration and data sent in the request.
|
||||||
def success(self, data: str):
|
def success(self, data: str):
|
||||||
print(f"Successfully wrote batch: data: {data}")
|
print(f"Successfully wrote batch: data: {data}")
|
||||||
|
@ -296,80 +436,43 @@ npm install --save @influxdata/influxdb-client
|
||||||
wco = write_client_options(success_callback=success,
|
wco = write_client_options(success_callback=success,
|
||||||
error_callback=error,
|
error_callback=error,
|
||||||
retry_callback=retry,
|
retry_callback=retry,
|
||||||
WriteOptions=write_options)
|
write_options=write_options)
|
||||||
|
|
||||||
# Instantiate a synchronous instance of the client with your
|
# Instantiate a synchronous instance of the client with your
|
||||||
# InfluxDB credentials and write options.
|
# InfluxDB credentials and write options, such as Gzip threshold, default tags,
|
||||||
with InfluxDBClient3(host=config['INFLUX_HOST'],
|
# and timestamp precision. Default precision is nanosecond ('ns').
|
||||||
token=config['INFLUX_TOKEN'],
|
with InfluxDBClient3(host=host,
|
||||||
database=config['INFLUX_DATABASE'],
|
token=token,
|
||||||
|
database=database,
|
||||||
write_client_options=wco) as client:
|
write_client_options=wco) as client:
|
||||||
|
|
||||||
client.write(points, write_precision='s')
|
client.write(points, write_precision='s')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
1. To run the module and write the data to your {{< product-name >}} database,
|
||||||
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python write-points.py
|
||||||
|
```
|
||||||
|
|
||||||
<!-- END PYTHON SETUP PROJECT -->
|
<!-- END PYTHON SETUP PROJECT -->
|
||||||
{{% /tab-content %}}
|
|
||||||
{{< /tabs-wrapper >}}
|
{{% /tab-content %}} {{< /tabs-wrapper >}}
|
||||||
|
|
||||||
The sample code does the following:
|
The sample code does the following:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
1. Instantiates a client configured with the InfluxDB URL and API token.
|
1. Instantiates a client configured with the InfluxDB URL and API token.
|
||||||
|
1. Constructs `home`
|
||||||
|
[measurement](/influxdb/cloud-dedicated/reference/glossary/#measurement)
|
||||||
|
`Point` objects.
|
||||||
|
1. Sends data as line protocol format to InfluxDB and waits for the response.
|
||||||
|
1. If the write succeeds, logs the success message to stdout; otherwise, logs
|
||||||
|
the failure message and error details.
|
||||||
|
1. Closes the client to release resources.
|
||||||
|
|
||||||
2. Uses the client to instantiate a **write client** with credentials.
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
3. Constructs a `Point` object with the [measurement](/influxdb/cloud-dedicated/reference/glossary/#measurement) name (`"home"`).
|
|
||||||
|
|
||||||
4. Adds a tag and fields to the point.
|
|
||||||
|
|
||||||
5. Adds the point to a batch to be written to the database.
|
|
||||||
|
|
||||||
6. Sends the batch to InfluxDB and waits for the response.
|
|
||||||
|
|
||||||
7. Executes callbacks for the response, flushes the write buffer, and releases resources.
|
|
||||||
|
|
||||||
## Run the example
|
|
||||||
|
|
||||||
To run the sample and write the data to your InfluxDB Cloud Dedicated database, enter the following command in your terminal:
|
|
||||||
|
|
||||||
{{< code-tabs-wrapper >}}
|
|
||||||
{{% code-tabs %}}
|
|
||||||
[Go](#)
|
|
||||||
[Node.js](#)
|
|
||||||
[Python](#)
|
|
||||||
{{% /code-tabs %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN GO RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go run write-point.go
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- END GO RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN NODE.JS RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
node write-point.js
|
|
||||||
```
|
|
||||||
<!-- END NODE.JS RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN PYTHON RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
python write-point.py
|
|
||||||
```
|
|
||||||
<!-- END PYTHON RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{< /code-tabs-wrapper >}}
|
|
||||||
|
|
||||||
The example logs the point as line protocol to stdout, and then writes the point to the database.
|
|
||||||
The line protocol is similar to the following:
|
|
||||||
|
|
||||||
### Home sensor data line protocol
|
|
||||||
|
|
||||||
```sh
|
|
||||||
home,room=Kitchen co=9i,hum=20.2,temp=72 1641024000
|
|
||||||
```
|
|
||||||
|
|
|
@ -10,17 +10,16 @@ weight: 3
|
||||||
influxdb/clustered/tags: [get-started]
|
influxdb/clustered/tags: [get-started]
|
||||||
---
|
---
|
||||||
|
|
||||||
{{% product-name %}} is a highly available InfluxDB cluster hosted and
|
InfluxDB is the platform purpose-built to collect, store, and query
|
||||||
managed on your own infrastructure and is the platform purpose-built to collect,
|
time series data.
|
||||||
store, and query time series data.
|
{{% product-name %}} is powered by the InfluxDB 3.0 storage engine, that
|
||||||
It is powered by the InfluxDB 3.0 storage engine which provides a number of
|
provides nearly unlimited series cardinality,
|
||||||
benefits including nearly unlimited series cardinality, improved query performance,
|
improved query performance, and interoperability with widely used data
|
||||||
and interoperability with widely used data processing tools and platforms.
|
processing tools and platforms.
|
||||||
|
|
||||||
**Time series data** is a sequence of data points indexed in time order.
|
**Time series data** is a sequence of data points indexed in time order. Data
|
||||||
Data points typically consist of successive measurements made from the same
|
points typically consist of successive measurements made from the same source
|
||||||
source and are used to track changes over time.
|
and are used to track changes over time. Examples of time series data include:
|
||||||
Examples of time series data include:
|
|
||||||
|
|
||||||
- Industrial sensor data
|
- Industrial sensor data
|
||||||
- Server performance metrics
|
- Server performance metrics
|
||||||
|
@ -45,33 +44,43 @@ throughout this documentation.
|
||||||
### Data organization
|
### Data organization
|
||||||
|
|
||||||
The {{% product-name %}} data model organizes time series data into databases
|
The {{% product-name %}} data model organizes time series data into databases
|
||||||
and measurements.
|
and tables.
|
||||||
|
|
||||||
A database can contain multiple measurements.
|
A database can contain multiple tables.
|
||||||
Measurements contain multiple tags and fields.
|
Tables contain multiple tags and fields.
|
||||||
|
|
||||||
- **Database**: Named location where time series data is stored.
|
- **Database**: A named location where time series data is stored in _tables_.
|
||||||
A database can contain multiple _measurements_.
|
_Database_ is synonymous with _bucket_ in InfluxDB Cloud Serverless and InfluxDB TSM.
|
||||||
- **Measurement**: Logical grouping for time series data.
|
- **Table**: A logical grouping for time series data. All _points_ in a given
|
||||||
All _points_ in a given measurement should have the same _tags_.
|
table should have the same _tags_. A table contains _tags_ and
|
||||||
A measurement contains multiple _tags_ and _fields_.
|
_fields_. _Table_ is synonymous with _measurement_ in InfluxDB Cloud
|
||||||
- **Tags**: Key-value pairs that provide metadata for each point--for example,
|
Serverless and InfluxDB TSM.
|
||||||
something to identify the source or context of the data like host,
|
- **Tags**: Key-value pairs that provide metadata for each point--for
|
||||||
location, station, etc.
|
example, something to identify the source or context of the data like
|
||||||
Tag values may be null.
|
host, location, station, etc. Tag values may be null.
|
||||||
- **Fields**: Key-value pairs with values that change over time--for example,
|
- **Fields**: Key-value pairs with values that change over time--for
|
||||||
temperature, pressure, stock price, etc.
|
example, temperature, pressure, stock price, etc. Field values may be
|
||||||
Field values may be null, but at least one field value is not null on any given row.
|
null, but at least one field value is not null on any given row.
|
||||||
- **Timestamp**: Timestamp associated with the data.
|
- **Timestamp**: Timestamp associated with the data. When stored on disk and
|
||||||
When stored on disk and queried, all data is ordered by time.
|
queried, all data is ordered by time. A timestamp is never null.
|
||||||
A timestamp is never null.
|
|
||||||
|
{{% note %}}
|
||||||
|
|
||||||
|
#### What about buckets and measurements?
|
||||||
|
|
||||||
|
If coming from InfluxDB Cloud Serverless or InfluxDB powered by the TSM storage engine, you're likely familiar
|
||||||
|
with the concepts _bucket_ and _measurement_.
|
||||||
|
_Bucket_ in TSM or InfluxDB Cloud Serverless is synonymous with
|
||||||
|
_database_ in {{% product-name %}}.
|
||||||
|
_Measurement_ in TSM or InfluxDB Cloud Serverless is synonymous with
|
||||||
|
_table_ in {{% product-name %}}.
|
||||||
|
{{% /note %}}
|
||||||
|
|
||||||
### Schema on write
|
### Schema on write
|
||||||
|
|
||||||
When using InfluxDB, you define your schema as you write your data.
|
As you write data to InfluxDB, the data defines the table schema.
|
||||||
You don't need to create measurements (equivalent to a relational table) or
|
You don't need to create tables or
|
||||||
explicitly define the schema of the measurement.
|
explicitly define the table schema.
|
||||||
Measurement schemas are defined by the schema of data as it is written to the measurement.
|
|
||||||
|
|
||||||
### Important definitions
|
### Important definitions
|
||||||
|
|
||||||
|
@ -121,7 +130,7 @@ While it may coincidentally work, it isn't supported.
|
||||||
|
|
||||||
### `influxctl` admin CLI
|
### `influxctl` admin CLI
|
||||||
|
|
||||||
The [`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/)
|
The [`influxctl` command line interface (CLI)](/influxdb/clustered/reference/cli/influxctl/)
|
||||||
writes, queries, and performs administrative tasks, such as managing databases
|
writes, queries, and performs administrative tasks, such as managing databases
|
||||||
and authorization tokens in a cluster.
|
and authorization tokens in a cluster.
|
||||||
|
|
||||||
|
@ -143,7 +152,7 @@ The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB 2.x tool
|
||||||
InfluxDB client libraries are community-maintained, language-specific clients that interact with InfluxDB APIs.
|
InfluxDB client libraries are community-maintained, language-specific clients that interact with InfluxDB APIs.
|
||||||
|
|
||||||
[InfluxDB v3 client libraries](/influxdb/clustered/reference/client-libraries/v3/) are the recommended client libraries for writing and querying data {{% product-name %}}.
|
[InfluxDB v3 client libraries](/influxdb/clustered/reference/client-libraries/v3/) are the recommended client libraries for writing and querying data {{% product-name %}}.
|
||||||
They use the HTTP API to write data and use Flight gRPC to query data.
|
They use the HTTP API to write data and use InfluxDB's Flight gRPC API to query data.
|
||||||
|
|
||||||
[InfluxDB v2 client libraries](/influxdb/clustered/reference/client-libraries/v2/) can use `/api/v2` HTTP endpoints to manage resources such as buckets and API tokens, and write data in {{% product-name %}}.
|
[InfluxDB v2 client libraries](/influxdb/clustered/reference/client-libraries/v2/) can use `/api/v2` HTTP endpoints to manage resources such as buckets and API tokens, and write data in {{% product-name %}}.
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,11 @@ related:
|
||||||
- /telegraf/v1/
|
- /telegraf/v1/
|
||||||
---
|
---
|
||||||
|
|
||||||
This tutorial walks you through the fundamental of creating **line protocol** data and writing it to InfluxDB.
|
This tutorial walks you through the fundamental of creating **line protocol**
|
||||||
|
data and writing it to InfluxDB.
|
||||||
|
|
||||||
InfluxDB provides many different options for ingesting or writing data, including the following:
|
InfluxDB provides many different options for ingesting or writing data,
|
||||||
|
including the following:
|
||||||
|
|
||||||
- InfluxDB HTTP API (v1 and v2)
|
- InfluxDB HTTP API (v1 and v2)
|
||||||
- Telegraf
|
- Telegraf
|
||||||
|
@ -31,15 +33,16 @@ InfluxDB provides many different options for ingesting or writing data, includin
|
||||||
- `influx3` data CLI
|
- `influx3` data CLI
|
||||||
- InfluxDB client libraries
|
- InfluxDB client libraries
|
||||||
|
|
||||||
If using tools like Telegraf or InfluxDB client libraries, they can
|
If using tools like Telegraf or InfluxDB client libraries, they can build the
|
||||||
build the line protocol for you, but it's good to understand how line protocol works.
|
line protocol for you, but it's good to understand how line protocol works.
|
||||||
|
|
||||||
## Line protocol
|
## Line protocol
|
||||||
|
|
||||||
All data written to InfluxDB is written using **line protocol**, a text-based
|
All data written to InfluxDB is written using **line protocol**, a text-based
|
||||||
format that lets you provide the necessary information to write a data point to InfluxDB.
|
format that lets you provide the necessary information to write a data point to
|
||||||
_This tutorial covers the basics of line protocol, but for detailed information,
|
InfluxDB. _This tutorial covers the basics of line protocol, but for detailed
|
||||||
see the [Line protocol reference](/influxdb/clustered/reference/syntax/line-protocol/)._
|
information, see the
|
||||||
|
[Line protocol reference](/influxdb/clustered/reference/syntax/line-protocol/)._
|
||||||
|
|
||||||
### Line protocol elements
|
### Line protocol elements
|
||||||
|
|
||||||
|
@ -47,8 +50,8 @@ Each line of line protocol contains the following elements:
|
||||||
|
|
||||||
{{< req type="key" >}}
|
{{< req type="key" >}}
|
||||||
|
|
||||||
- {{< req "\*" >}} **measurement**: String that identifies the
|
- {{< req "\*" >}} **measurement**: A string that identifies the
|
||||||
[measurement](/influxdb/clustered/reference/glossary/#measurement) to store the data in.
|
[table](/influxdb/clustered/reference/glossary/#table) to store the data in.
|
||||||
- **tag set**: Comma-delimited list of key value pairs, each representing a tag.
|
- **tag set**: Comma-delimited list of key value pairs, each representing a tag.
|
||||||
Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._
|
Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._
|
||||||
- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field.
|
- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field.
|
||||||
|
@ -65,12 +68,15 @@ Each line of line protocol contains the following elements:
|
||||||
|
|
||||||
#### Line protocol element parsing
|
#### Line protocol element parsing
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
- **measurement**: Everything before the _first unescaped comma before the first whitespace_.
|
- **measurement**: Everything before the _first unescaped comma before the first whitespace_.
|
||||||
- **tag set**: Key-value pairs between the _first unescaped comma_ and the _first unescaped whitespace_.
|
- **tag set**: Key-value pairs between the _first unescaped comma_ and the _first unescaped whitespace_.
|
||||||
- **field set**: Key-value pairs between the _first and second unescaped whitespaces_.
|
- **field set**: Key-value pairs between the _first and second unescaped whitespaces_.
|
||||||
- **timestamp**: Integer value after the _second unescaped whitespace_.
|
- **timestamp**: Integer value after the _second unescaped whitespace_.
|
||||||
- Lines are separated by the newline character (`\n`).
|
- Lines are separated by the newline character (`\n`).
|
||||||
Line protocol is whitespace sensitive.
|
Line protocol is whitespace sensitive.
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -88,6 +94,8 @@ Consider a use case where you collect data from sensors in your home.
|
||||||
Each sensor collects temperature, humidity, and carbon monoxide readings.
|
Each sensor collects temperature, humidity, and carbon monoxide readings.
|
||||||
To collect this data, use the following schema:
|
To collect this data, use the following schema:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
- **measurement**: `home`
|
- **measurement**: `home`
|
||||||
- **tags**
|
- **tags**
|
||||||
- `room`: Living Room or Kitchen
|
- `room`: Living Room or Kitchen
|
||||||
|
@ -96,6 +104,7 @@ To collect this data, use the following schema:
|
||||||
- `hum`: percent humidity (float)
|
- `hum`: percent humidity (float)
|
||||||
- `co`: carbon monoxide in parts per million (integer)
|
- `co`: carbon monoxide in parts per million (integer)
|
||||||
- **timestamp**: Unix timestamp in _second_ precision
|
- **timestamp**: Unix timestamp in _second_ precision
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
Data is collected hourly beginning at
|
Data is collected hourly beginning at
|
||||||
{{% influxdb/custom-timestamps-span %}}**2022-01-01T08:00:00Z (UTC)** until **2022-01-01T20:00:00Z (UTC)**{{% /influxdb/custom-timestamps-span %}}.
|
{{% influxdb/custom-timestamps-span %}}**2022-01-01T08:00:00Z (UTC)** until **2022-01-01T20:00:00Z (UTC)**{{% /influxdb/custom-timestamps-span %}}.
|
||||||
|
@ -151,6 +160,7 @@ credentials (**URL**, **organization**, and **token**) are provided by
|
||||||
{{% /note %}}
|
{{% /note %}}
|
||||||
|
|
||||||
{{< tabs-wrapper >}}
|
{{< tabs-wrapper >}}
|
||||||
|
|
||||||
{{% tabs %}}
|
{{% tabs %}}
|
||||||
[influxctl CLI](#)
|
[influxctl CLI](#)
|
||||||
[Telegraf](#)
|
[Telegraf](#)
|
||||||
|
@ -162,7 +172,9 @@ credentials (**URL**, **organization**, and **token**) are provided by
|
||||||
[C#](#)
|
[C#](#)
|
||||||
[Java](#)
|
[Java](#)
|
||||||
{{% /tabs %}}
|
{{% /tabs %}}
|
||||||
|
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!---------------------------- BEGIN INFLUXCTL CLI CONTENT ---------------------------->
|
<!---------------------------- BEGIN INFLUXCTL CLI CONTENT ---------------------------->
|
||||||
|
|
||||||
Use the [`influxctl write` command](/influxdb/clustered/reference/cli/influxctl/write/)
|
Use the [`influxctl write` command](/influxdb/clustered/reference/cli/influxctl/write/)
|
||||||
|
@ -178,6 +190,7 @@ Provide the following:
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
{{% code-placeholders "get-started" %}}
|
{{% code-placeholders "get-started" %}}
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
influxctl write \
|
influxctl write \
|
||||||
--database get-started \
|
--database get-started \
|
||||||
|
@ -213,10 +226,14 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200'
|
||||||
|
|
||||||
{{% /code-placeholders %}}
|
{{% /code-placeholders %}}
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!----------------------------- END INFLUXCTL CLI CONTENT ----------------------------->
|
<!----------------------------- END INFLUXCTL CLI CONTENT ----------------------------->
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!------------------------------- BEGIN TELEGRAF CONTENT ------------------------------>
|
<!------------------------------- BEGIN TELEGRAF CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
Use [Telegraf](/telegraf/v1/) to consume line protocol,
|
Use [Telegraf](/telegraf/v1/) to consume line protocol,
|
||||||
|
@ -257,7 +274,9 @@ and then write it to {{< product-name >}}.
|
||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Run the following command to generate a Telegraf configuration file (`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2` plugins:
|
3. Run the following command to generate a Telegraf configuration file
|
||||||
|
(`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2`
|
||||||
|
plugins:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
telegraf --sample-config \
|
telegraf --sample-config \
|
||||||
|
@ -268,8 +287,9 @@ and then write it to {{< product-name >}}.
|
||||||
|
|
||||||
4. In your editor, open `./telegraf.conf` and configure the following:
|
4. In your editor, open `./telegraf.conf` and configure the following:
|
||||||
|
|
||||||
- **`file` input plugin**: In the `[[inputs.file]].files` list, replace `"/tmp/metrics.out"` with your sample data filename.
|
- **`file` input plugin**: In the `[[inputs.file]].files` list, replace
|
||||||
If Telegraf can't find a file when started, it stops processing and exits.
|
`"/tmp/metrics.out"` with your sample data filename. If Telegraf can't
|
||||||
|
find a file when started, it stops processing and exits.
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[[inputs.file]]
|
[[inputs.file]]
|
||||||
|
@ -281,8 +301,6 @@ and then write it to {{< product-name >}}.
|
||||||
<!--test
|
<!--test
|
||||||
```bash
|
```bash
|
||||||
echo '[[inputs.file]]' > telegraf.conf
|
echo '[[inputs.file]]' > telegraf.conf
|
||||||
echo ' ## Files to parse each interval. Accept standard unix glob matching rules,' >> telegraf.conf
|
|
||||||
echo ' ## as well as ** to match recursive files and directories.' >> telegraf.conf
|
|
||||||
echo ' files = ["home.lp"]' >> telegraf.conf
|
echo ' files = ["home.lp"]' >> telegraf.conf
|
||||||
```
|
```
|
||||||
-->
|
-->
|
||||||
|
@ -307,23 +325,20 @@ and then write it to {{< product-name >}}.
|
||||||
<!--test
|
<!--test
|
||||||
```bash
|
```bash
|
||||||
echo '[[outputs.influxdb_v2]]' >> telegraf.conf
|
echo '[[outputs.influxdb_v2]]' >> telegraf.conf
|
||||||
echo ' # InfluxDB cluster URL' >> telegraf.conf
|
|
||||||
echo ' urls = ["${INFLUX_HOST}"]' >> telegraf.conf
|
echo ' urls = ["${INFLUX_HOST}"]' >> telegraf.conf
|
||||||
echo '' >> telegraf.conf
|
echo '' >> telegraf.conf
|
||||||
echo ' # INFLUX_TOKEN is an environment variable you assigned to your database token' >> telegraf.conf
|
|
||||||
echo ' token = "${INFLUX_TOKEN}"' >> telegraf.conf
|
echo ' token = "${INFLUX_TOKEN}"' >> telegraf.conf
|
||||||
echo '' >> telegraf.conf
|
echo '' >> telegraf.conf
|
||||||
echo ' # An empty string (InfluxDB ignores this parameter)' >> telegraf.conf
|
|
||||||
echo ' organization = ""' >> telegraf.conf
|
echo ' organization = ""' >> telegraf.conf
|
||||||
echo '' >> telegraf.conf
|
echo '' >> telegraf.conf
|
||||||
echo ' # Database name' >> telegraf.conf
|
|
||||||
echo ' bucket = "get-started"' >> telegraf.conf
|
echo ' bucket = "get-started"' >> telegraf.conf
|
||||||
```
|
```
|
||||||
-->
|
-->
|
||||||
|
|
||||||
The example configuration uses the following InfluxDB credentials:
|
The example configuration uses the following InfluxDB credentials:
|
||||||
|
|
||||||
- **`urls`**: an array containing your **`INFLUX_HOST`** environment variable
|
- **`urls`**: an array containing your **`INFLUX_HOST`** environment
|
||||||
|
variable
|
||||||
- **`token`**: your **`INFLUX_TOKEN`** environment variable
|
- **`token`**: your **`INFLUX_TOKEN`** environment variable
|
||||||
- **`organization`**: an empty string (InfluxDB ignores this parameter)
|
- **`organization`**: an empty string (InfluxDB ignores this parameter)
|
||||||
- **`bucket`**: the name of the database to write to
|
- **`bucket`**: the name of the database to write to
|
||||||
|
@ -331,7 +346,8 @@ and then write it to {{< product-name >}}.
|
||||||
5. To write the data, start the `telegraf` daemon with the following options:
|
5. To write the data, start the `telegraf` daemon with the following options:
|
||||||
|
|
||||||
- `--config`: Specifies the path of the configuration file.
|
- `--config`: Specifies the path of the configuration file.
|
||||||
- `--once`: Runs a single Telegraf collection cycle for the configured inputs and outputs, and then exits.
|
- `--once`: Runs a single Telegraf collection cycle for the configured
|
||||||
|
inputs and outputs, and then exits.
|
||||||
|
|
||||||
Enter the following command in your terminal:
|
Enter the following command in your terminal:
|
||||||
|
|
||||||
|
@ -351,22 +367,29 @@ Telegraf and its plugins provide many options for reading and writing data.
|
||||||
To learn more, see how to [use Telegraf to write data](/influxdb/clustered/write-data/use-telegraf/).
|
To learn more, see how to [use Telegraf to write data](/influxdb/clustered/write-data/use-telegraf/).
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!------------------------------- END TELEGRAF CONTENT ------------------------------>
|
<!------------------------------- END TELEGRAF CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!----------------------------- BEGIN v1 API CONTENT ----------------------------->
|
<!----------------------------- BEGIN v1 API CONTENT ----------------------------->
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
Write data with your existing workloads that already use the InfluxDB v1 `/write` API endpoint.
|
Write data with your existing workloads that already use the InfluxDB v1 `/write` API endpoint.
|
||||||
|
|
||||||
{{% note %}}
|
{{% note %}}
|
||||||
|
|
||||||
If migrating data from InfluxDB 1.x, see the [Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/clustered/guides/migrate-data/migrate-1x-to-clustered/) guide.
|
If migrating data from InfluxDB 1.x, see the
|
||||||
|
[Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/clustered/guides/migrate-data/migrate-1x-to-clustered/) guide.
|
||||||
|
|
||||||
{{% /note %}}
|
{{% /note %}}
|
||||||
|
|
||||||
To write data to InfluxDB using the [InfluxDB v1 HTTP API](/influxdb/clustered/reference/api/), send a
|
To write data to InfluxDB using the
|
||||||
request to the [InfluxDB API `/write` endpoint](/influxdb/clustered/api/#operation/PostLegacyWrite) using the `POST` request method.
|
[InfluxDB v1 HTTP API](/influxdb/clustered/reference/api/), send a
|
||||||
|
request to the
|
||||||
|
[InfluxDB API `/write` endpoint](/influxdb/clustered/api/#operation/PostLegacyWrite) using the `POST` request method.
|
||||||
|
|
||||||
{{% api-endpoint endpoint="https://{{< influxdb/host >}}/write" method="post" api-ref="/influxdb/clustered/api/#operation/PostLegacyWrite"%}}
|
{{% api-endpoint endpoint="https://{{< influxdb/host >}}/write" method="post" api-ref="/influxdb/clustered/api/#operation/PostLegacyWrite"%}}
|
||||||
|
|
||||||
|
@ -392,7 +415,7 @@ to InfluxDB:
|
||||||
{{% code-placeholders "DATABASE_TOKEN" %}}
|
{{% code-placeholders "DATABASE_TOKEN" %}}
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl --silent -w "%{response_code}: ${errormsg}\n" \
|
response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \
|
||||||
"https://{{< influxdb/host >}}/write?db=get-started&precision=s" \
|
"https://{{< influxdb/host >}}/write?db=get-started&precision=s" \
|
||||||
--header "Authorization: Bearer DATABASE_TOKEN" \
|
--header "Authorization: Bearer DATABASE_TOKEN" \
|
||||||
--header "Content-type: text/plain; charset=utf-8" \
|
--header "Content-type: text/plain; charset=utf-8" \
|
||||||
|
@ -424,7 +447,19 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600
|
||||||
home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600
|
home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600
|
||||||
home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200
|
home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200
|
||||||
home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200
|
home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200
|
||||||
"
|
")
|
||||||
|
|
||||||
|
# Format the response code and error message output.
|
||||||
|
response_code=${response%%:*}
|
||||||
|
errormsg=${response#*:}
|
||||||
|
|
||||||
|
# Remove leading and trailing whitespace from errormsg
|
||||||
|
errormsg=$(echo "${errormsg}" | tr -d '[:space:]')
|
||||||
|
|
||||||
|
echo "$response_code"
|
||||||
|
if [[ $errormsg ]]; then
|
||||||
|
echo "$errormsg"
|
||||||
|
fi
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-placeholders %}}
|
{{% /code-placeholders %}}
|
||||||
|
@ -440,23 +475,31 @@ If successful, the output is an HTTP `204 No Content` status code.
|
||||||
<!--pytest-codeblocks:expected-output-->
|
<!--pytest-codeblocks:expected-output-->
|
||||||
|
|
||||||
```
|
```
|
||||||
204:
|
204
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!------------------------------ END v1 API CONTENT ------------------------------>
|
<!------------------------------ END v1 API CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!----------------------------- BEGIN v2 API CONTENT ----------------------------->
|
<!----------------------------- BEGIN v2 API CONTENT ----------------------------->
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
To write data to InfluxDB using the [InfluxDB v2 HTTP API](/influxdb/clustered/reference/api/), send a
|
To write data to InfluxDB using the
|
||||||
request to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method.
|
[InfluxDB v2 HTTP API](/influxdb/clustered/reference/api/), send a request
|
||||||
|
to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method.
|
||||||
|
|
||||||
{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write" method="post" api-ref="/influxdb/clustered/api/#operation/PostWrite" >}}
|
{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write"
|
||||||
|
method="post" api-ref="/influxdb/clustered/api/#operation/PostWrite" >}}
|
||||||
|
|
||||||
Include the following with your request:
|
Include the following with your request:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
- **Headers**:
|
- **Headers**:
|
||||||
- **Authorization**: Bearer <INFLUX_TOKEN>
|
- **Authorization**: Bearer <INFLUX_TOKEN>
|
||||||
- **Content-Type**: text/plain; charset=utf-8
|
- **Content-Type**: text/plain; charset=utf-8
|
||||||
|
@ -465,18 +508,24 @@ Include the following with your request:
|
||||||
- **bucket**: InfluxDB database name
|
- **bucket**: InfluxDB database name
|
||||||
- **precision**:[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) (default is `ns`)
|
- **precision**:[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) (default is `ns`)
|
||||||
- **Request body**: Line protocol as plain text
|
- **Request body**: Line protocol as plain text
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
{{% note %}}
|
{{% note %}}
|
||||||
The {{% product-name %}} v2 API `/api/v2/write` endpoint supports `Bearer` and `Token` authorization schemes and you can use either scheme to pass a database token in your request.
|
The {{% product-name %}} v2 API `/api/v2/write` endpoint supports
|
||||||
For more information about HTTP API token schemes, see how to [authenticate API requests](/influxdb/clustered/guides/api-compatibility/v2/).
|
`Bearer` and `Token` authorization schemes and you can use either scheme to pass
|
||||||
|
a database token in your request.
|
||||||
|
For more information about HTTP API token
|
||||||
|
schemes, see how to
|
||||||
|
[authenticate API requests](/influxdb/clustered/guides/api-compatibility/v2/).
|
||||||
{{% /note %}}
|
{{% /note %}}
|
||||||
|
|
||||||
The following example uses cURL and the InfluxDB v2 API to write line protocol
|
The following example uses cURL and the InfluxDB v2 API to write line protocol
|
||||||
to InfluxDB:
|
to InfluxDB:
|
||||||
|
|
||||||
{{% code-placeholders "DATABASE_TOKEN"%}}
|
{{% code-placeholders "DATABASE_TOKEN"%}}
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl --silent -w "%{response_code}: %{errormsg}\n" \
|
response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \
|
||||||
"https://{{< influxdb/host >}}/api/v2/write?bucket=get-started&precision=s" \
|
"https://{{< influxdb/host >}}/api/v2/write?bucket=get-started&precision=s" \
|
||||||
--header "Authorization: Bearer DATABASE_TOKEN" \
|
--header "Authorization: Bearer DATABASE_TOKEN" \
|
||||||
--header "Content-Type: text/plain; charset=utf-8" \
|
--header "Content-Type: text/plain; charset=utf-8" \
|
||||||
|
@ -508,7 +557,19 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600
|
||||||
home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600
|
home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600
|
||||||
home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200
|
home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200
|
||||||
home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200
|
home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200
|
||||||
"
|
")
|
||||||
|
|
||||||
|
# Format the response code and error message output.
|
||||||
|
response_code=${response%%:*}
|
||||||
|
errormsg=${response#*:}
|
||||||
|
|
||||||
|
# Remove leading and trailing whitespace from errormsg
|
||||||
|
errormsg=$(echo "${errormsg}" | tr -d '[:space:]')
|
||||||
|
|
||||||
|
echo "$response_code"
|
||||||
|
if [[ $errormsg ]]; then
|
||||||
|
echo "$errormsg"
|
||||||
|
fi
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /code-placeholders %}}
|
{{% /code-placeholders %}}
|
||||||
|
@ -524,14 +585,18 @@ If successful, the output is an HTTP `204 No Content` status code.
|
||||||
<!--pytest-codeblocks:expected-output-->
|
<!--pytest-codeblocks:expected-output-->
|
||||||
|
|
||||||
```
|
```
|
||||||
204:
|
204
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!------------------------------ END v2 API CONTENT ------------------------------>
|
<!------------------------------ END v2 API CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!---------------------------- BEGIN PYTHON CONTENT --------------------------->
|
<!---------------------------- BEGIN PYTHON CONTENT --------------------------->
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
To write data to {{% product-name %}} using Python, use the
|
To write data to {{% product-name %}} using Python, use the
|
||||||
|
@ -575,9 +640,13 @@ dependencies to your current project.
|
||||||
pip install influxdb3-python
|
pip install influxdb3-python
|
||||||
```
|
```
|
||||||
|
|
||||||
The `influxdb3-python` package provides the `influxdb_client_3` module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data returned from queries.
|
The `influxdb3-python` package provides the `influxdb_client_3` module and
|
||||||
|
also installs the
|
||||||
|
[`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for
|
||||||
|
working with Arrow data returned from queries.
|
||||||
|
|
||||||
5. In your terminal or editor, create a new file for your code--for example: `write.py`.
|
5. In your terminal or editor, create a new file for your code--for example:
|
||||||
|
`write.py`.
|
||||||
|
|
||||||
<!--pytest-codeblocks:cont-->
|
<!--pytest-codeblocks:cont-->
|
||||||
|
|
||||||
|
@ -638,24 +707,31 @@ dependencies to your current project.
|
||||||
The sample does the following:
|
The sample does the following:
|
||||||
|
|
||||||
1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module.
|
1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module.
|
||||||
2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB client
|
2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB
|
||||||
configured with the following credentials:
|
client configured with the following credentials:
|
||||||
|
|
||||||
- **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL without protocol or trailing slash)
|
- **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL
|
||||||
- **`org`**: an empty or arbitrary string (InfluxDB ignores this parameter)
|
without protocol or trailing slash)
|
||||||
- **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
- **`org`**: an empty or arbitrary string (InfluxDB ignores this
|
||||||
with write access to the specified database.
|
parameter)
|
||||||
_Store this in a secret store or environment variable to avoid exposing the raw token string._
|
- **`token`**: a
|
||||||
- **`database`**: the name of the {{% product-name %}} database to write to
|
[database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
|
with write access to the specified database. _Store this in a secret
|
||||||
|
store or environment variable to avoid exposing the raw token string._
|
||||||
|
- **`database`**: the name of the {{% product-name %}} database to write
|
||||||
|
to
|
||||||
|
|
||||||
3. Defines a list of line protocol strings where each string represents a data record.
|
3. Defines a list of line protocol strings where each string represents a
|
||||||
4. Calls the `client.write()` method with the line protocol record list and write options.
|
data record.
|
||||||
|
4. Calls the `client.write()` method with the line protocol record list and
|
||||||
|
write options.
|
||||||
|
|
||||||
**Because the timestamps in the sample line protocol are in second
|
**Because the timestamps in the sample line protocol are in second
|
||||||
precision, the example passes the `write_precision='s'` option
|
precision, the example passes the `write_precision='s'` option to set the
|
||||||
to set the [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.**
|
[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision)
|
||||||
|
to seconds.**
|
||||||
|
|
||||||
6. To execute the module and write line protocol to your {{% product-name %}}
|
7. To execute the module and write line protocol to your {{% product-name %}}
|
||||||
database, enter the following command in your terminal:
|
database, enter the following command in your terminal:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
@ -667,15 +743,19 @@ dependencies to your current project.
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!----------------------------- END PYTHON CONTENT ---------------------------->
|
<!----------------------------- END PYTHON CONTENT ---------------------------->
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!----------------------------- BEGIN GO CONTENT ------------------------------>
|
<!----------------------------- BEGIN GO CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
To write data to {{% product-name %}} using Go, use the
|
To write data to {{% product-name %}} using Go, use the InfluxDB v3
|
||||||
InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go).
|
[influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go).
|
||||||
|
|
||||||
1. Inside of your project directory, create a new module directory and navigate into it.
|
1. Inside of your project directory, create a new module directory and navigate
|
||||||
|
into it.
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Using bash here is required when running with pytest.
|
Using bash here is required when running with pytest.
|
||||||
|
@ -694,7 +774,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
go mod init influxdb_go_client
|
go mod init influxdb_go_client
|
||||||
```
|
```
|
||||||
|
|
||||||
3. In your terminal or editor, create a new file for your code--for example: `write.go`.
|
3. In your terminal or editor, create a new file for your code--for example:
|
||||||
|
`write.go`.
|
||||||
|
|
||||||
<!--pytest-codeblocks:cont-->
|
<!--pytest-codeblocks:cont-->
|
||||||
|
|
||||||
|
@ -794,31 +875,38 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
The sample does the following:
|
The sample does the following:
|
||||||
|
|
||||||
1. Imports required packages.
|
1. Imports required packages.
|
||||||
|
|
||||||
2. Defines a `WriteLineProtocol()` function that does the following:
|
2. Defines a `WriteLineProtocol()` function that does the following:
|
||||||
|
|
||||||
1. To instantiate the client, calls the `influxdb3.New(influxdb3.ClientConfig)` function and passes the following:
|
1. To instantiate the client, calls the
|
||||||
|
`influxdb3.New(influxdb3.ClientConfig)` function and passes the
|
||||||
|
following:
|
||||||
|
|
||||||
- **`Host`**: the {{% product-name omit=" Clustered" %}} cluster URL
|
- **`Host`**: the {{% product-name omit=" Clustered" %}} cluster URL
|
||||||
- **`Database`**: The name of your {{% product-name %}} database
|
- **`Database`**: The name of your {{% product-name %}} database
|
||||||
- **`Token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
- **`Token`**: a
|
||||||
with _write_ access to the specified database.
|
[database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
_Store this in a secret store or environment variable to avoid exposing the raw token string._
|
with _write_ access to the specified database. _Store this in a
|
||||||
- **`WriteOptions`**: `influxdb3.WriteOptions` options for writing to InfluxDB.
|
secret store or environment variable to avoid exposing the raw
|
||||||
|
token string._
|
||||||
|
- **`WriteOptions`**: `influxdb3.WriteOptions` options for writing
|
||||||
|
to InfluxDB.
|
||||||
|
|
||||||
**Because the timestamps in the sample line protocol are in second
|
**Because the timestamps in the sample line protocol are in second
|
||||||
precision, the example passes the `Precision: lineprotocol.Second` option
|
precision, the example passes the `Precision: lineprotocol.Second`
|
||||||
to set the [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.**
|
option to set the
|
||||||
|
[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision)
|
||||||
2. Defines a deferred function that closes the client when the function returns.
|
to seconds.**
|
||||||
|
|
||||||
|
2. Defines a deferred function that closes the client when the function
|
||||||
|
returns.
|
||||||
3. Defines an array of line protocol strings where each string
|
3. Defines an array of line protocol strings where each string
|
||||||
represents a data record.
|
represents a data record.
|
||||||
|
4. Iterates through the array of line protocol and calls the write
|
||||||
|
client's `Write()` method to write each line of line protocol
|
||||||
|
separately to InfluxDB.
|
||||||
|
|
||||||
4. Iterates through the array of line protocol and calls the
|
5. In your editor, create a `main.go` file and enter the following sample code
|
||||||
write client's `Write()` method
|
that calls the `WriteLineProtocol()` function:
|
||||||
to write each line of line protocol separately to InfluxDB.
|
|
||||||
|
|
||||||
5. In your editor, create a `main.go` file and enter the following sample code that calls the `WriteLineProtocol()` function:
|
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
@ -829,7 +917,9 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
6. In your terminal, enter the following command to install the packages listed in `imports`, build the `influxdb_go_client` module, and execute the `main()` function:
|
6. In your terminal, enter the following command to install the packages listed
|
||||||
|
in `imports`, build the `influxdb_go_client` module, and execute the
|
||||||
|
`main()` function:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
|
@ -840,21 +930,28 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
The program writes the line protocol to your {{% product-name %}} database.
|
The program writes the line protocol to your {{% product-name %}} database.
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!------------------------------- END GO CONTENT ------------------------------>
|
<!------------------------------- END GO CONTENT ------------------------------>
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!---------------------------- BEGIN NODE.JS CONTENT --------------------------->
|
<!---------------------------- BEGIN NODE.JS CONTENT --------------------------->
|
||||||
|
|
||||||
1. If you haven't already, follow the instructions for [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) for your system.
|
1. If you haven't already, follow the instructions for
|
||||||
2. In your terminal, enter the following command to create a `influxdb_js_client` directory for your project:
|
[Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
|
||||||
|
for your system.
|
||||||
|
2. In your terminal, enter the following command to create a
|
||||||
|
`influxdb_js_client` directory for your project:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir influxdb_js_client && cd influxdb_js_client
|
mkdir influxdb_js_client && cd influxdb_js_client
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Inside of `influxdb_js_client`, enter the following command to initialize a package.
|
3. Inside of `influxdb_js_client`, enter the following command to initialize a
|
||||||
This example configures the package to use [ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders).
|
package. This example configures the package to use
|
||||||
|
[ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders).
|
||||||
|
|
||||||
<!--pytest-codeblocks:cont-->
|
<!--pytest-codeblocks:cont-->
|
||||||
|
|
||||||
|
@ -862,7 +959,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
npm init -y; npm pkg set type="module"
|
npm init -y; npm pkg set type="module"
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Install the `@influxdata/influxdb3-client` JavaScript client library as a dependency to your project.
|
4. Install the `@influxdata/influxdb3-client` JavaScript client library as a
|
||||||
|
dependency to your project.
|
||||||
|
|
||||||
<!--pytest-codeblocks:cont-->
|
<!--pytest-codeblocks:cont-->
|
||||||
|
|
||||||
|
@ -882,13 +980,13 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// write.js
|
// write.js
|
||||||
import { InfluxDBClient } from "@influxdata/influxdb3-client";
|
import { InfluxDBClient } from '@influxdata/influxdb3-client';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set InfluxDB credentials.
|
* Set InfluxDB credentials.
|
||||||
*/
|
*/
|
||||||
const host = "https://cluster-id.influxdb.io";
|
const host = 'https://cluster-id.influxdb.io';
|
||||||
const database = "get-started";
|
const database = 'get-started';
|
||||||
/**
|
/**
|
||||||
* INFLUX_TOKEN is an environment variable you assigned to your
|
* INFLUX_TOKEN is an environment variable you assigned to your
|
||||||
* WRITE token value.
|
* WRITE token value.
|
||||||
|
@ -941,16 +1039,17 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
* for all the records.
|
* for all the records.
|
||||||
*/
|
*/
|
||||||
const writePromises = records.map((record) => {
|
const writePromises = records.map((record) => {
|
||||||
return client.write(record, database, "", { precision: "s" })
|
return client.write(record, database, '', { precision: 's' }).then(
|
||||||
.then(() => `Data has been written successfully: ${record}`,
|
() => `Data has been written successfully: ${record}`,
|
||||||
() => `Failed writing data: ${record}`);
|
() => `Failed writing data: ${record}`
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wait for all the write promises to settle, and then output the results.
|
* Wait for all the write promises to settle, and then output the results.
|
||||||
*/
|
*/
|
||||||
const writeResults = await Promise.allSettled(writePromises);
|
const writeResults = await Promise.allSettled(writePromises);
|
||||||
writeResults.forEach(write => console.log(write.value));
|
writeResults.forEach((write) => console.log(write.value));
|
||||||
|
|
||||||
/** Close the client to release resources. */
|
/** Close the client to release resources. */
|
||||||
await client.close();
|
await client.close();
|
||||||
|
@ -960,35 +1059,48 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
The sample code does the following:
|
The sample code does the following:
|
||||||
|
|
||||||
1. Imports the `InfluxDBClient` class.
|
1. Imports the `InfluxDBClient` class.
|
||||||
2. Calls the `new InfluxDBClient()` constructor and passes a `ClientOptions` object to instantiate a client configured
|
2. Calls the `new InfluxDBClient()` constructor and passes a
|
||||||
with InfluxDB credentials.
|
`ClientOptions` object to instantiate a client configured with InfluxDB
|
||||||
|
credentials.
|
||||||
|
|
||||||
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
||||||
- **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
- **`token`**: a
|
||||||
with _write_ access to the specified database.
|
[database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
_Store this in a secret store or environment variable to avoid exposing the raw token string._
|
with _write_ access to the specified database. _Store this in a secret
|
||||||
|
store or environment variable to avoid exposing the raw token string._
|
||||||
|
|
||||||
3. Defines a list of line protocol strings where each string represents a data record.
|
3. Defines a list of line protocol strings where each string represents a
|
||||||
4. Calls the client's `write()` method for each record, defines the success or failure message to return, and collects the pending promises into the `writePromises` array.
|
data record.
|
||||||
Each call to `write()` passes the following arguments:
|
4. Calls the client's `write()` method for each record, defines the success
|
||||||
|
or failure message to return, and collects the pending promises into the
|
||||||
|
`writePromises` array. Each call to `write()` passes the following
|
||||||
|
arguments:
|
||||||
|
|
||||||
- **`record`**: the line protocol record
|
- **`record`**: the line protocol record
|
||||||
- **`database`**: the name of the {{% product-name %}} database to write to
|
- **`database`**: the name of the {{% product-name %}} database to write
|
||||||
- **`{precision}`**: a `WriteOptions` object that sets the `precision` value.
|
to
|
||||||
|
- **`{precision}`**: a `WriteOptions` object that sets the `precision`
|
||||||
|
value.
|
||||||
|
|
||||||
**Because the timestamps in the sample line protocol are in second
|
**Because the timestamps in the sample line protocol are in second
|
||||||
precision, the example passes `s` as the `precision` value to set the write
|
precision, the example passes `s` as the `precision` value to set the
|
||||||
[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.**
|
write
|
||||||
|
[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision)
|
||||||
|
to seconds.**
|
||||||
|
|
||||||
|
5. Calls `Promise.allSettled()` with the promises array to pause execution
|
||||||
|
until the promises have completed, and then assigns the array containing
|
||||||
|
success and failure messages to a `writeResults` constant.
|
||||||
|
6. Iterates over and prints the messages in `writeResults`.
|
||||||
|
7. Closes the client to release resources.
|
||||||
|
|
||||||
5. Calls `Promise.allSettled()` with the promises array to pause execution until the promises have completed, and then assigns the array containing success and failure messages to a `writeResults` constant.
|
|
||||||
7. Iterates over and prints the messages in `writeResults`.
|
|
||||||
8. Closes the client to release resources.
|
|
||||||
7. In your terminal or editor, create an `index.js` file.
|
7. In your terminal or editor, create an `index.js` file.
|
||||||
8. Inside of `index.js`, enter the following sample code to import and call `writeLineProtocol()`:
|
8. Inside of `index.js`, enter the following sample code to import and call
|
||||||
|
`writeLineProtocol()`:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
// index.js
|
// index.js
|
||||||
import { writeLineProtocol } from "./write.js";
|
import { writeLineProtocol } from './write.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the client functions.
|
* Execute the client functions.
|
||||||
|
@ -1010,13 +1122,21 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
```
|
```
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
|
|
||||||
<!---------------------------- END NODE.JS CONTENT --------------------------->
|
<!---------------------------- END NODE.JS CONTENT --------------------------->
|
||||||
|
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
|
||||||
<!---------------------------- BEGIN C# CONTENT --------------------------->
|
<!---------------------------- BEGIN C# CONTENT --------------------------->
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
{{% influxdb/custom-timestamps %}}
|
||||||
1. If you haven't already, follow the [Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download) to install .NET and the `dotnet` CLI.
|
|
||||||
2. In your terminal, create an executable C# project using the .NET **console** template.
|
1. If you haven't already, follow the
|
||||||
|
[Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download)
|
||||||
|
to install .NET and the `dotnet` CLI.
|
||||||
|
2. In your terminal, create an executable C# project using the .NET **console**
|
||||||
|
template.
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
|
@ -1032,7 +1152,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
cd influxdb_csharp_client
|
cd influxdb_csharp_client
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run the following command to install the latest version of the InfluxDB v3 C# client library.
|
4. Run the following command to install the latest version of the InfluxDB v3
|
||||||
|
C# client library.
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
|
@ -1040,7 +1161,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
dotnet add package InfluxDB3.Client
|
dotnet add package InfluxDB3.Client
|
||||||
```
|
```
|
||||||
|
|
||||||
5. In your editor, create a `Write.cs` file and enter the following sample code:
|
5. In your editor, create a `Write.cs` file and enter the following sample
|
||||||
|
code:
|
||||||
|
|
||||||
```c#
|
```c#
|
||||||
// Write.cs
|
// Write.cs
|
||||||
|
@ -1125,25 +1247,34 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
|
|
||||||
The sample does the following:
|
The sample does the following:
|
||||||
|
|
||||||
1. Calls the `new InfluxDBClient()` constructor to instantiate a client configured
|
1. Calls the `new InfluxDBClient()` constructor to instantiate a client
|
||||||
with InfluxDB credentials.
|
configured with InfluxDB credentials.
|
||||||
|
|
||||||
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
||||||
- **`database`**: the name of the {{% product-name %}} database to write to
|
- **`database`**: the name of the {{% product-name %}} database to write
|
||||||
- **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
to
|
||||||
with _write_ access to the specified database.
|
- **`token`**: a
|
||||||
_Store this in a secret store or environment variable to avoid exposing the raw token string._
|
[database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
|
with _write_ access to the specified database. _Store this in a secret
|
||||||
|
store or environment variable to avoid exposing the raw token string._
|
||||||
|
|
||||||
_Instantiating the client with the `using` statement ensures that the client is disposed of when it's no longer needed._
|
_Instantiating the client with the `using` statement ensures that the
|
||||||
|
client is disposed of when it's no longer needed._
|
||||||
|
|
||||||
2. Defines an array of line protocol strings where each string represents a data record.
|
2. Defines an array of line protocol strings where each string represents a
|
||||||
3. Calls the client's `WriteRecordAsync()` method to write each line protocol record to InfluxDB.
|
data record.
|
||||||
|
3. Calls the client's `WriteRecordAsync()` method to write each line
|
||||||
|
protocol record to InfluxDB.
|
||||||
|
|
||||||
**Because the timestamps in the sample line protocol are in second
|
**Because the timestamps in the sample line protocol are in second
|
||||||
precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs)
|
precision, the example passes the
|
||||||
to the `precision:` option to set the[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.**
|
[`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs)
|
||||||
|
to the `precision:` option to set
|
||||||
|
the[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision)
|
||||||
|
to seconds.**
|
||||||
|
|
||||||
6. In your editor, open the `Program.cs` file and replace its contents with the following:
|
6. In your editor, open the `Program.cs` file and replace its contents with the
|
||||||
|
following:
|
||||||
|
|
||||||
```c#
|
```c#
|
||||||
// Program.cs
|
// Program.cs
|
||||||
|
@ -1162,18 +1293,22 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
The `Program` class shares the same `InfluxDBv3` namespace as the `Write` class you defined in the preceding step
|
The `Program` class shares the same `InfluxDBv3` namespace as the `Write`
|
||||||
and defines a `Main()` function that calls `Write.WriteLineProtocol()`.
|
class you defined in the preceding step and defines a `Main()` function that
|
||||||
The `dotnet` CLI recognizes `Program.Main()` as the entry point for your program.
|
calls `Write.WriteLineProtocol()`. The `dotnet` CLI recognizes
|
||||||
|
`Program.Main()` as the entry point for your program.
|
||||||
|
|
||||||
7. To build and execute the program and write the line protocol to your {{% product-name %}} database, enter the following command in your terminal:
|
7. To build and execute the program and write the line protocol to your
|
||||||
|
{{% product-name %}} database, enter the following command in your terminal:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
dotnet run
|
dotnet run
|
||||||
```
|
```
|
||||||
|
|
||||||
<!---------------------------- END C# CONTENT --------------------------->
|
<!---------------------------- END C# CONTENT --------------------------->
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{% tab-content %}}
|
{{% tab-content %}}
|
||||||
|
@ -1182,10 +1317,12 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu
|
||||||
|
|
||||||
_The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
_The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
|
|
||||||
1. If you haven't already, follow the instructions to download and install the [Java JDK](https://www.oracle.com/java/technologies/downloads/) and [Maven](https://maven.apache.org/download.cgi) for your system.
|
1. If you haven't already, follow the instructions to download and install the
|
||||||
|
[Java JDK](https://www.oracle.com/java/technologies/downloads/) and
|
||||||
|
[Maven](https://maven.apache.org/download.cgi) for your system.
|
||||||
2. In your terminal or editor, use Maven to generate a project--for example:
|
2. In your terminal or editor, use Maven to generate a project--for example:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate \
|
mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate \
|
||||||
-DarchetypeArtifactId="maven-archetype-quickstart" \
|
-DarchetypeArtifactId="maven-archetype-quickstart" \
|
||||||
-DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4" \
|
-DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4" \
|
||||||
|
@ -1194,9 +1331,11 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
```
|
```
|
||||||
|
|
||||||
Maven creates the `<artifactId>` directory (`./influxdb_java_client`) that
|
Maven creates the `<artifactId>` directory (`./influxdb_java_client`) that
|
||||||
contains a `pom.xml` and scaffolding for your `com.influxdbv3.influxdb_java_client` Java application.
|
contains a `pom.xml` and scaffolding for your
|
||||||
|
`com.influxdbv3.influxdb_java_client` Java application.
|
||||||
|
|
||||||
3. In your terminal or editor, change into the `./influxdb_java_client` directory--for example:
|
3. In your terminal or editor, change into the `./influxdb_java_client`
|
||||||
|
directory--for example:
|
||||||
|
|
||||||
<!--pytest-codeblocks:cont-->
|
<!--pytest-codeblocks:cont-->
|
||||||
|
|
||||||
|
@ -1204,7 +1343,8 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
cd ./influxdb_java_client
|
cd ./influxdb_java_client
|
||||||
```
|
```
|
||||||
|
|
||||||
4. In your editor, open the `pom.xml` Maven configuration file and add the `com.influxdb.influxdb3-java` client library into `dependencies`.
|
4. In your editor, open the `pom.xml` Maven configuration file and add the
|
||||||
|
`com.influxdb.influxdb3-java` client library into `dependencies`.
|
||||||
|
|
||||||
```pom
|
```pom
|
||||||
...
|
...
|
||||||
|
@ -1218,7 +1358,9 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
...
|
...
|
||||||
</dependencies>
|
</dependencies>
|
||||||
```
|
```
|
||||||
5. To validate your `pom.xml`, run Maven's `validate` command--for example, enter the following in your terminal:
|
|
||||||
|
5. To check your `pom.xml` for problems, run Maven's `validate` command--for example,
|
||||||
|
enter the following in your terminal:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
|
@ -1226,7 +1368,9 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
mvn validate
|
mvn validate
|
||||||
```
|
```
|
||||||
|
|
||||||
6. In your editor, navigate to the `./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a `Write.java` file.
|
6. In your editor, navigate to the
|
||||||
|
`./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a
|
||||||
|
`Write.java` file.
|
||||||
7. In `Write.java`, enter the following sample code:
|
7. In `Write.java`, enter the following sample code:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
@ -1328,19 +1472,27 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
with InfluxDB credentials.
|
with InfluxDB credentials.
|
||||||
|
|
||||||
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
- **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL
|
||||||
- **`database`**: the name of the {{% product-name %}} database to write to
|
- **`database`**: the name of the {{% product-name %}} database to write
|
||||||
- **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
to
|
||||||
with _write_ access to the specified database.
|
- **`token`**: a
|
||||||
_Store this in a secret store or environment variable to avoid exposing the raw token string._
|
[database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
|
with _write_ access to the specified database. _Store this in a secret
|
||||||
|
store or environment variable to avoid exposing the raw token string._
|
||||||
|
|
||||||
2. Defines a list of line protocol strings where each string represents a data record.
|
3. Defines a list of line protocol strings where each string represents a
|
||||||
3. Calls the client's `writeRecord()` method to write each record separately to InfluxDB.
|
data record.
|
||||||
|
4. Calls the client's `writeRecord()` method to write each record
|
||||||
|
separately to InfluxDB.
|
||||||
|
|
||||||
**Because the timestamps in the sample line protocol are in second
|
**Because the timestamps in the sample line protocol are in second
|
||||||
precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java)
|
precision, the example passes the
|
||||||
as the `precision` argument to set the write [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.**
|
[`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java)
|
||||||
|
as the `precision` argument to set the write
|
||||||
|
[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision)
|
||||||
|
to seconds.**
|
||||||
|
|
||||||
8. In your editor, open the `App.java` file (created by Maven) and replace its contents with the following sample code:
|
8. In your editor, open the `App.java` file (created by Maven) and replace its
|
||||||
|
contents with the following sample code:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
// App.java
|
// App.java
|
||||||
|
@ -1364,9 +1516,12 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- The `App` class and `Write` class are part of the same `com.influxdbv3` package (your project **groupId**).
|
- The `App` class and `Write` class are part of the same `com.influxdbv3`
|
||||||
|
package (your project **groupId**).
|
||||||
- `App` defines a `main()` function that calls `Write.writeLineProtocol()`.
|
- `App` defines a `main()` function that calls `Write.writeLineProtocol()`.
|
||||||
9. In your terminal or editor, use Maven to to install dependencies and compile the project code--for example:
|
|
||||||
|
9. In your terminal or editor, use Maven to install dependencies and compile
|
||||||
|
the project code--for example:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
|
@ -1374,19 +1529,23 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._
|
||||||
mvn compile
|
mvn compile
|
||||||
```
|
```
|
||||||
|
|
||||||
10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for example, using Maven:
|
10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for
|
||||||
|
example, using Maven:
|
||||||
|
|
||||||
<!--pytest.mark.skip-->
|
<!--pytest.mark.skip-->
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
mvn exec:java -Dexec.mainClass="com.influxdbv3.App"
|
mvn exec:java -Dexec.mainClass="com.influxdbv3.App"
|
||||||
```
|
```
|
||||||
|
|
||||||
<!---------------------------- END JAVA CONTENT --------------------------->
|
<!---------------------------- END JAVA CONTENT --------------------------->
|
||||||
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
{{% /influxdb/custom-timestamps %}}
|
||||||
{{% /tab-content %}}
|
{{% /tab-content %}}
|
||||||
{{< /tabs-wrapper >}}
|
{{< /tabs-wrapper >}}
|
||||||
|
|
||||||
If successful, the output is the success message; otherwise, error details and the failure message.
|
If successful, the output is the success message; otherwise, error details and
|
||||||
|
the failure message.
|
||||||
|
|
||||||
{{< expand-wrapper >}}
|
{{< expand-wrapper >}}
|
||||||
{{% expand "View the written data" %}}
|
{{% expand "View the written data" %}}
|
||||||
|
@ -1425,7 +1584,7 @@ If successful, the output is the success message; otherwise, error details and t
|
||||||
{{% /expand %}}
|
{{% /expand %}}
|
||||||
{{< /expand-wrapper >}}
|
{{< /expand-wrapper >}}
|
||||||
|
|
||||||
**Congratulations!** You have written data to InfluxDB.
|
**Congratulations!** You've written data to InfluxDB.
|
||||||
With data now stored in InfluxDB, let's query it.
|
Next, learn how to query your data.
|
||||||
|
|
||||||
{{< page-nav prev="/influxdb/clustered/get-started/setup/" next="/influxdb/clustered/get-started/query/" keepTab=true >}}
|
{{< page-nav prev="/influxdb/clustered/get-started/setup/" next="/influxdb/clustered/get-started/query/" keepTab=true >}}
|
||||||
|
|
|
@ -1,375 +0,0 @@
|
||||||
---
|
|
||||||
title: Use InfluxDB client libraries to write line protocol data
|
|
||||||
description: >
|
|
||||||
Use InfluxDB API clients to write line protocol data to InfluxDB Clustered.
|
|
||||||
menu:
|
|
||||||
influxdb_clustered:
|
|
||||||
name: Use client libraries
|
|
||||||
parent: Write line protocol
|
|
||||||
identifier: write-client-libs
|
|
||||||
weight: 103
|
|
||||||
related:
|
|
||||||
- /influxdb/clustered/reference/syntax/line-protocol/
|
|
||||||
- /influxdb/clustered/get-started/write/
|
|
||||||
---
|
|
||||||
|
|
||||||
Use InfluxDB client libraries to build line protocol, and then write it to an
|
|
||||||
InfluxDB database.
|
|
||||||
|
|
||||||
- [Construct line protocol](#construct-line-protocol)
|
|
||||||
- [Set up your project](#set-up-your-project)
|
|
||||||
- [Construct points and write line protocol](#construct-points-and-write-line-protocol)
|
|
||||||
- [Run the example](#run-the-example)
|
|
||||||
- [Home sensor data line protocol](#home-sensor-data-line-protocol)
|
|
||||||
|
|
||||||
## Construct line protocol
|
|
||||||
|
|
||||||
With a [basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/),
|
|
||||||
you can now construct line protocol and write data to InfluxDB.
|
|
||||||
Consider a use case where you collect data from sensors in your home.
|
|
||||||
Each sensor collects temperature, humidity, and carbon monoxide readings.
|
|
||||||
To collect this data, use the following schema:
|
|
||||||
|
|
||||||
- **measurement**: `home`
|
|
||||||
- **tags**
|
|
||||||
- `room`: Living Room or Kitchen
|
|
||||||
- **fields**
|
|
||||||
- `temp`: temperature in °C (float)
|
|
||||||
- `hum`: percent humidity (float)
|
|
||||||
- `co`: carbon monoxide in parts per million (integer)
|
|
||||||
- **timestamp**: Unix timestamp in _second_ precision
|
|
||||||
|
|
||||||
The following example shows how to construct and write points that follow this schema.
|
|
||||||
|
|
||||||
## Set up your project
|
|
||||||
|
|
||||||
The examples in this guide assume you followed [Set up InfluxDB](/influxdb/clustered/get-started/setup/)
|
|
||||||
and [Write data set up](/influxdb/clustered/get-started/write/#set-up-your-project-and-credentials)
|
|
||||||
instructions in [Get started](/influxdb/clustered/get-started/).
|
|
||||||
|
|
||||||
After setting up InfluxDB and your project, you should have the following:
|
|
||||||
|
|
||||||
- {{< product-name >}} credentials:
|
|
||||||
|
|
||||||
- [Database](/influxdb/clustered/admin/databases/)
|
|
||||||
- [Database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
|
||||||
- Cluster hostname
|
|
||||||
|
|
||||||
- A directory for your project.
|
|
||||||
|
|
||||||
- Credentials stored as environment variables or in a project configuration file--for example, a `.env` ("dotenv") file.
|
|
||||||
|
|
||||||
- Client libraries installed for writing data to InfluxDB.
|
|
||||||
|
|
||||||
The following example shows how to construct `Point` objects that follow the [example `home` schema](#example-home-schema), and then write the points as line protocol to an
|
|
||||||
{{% product-name %}} database.
|
|
||||||
|
|
||||||
{{< tabs-wrapper >}}
|
|
||||||
{{% tabs %}}
|
|
||||||
[Go](#)
|
|
||||||
[Node.js](#)
|
|
||||||
[Python](#)
|
|
||||||
{{% /tabs %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN GO PROJECT SETUP -->
|
|
||||||
|
|
||||||
1. Install [Go 1.13 or later](https://golang.org/doc/install).
|
|
||||||
|
|
||||||
2. Inside of your project directory, install the client package to your project dependencies.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go get github.com/influxdata/influxdb-client-go/v2
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- END GO SETUP PROJECT -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN NODE.JS PROJECT SETUP -->
|
|
||||||
|
|
||||||
Inside of your project directory, install the `@influxdata/influxdb-client` InfluxDB v2 JavaScript client library.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install --save @influxdata/influxdb-client
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- END NODE.JS SETUP PROJECT -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN PYTHON SETUP PROJECT -->
|
|
||||||
|
|
||||||
1. **Optional, but recommended**: Use [`venv`](https://docs.python.org/3/library/venv.html)) or [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual environment for installing and executing code--for example:
|
|
||||||
|
|
||||||
Inside of your project directory, enter the following command using `venv` to create and activate a virtual environment for the project:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
python3 -m venv envs/env1 && source ./envs/env1/bin/activate
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Install the [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), which provides the InfluxDB `influxdb_client_3` Python client library module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
pip install influxdb3-python
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- END PYTHON SETUP PROJECT -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{< /tabs-wrapper >}}
|
|
||||||
|
|
||||||
## Construct points and write line protocol
|
|
||||||
|
|
||||||
{{< tabs-wrapper >}}
|
|
||||||
{{% tabs %}}
|
|
||||||
[Go](#)
|
|
||||||
[Node.js](#)
|
|
||||||
[Python](#)
|
|
||||||
{{% /tabs %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN GO SETUP SAMPLE -->
|
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.go`.
|
|
||||||
|
|
||||||
2. In `write-point.go`, enter the following sample code:
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
"fmt"
|
|
||||||
"github.com/influxdata/influxdb-client-go/v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Set a log level constant
|
|
||||||
const debugLevel uint = 4
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define options for the client.
|
|
||||||
* Instantiate the client with the following arguments:
|
|
||||||
* - An object containing InfluxDB URL and token credentials.
|
|
||||||
* - Write options for batch size and timestamp precision.
|
|
||||||
**/
|
|
||||||
clientOptions := influxdb2.DefaultOptions().
|
|
||||||
SetBatchSize(20).
|
|
||||||
SetLogLevel(debugLevel).
|
|
||||||
SetPrecision(time.Second)
|
|
||||||
|
|
||||||
client := influxdb2.NewClientWithOptions(os.Getenv("INFLUX_URL"),
|
|
||||||
os.Getenv("INFLUX_TOKEN"),
|
|
||||||
clientOptions)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an asynchronous, non-blocking write client.
|
|
||||||
* Provide your InfluxDB org and database as arguments
|
|
||||||
**/
|
|
||||||
writeAPI := client.WriteAPI(os.Getenv("INFLUX_ORG"), "get-started")
|
|
||||||
|
|
||||||
// Get the errors channel for the asynchronous write client.
|
|
||||||
errorsCh := writeAPI.Errors()
|
|
||||||
|
|
||||||
/** Create a point.
|
|
||||||
* Provide measurement, tags, and fields as arguments.
|
|
||||||
**/
|
|
||||||
p := influxdb2.NewPointWithMeasurement("home").
|
|
||||||
AddTag("room", "Kitchen").
|
|
||||||
AddField("temp", 72.0).
|
|
||||||
AddField("hum", 20.2).
|
|
||||||
AddField("co", 9).
|
|
||||||
SetTime(time.Now())
|
|
||||||
|
|
||||||
// Define a proc for handling errors.
|
|
||||||
go func() {
|
|
||||||
for err := range errorsCh {
|
|
||||||
fmt.Printf("write error: %s\n", err.Error())
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Write the point asynchronously
|
|
||||||
writeAPI.WritePoint(p)
|
|
||||||
|
|
||||||
// Send pending writes from the buffer to the database.
|
|
||||||
writeAPI.Flush()
|
|
||||||
|
|
||||||
// Ensure background processes finish and release resources.
|
|
||||||
client.Close()
|
|
||||||
}
|
|
||||||
```
|
|
||||||
<!-- END GO SETUP SAMPLE -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN NODE.JS SETUP SAMPLE -->
|
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.js`.
|
|
||||||
|
|
||||||
2. In `write-point.js`, enter the following sample code:
|
|
||||||
|
|
||||||
```js
|
|
||||||
'use strict'
|
|
||||||
/** @module write
|
|
||||||
* Use the JavaScript client library for Node.js. to create a point and write it to InfluxDB
|
|
||||||
**/
|
|
||||||
|
|
||||||
import {InfluxDB, Point} from '@influxdata/influxdb-client'
|
|
||||||
|
|
||||||
/** Get credentials from the environment **/
|
|
||||||
const url = process.env.INFLUX_URL
|
|
||||||
const token = process.env.INFLUX_TOKEN
|
|
||||||
const org = process.env.INFLUX_ORG
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate a client with a configuration object
|
|
||||||
* that contains your InfluxDB URL and token.
|
|
||||||
**/
|
|
||||||
const influxDB = new InfluxDB({url, token})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a write client configured to write to the database.
|
|
||||||
* Provide your InfluxDB org and database.
|
|
||||||
**/
|
|
||||||
const writeApi = influxDB.getWriteApi(org, 'get-started')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a point and add tags and fields.
|
|
||||||
* To add a field, call the field method for your data type.
|
|
||||||
**/
|
|
||||||
const point1 = new Point('home')
|
|
||||||
.tag('room', 'Kitchen')
|
|
||||||
.floatField('temp', 72.0)
|
|
||||||
.floatField('hum', 20.2)
|
|
||||||
.intField('co', 9)
|
|
||||||
console.log(` ${point1}`)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the point to the batch.
|
|
||||||
**/
|
|
||||||
writeApi.writePoint(point1)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush pending writes in the batch from the buffer and close the write client.
|
|
||||||
**/
|
|
||||||
writeApi.close().then(() => {
|
|
||||||
console.log('WRITE FINISHED')
|
|
||||||
})
|
|
||||||
```
|
|
||||||
<!-- END NODE.JS SETUP SAMPLE -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{% tab-content %}}
|
|
||||||
<!-- BEGIN PYTHON SETUP SAMPLE -->
|
|
||||||
|
|
||||||
1. Create a file for your module--for example: `write-point.py`.
|
|
||||||
|
|
||||||
2. In `write-point.py`, enter the following sample code to write data in batching mode:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import os
|
|
||||||
from influxdb_client_3 import Point, write_client_options, WritePrecision, WriteOptions, InfluxDBError
|
|
||||||
|
|
||||||
# Create an array of points with tags and fields.
|
|
||||||
points = [Point("home")
|
|
||||||
.tag("room", "Kitchen")
|
|
||||||
.field("temp", 25.3)
|
|
||||||
.field('hum', 20.2)
|
|
||||||
.field('co', 9)]
|
|
||||||
|
|
||||||
# With batching mode, define callbacks to execute after a successful or failed write request.
|
|
||||||
# Callback methods receive the configuration and data sent in the request.
|
|
||||||
def success(self, data: str):
|
|
||||||
print(f"Successfully wrote batch: data: {data}")
|
|
||||||
|
|
||||||
def error(self, data: str, exception: InfluxDBError):
|
|
||||||
print(f"Failed writing batch: config: {self}, data: {data} due: {exception}")
|
|
||||||
|
|
||||||
def retry(self, data: str, exception: InfluxDBError):
|
|
||||||
print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}")
|
|
||||||
|
|
||||||
# Configure options for batch writing.
|
|
||||||
write_options = WriteOptions(batch_size=500,
|
|
||||||
flush_interval=10_000,
|
|
||||||
jitter_interval=2_000,
|
|
||||||
retry_interval=5_000,
|
|
||||||
max_retries=5,
|
|
||||||
max_retry_delay=30_000,
|
|
||||||
exponential_base=2)
|
|
||||||
|
|
||||||
# Create an options dict that sets callbacks and WriteOptions.
|
|
||||||
wco = write_client_options(success_callback=success,
|
|
||||||
error_callback=error,
|
|
||||||
retry_callback=retry,
|
|
||||||
WriteOptions=write_options)
|
|
||||||
|
|
||||||
# Instantiate a synchronous instance of the client with your
|
|
||||||
# InfluxDB credentials and write options.
|
|
||||||
with InfluxDBClient3(host=config['INFLUX_HOST'],
|
|
||||||
token=config['INFLUX_TOKEN'],
|
|
||||||
database=config['INFLUX_DATABASE'],
|
|
||||||
write_client_options=wco) as client:
|
|
||||||
|
|
||||||
client.write(points, write_precision='s')
|
|
||||||
```
|
|
||||||
<!-- END PYTHON SETUP PROJECT -->
|
|
||||||
{{% /tab-content %}}
|
|
||||||
{{< /tabs-wrapper >}}
|
|
||||||
|
|
||||||
The sample code does the following:
|
|
||||||
|
|
||||||
1. Instantiates a client configured with the InfluxDB URL and API token.
|
|
||||||
|
|
||||||
2. Uses the client to instantiate a **write client** with credentials.
|
|
||||||
|
|
||||||
3. Constructs a `Point` object with the [measurement](/influxdb/clustered/reference/glossary/#measurement) name (`"home"`).
|
|
||||||
|
|
||||||
4. Adds a tag and fields to the point.
|
|
||||||
|
|
||||||
5. Adds the point to a batch to be written to the database.
|
|
||||||
|
|
||||||
6. Sends the batch to InfluxDB and waits for the response.
|
|
||||||
|
|
||||||
7. Executes callbacks for the response, flushes the write buffer, and releases resources.
|
|
||||||
|
|
||||||
## Run the example
|
|
||||||
|
|
||||||
To run the sample and write the data to your InfluxDB Clustered database, enter the following command in your terminal:
|
|
||||||
|
|
||||||
{{< code-tabs-wrapper >}}
|
|
||||||
{{% code-tabs %}}
|
|
||||||
[Go](#)
|
|
||||||
[Node.js](#)
|
|
||||||
[Python](#)
|
|
||||||
{{% /code-tabs %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN GO RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go run write-point.go
|
|
||||||
```
|
|
||||||
|
|
||||||
<!-- END GO RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN NODE.JS RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
node write-point.js
|
|
||||||
```
|
|
||||||
<!-- END NODE.JS RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
<!-- BEGIN PYTHON RUN EXAMPLE -->
|
|
||||||
|
|
||||||
```sh
|
|
||||||
python write-point.py
|
|
||||||
```
|
|
||||||
<!-- END PYTHON RUN EXAMPLE -->
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{< /code-tabs-wrapper >}}
|
|
||||||
|
|
||||||
The example logs the point as line protocol to stdout, and then writes the point to the database.
|
|
||||||
The line protocol is similar to the following:
|
|
||||||
|
|
||||||
### Home sensor data line protocol
|
|
||||||
|
|
||||||
```sh
|
|
||||||
home,room=Kitchen co=9i,hum=20.2,temp=72 1641024000
|
|
||||||
```
|
|
|
@ -1,165 +0,0 @@
|
||||||
---
|
|
||||||
title: Use the influxctl CLI to write line protocol data
|
|
||||||
description: >
|
|
||||||
Use the [`influxctl` CLI](/influxdb/clustered/reference/cli/influxctl/)
|
|
||||||
to write line protocol data to InfluxDB Clustered.
|
|
||||||
menu:
|
|
||||||
influxdb_clustered:
|
|
||||||
name: Use the influxctl CLI
|
|
||||||
parent: Write line protocol
|
|
||||||
identifier: write-influxctl
|
|
||||||
weight: 101
|
|
||||||
related:
|
|
||||||
- /influxdb/clustered/reference/cli/influxctl/write/
|
|
||||||
- /influxdb/clustered/reference/syntax/line-protocol/
|
|
||||||
- /influxdb/clustered/get-started/write/
|
|
||||||
---
|
|
||||||
|
|
||||||
Use the [`influxctl` CLI](/influxdb/clustered/reference/cli/influxctl/)
|
|
||||||
to write line protocol data to {{< product-name >}}.
|
|
||||||
|
|
||||||
- [Construct line protocol](#construct-line-protocol)
|
|
||||||
- [Write the line protocol to InfluxDB](#write-the-line-protocol-to-influxdb)
|
|
||||||
|
|
||||||
## Construct line protocol
|
|
||||||
|
|
||||||
With a [basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/),
|
|
||||||
you can now construct line protocol and write data to InfluxDB.
|
|
||||||
Consider a use case where you collect data from sensors in your home.
|
|
||||||
Each sensor collects temperature, humidity, and carbon monoxide readings.
|
|
||||||
To collect this data, use the following schema:
|
|
||||||
|
|
||||||
- **measurement**: `home`
|
|
||||||
- **tags**
|
|
||||||
- `room`: Living Room or Kitchen
|
|
||||||
- **fields**
|
|
||||||
- `temp`: temperature in °C (float)
|
|
||||||
- `hum`: percent humidity (float)
|
|
||||||
- `co`: carbon monoxide in parts per million (integer)
|
|
||||||
- **timestamp**: Unix timestamp in _second_ precision
|
|
||||||
|
|
||||||
The following line protocol represent the schema described above:
|
|
||||||
|
|
||||||
```
|
|
||||||
home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000
|
|
||||||
home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000
|
|
||||||
home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600
|
|
||||||
home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600
|
|
||||||
home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200
|
|
||||||
home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200
|
|
||||||
home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800
|
|
||||||
home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800
|
|
||||||
home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400
|
|
||||||
home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400
|
|
||||||
home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000
|
|
||||||
home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000
|
|
||||||
```
|
|
||||||
|
|
||||||
For this tutorial, you can either pass this line protocol directly to the
|
|
||||||
`influxctl write` command as a string, via `stdin`, or you can save it to and read
|
|
||||||
it from a file.
|
|
||||||
|
|
||||||
## Write the line protocol to InfluxDB
|
|
||||||
|
|
||||||
Use the [`influxctl write` command](/influxdb/clustered/reference/cli/influxctl/write/)
|
|
||||||
to write the [home sensor sample data](#home-sensor-data-line-protocol) to your
|
|
||||||
{{< product-name omit=" Clustered" >}} cluster.
|
|
||||||
Provide the following:
|
|
||||||
|
|
||||||
- The [database](/influxdb/clustered/admin/databases/) name using the `--database` flag
|
|
||||||
- A [database token](/influxdb/clustered/admin/tokens/#database-tokens) (with write permissions
|
|
||||||
on the target database) using the `--token` flag
|
|
||||||
- The timestamp precision as seconds (`s`) using the `--precision` flag
|
|
||||||
- [Line protocol](#construct-line-protocol).
|
|
||||||
Pass the line protocol in one of the following ways:
|
|
||||||
|
|
||||||
- a string on the command line
|
|
||||||
- a path to a file that contains the query
|
|
||||||
- a single dash (`-`) to read the query from stdin
|
|
||||||
|
|
||||||
{{< code-tabs-wrapper >}}
|
|
||||||
{{% code-tabs %}}
|
|
||||||
[string](#)
|
|
||||||
[file](#)
|
|
||||||
[stdin](#)
|
|
||||||
{{% /code-tabs %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
|
|
||||||
{{% influxdb/custom-timestamps %}}
|
|
||||||
{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}}
|
|
||||||
```sh
|
|
||||||
influxctl write \
|
|
||||||
--database DATABASE_NAME \
|
|
||||||
--token DATABASE_TOKEN \
|
|
||||||
--precision s \
|
|
||||||
'home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000
|
|
||||||
home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000
|
|
||||||
home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600
|
|
||||||
home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600
|
|
||||||
home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200
|
|
||||||
home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200
|
|
||||||
home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800
|
|
||||||
home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800
|
|
||||||
home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400
|
|
||||||
home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400
|
|
||||||
home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000
|
|
||||||
home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000'
|
|
||||||
```
|
|
||||||
{{% /code-placeholders %}}
|
|
||||||
{{% /influxdb/custom-timestamps %}}
|
|
||||||
|
|
||||||
Replace the following:
|
|
||||||
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}:
|
|
||||||
Name of the database to write to.
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}:
|
|
||||||
Database token with write permissions on the target database.
|
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
|
|
||||||
{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}}
|
|
||||||
```sh
|
|
||||||
influxctl write \
|
|
||||||
--database DATABASE_NAME \
|
|
||||||
--token DATABASE_TOKEN \
|
|
||||||
--precision s \
|
|
||||||
LINE_PROTOCOL_FILEPATH
|
|
||||||
```
|
|
||||||
{{% /code-placeholders %}}
|
|
||||||
|
|
||||||
Replace the following:
|
|
||||||
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}:
|
|
||||||
Name of the database to write to.
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}:
|
|
||||||
Database token with write permissions on the target database.
|
|
||||||
- {{% code-placeholder-key %}}`LINE_PROTOCOL_FILEPATH`{{% /code-placeholder-key %}}:
|
|
||||||
File path to the file containing the line protocol. Can be an absolute file path
|
|
||||||
or relative to the current working directory.
|
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{% code-tab-content %}}
|
|
||||||
|
|
||||||
{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}}
|
|
||||||
```sh
|
|
||||||
cat LINE_PROTOCOL_FILEPATH | influxctl write \
|
|
||||||
--database DATABASE_NAME \
|
|
||||||
--token DATABASE_TOKEN \
|
|
||||||
--precision s \
|
|
||||||
-
|
|
||||||
```
|
|
||||||
{{% /code-placeholders %}}
|
|
||||||
|
|
||||||
Replace the following:
|
|
||||||
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}:
|
|
||||||
Name of the database to write to.
|
|
||||||
- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}:
|
|
||||||
Database token with write permissions on the target database.
|
|
||||||
- {{% code-placeholder-key %}}`LINE_PROTOCOL_FILEPATH`{{% /code-placeholder-key %}}:
|
|
||||||
File path to the file containing the line protocol. Can be an absolute file path
|
|
||||||
or relative to the current working directory.
|
|
||||||
|
|
||||||
{{% /code-tab-content %}}
|
|
||||||
{{< /code-tabs-wrapper >}}
|
|
|
@ -43,7 +43,7 @@ Each line of line protocol contains the following elements:
|
||||||
|
|
||||||
{{< req type="key" >}}
|
{{< req type="key" >}}
|
||||||
|
|
||||||
- {{< req "\*" >}} **measurement**: String that identifies the [measurement](/influxdb/clustered/reference/glossary/#measurement) to store the data in.
|
- {{< req "\*" >}} **measurement**: A string that identifies the [table](/influxdb/clustered/reference/glossary/#table) to store the data in.
|
||||||
- **tag set**: Comma-delimited list of key value pairs, each representing a tag.
|
- **tag set**: Comma-delimited list of key value pairs, each representing a tag.
|
||||||
Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._
|
Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._
|
||||||
- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field.
|
- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field.
|
|
@ -0,0 +1,463 @@
|
||||||
|
---
|
||||||
|
title: Use InfluxDB client libraries to write line protocol data
|
||||||
|
description: >
|
||||||
|
Use InfluxDB API clients to write points as line protocol data to InfluxDB
|
||||||
|
Clustered.
|
||||||
|
menu:
|
||||||
|
influxdb_clustered:
|
||||||
|
name: Use client libraries
|
||||||
|
parent: Write line protocol
|
||||||
|
identifier: write-client-libs
|
||||||
|
weight: 103
|
||||||
|
related:
|
||||||
|
- /influxdb/clustered/reference/syntax/line-protocol/
|
||||||
|
- /influxdb/clustered/get-started/write/
|
||||||
|
---
|
||||||
|
|
||||||
|
Use InfluxDB client libraries to build time series points, and then write them
|
||||||
|
line protocol to an {{% product-name %}} database.
|
||||||
|
|
||||||
|
- [Construct line protocol](#construct-line-protocol)
|
||||||
|
- [Example home schema](#example-home-schema)
|
||||||
|
- [Set up your project](#set-up-your-project)
|
||||||
|
- [Construct points and write line protocol](#construct-points-and-write-line-protocol)
|
||||||
|
|
||||||
|
## Construct line protocol
|
||||||
|
|
||||||
|
With a
|
||||||
|
[basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/),
|
||||||
|
you can construct line protocol data and write it to InfluxDB.
|
||||||
|
|
||||||
|
All InfluxDB client libraries write data in line protocol format to InfluxDB.
|
||||||
|
Client library `write` methods let you provide data as raw line protocol or as
|
||||||
|
`Point` objects that the client library converts to line protocol. If your
|
||||||
|
program creates the data you write to InfluxDB, use the client library `Point`
|
||||||
|
interface to take advantage of type safety in your program.
|
||||||
|
|
||||||
|
### Example home schema
|
||||||
|
|
||||||
|
Consider a use case where you collect data from sensors in your home. Each
|
||||||
|
sensor collects temperature, humidity, and carbon monoxide readings.
|
||||||
|
|
||||||
|
To collect this data, use the following schema:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
|
- **measurement**: `home`
|
||||||
|
- **tags**
|
||||||
|
- `room`: Living Room or Kitchen
|
||||||
|
- **fields**
|
||||||
|
- `temp`: temperature in °C (float)
|
||||||
|
- `hum`: percent humidity (float)
|
||||||
|
- `co`: carbon monoxide in parts per million (integer)
|
||||||
|
- **timestamp**: Unix timestamp in _second_ precision
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
||||||
|
|
||||||
|
The following example shows how to construct and write points that follow the
|
||||||
|
`home` schema.
|
||||||
|
|
||||||
|
## Set up your project
|
||||||
|
|
||||||
|
The examples in this guide assume you followed
|
||||||
|
[Set up InfluxDB](/influxdb/clustered/get-started/setup/) and
|
||||||
|
[Write data set up](/influxdb/clustered/get-started/write/#set-up-your-project-and-credentials)
|
||||||
|
instructions in [Get started](/influxdb/clustered/get-started/).
|
||||||
|
|
||||||
|
After setting up InfluxDB and your project, you should have the following:
|
||||||
|
|
||||||
|
- {{< product-name >}} credentials:
|
||||||
|
|
||||||
|
- [Database](/influxdb/clustered/admin/databases/)
|
||||||
|
- [Database token](/influxdb/clustered/admin/tokens/#database-tokens)
|
||||||
|
- Cluster hostname
|
||||||
|
|
||||||
|
- A directory for your project.
|
||||||
|
|
||||||
|
- Credentials stored as environment variables or in a project configuration
|
||||||
|
file--for example, a `.env` ("dotenv") file.
|
||||||
|
|
||||||
|
- Client libraries installed for writing data to InfluxDB.
|
||||||
|
|
||||||
|
The following example shows how to construct `Point` objects that follow the
|
||||||
|
[example `home` schema](#example-home-schema), and then write the data as line
|
||||||
|
protocol to an {{% product-name %}} database.
|
||||||
|
|
||||||
|
The examples use InfluxDB v3 client libraries. For examples using InfluxDB v2
|
||||||
|
client libraries to write data to InfluxDB v3, see
|
||||||
|
[InfluxDB v2 clients](/influxdb/clustered/reference/client-libraries/v2/).
|
||||||
|
|
||||||
|
{{< tabs-wrapper >}} {{% tabs %}} [Go](#) [Node.js](#) [Python](#) {{% /tabs %}}
|
||||||
|
{{% tab-content %}}
|
||||||
|
|
||||||
|
The following steps set up a Go project using the
|
||||||
|
[InfluxDB v3 Go client](https://github.com/InfluxCommunity/influxdb3-go/):
|
||||||
|
|
||||||
|
<!-- BEGIN GO PROJECT SETUP -->
|
||||||
|
|
||||||
|
1. Install [Go 1.13 or later](https://golang.org/doc/install).
|
||||||
|
|
||||||
|
1. Create a directory for your Go module and change to the directory--for
|
||||||
|
example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir iot-starter-go && cd $_
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Initialize a Go module--for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go mod init iot-starter
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install [`influxdb3-go`](https://github.com/InfluxCommunity/influxdb3-go/),
|
||||||
|
which provides the InfluxDB `influxdb3` Go client library module.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/InfluxCommunity/influxdb3-go
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END GO SETUP PROJECT -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
|
<!-- BEGIN NODE.JS PROJECT SETUP -->
|
||||||
|
|
||||||
|
The following steps set up a JavaScript project using the
|
||||||
|
[InfluxDB v3 JavaScript client](https://github.com/InfluxCommunity/influxdb3-js/).
|
||||||
|
|
||||||
|
1. Install [Node.js](https://nodejs.org/en/download/).
|
||||||
|
|
||||||
|
1. Create a directory for your JavaScript project and change to the
|
||||||
|
directory--for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir -p iot-starter-js && cd $_
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Initialize a project--for example, using `npm`:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm init
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install the `@influxdata/influxdb3-client` InfluxDB v3 JavaScript client
|
||||||
|
library.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install @influxdata/influxdb3-client
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END NODE.JS SETUP PROJECT -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
|
<!-- BEGIN PYTHON SETUP PROJECT -->
|
||||||
|
|
||||||
|
The following steps set up a Python project using the
|
||||||
|
[InfluxDB v3 Python client](https://github.com/InfluxCommunity/influxdb3-python/):
|
||||||
|
|
||||||
|
1. Install [Python](https://www.python.org/downloads/)
|
||||||
|
|
||||||
|
1. Inside of your project directory, create a directory for your Python module
|
||||||
|
and change to the module directory--for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir -p iot-starter-py && cd $_
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **Optional, but recommended**: Use
|
||||||
|
[`venv`](https://docs.python.org/3/library/venv.html) or
|
||||||
|
[`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual
|
||||||
|
environment for installing and executing code--for example, enter the
|
||||||
|
following command using `venv` to create and activate a virtual environment
|
||||||
|
for the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv envs/iot-starter && source ./envs/iot-starter/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Install
|
||||||
|
[`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python),
|
||||||
|
which provides the InfluxDB `influxdb_client_3` Python client library module
|
||||||
|
and also installs the
|
||||||
|
[`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for
|
||||||
|
working with Arrow data.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pip install influxdb3-python
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END PYTHON SETUP PROJECT -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{< /tabs-wrapper >}}
|
||||||
|
|
||||||
|
## Construct points and write line protocol
|
||||||
|
|
||||||
|
Client libraries provide one or more `Point` constructor methods. Some libraries
|
||||||
|
support language-native data structures, such as Go's `struct`, for creating
|
||||||
|
points.
|
||||||
|
|
||||||
|
{{< tabs-wrapper >}} {{% tabs %}} [Go](#) [Node.js](#) [Python](#) {{% /tabs %}}
|
||||||
|
{{% tab-content %}}
|
||||||
|
|
||||||
|
<!-- BEGIN GO SETUP SAMPLE -->
|
||||||
|
|
||||||
|
1. Create a file for your module--for example: `main.go`.
|
||||||
|
|
||||||
|
1. In `main.go`, enter the following sample code:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"os"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"github.com/InfluxCommunity/influxdb3-go/influxdb3"
|
||||||
|
"github.com/influxdata/line-protocol/v2/lineprotocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Write() error {
|
||||||
|
url := os.Getenv("INFLUX_HOST")
|
||||||
|
token := os.Getenv("INFLUX_TOKEN")
|
||||||
|
database := os.Getenv("INFLUX_DATABASE")
|
||||||
|
|
||||||
|
// To instantiate a client, call New() with InfluxDB credentials.
|
||||||
|
client, err := influxdb3.New(influxdb3.ClientConfig{
|
||||||
|
Host: url,
|
||||||
|
Token: token,
|
||||||
|
Database: database,
|
||||||
|
})
|
||||||
|
|
||||||
|
/** Use a deferred function to ensure the client is closed when the
|
||||||
|
* function returns.
|
||||||
|
**/
|
||||||
|
defer func (client *influxdb3.Client) {
|
||||||
|
err = client.Close()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}(client)
|
||||||
|
|
||||||
|
/** Use the NewPoint method to construct a point.
|
||||||
|
* NewPoint(measurement, tags map, fields map, time)
|
||||||
|
**/
|
||||||
|
point := influxdb3.NewPoint("home",
|
||||||
|
map[string]string{
|
||||||
|
"room": "Living Room",
|
||||||
|
},
|
||||||
|
map[string]any{
|
||||||
|
"temp": 24.5,
|
||||||
|
"hum": 40.5,
|
||||||
|
"co": 15i},
|
||||||
|
time.Now(),
|
||||||
|
)
|
||||||
|
|
||||||
|
/** Use the NewPointWithMeasurement method to construct a point with
|
||||||
|
* method chaining.
|
||||||
|
**/
|
||||||
|
point2 := influxdb3.NewPointWithMeasurement("home").
|
||||||
|
SetTag("room", "Living Room").
|
||||||
|
SetField("temp", 23.5).
|
||||||
|
SetField("hum", 38.0).
|
||||||
|
SetField("co", 16i).
|
||||||
|
SetTimestamp(time.Now())
|
||||||
|
|
||||||
|
fmt.Println("Writing points")
|
||||||
|
points := []*influxdb3.Point{point, point2}
|
||||||
|
|
||||||
|
/** Write points to InfluxDB.
|
||||||
|
* You can specify WriteOptions, such as Gzip threshold,
|
||||||
|
* default tags, and timestamp precision. Default precision is lineprotocol.Nanosecond
|
||||||
|
**/
|
||||||
|
err = client.WritePoints(context.Background(), points,
|
||||||
|
influxdb3.WithPrecision(lineprotocol.Second))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
Write()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
1. To run the module and write the data to your {{% product-name %}} database,
|
||||||
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go run main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END GO SAMPLE -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
|
<!-- BEGIN NODE.JS SETUP SAMPLE -->
|
||||||
|
|
||||||
|
1. Create a file for your module--for example: `write-points.js`.
|
||||||
|
|
||||||
|
1. In `write-points.js`, enter the following sample code:
|
||||||
|
|
||||||
|
```js
|
||||||
|
// write-points.js
|
||||||
|
import { InfluxDBClient, Point } from '@influxdata/influxdb3-client';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set InfluxDB credentials.
|
||||||
|
*/
|
||||||
|
const host = process.env.INFLUX_HOST ?? '';
|
||||||
|
const database = process.env.INFLUX_DATABASE;
|
||||||
|
const token = process.env.INFLUX_TOKEN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write line protocol to InfluxDB using the JavaScript client library.
|
||||||
|
*/
|
||||||
|
export async function writePoints() {
|
||||||
|
/**
|
||||||
|
* Instantiate an InfluxDBClient.
|
||||||
|
* Provide the host URL and the database token.
|
||||||
|
*/
|
||||||
|
const client = new InfluxDBClient({ host, token });
|
||||||
|
|
||||||
|
/** Use the fluent interface with chained methods to construct Points. */
|
||||||
|
const point = Point.measurement('home')
|
||||||
|
.setTag('room', 'Living Room')
|
||||||
|
.setFloatField('temp', 22.2)
|
||||||
|
.setFloatField('hum', 35.5)
|
||||||
|
.setIntegerField('co', 7)
|
||||||
|
.setTimestamp(new Date().getTime() / 1000);
|
||||||
|
|
||||||
|
const point2 = Point.measurement('home')
|
||||||
|
.setTag('room', 'Kitchen')
|
||||||
|
.setFloatField('temp', 21.0)
|
||||||
|
.setFloatField('hum', 35.9)
|
||||||
|
.setIntegerField('co', 0)
|
||||||
|
.setTimestamp(new Date().getTime() / 1000);
|
||||||
|
|
||||||
|
/** Write points to InfluxDB.
|
||||||
|
* The write method accepts an array of points, the target database, and
|
||||||
|
* an optional configuration object.
|
||||||
|
* You can specify WriteOptions, such as Gzip threshold, default tags,
|
||||||
|
* and timestamp precision. Default precision is lineprotocol.Nanosecond
|
||||||
|
**/
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.write([point, point2], database, '', { precision: 's' });
|
||||||
|
console.log('Data has been written successfully!');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error writing data to InfluxDB: ${error.body}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
writePoints();
|
||||||
|
```
|
||||||
|
|
||||||
|
1. To run the module and write the data to your {{\< product-name >}} database,
|
||||||
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
node writePoints.js
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END NODE.JS SAMPLE -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{% tab-content %}}
|
||||||
|
|
||||||
|
<!-- BEGIN PYTHON SETUP SAMPLE -->
|
||||||
|
|
||||||
|
1. Create a file for your module--for example: `write-points.py`.
|
||||||
|
|
||||||
|
1. In `write-points.py`, enter the following sample code to write data in
|
||||||
|
batching mode:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os
|
||||||
|
from influxdb_client_3 import (
|
||||||
|
InfluxDBClient3, InfluxDBError, Point, WritePrecision,
|
||||||
|
WriteOptions, write_client_options)
|
||||||
|
|
||||||
|
host = os.getenv('INFLUX_HOST')
|
||||||
|
token = os.getenv('INFLUX_TOKEN')
|
||||||
|
database = os.getenv('INFLUX_DATABASE')
|
||||||
|
|
||||||
|
# Create an array of points with tags and fields.
|
||||||
|
points = [Point("home")
|
||||||
|
.tag("room", "Kitchen")
|
||||||
|
.field("temp", 25.3)
|
||||||
|
.field('hum', 20.2)
|
||||||
|
.field('co', 9)]
|
||||||
|
|
||||||
|
# With batching mode, define callbacks to execute after a successful or
|
||||||
|
# failed write request.
|
||||||
|
# Callback methods receive the configuration and data sent in the request.
|
||||||
|
def success(self, data: str):
|
||||||
|
print(f"Successfully wrote batch: data: {data}")
|
||||||
|
|
||||||
|
def error(self, data: str, exception: InfluxDBError):
|
||||||
|
print(f"Failed writing batch: config: {self}, data: {data} due: {exception}")
|
||||||
|
|
||||||
|
def retry(self, data: str, exception: InfluxDBError):
|
||||||
|
print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}")
|
||||||
|
|
||||||
|
# Configure options for batch writing.
|
||||||
|
write_options = WriteOptions(batch_size=500,
|
||||||
|
flush_interval=10_000,
|
||||||
|
jitter_interval=2_000,
|
||||||
|
retry_interval=5_000,
|
||||||
|
max_retries=5,
|
||||||
|
max_retry_delay=30_000,
|
||||||
|
exponential_base=2)
|
||||||
|
|
||||||
|
# Create an options dict that sets callbacks and WriteOptions.
|
||||||
|
wco = write_client_options(success_callback=success,
|
||||||
|
error_callback=error,
|
||||||
|
retry_callback=retry,
|
||||||
|
write_options=write_options)
|
||||||
|
|
||||||
|
# Instantiate a synchronous instance of the client with your
|
||||||
|
# InfluxDB credentials and write options, such as Gzip threshold, default tags,
|
||||||
|
# and timestamp precision. Default precision is nanosecond ('ns').
|
||||||
|
with InfluxDBClient3(host=host,
|
||||||
|
token=token,
|
||||||
|
database=database,
|
||||||
|
write_client_options=wco) as client:
|
||||||
|
|
||||||
|
client.write(points, write_precision='s')
|
||||||
|
```
|
||||||
|
|
||||||
|
1. To run the module and write the data to your {{< product-name >}} database,
|
||||||
|
enter the following command in your terminal:
|
||||||
|
|
||||||
|
<!-- pytest.mark.skip -->
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python write-points.py
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END PYTHON SETUP PROJECT -->
|
||||||
|
|
||||||
|
{{% /tab-content %}} {{< /tabs-wrapper >}}
|
||||||
|
|
||||||
|
The sample code does the following:
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = NO -->
|
||||||
|
|
||||||
|
1. Instantiates a client configured with the InfluxDB URL and API token.
|
||||||
|
1. Constructs `home`
|
||||||
|
[measurement](/influxdb/clustered/reference/glossary/#measurement)
|
||||||
|
`Point` objects.
|
||||||
|
1. Sends data as line protocol format to InfluxDB and waits for the response.
|
||||||
|
1. If the write succeeds, logs the success message to stdout; otherwise, logs
|
||||||
|
the failure message and error details.
|
||||||
|
1. Closes the client to release resources.
|
||||||
|
|
||||||
|
<!-- vale InfluxDataDocs.v3Schema = YES -->
|
19
package.json
19
package.json
|
@ -5,7 +5,7 @@
|
||||||
"description": "InfluxDB documentation",
|
"description": "InfluxDB documentation",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vvago/vale": "^3.0.7",
|
"@vvago/vale": "^3.4.2",
|
||||||
"autoprefixer": ">=10.2.5",
|
"autoprefixer": ">=10.2.5",
|
||||||
"hugo-extended": ">=0.101.0",
|
"hugo-extended": ">=0.101.0",
|
||||||
"husky": "^9.0.11",
|
"husky": "^9.0.11",
|
||||||
|
@ -20,13 +20,14 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "husky",
|
"prepare": "husky",
|
||||||
"test": "./test.sh"
|
"lint-vale": ".ci/vale/vale.sh",
|
||||||
|
"lint-staged": "lint-staged --relative"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"main": "index.js",
|
||||||
"*.{js,css,md}": "prettier --write",
|
"module": "main.js",
|
||||||
"content/influxdb/cloud-dedicated/**/*.md": "npx vale --config=content/influxdb/cloud-dedicated/.vale.ini --minAlertLevel=error --output=line",
|
"directories": {
|
||||||
"content/influxdb/cloud-serverless/**/*.md": "npx vale --config=content/influxdb/cloud-serverless/.vale.ini --minAlertLevel=error --output=line",
|
"test": "test"
|
||||||
"content/influxdb/clustered/**/*.md": "npx vale --config=content/influxdb/clustered/.vale.ini --minAlertLevel=error --output=line",
|
},
|
||||||
"content/influxdb/{cloud,v2,telegraf}/**/*.md": "npx vale --config=.vale.ini --minAlertLevel=error --output=line"
|
"keywords": [],
|
||||||
}
|
"author": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,94 +0,0 @@
|
||||||
# If you need more help, visit the Dockerfile reference guide at
|
|
||||||
# https://docs.docker.com/engine/reference/builder/
|
|
||||||
|
|
||||||
# Starting from a Go base image is easier than setting up the Go environment later.
|
|
||||||
FROM golang:latest
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
|
||||||
curl \
|
|
||||||
git \
|
|
||||||
gpg \
|
|
||||||
jq \
|
|
||||||
maven \
|
|
||||||
nodejs \
|
|
||||||
npm \
|
|
||||||
wget
|
|
||||||
|
|
||||||
# Install test runner dependencies
|
|
||||||
RUN apt-get install -y \
|
|
||||||
python3 \
|
|
||||||
python3-pip \
|
|
||||||
python3-venv
|
|
||||||
|
|
||||||
RUN ln -s /usr/bin/python3 /usr/bin/python
|
|
||||||
|
|
||||||
# Create a virtual environment for Python to avoid conflicts with the system Python and having to use the --break-system-packages flag when installing packages with pip.
|
|
||||||
RUN python -m venv /opt/venv
|
|
||||||
# Enable venv
|
|
||||||
ENV PATH="/opt/venv/bin:$PATH"
|
|
||||||
|
|
||||||
# Prevents Python from writing pyc files.
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1
|
|
||||||
|
|
||||||
# the application crashes without emitting any logs due to buffering.
|
|
||||||
ENV PYTHONUNBUFFERED=1
|
|
||||||
|
|
||||||
# RUN --mount=type=cache,target=/root/.cache/node_modules \
|
|
||||||
# --mount=type=bind,source=package.json,target=package.json \
|
|
||||||
# npm install
|
|
||||||
|
|
||||||
# Copy docs test directory to the image.
|
|
||||||
WORKDIR /usr/src/app
|
|
||||||
RUN chmod -R 755 .
|
|
||||||
|
|
||||||
ARG SOURCE_DIR
|
|
||||||
|
|
||||||
COPY data ./data
|
|
||||||
# Install parse_yaml.sh and parse YAML config files into dotenv files to be used by tests.
|
|
||||||
RUN /bin/bash -c 'curl -sO https://raw.githubusercontent.com/mrbaseman/parse_yaml/master/src/parse_yaml.sh'
|
|
||||||
RUN /bin/bash -c 'source ./parse_yaml.sh && parse_yaml ./data/products.yml > .env.products'
|
|
||||||
|
|
||||||
COPY test ./test
|
|
||||||
WORKDIR /usr/src/app/test
|
|
||||||
COPY shared/fixtures ./tmp/data
|
|
||||||
|
|
||||||
# Some Python test dependencies (pytest-dotenv and pytest-codeblocks) aren't
|
|
||||||
# available as packages in apt-cache, so use pip to download dependencies in a # separate step and use Docker's caching.
|
|
||||||
# Leverage a cache mount to /root/.cache/pip to speed up subsequent builds.
|
|
||||||
# Leverage a bind mount to requirements.txt to avoid having to copy them into
|
|
||||||
# this layer.
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
||||||
--mount=type=bind,source=test/requirements.txt,target=requirements.txt \
|
|
||||||
pip install -Ur requirements.txt
|
|
||||||
|
|
||||||
COPY test/setup/run-tests.sh /usr/local/bin/run-tests.sh
|
|
||||||
RUN chmod +x /usr/local/bin/run-tests.sh
|
|
||||||
|
|
||||||
# Install Telegraf for use in tests.
|
|
||||||
# Follow the install instructions (https://docs.influxdata.com/telegraf/v1/install/?t=curl), except for sudo (which isn't available in Docker).
|
|
||||||
# influxdata-archive_compat.key GPG fingerprint:
|
|
||||||
# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
|
|
||||||
RUN wget -q https://repos.influxdata.com/influxdata-archive_compat.key
|
|
||||||
|
|
||||||
RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
|
|
||||||
|
|
||||||
RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install telegraf
|
|
||||||
|
|
||||||
# Install influx v2 Cloud CLI for use in tests.
|
|
||||||
# Follow the install instructions(https://portal.influxdata.com/downloads/), except for sudo (which isn't available in Docker).
|
|
||||||
# influxdata-archive_compat.key GPG fingerprint:
|
|
||||||
# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
|
|
||||||
RUN wget -q https://repos.influxdata.com/influxdata-archive_compat.key
|
|
||||||
|
|
||||||
RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
|
|
||||||
|
|
||||||
RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install influxdb2-cli
|
|
||||||
|
|
||||||
ENV TEMP_DIR=./tmp
|
|
||||||
|
|
||||||
ENTRYPOINT [ "run-tests.sh" ]
|
|
||||||
CMD [""]
|
|
66
test.sh
66
test.sh
|
@ -1,66 +0,0 @@
|
||||||
#! /bin/bash
|
|
||||||
|
|
||||||
# Path: test.sh
|
|
||||||
# Description:
|
|
||||||
# This script is used to copy content files for testing and to run tests on tests on those temporary copies.
|
|
||||||
# The temporary files are shared between the host and the Docker container
|
|
||||||
# using a bind mount configured in compose.yaml.
|
|
||||||
#
|
|
||||||
# Docker compose now has an experimental file watch feature
|
|
||||||
# (https://docs.docker.com/compose/file-watch/) that is likely preferable to the
|
|
||||||
# strategy here.
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# The default behavior is to test all *.md files that have been added or modified in the current branch, effectively:
|
|
||||||
#
|
|
||||||
# `git diff --name-only --diff-filter=AM --relative master | grep -E '\.md$' | ./test.sh`
|
|
||||||
#
|
|
||||||
# To specify files to test, in your terminal command line, pass a file pattern as the only argument to the script--for example:
|
|
||||||
#
|
|
||||||
# sh test.sh ./content/**/*.md
|
|
||||||
##
|
|
||||||
|
|
||||||
paths="$1"
|
|
||||||
target=./test/tmp
|
|
||||||
testrun=./test/.test-run.txt
|
|
||||||
mkdir -p "$target"
|
|
||||||
cat /dev/null > "$testrun"
|
|
||||||
rm -rf "$target"/*
|
|
||||||
|
|
||||||
# Check if the user provided a path to copy.
|
|
||||||
if [ -z "$paths" ]; then
|
|
||||||
echo "No path provided. Running tests for *.md files that have been added or modified in the current branch."
|
|
||||||
paths=$(git diff --name-only --diff-filter=AM HEAD | \
|
|
||||||
grep -E '\.md$')
|
|
||||||
|
|
||||||
if [ -z "$paths" ]; then
|
|
||||||
echo "No files found for pattern: $paths"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
paths=$(find "$paths" -type f -name '*.md')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Log the list of files to be tested and copy them to the test directory.
|
|
||||||
echo "$paths" >> "$testrun"
|
|
||||||
echo "$paths" | rsync -arv --files-from=- . "$target"
|
|
||||||
|
|
||||||
# Build or rebuild a service if the Dockerfile or build directory have changed, and then run the tests.
|
|
||||||
docker compose up test
|
|
||||||
|
|
||||||
# Troubleshoot tests
|
|
||||||
# If you want to examine files or run commands for debugging tests,
|
|
||||||
# start the container and use `exec` to open an interactive shell--for example:
|
|
||||||
|
|
||||||
# docker compose run -it --entrypoint=/bin/bash test
|
|
||||||
|
|
||||||
# To build and run a new container and debug test failures, use `docker compose run` which runs a one-off command in a new container. Pass additional flags to be used by the container's entrypoint and the test runners it executes--for example:
|
|
||||||
|
|
||||||
# docker compose run --rm test -v
|
|
||||||
# docker compose run --rm test --entrypoint /bin/bash
|
|
||||||
|
|
||||||
# Or, pass the flags in the compose file--for example:
|
|
||||||
# services:
|
|
||||||
# test:
|
|
||||||
# build:...
|
|
||||||
# command: ["-vv"]
|
|
|
@ -8,9 +8,10 @@
|
||||||
**/__pycache__
|
**/__pycache__
|
||||||
**/.venv
|
**/.venv
|
||||||
**/.classpath
|
**/.classpath
|
||||||
|
**/.config.toml
|
||||||
**/.dockerignore
|
**/.dockerignore
|
||||||
**/.env
|
**/.env
|
||||||
**/.env.influxdbv3
|
**/.env.*
|
||||||
**/.git
|
**/.git
|
||||||
**/.gitignore
|
**/.gitignore
|
||||||
**/.project
|
**/.project
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
**/*.jfm
|
**/*.jfm
|
||||||
**/bin
|
**/bin
|
||||||
**/charts
|
**/charts
|
||||||
|
**/config.toml
|
||||||
**/docker-compose*
|
**/docker-compose*
|
||||||
**/compose*
|
**/compose*
|
||||||
**/Dockerfile*
|
**/Dockerfile*
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/target
|
/target
|
||||||
/Cargo.lock
|
/Cargo.lock
|
||||||
|
config.toml
|
||||||
content
|
content
|
||||||
node_modules
|
node_modules
|
||||||
tmp
|
tmp
|
||||||
|
.config*
|
||||||
.env*
|
.env*
|
||||||
|
**/.env.test
|
||||||
.pytest_cache
|
.pytest_cache
|
||||||
.test-run.txt
|
.test-run.txt
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script is used to run tests for the InfluxDB documentation.
|
|
||||||
# The script is designed to be run in a Docker container. It is used to substitute placeholder values.
|
|
||||||
|
|
||||||
# Function to check if an option is present in the arguments
|
|
||||||
has_option() {
|
|
||||||
local target="$1"
|
|
||||||
shift
|
|
||||||
for arg in "$@"; do
|
|
||||||
if [ "$arg" == "$target" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
verbose=0
|
|
||||||
# Check if "--option" is present in the CMD arguments
|
|
||||||
if has_option "-v" "$@"; then
|
|
||||||
verbose=1
|
|
||||||
echo "Using verbose mode..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
BASE_DIR=$(pwd)
|
|
||||||
cd $TEMP_DIR
|
|
||||||
|
|
||||||
for file in `find . -type f \( -iname '*.md' \)` ; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
echo "PRETEST: substituting values in $file"
|
|
||||||
|
|
||||||
# Replaces placeholder values with environment variable references.
|
|
||||||
|
|
||||||
# Non-language-specific replacements.
|
|
||||||
sed -i 's|https:\/\/{{< influxdb/host >}}|$INFLUX_HOST|g;
|
|
||||||
' $file
|
|
||||||
|
|
||||||
# Python-specific replacements.
|
|
||||||
# Use f-strings to identify placeholders in Python while also keeping valid syntax if
|
|
||||||
# the user replaces the value.
|
|
||||||
# Remember to import os for your example code.
|
|
||||||
sed -i 's/f"DATABASE_TOKEN"/os.getenv("INFLUX_TOKEN")/g;
|
|
||||||
s/f"API_TOKEN"/os.getenv("INFLUX_TOKEN")/g;
|
|
||||||
s/f"BUCKET_NAME"/os.getenv("INFLUX_DATABASE")/g;
|
|
||||||
s/f"DATABASE_NAME"/os.getenv("INFLUX_DATABASE")/g;
|
|
||||||
s|f"{{< influxdb/host >}}"|os.getenv("INFLUX_HOSTNAME")|g;
|
|
||||||
s|f"RETENTION_POLICY_NAME\|RETENTION_POLICY"|"autogen"|g;
|
|
||||||
' $file
|
|
||||||
|
|
||||||
# Shell-specific replacements.
|
|
||||||
## In JSON Heredoc
|
|
||||||
sed -i 's|"orgID": "ORG_ID"|"orgID": "$INFLUX_ORG"|g;
|
|
||||||
s|"name": "BUCKET_NAME"|"name": "$INFLUX_DATABASE"|g;' \
|
|
||||||
$file
|
|
||||||
|
|
||||||
sed -i 's/API_TOKEN/$INFLUX_TOKEN/g;
|
|
||||||
s/ORG_ID/$INFLUX_ORG/g;
|
|
||||||
s/DATABASE_TOKEN/$INFLUX_TOKEN/g;
|
|
||||||
s/--bucket-id BUCKET_ID/--bucket-id $INFLUX_BUCKET_ID/g;
|
|
||||||
s/BUCKET_NAME/$INFLUX_DATABASE/g;
|
|
||||||
s/DATABASE_NAME/$INFLUX_DATABASE/g;
|
|
||||||
s/--id DBRP_ID/--id $INFLUX_DBRP_ID/g;
|
|
||||||
s/get-started/$INFLUX_DATABASE/g;
|
|
||||||
s/RETENTION_POLICY_NAME\|RETENTION_POLICY/$INFLUX_RETENTION_POLICY/g;
|
|
||||||
s/CONFIG_NAME/CONFIG_$(shuf -i 0-100 -n1)/g;' \
|
|
||||||
$file
|
|
||||||
|
|
||||||
# v2-specific replacements.
|
|
||||||
sed -i 's|https:\/\/us-west-2-1.aws.cloud2.influxdata.com|$INFLUX_HOST|g;
|
|
||||||
s|{{< latest-patch >}}|${influxdb_latest_patches_v2}|g;
|
|
||||||
s|{{< latest-patch cli=true >}}|${influxdb_latest_cli_v2}|g;' \
|
|
||||||
$file
|
|
||||||
|
|
||||||
# Skip package manager commands.
|
|
||||||
sed -i 's|sudo dpkg.*$||g;
|
|
||||||
s|sudo yum.*$||g;' \
|
|
||||||
$file
|
|
||||||
|
|
||||||
# Environment-specific replacements.
|
|
||||||
sed -i 's|sudo ||g;' \
|
|
||||||
$file
|
|
||||||
fi
|
|
||||||
if [ $verbose -eq 1 ]; then
|
|
||||||
echo "FILE CONTENTS:"
|
|
||||||
cat $file
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Miscellaneous test setup.
|
|
||||||
# For macOS samples.
|
|
||||||
mkdir -p ~/Downloads && rm -rf ~/Downloads/*
|
|
||||||
# Clean up installed files from previous runs.
|
|
||||||
gpg -q --batch --yes --delete-key D8FF8E1F7DF8B07E > /dev/null 2>&1
|
|
||||||
|
|
||||||
# Activate the Python virtual environment configured in the Dockerfile.
|
|
||||||
. /opt/venv/bin/activate
|
|
||||||
|
|
||||||
# List installed Python dependencies.
|
|
||||||
pip list
|
|
||||||
|
|
||||||
# Run test commands with options provided in the CMD of the Dockerfile.
|
|
||||||
# pytest rootdir is the directory where pytest.ini is located (/test).
|
|
||||||
if [ -d ./content/influxdb/cloud-dedicated/ ]; then
|
|
||||||
echo "Running content/influxdb/cloud-dedicated tests..."
|
|
||||||
pytest --codeblocks --envfile $BASE_DIR/.env.dedicated ./content/influxdb/cloud-dedicated/ $@
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d ./content/influxdb/cloud-serverless/ ]; then
|
|
||||||
echo "Running content/influxdb/cloud-serverless tests..."
|
|
||||||
pytest --codeblocks --envfile $BASE_DIR/.env.serverless ./content/influxdb/cloud-serverless/ $@
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d ./content/telegraf/ ]; then
|
|
||||||
echo "Running content/telegraf tests..."
|
|
||||||
pytest --codeblocks --envfile $BASE_DIR/.env.telegraf ./content/telegraf/ $@
|
|
||||||
fi
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This script is used to run tests for the InfluxDB documentation.
|
||||||
|
# The script is designed to be run in a Docker container. It is used to substitute placeholder values in test files.
|
||||||
|
|
||||||
|
TEST_CONTENT="/app/content"
|
||||||
|
|
||||||
|
function substitute_placeholders {
|
||||||
|
for file in `find "$TEST_CONTENT" -type f \( -iname '*.md' \)`; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
# echo "PRETEST: substituting values in $file"
|
||||||
|
|
||||||
|
# Replaces placeholder values with environment variable references.
|
||||||
|
|
||||||
|
# Non-language-specific replacements.
|
||||||
|
sed -i 's|https:\/\/{{< influxdb/host >}}|$INFLUX_HOST|g;
|
||||||
|
' $file
|
||||||
|
|
||||||
|
# Python-specific replacements.
|
||||||
|
# Use f-strings to identify placeholders in Python while also keeping valid syntax if
|
||||||
|
# the user replaces the value.
|
||||||
|
# Remember to import os for your example code.
|
||||||
|
sed -i 's/f"DATABASE_TOKEN"/os.getenv("INFLUX_TOKEN")/g;
|
||||||
|
s/f"API_TOKEN"/os.getenv("INFLUX_TOKEN")/g;
|
||||||
|
s/f"BUCKET_NAME"/os.getenv("INFLUX_DATABASE")/g;
|
||||||
|
s/f"DATABASE_NAME"/os.getenv("INFLUX_DATABASE")/g;
|
||||||
|
s|f"{{< influxdb/host >}}"|os.getenv("INFLUX_HOSTNAME")|g;
|
||||||
|
s|f"RETENTION_POLICY_NAME\|RETENTION_POLICY"|"autogen"|g;
|
||||||
|
' $file
|
||||||
|
|
||||||
|
# Shell-specific replacements.
|
||||||
|
## In JSON Heredoc
|
||||||
|
sed -i 's|"orgID": "ORG_ID"|"orgID": "$INFLUX_ORG"|g;
|
||||||
|
s|"name": "BUCKET_NAME"|"name": "$INFLUX_DATABASE"|g;' \
|
||||||
|
$file
|
||||||
|
|
||||||
|
sed -i 's/API_TOKEN/$INFLUX_TOKEN/g;
|
||||||
|
s/ORG_ID/$INFLUX_ORG/g;
|
||||||
|
s/DATABASE_TOKEN/$INFLUX_TOKEN/g;
|
||||||
|
s/--bucket-id BUCKET_ID/--bucket-id $INFLUX_BUCKET_ID/g;
|
||||||
|
s/BUCKET_NAME/$INFLUX_DATABASE/g;
|
||||||
|
s/DATABASE_NAME/$INFLUX_DATABASE/g;
|
||||||
|
s/--id DBRP_ID/--id $INFLUX_DBRP_ID/g;
|
||||||
|
s/get-started/$INFLUX_DATABASE/g;
|
||||||
|
s/RETENTION_POLICY_NAME\|RETENTION_POLICY/$INFLUX_RETENTION_POLICY/g;
|
||||||
|
s/CONFIG_NAME/CONFIG_$(shuf -i 0-100 -n1)/g;' \
|
||||||
|
$file
|
||||||
|
|
||||||
|
# v2-specific replacements.
|
||||||
|
sed -i 's|https:\/\/us-west-2-1.aws.cloud2.influxdata.com|$INFLUX_HOST|g;
|
||||||
|
s|{{< latest-patch >}}|${influxdb_latest_patches_v2}|g;
|
||||||
|
s|{{< latest-patch cli=true >}}|${influxdb_latest_cli_v2}|g;' \
|
||||||
|
$file
|
||||||
|
|
||||||
|
# Skip package manager commands.
|
||||||
|
sed -i 's|sudo dpkg.*$||g;
|
||||||
|
s|sudo yum.*$||g;' \
|
||||||
|
$file
|
||||||
|
|
||||||
|
# Environment-specific replacements.
|
||||||
|
sed -i 's|sudo ||g;' \
|
||||||
|
$file
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
# Parse YAML config files into dotenv files to be used by tests.
|
||||||
|
parse_yaml /app/appdata/products.yml > /app/appdata/.env.products
|
||||||
|
|
||||||
|
# Miscellaneous test setup.
|
||||||
|
# For macOS samples.
|
||||||
|
mkdir -p ~/Downloads && rm -rf ~/Downloads/*
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_tests() {
|
||||||
|
TEST_FILES="$*"
|
||||||
|
|
||||||
|
# Remove files from the previous run.
|
||||||
|
rm -rf "$TEST_CONTENT"/*
|
||||||
|
# Copy the test files to the target directory while preserving the directory structure.
|
||||||
|
for FILE in $TEST_FILES; do
|
||||||
|
# Create the parent directories of the destination file
|
||||||
|
#mkdir -p "$(dirname "$TEST_TARGET/$FILE")"
|
||||||
|
# Copy the file
|
||||||
|
rsync -avz --relative --log-file=./test.log "$FILE" /app/
|
||||||
|
done
|
||||||
|
|
||||||
|
substitute_placeholders
|
||||||
|
}
|
||||||
|
|
||||||
|
# If arguments were passed and the first argument is not --files, run the command. This is useful for running "/bin/bash" for debugging the container.
|
||||||
|
# If --files is passed, prepare all remaining arguments as test files.
|
||||||
|
# Otherwise (no arguments), run the setup function and return existing files to be tested.
|
||||||
|
if [ "$1" != "--files" ]; then
|
||||||
|
echo "Executing $0 without --files argument."
|
||||||
|
"$@"
|
||||||
|
fi
|
||||||
|
if [ "$1" == "--files" ]; then
|
||||||
|
shift
|
||||||
|
prepare_tests "$@"
|
||||||
|
fi
|
||||||
|
setup
|
||||||
|
# Return new or existing files to be tested.
|
||||||
|
find "$TEST_CONTENT" -type f -name '*.md'
|
Loading…
Reference in New Issue