From 4caaa428879f08faf32a94aff8b1803df1204963 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Sat, 3 Jan 2026 13:50:38 -0600 Subject: [PATCH 01/19] fix(v2): broken links to Grafana guides for Cloud and OSS v2. (#6692) - Add expected aliases (more descriptive URLs) for the Grafana pages --- content/influxdb/cloud/tools/grafana.md | 2 ++ content/influxdb/v2/tools/grafana.md | 1 + 2 files changed, 3 insertions(+) diff --git a/content/influxdb/cloud/tools/grafana.md b/content/influxdb/cloud/tools/grafana.md index 981be27bd..f10657ec3 100644 --- a/content/influxdb/cloud/tools/grafana.md +++ b/content/influxdb/cloud/tools/grafana.md @@ -13,6 +13,8 @@ related: - /influxdb/cloud/query-data/get-started/ - /influxdb/cloud/query-data/influxql/ - /flux/v0/get-started/, Get started with Flux +aliases: + - /influxdb/cloud/visualize-data/grafana/ alt_links: v1: /influxdb/v1/tools/grafana/ enterprise_v1: /enterprise_influxdb/v1/tools/grafana/ diff --git a/content/influxdb/v2/tools/grafana.md b/content/influxdb/v2/tools/grafana.md index 6430ec799..4b3f7a8cd 100644 --- a/content/influxdb/v2/tools/grafana.md +++ b/content/influxdb/v2/tools/grafana.md @@ -10,6 +10,7 @@ weight: 120 influxdb/v2/tags: [grafana] aliases: - /influxdb/v2/visualize-data/other-tools/grafana/ + - /influxdb/v2/visualize-data/grafana/ related: - https://grafana.com/docs/, Grafana documentation - /influxdb/v2/query-data/get-started/ From f6da51829bbfa56296d7a1ffc35f105645c3099e Mon Sep 17 00:00:00 2001 From: Dustin Eaton Date: Mon, 5 Jan 2026 12:56:28 -0600 Subject: [PATCH 02/19] feat: Clustered release 20251218-1946608 --- .../reference/release-notes/clustered.md | 27 + .../20251218-1946608/app-instance-schema.json | 3255 +++++++++++++++++ .../20251218-1946608/example-customer.yml | 342 ++ 3 files changed, 3624 insertions(+) create mode 100644 static/downloads/clustered-release-artifacts/20251218-1946608/app-instance-schema.json create mode 100644 static/downloads/clustered-release-artifacts/20251218-1946608/example-customer.yml diff --git a/content/influxdb3/clustered/reference/release-notes/clustered.md b/content/influxdb3/clustered/reference/release-notes/clustered.md index 939df219f..eb670f23f 100644 --- a/content/influxdb3/clustered/reference/release-notes/clustered.md +++ b/content/influxdb3/clustered/reference/release-notes/clustered.md @@ -61,6 +61,33 @@ directory. This new directory contains artifacts associated with the specified r --- +## 20251218-1946608 {date="2025-12-18"} + +### Quickstart + +```yaml +spec: + package: + image: us-docker.pkg.dev/influxdb2-artifacts/clustered/influxdb:20251218-1946608 +``` + +#### Release artifacts +- [app-instance-schema.json](/downloads/clustered-release-artifacts/20251218-1946608/app-instance-schema.json) +- [example-customer.yml](/downloads/clustered-release-artifacts/20251218-1946608/example-customer.yml) +- [InfluxDB Clustered README EULA July 2024.txt](/downloads/clustered-release-artifacts/InfluxDB%20Clustered%20README%20EULA%20July%202024.txt) + +### Highlights + +- The garbage collector has been fixed to support customers who specify the S3 bucket in `spec.package.spec.objectStore.s3.endpoint` (e.g. "https://$BUCKET.$REGION.amazonaws.com") and an additional prefix in `spec.package.spec.objectStore.bucket`; if you previously disabled `INFLUXDB_IOX_CREATE_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` and `INFLUXDB_IOX_DELETE_USING_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` to work around the bug, you can remove those overrides now. +- Add support for both 'postgres' and 'postgresql' URI schemes in catalog DSN parsing. +- Add support to the Management API for: + - Renaming databases + - Undeleting databases + - Renaming tables + - Deleting tables + - Undeleting tables +- Dependency updates and miscellaneous security fixes. + ## 20250925-1878107 {date="2025-09-25"} ### Quickstart diff --git a/static/downloads/clustered-release-artifacts/20251218-1946608/app-instance-schema.json b/static/downloads/clustered-release-artifacts/20251218-1946608/app-instance-schema.json new file mode 100644 index 000000000..51eb13f3b --- /dev/null +++ b/static/downloads/clustered-release-artifacts/20251218-1946608/app-instance-schema.json @@ -0,0 +1,3255 @@ +{ + "additionalProperties": false, + "properties": { + "apiVersion": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "metadata": { + "type": "object" + }, + "spec": { + "additionalProperties": false, + "properties": { + "imagePullSecrets": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + }, + "package": { + "properties": { + "apiVersion": { + "type": "string" + }, + "image": { + "type": "string" + }, + "spec": { + "additionalProperties": false, + "properties": { + "admin": { + "additionalProperties": false, + "description": "OAuth configuration for restricting access to Clustered", + "properties": { + "dsn": { + "additionalProperties": false, + "description": "The dsn for the postgres compatible database", + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "identityProvider": { + "description": "The identity provider to be used e.g. \"keycloak\", \"auth0\", \"azure\"", + "type": "string" + }, + "internalSigningKey": { + "description": "Internal JWT secrets", + "properties": { + "id": { + "additionalProperties": false, + "description": "random ID that uniquely identifies this keypair. Generally a UUID.", + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "privateKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "publicKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "required": [ + "id", + "privateKey", + "publicKey" + ], + "type": "object" + }, + "jwksEndpoint": { + "description": "The JWKS endpoint given by your identity provider. This should look like \"https://{identityProviderDomain}/.well-known/jwks.json\"", + "type": "string" + }, + "users": { + "description": "The list of users to grant access to Clustered via influxctl", + "item": { + "properties": { + "email": { + "description": "The email of the user within your identity provider.", + "type": "string" + }, + "firstName": { + "description": "The first name of the user that will be used in Clustered.", + "type": "string" + }, + "id": { + "description": "The identifier of the user within your identity provider.", + "type": "string" + }, + "lastName": { + "description": "The last name of the user that will be used in Clustered.", + "type": "string" + }, + "userGroups": { + "description": "Optional list of user groups to assign to the user, rather than the default groups. The following groups are currently supported: Admin, Auditor, Member", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "firstName", + "lastName", + "email", + "id" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "catalog": { + "additionalProperties": false, + "description": "Configuration for the postgres-compatible database that is used as a catalog/metadata store", + "properties": { + "dsn": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "components": { + "additionalProperties": false, + "properties": { + "catalog": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "common": { + "additionalProperties": false, + "description": "Common configuration to all components. They will be overridden by component-specific configuration.\nAny value defined in the component-specific settings will be merged with values defined in the common settings.\n", + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "compactor": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "garbage-collector": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "granite": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "ingester": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "querier": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "router": { + "additionalProperties": false, + "properties": { + "log": { + "additionalProperties": false, + "description": "Configuring logging parameters.\n", + "properties": { + "filters": { + "description": "InfluxDB 3.0 logging verbosity can be configured in fine grained way using a list\nof \"log filters\".\n\nEach log filter is an expression in the form of:\n\ntarget=level\n\nWhere \"target\" matches the \"target\" field in the logs, while level can be one of\nerror, warn, info, debug and trace.\n\nError and warn are less verbose while debug and trace are more verbose.\n\nYou can omit target and just specify a level. In that case the level \nwill set the maximum level for all events that are not enabled by other filters.\n\nIf a filter for a given target appears again in the filter list, it will override\na previous occurrence. This allows you to override the default filters.\n\nThe full documentation for the log filter syntax can be found at:\nhttps://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html\n", + "item": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "properties": { + "affinity": { + "default": { }, + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "object" + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "items": { + "type": "object" + }, + "type": "array" + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "containers": { + "default": { }, + "patternProperties": { + ".": { + "additionalProperties": false, + "properties": { + "env": { + "default": { }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "labels": { + "default": { }, + "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels", + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "nodeSelector": { + "default": { }, + "patternProperties": { + ".": { + "type": "string" + } + }, + "type": "object" + }, + "tolerations": { + "default": [ ], + "description": "Pod tolerations to place onto this IOx component to affect scheduling decisions.\n\nFor further details, consult the Kubernetes documentation\nhttps://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration\n", + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "egress": { + "additionalProperties": false, + "description": "Configuration for how external resources are accessed from Clustered components", + "properties": { + "customCertificates": { + "additionalProperties": false, + "description": "Custom certificate or CA Bundle. Used to verify outbound connections performed by influxdb, such as OIDC servers,\npostgres databases, or object store API endpoints.\n\nEquivalent to the SSL_CERT_FILE environment variable used by OpenSSL.\n", + "examples": [ + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "featureFlags": { + "description": "An array of feature flag names. Feature flags (aka feature gates) control features that\nhave not yet been released. They can be experimental to varying degrees (alpha, beta, rc).\n", + "properties": { + "clusteredAuth": { + "description": "Use the authorization service optimized for Clustered deployments.\n\nThis authorization service communicates directly with the locally deployed\ngranite service, which allows it to become ready to validate access tokens\npromptly on pod start up. It also offers more control over the invalidation\nschedule for cached tokens, and may slightly reduce query latency.\n", + "type": "string" + }, + "enableDefaultResourceLimits": { + "description": "Enable Default Resource Limits for Containers\n\nWhen enabled, all containers will have `requests.cpu`, `requests.memory`,\n`limits.cpu`, and `limits.memory` defined. This is particularily useful\nfor namespaces that include a ResourceQuota. When enabling this feature\nflag, make sure to specify the resource limits and requests for the IOx\ncomponents as the defaults may not be properly sized for your cluster.\n", + "type": "string" + }, + "grafana": { + "description": "An experimental, minimal installation of a Grafana Deployment to use alongside Clustered.\n\nOnly this flag if you do not have your own metric visualisation setup and wish\nto experiment with Clustered. It is tested with Grafana v12.1.1.\n", + "type": "string" + }, + "localTracing": { + "description": "Experimental installation of Jaeger for tracing capabilities with InfluxDB 3.\n\nOnly enable this flag when instructed to do so by the support team.\n", + "type": "string" + }, + "noGrpcProbes": { + "description": "Remove gRPC liveness/readiness probes for debug service", + "type": "string" + }, + "noMinReadySeconds": { + "description": "Experimental flag for Kubernetes clusters that are lower than v1.25.\n\nNo longer uses minReadySeconds for workloads, this will cause downtime.\n", + "type": "string" + }, + "noPrometheus": { + "description": "Disable the install of the default bare-bones Prometheus StatefulSet installation alongside Clustered.\n\nThis feature flag is useful when you already have a monitoring setup and wish to utilise it.\n\nNOTE: In future releases, the `debug-service` will have a partial, minor, dependency on a Prometheus instance being available.\nIf you do not wish for this service to utilise your own installation of Prometheus, disabling it here may cause issues.\n", + "type": "string" + }, + "serviceMonitor": { + "description": "Deprecated. Use observability.serviceMonitor instead.\n\nCreate a ServiceMonitor resource for InfluxDB3.\n", + "type": "string" + }, + "useLicensedBinaries": { + "description": "This flag is deprecated and no longer has any effect. Licensed binaries are now always used.\n", + "type": "string" + } + }, + "type": "array" + }, + "hostingEnvironment": { + "additionalProperties": false, + "description": "Environment or cloud-specific configuration elements which are utilised by InfluxDB Clustered.", + "properties": { + "aws": { + "additionalProperties": false, + "description": "Configuration for hosting on AWS.", + "properties": { + "eksRoleArn": { + "default": "", + "description": "IAM role ARN to apply to the IOx ServiceAccount, used with EKS IRSA.", + "type": "string" + } + }, + "type": "object" + }, + "gke": { + "additionalProperties": false, + "description": "Configuration for hosting on Google Kubernetes Engine (GKE).", + "properties": { + "workloadIdentity": { + "additionalProperties": false, + "description": "Authentication via GKE workload identity. This will annotate the relevant Kubernetes ServiceAccount objects.\nSee https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity for further details.\n", + "properties": { + "serviceAccountEmail": { + "description": "Google IAM Service Account email, this should be in the format \"NAME@PROJECT_ID.iam.gserviceaccount.com\".", + "type": "string" + } + }, + "required": [ + "serviceAccountEmail" + ], + "type": "object" + } + }, + "type": "object" + }, + "openshift": { + "additionalProperties": false, + "description": "Configuration for hosting on Red Hat OpenShift.", + "properties": { }, + "type": "object" + } + }, + "type": "object" + }, + "images": { + "description": "Manipulate how images are retrieved for Clustered. This is typically useful for air-gapped environments when you need to use an internal registry.", + "properties": { + "overrides": { + "description": "Override specific images using the contained predicate fields.\n\nThis takes precedence over the registryOverride field.\n", + "item": { + "description": "Remaps an image matching naming predicates\n", + "properties": { + "name": { + "description": "Naming predicate: the part of the image name that comes after the registry name, e.g.\nIf the image name is \"oci.influxdata.com/foo/bar:1234\", the name field matches \"foo/bar\"\n", + "type": "string" + }, + "newFQIN": { + "description": "Rewrite expression: when a naming predicate matches this image, rewrite the image reference\nusing this Fully Qualified Image Name. i.e. this replaces the whole registry/imagename:tag@digest\nparts of the input image reference.\n", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "registryOverride": { + "default": "", + "description": "Place a new registry prefix infront of all Clustered component images.\n\nThis is used when you wish to maintain the original registry path for images and simply relocate them underneath\nyour own registry.\n\nExample:\nregistryOverride: 'newReg' means 'myregistry/test' becomes 'newReg/myregistry/test'\n", + "type": "string" + } + }, + "type": "object" + }, + "ingesterStorage": { + "additionalProperties": false, + "description": "Storage configuration for the Clustered ingesters.", + "properties": { + "storage": { + "description": "A higher value provides more disk space for the Write-Ahead Log (WAL) to each ingester, allowing for a greater set of leading edge data to be maintained in-memory.\nThis also reduces the frequency of WAL rotations, leading to better query performance and less burden on the compactor.\n\nNote that at 90% capacity, an ingester will stop accepting writes in order to persist its active WAL into the configured object store as parquet files.\n", + "type": "string" + }, + "storageClassName": { + "default": "", + "type": "string" + } + }, + "required": [ + "storage" + ], + "type": "object" + }, + "ingress": { + "additionalProperties": false, + "description": "Configuration for how Clustered components are accessed.", + "properties": { + "grpc": { + "additionalProperties": false, + "description": "Configuration for components which utilise gRPC", + "properties": { + "className": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "hosts": { + "description": "A number of hosts/domains to use as entrypoints within the Ingress resources.", + "type": "array" + }, + "http": { + "additionalProperties": false, + "description": "Configuration for components which utilise HTTP", + "properties": { + "className": { + "default": "", + "type": "string" + } + }, + "type": "object" + }, + "template": { + "additionalProperties": false, + "description": "Template to apply across configured Ingress-type resources.\nThis allows you to specify a range of third party annotations onto the created Ingress objects and/or\nalter the kind of Ingress you would like to use, e.g. 'Route'.\n", + "oneOf": [ + { + "properties": { + "apiVersion": { + "const": "networking.istio.io/v1beta1" + }, + "kind": { + "const": "Gateway" + }, + "selector": { + "default": { }, + "description": "This selector determines which Istio ingress gateway pods will be chosen\nto handle traffic for the created Gateway resources. A blank selector means that all\ngateway pods in the cluster will handle traffic.\n\nFor more details, see https://istio.io/latest/docs/reference/config/networking/gateway/#Gateway\n", + "type": "object" + } + }, + "required": [ + "apiVersion", + "kind" + ] + }, + { + "properties": { + "apiVersion": { + "enum": [ + "networking.k8s.io/v1", + "route.openshift.io/v1" + ], + "type": "string" + }, + "kind": { + "enum": [ + "Ingress", + "Route" + ], + "type": "string" + } + } + } + ], + "properties": { + "apiVersion": { + "default": "networking.k8s.io/v1", + "enum": [ + "networking.k8s.io/v1", + "route.openshift.io/v1", + "networking.istio.io/v1beta1" + ], + "type": "string" + }, + "kind": { + "default": "Ingress", + "enum": [ + "Ingress", + "Route", + "Gateway" + ], + "type": "string" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "annotations": { + "default": { }, + "description": "Annotations to place onto the objects which enable ingress.", + "type": "object" + } + }, + "type": "object" + }, + "selector": { + "description": "Selector to specify which gateway deployment utilises the configured ingress configuration.\n\nNote that this is only for Istio Gateway, see https://istio.io/latest/docs/reference/config/networking/gateway/#Gateway for further details\n", + "type": "object" + } + }, + "type": "object" + }, + "tlsSecretName": { + "default": "", + "description": "Kubernetes Secret name which contains TLS certificates.\n\nIf you are using cert-manager, this is the name of the Secret to create containing certificates.\nNote that cert-manager is externally managed and is not apart of a Clustered configuration.\n", + "type": "string" + } + }, + "type": "object" + }, + "monitoringStorage": { + "additionalProperties": false, + "description": "Storage configuration for the Prometheus instance shipped alongside Clustered for basic monitoring purposes.", + "properties": { + "storage": { + "description": "The amount of storage to provision for the attached volume, e.g. \"10Gi\".", + "type": "string" + }, + "storageClassName": { + "default": "", + "type": "string" + } + }, + "required": [ + "storage" + ], + "type": "object" + }, + "objectStore": { + "additionalProperties": false, + "description": "Configuration for the backing object store of IOx.", + "oneOf": [ + { + "required": [ + "bucket", + "region" + ] + }, + { + "required": [ + "s3", + "bucket" + ] + }, + { + "required": [ + "azure", + "bucket" + ] + }, + { + "required": [ + "google", + "bucket" + ] + } + ], + "properties": { + "accessKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "allowHttp": { + "default": "false", + "type": "string" + }, + "azure": { + "additionalProperties": false, + "description": "Configuration for Azure Blob Storage.", + "properties": { + "accessKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "account": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "required": [ + "accessKey", + "account" + ], + "type": "object" + }, + "bucket": { + "type": "string" + }, + "endpoint": { + "default": "", + "type": "string" + }, + "google": { + "additionalProperties": false, + "description": "Configuration for Google Cloud Storage.", + "properties": { + "serviceAccountSecret": { + "additionalProperties": false, + "description": "Authentication via Google IAM Service Account credentials file using a Kubernetes Secret name and key.\nSee https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform for further details.\n\nIf you wish to use GKE IAM annotations, refer to the hostingEnviornment section of the schema.\n", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "region": { + "default": "", + "description": "The region in which the bucket resides. This may not be required dependent on your object store provider.", + "type": "string" + }, + "s3": { + "additionalProperties": false, + "description": "Configuration for AWS S3 (compatible) object stores.", + "properties": { + "accessKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + }, + "allowHttp": { + "description": "Allow the S3 client to accept insecure HTTP, as well as HTTPS connections to object store.", + "type": "string" + }, + "endpoint": { + "default": "", + "description": "S3 bucket region, see https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_region for further details.", + "type": "string" + }, + "region": { + "description": "AWS region for the bucket, such as us-east-1.", + "type": "string" + }, + "secretKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "required": [ + "region" + ], + "type": "object" + }, + "secretKey": { + "additionalProperties": false, + "examples": [ + "value: ...", + "valueFrom: ..." + ], + "oneOf": [ + { + "required": [ + "value" + ] + }, + { + "required": [ + "valueFrom" + ] + } + ], + "properties": { + "value": { + "default": "", + "description": "Value", + "type": [ + "string", + "null" + ] + }, + "valueFrom": { + "additionalProperties": false, + "description": "Allows to source the value from configMaps or secrets", + "examples": [ + "configMapKeyRef: ...", + "secretKeyRef: ..." + ], + "oneOf": [ + { + "required": [ + "configMapKeyRef" + ] + }, + { + "required": [ + "secretKeyRef" + ] + } + ], + "properties": { + "configMapKeyRef": { + "additionalProperties": false, + "description": "Selects a key from a ConfigMap.", + "properties": { + "key": { + "description": "The key to select.", + "type": "string" + }, + "name": { + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "default": false, + "description": "Specify whether the ConfigMap or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + }, + "secretKeyRef": { + "additionalProperties": false, + "description": "SecretKeySelector selects a key of a Secret.", + "properties": { + "key": { + "description": "The key of the secret to select from. Must be a valid secret key.", + "type": "string" + }, + "name": { + "default": "", + "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "type": [ + "string", + "null" + ] + }, + "optional": { + "description": "Specify whether the Secret or it's key must be defined", + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "key", + "name" + ], + "type": [ + "object", + "null" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "observability": { + "additionalProperties": false, + "default": { }, + "description": "Configuration for gaining operational insight into Clustered components", + "properties": { + "retention": { + "default": "12h", + "description": "The retention period for prometheus", + "type": "string" + }, + "serviceMonitor": { + "additionalProperties": false, + "description": "Configure a ServiceMonitor resource to easily expose InfluxDB metrics via the Prometheus Operator.\nSee the Prometheus Operator documentation for usage:\nhttps://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md\n", + "properties": { + "fallbackScrapeProtocol": { + "default": null, + "description": "Specifies which protocol to use when scraping endpoints that return a blank or invalid Content-Type header.\n\nRequired for Prometheus v3.0.0+ only, which enforces Content-Type validation (unlike v2).\n\nFor most standard Prometheus metrics endpoints, including InfluxDB, use \"PrometheusText0.0.4\".\n", + "type": "string" + }, + "interval": { + "default": "30s", + "description": "A duration string that controls the length of time between scrape attempts, ex: '15s', or '1m'", + "type": "string" + }, + "scrapeTimeout": { + "default": null, + "description": "A duration string that controls the scrape timeout duration, ex: '10s'", + "type": "string" + } + }, + "required": [ ], + "type": "object" + } + }, + "type": "object" + }, + "resources": { + "additionalProperties": false, + "properties": { + "catalog": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "4", + "type": "string" + }, + "memory": { + "default": "16Gi", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "compactor": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "8", + "type": "string" + }, + "memory": { + "default": "32Gi", + "type": "string" + }, + "replicas": { + "default": 1, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "garbage-collector": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + }, + "replicas": { + "const": 1, + "description": "Replica configuration for the Garbage Collector.\nNOTE: This component does not support horizontal scaling at this time.\nRefer to https://docs.influxdata.com/influxdb/clustered/reference/internals/storage-engine/#garbage-collector-scaling-strategies\nfor more details.\n", + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "granite": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": "500M", + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "0.5", + "type": "string" + }, + "memory": { + "default": "500M", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "ingester": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "6", + "type": "string" + }, + "memory": { + "default": "24Gi", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "prometheus": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "500m", + "type": "string" + }, + "memory": { + "default": "512Mi", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "querier": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "8", + "type": "string" + }, + "memory": { + "default": "32Gi", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "router": { + "additionalProperties": false, + "description": "See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits", + "properties": { + "limits": { + "additionalProperties": false, + "description": "Limits describes the maximum amount of compute resources allowed.", + "properties": { + "cpu": { + "default": null, + "type": "string" + }, + "memory": { + "default": null, + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "additionalProperties": false, + "description": "Requests describes the minimum amount of compute resources required.", + "properties": { + "cpu": { + "default": "1", + "type": "string" + }, + "memory": { + "default": "2Gi", + "type": "string" + }, + "replicas": { + "default": 3, + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "catalog", + "objectStore", + "ingesterStorage", + "monitoringStorage" + ], + "type": "object" + } + }, + "required": [ + "image", + "apiVersion" + ], + "type": "object" + }, + "pause": { + "default": false, + "type": "boolean" + } + }, + "type": "object" + }, + "status": { + "additionalProperties": true, + "type": "object" + } + }, + "type": "object" +} + diff --git a/static/downloads/clustered-release-artifacts/20251218-1946608/example-customer.yml b/static/downloads/clustered-release-artifacts/20251218-1946608/example-customer.yml new file mode 100644 index 000000000..a6aff8503 --- /dev/null +++ b/static/downloads/clustered-release-artifacts/20251218-1946608/example-customer.yml @@ -0,0 +1,342 @@ +# yaml-language-server: $schema=app-instance-schema.json +apiVersion: kubecfg.dev/v1alpha1 +kind: AppInstance +metadata: + name: influxdb + namespace: influxdb +spec: + # One or more secrets that are used to pull the images from an authenticated registry. + # This will either be the secret provided to you, if using our registry, or a secret for your own registry + # if self-hosting the images. + imagePullSecrets: + - name: + package: + # The version of the clustered package that will be used. + # This determines the version of all of the individual components. + # When a new version of the product is released, this version should be updated and any + # new config options should be updated below. + image: us-docker.pkg.dev/influxdb2-artifacts/clustered/influxdb:20251218-1946608 + apiVersion: influxdata.com/v1alpha1 + spec: + # # Provides a way to pass down hosting environment specific configuration, such as an role ARN when using EKS IRSA. + # # This section contains three multually-exclusive "blocks". Uncomment the block named after the hosting environment + # # you run: "aws", "openshift" or "gke". + # hostingEnvironment: + # # # Uncomment this block if you're running in EKS. + # # aws: + # # eksRoleArn: 'arn:aws:iam::111111111111:role/your-influxdb-clustered-role' + # # + # # # Uncomment this block if you're running inside OpenShift. + # # # Note: there are currently no OpenShift-specific parameters. You have to pass an empty object + # # # as a marker that you're choosing OpenShift as hosting environment. + # # openshift: {} + # # + # # # Uncomment this block if you're running in GKE: + # # gke: + # # # Authenticate to Google Cloud services via workload identity, this + # # # annotates the 'iox' ServiceAccount with the role name you specify. + # # # NOTE: This setting just enables GKE specific authentication mechanism, + # # # You still need to enable `spec.objectStore.google` below if you want to use GCS. + # # workloadIdentity: + # # # Google Service Account name to use for the workload identity. + # # serviceAccountEmail: @.iam.gserviceaccount.com + catalog: + # A postgresql style DSN that points at a postgresql compatible database. + # eg: postgres://[user[:password]@][netloc][:port][/dbname][?param1=value1&...] + dsn: + valueFrom: + secretKeyRef: + name: + key: + + # images: + # # This can be used to override a specific image name with its FQIN + # # (Fully Qualified Image Name) for testing. eg. + # overrides: + # - name: influxdb2-artifacts/iox/iox + # newFQIN: mycompany/test-iox-build:aninformativetag + # + # # Set this variable to the prefix of your internal registry. This will be prefixed to all expected images. + # # eg. us-docker.pkg.dev/iox:latest => registry.mycompany.io/us-docker.pkg.dev/iox:latest + # registryOverride: + + objectStore: + # Bucket that the parquet files will be stored in + bucket: + + # Uncomment one of the following (s3, azure) + # to enable the configuration of your object store + s3: + # URL for S3 Compatible object store + endpoint: + + # Set to true to allow communication over HTTP (instead of HTTPS) + allowHttp: "false" + + # S3 Access Key + # This can also be provided as a valueFrom: secretKeyRef: + accessKey: + value: + + # S3 Secret Key + # This can also be provided as a valueFrom: secretKeyRef: + secretKey: + value: + + # This value is required for AWS S3, it may or may not be required for other providers. + region: + + # azure: + # Azure Blob Storage Access Key + # This can also be provided as a valueFrom: secretKeyRef: + # accessKey: + # value: + + # Azure Blob Storage Account + # This can also be provided as a valueFrom: secretKeyRef: + # account: + # value: + + # There are two main ways you can access a Google: + # + # a) GKE Workload Identity: configure workload identity in the top level `hostingEnvironment.gke` section. + # b) Explicit service account secret (JSON) file: use the `serviceAccountSecret` field here + # + # If you pick (a) you may not need to uncomment anything else in this section, + # but you still need to tell influxdb that you intend to use Google Cloud Storage. + # so you need to specify an empty object. Uncomment the following line: + # + # google: {} + # + # + # If you pick (b), uncomment the following block: + # + # google: + # # If you're authenticating to Google Cloud service using a Service Account credentials file, as opposed + # # as to use workload identity (see above) you need to provide a reference to a k8s secret containing the credentials file. + # serviceAccountSecret: + # # Kubernetes Secret name containing the credentials for a Google IAM Service Account. + # name: + # # The key within the Secret containing the credentials. + # key: + + # Parameters to tune observability configuration, such as Prometheus ServiceMonitor's. + observability: {} + # retention: 12h + # serviceMonitor: + # interval: 10s + # scrapeTimeout: 30s + + # Ingester pods have a volume attached. + ingesterStorage: + # (Optional) Set the storage class. This will differ based on the K8s environment and desired storage characteristics. + # If not set, the default storage class will be used. + # storageClassName: + # Set the storage size (minimum 2Gi recommended) + storage: + + # Monitoring pods have a volume attached. + monitoringStorage: + # (Optional) Set the storage class. This will differ based on the K8s environment and desired storage characteristics. + # If not set, the default storage class will be used. + # storageClassName: + # Set the storage size (minimum 10Gi recommended) + storage: + + # Uncomment the follow block if using our provided Ingress. + # + # We currently only support the ingress NGINX ingress controller: https://github.com/kubernetes/ingress-nginx + # + # ingress: + # hosts: + # # This is the host on which you will access Influxdb 3.0, for both reads and writes + # - + + # (Optional) + # The name of the Kubernetes Secret containing a TLS certificate, this should exist in the same namespace as the Clustered installation. + # If you are using cert-manager, enter a name for the Secret it should create. + # tlsSecretName: + + # http: + # # Usually you have only one ingress controller installed in a given cluster. + # # In case you have more than one, you have to specify the "class name" of the ingress controller you want to use + # className: nginx + + # grpc: + # # Usually you have only one ingress controller installed in a given cluster. + # # In case you have more than one, you have to specify the "class name" of the ingress controller you want to use + # className: nginx + # + # Enables specifying which 'type' of Ingress to use, alongside whether to place additional annotations + # onto those objects, this is useful for third party software in your environment, such as cert-manager. + # template: + # apiVersion: 'route.openshift.io/v1' + # kind: 'Route' + # metadata: + # annotations: + # 'example-annotation': 'annotation-value' + + # Enables specifying customizations for the various components in InfluxDB 3.0. + # components: + # # router: + # # template: + # # containers: + # # iox: + # # env: + # # INFLUXDB_IOX_MAX_HTTP_REQUESTS: "5000" + # # nodeSelector: + # # disktype: ssd + # # tolerations: + # # - effect: NoSchedule + # # key: example + # # operator: Exists + # # Common customizations for all components go in a pseudo-component called "common" + # # common: + # # template: + # # # Metadata contains custom annotations (and labels) to be added to a component. E.g.: + # # metadata: + # # annotations: + # # telegraf.influxdata.com/class: "foo" + + # Example of setting nodeAffinity for the querier component to ensure it runs on nodes with specific labels + # components: + # # querier: + # # template: + # # affinity: + # # nodeAffinity: + # # requiredDuringSchedulingIgnoredDuringExecution: + # # Node must have these labels to be considered for scheduling + # # nodeSelectorTerms: + # # - matchExpressions: + # # - key: required + # # operator: In + # # values: + # # - ssd + # # preferredDuringSchedulingIgnoredDuringExecution: + # # Scheduler will prefer nodes with these labels but they're not required + # # - weight: 1 + # # preference: + # # matchExpressions: + # # - key: preferred + # # operator: In + # # values: + # # - postgres + + # Example of setting podAntiAffinity for the querier component to ensure it runs on nodes with specific labels + # components: + # # querier: + # # template: + # # affinity: + # # podAntiAffinity: + # # requiredDuringSchedulingIgnoredDuringExecution: + # # Ensures that the pod will not be scheduled on a node if another pod matching the labelSelector is already running there + # # - labelSelector: + # # matchExpressions: + # # - key: app + # # operator: In + # # values: + # # - querier + # # topologyKey: "kubernetes.io/hostname" + # # preferredDuringSchedulingIgnoredDuringExecution: + # # Scheduler will prefer not to schedule pods together but may do so if necessary + # # - weight: 1 + # # podAffinityTerm: + # # labelSelector: + # # matchExpressions: + # # - key: app + # # operator: In + # # values: + # # - querier + # # topologyKey: "kubernetes.io/hostname" + + # Uncomment the following block to tune the various pods for their cpu/memory/replicas based on workload needs. + # Only uncomment the specific resources you want to change, anything uncommented will use the package default. + # (You can read more about k8s resources and limits in https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits) + # + # resources: + # # The ingester handles data being written + # ingester: + # requests: + # cpu: + # memory: + # replicas: # The default for ingesters is 3 to increase availability + # + # # optionally you can specify the resource limits which improves isolation. + # # (see https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits) + # # limits: + # # cpu: + # # memory: + + # # The compactor reorganizes old data to improve query and storage efficiency. + # compactor: + # requests: + # cpu: + # memory: + # replicas: # the default is 1 + + # # The querier handles querying data. + # querier: + # requests: + # cpu: + # memory: + # replicas: # the default is 3 + + # # The router performs some api routing. + # router: + # requests: + # cpu: + # memory: + # replicas: # the default is 3 + + admin: + # The list of users to grant access to Clustered via influxctl + users: + # First name of user + - firstName: + # Last name of user + lastName: + # Email of user + email: + # The ID that the configured Identity Provider uses for the user in oauth flows + id: + # Optional list of user groups to assign to the user, rather than the default groups. The following groups are currently supported: Admin, Auditor, Member + userGroups: + - + + # The dsn for the postgres compatible database (note this is the same as defined above) + dsn: + valueFrom: + secretKeyRef: + name: + key: + # The identity provider to be used e.g. "keycloak", "auth0", "azure", etc + # Note for Azure Active Directory it must be exactly "azure" + identityProvider: + # The JWKS endpoint provided by the Identity Provider + jwksEndpoint: + + # # This (optional) section controls how InfluxDB issues outbound requests to other services + # egress: + # # If you're using a custom CA you will need to specify the full custom CA bundle here. + # # + # # NOTE: the custom CA is currently only honoured for outbound requests used to obtain + # # the JWT public keys from your identiy provider (see `jwksEndpoint`). + # customCertificates: + # valueFrom: + # configMapKeyRef: + # key: ca.pem + # name: custom-ca + + # We also include the ability to enable some features that are not yet ready for general availability + # or for which we don't yet have a proper place to turn on an optional feature in the configuration file. + # To turn on these you should include the name of the feature flag in the `featureFlag` array. + # + # featureFlags: + # # Uncomment to install a Grafana deployment. + # # Depends on one of the prometheus features being deployed. + # # - grafana + + # # The following 2 flags should be uncommented for k8s API 1.21 support. + # # Note that this is an experimental configuration. + # # - noMinReadySeconds + # # - noGrpcProbes From f72f3564ae6e672976a287e297049e7f0c10cf7c Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Mon, 5 Jan 2026 17:04:22 -0600 Subject: [PATCH 03/19] Update content/influxdb3/clustered/reference/release-notes/clustered.md --- .../influxdb3/clustered/reference/release-notes/clustered.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/influxdb3/clustered/reference/release-notes/clustered.md b/content/influxdb3/clustered/reference/release-notes/clustered.md index eb670f23f..9565636f8 100644 --- a/content/influxdb3/clustered/reference/release-notes/clustered.md +++ b/content/influxdb3/clustered/reference/release-notes/clustered.md @@ -78,7 +78,7 @@ spec: ### Highlights -- The garbage collector has been fixed to support customers who specify the S3 bucket in `spec.package.spec.objectStore.s3.endpoint` (e.g. "https://$BUCKET.$REGION.amazonaws.com") and an additional prefix in `spec.package.spec.objectStore.bucket`; if you previously disabled `INFLUXDB_IOX_CREATE_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` and `INFLUXDB_IOX_DELETE_USING_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` to work around the bug, you can remove those overrides now. +- The garbage collector has been fixed to support customers who specify the S3 bucket in `spec.package.spec.objectStore.s3.endpoint` (for example, `"https://$BUCKET.$REGION.amazonaws.com"`) and an additional prefix in `spec.package.spec.objectStore.bucket`; if you previously disabled `INFLUXDB_IOX_CREATE_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` and `INFLUXDB_IOX_DELETE_USING_CATALOG_BACKUP_DATA_SNAPSHOT_FILES` to work around the bug, you can remove those overrides now. - Add support for both 'postgres' and 'postgresql' URI schemes in catalog DSN parsing. - Add support to the Management API for: - Renaming databases From de759b6c049f71338f554a49da11c0ca3180313e Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Mon, 5 Jan 2026 21:31:03 -0700 Subject: [PATCH 04/19] chore(telegraf-controller): add telegraf controller architectural overview (#6699) * chore(telegraf-controller): add telegraf controller architectural overview * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../telegraf/controller/reference/_index.md | 16 ++ .../controller/reference/architecture.md | 268 ++++++++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 content/telegraf/controller/reference/_index.md create mode 100644 content/telegraf/controller/reference/architecture.md diff --git a/content/telegraf/controller/reference/_index.md b/content/telegraf/controller/reference/_index.md new file mode 100644 index 000000000..583b619e1 --- /dev/null +++ b/content/telegraf/controller/reference/_index.md @@ -0,0 +1,16 @@ +--- +title: Telegraf Controller reference documentation +description: > + Reference documentation for Telegraf Controller, the application that + centralizes configuration management and provides information about the health + of Telegraf agent deployments. +menu: + telegraf_controller: + name: Reference +weight: 20 +--- + +Use the reference docs to look up Telegraf Controller configuration options, +APIs, and operational details. + +{{< children hlevel="h2" >}} diff --git a/content/telegraf/controller/reference/architecture.md b/content/telegraf/controller/reference/architecture.md new file mode 100644 index 000000000..2a2afa395 --- /dev/null +++ b/content/telegraf/controller/reference/architecture.md @@ -0,0 +1,268 @@ +--- +title: Telegraf Controller architecture +description: > + Architectural overview of the {{% product-name %}} application. +menu: + telegraf_controller: + name: Architectural overview + parent: Reference +weight: 105 +--- + +{{% product-name %}} is a standalone application that provides centralized +management for Telegraf agents. It runs as a single binary that starts two +separate servers: a web interface/API server and a dedicated high-performance +heartbeat server for agent monitoring. + +## Runtime Architecture + +### Application Components + +When you run the Telegraf Controller binary, it starts four main subsystems: + +- **Web Server**: Serves the management interface (default port: `8888`) +- **API Server**: Handles configuration management and administrative requests + (served on the same port as the web server) +- **Heartbeat Server**: Dedicated high-performance server for agent heartbeats + (default port: `8000`) +- **Background Scheduler**: Monitors agent health every 60 seconds + +### Process Model + +- **telegraf_controller** _(single process, multiple servers)_ + - **Main HTTP Server** _(port `8888`)_ + - Web UI (`/`) + - API Endpoints (`/api/*`) + - **Heartbeat Server** (port `8000`) + - POST /heartbeat _(high-performance endpoint)_ + - **Database Connection** + - SQLite or PostgreSQL + - **Background Tasks** + - Agent Status Monitor (60s interval) + +The dual-server architecture separates high-frequency heartbeat traffic from +regular management operations, ensuring that the web interface remains +responsive even under heavy agent load. + +## Configuration + +{{% product-name %}} configuration is controlled through command options and +environment variables. + +| Command Option | Environment Variable | Description | +| :----------------- | :------------------- | :--------------------------------------------------------------------------------------------------------------- | +| `--port` | `PORT` | API server port (default is `8888`) | +| `--heartbeat-port` | `HEARTBEAT_PORT` | Heartbeat service port (default: `8000`) | +| `--database` | `DATABASE` | Database filepath or URL (default is [SQLite path](/telegraf/controller/install/#default-sqlite-data-locations)) | +| `--ssl-cert` | `SSL_CERT` | Path to SSL certificate | +| `--ssl-key` | `SSL_KEY` | Path to SSL private key | + +To use environment variables, create a `.env` file in the same directory as the +binary or export these environment variables in your terminal session. + +### Database Selection + +{{% product-name %}} automatically selects the database type based on the +`DATABASE` string: + +- **SQLite** (default): Best for development and small deployments with less + than 1000 agents. Database file created automatically. +- **PostgreSQL**: Required for large deployments. Must be provisioned separately. + +Example PostgreSQL configuration: + +```bash +DATABASE="postgresql://user:password@localhost:5432/telegraf_controller" +``` + +## Data Flow + +### Agent registration and heartbeats + +{{< diagram >}} +flowchart LR + T["Telegraf Agents
(POST heartbeats)"] --> H["Port 8000
Heartbeat Server"] + H --Direct Write--> D[("Database")] + W["Web UI/API
"] --> A["Port 8888
API Server"] --View Agents (Read-Only)--> D + R["Rust Scheduler
(Agent status updates)"] --> D + +{{< /diagram >}} + +1. **Agents send heartbeats**: + + Telegraf agents with the heartbeat output plugin send `POST` requests to the + dedicated heartbeat server (port `8000` by default). + +2. **Heartbeat server processes the heartbeat**: + + The heartbeat server is a high-performance Rust-based HTTP server that: + + - Receives the `POST` request at `/agents/heartbeat` + - Validates the heartbeat payload + - Extracts agent information (ID, hostname, IP address, status, etc.) + - Uniquely identifies each agent using the `instance_id` in the heartbeat + payload. + +3. **Heartbeat server writes directly to the database**: + + The heartbeat server uses a Rust NAPI module that: + + - Bypasses the application ORM (Object-Relational Mapping) layer entirely + - Uses `sqlx` (Rust SQL library) to write directly to the database + - Implements batch processing to efficiently process multiple heartbeats + - Provides much higher throughput than going through the API layer + + The Rust module performs these operations: + + - Creates a new agent if it does not already exist + - Adds or updates the `last_seen` timestamp + - Adds or updates the agent status to the status reported in the heartbeat + - Updates other agent metadata (hostname, IP, etc.) + +4. **API layer reads agent data**: + + The API layer has read-only access for agent data and performs the following + actions: + + - `GET /api/agents` - List agents + - `GET /api/agents/summary` - Agent status summary + + The API never writes to the agents table. Only the heartbeat server does. + +5. **The Web UI displays updated agent data**: + + The web interface polls the API endpoints to display: + + - Real-time agent status + - Last seen timestamps + - Agent health metrics + +6. **The background scheduler evaluates agent statuses**: + + Every 60 seconds, a Rust-based scheduler (also part of the NAPI module): + + - Scans all agents in the database + - Checks `last_seen` timestamps against the agent's assigned reporting rule + - Updates agent statuses: + - ok โ†’ not_reporting (if heartbeat missed beyond threshold) + - not_reporting โ†’ ok (if heartbeat resumes) + - Auto-deletes agents that have exceeded the auto-delete threshold + (if enabled for the reporting rule) + +### Configuration distribution + +1. **An agent requests a configuration**: + + Telegraf agents request their configuration from the main API server + (port `8888`): + + ```bash + telegraf --config "http://localhost:8888/api/configs/{config-id}/toml?location=datacenter1&env=prod" + ``` + + The agent makes a `GET` request with: + + - **Config ID**: Unique identifier for the configuration template + - **Query Parameters**: Variables for parameter substitution + - **Accept Header**: Can specify `text/x-toml` or `application/octet-stream` + for download + +2. **The API server receives request**: + + The API server on port `8888` handles the request at + `/api/configs/{id}/toml` and does the following: + + - Validates the configuration ID + - Extracts all query parameters for substitution + - Checks the `Accept` header to determine response format + +3. **The application retrieves the configuration from the database**: + + {{% product-name %}} fetches configuration data from the database: + + - **Configuration TOML**: The raw configuration with parameter placeholders + - **Configuration name**: Used for filename if downloading + - **Updated timestamp**: For the `Last-Modified` header + +4. **{{% product-name %}} substitutes parameters**: + + {{% product-name %}} processes the TOML template and replaces parameters + with parameter values specified in the `GET` request. + +5. **{{% product-name %}} sets response headers**: + + - Content-Type + - Last-Modified + + Telegraf uses the `Last-Modified` header to determine if a configuration + has been updated and, if so, download and use the updated configuration. + +6. **{{% product-name %}} delivers the response**: + + Based on the `Accept` header: + + {{< tabs-wrapper >}} +{{% tabs "medium" %}} +[text/x-toml (TOML)](#) +[application/octet-stream (Download)](#) +{{% /tabs %}} +{{% tab-content %}} + + +``` +HTTP/1.1 200 OK +Content-Type: text/x-toml; charset=utf-8 +Last-Modified: Mon, 05 Jan 2025 07:28:00 GMT + +[agent] + hostname = "server-01" + environment = "prod" +... +``` + + +{{% /tab-content %}} +{{% tab-content %}} + + +``` +HTTP/1.1 200 OK +Content-Type: application/octet-stream +Content-Disposition: attachment; filename="config_name.toml" +Last-Modified: Mon, 05 Jan 2025 07:28:00 GMT + +[agent] + hostname = "server-01" +... +``` + + +{{% /tab-content %}} +{{< /tabs-wrapper >}} + +7. _(Optional)_ **Telegraf regularly checks the configuration for updates**: + + Telegraf agents can regularly check {{% product-name %}} for configuration + updates and automatically load updates when detected. When starting a + Telegraf agent, include the `--config-url-watch-interval` option with the + interval that you want the agent to use to check for updatesโ€”for example: + + ```bash + telegraf \ + --config http://localhost:8888/api/configs/xxxxxx/toml \ + --config-url-watch-interval 1h + ``` + +## Reporting Rules + +{{% product-name %}} uses reporting rules to determine when agents should be +marked as not reporting: + +- **Default Rule**: Created automatically on first run +- **Heartbeat Interval**: Expected frequency of agent heartbeats (default: 60s) +- **Threshold Multiplier**: How many intervals to wait before marking not_reporting (default: 3x) + +Access reporting rules via: + +- **Web UI**: Reporting Rules +- **API**: `GET /api/reporting-rules` From 30c0aecbd3d2ce1907b30affa9d8ee60acdc328f Mon Sep 17 00:00:00 2001 From: Mohammad Naqvi <162358280+mnaqvi08@users.noreply.github.com> Date: Tue, 6 Jan 2026 09:50:26 -0500 Subject: [PATCH 05/19] chore: update docs to reflect DB undelete addition --- .../cloud-dedicated/admin/databases/delete.md | 8 ++++ .../admin/databases/undelete.md | 41 +++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/content/influxdb3/cloud-dedicated/admin/databases/delete.md b/content/influxdb3/cloud-dedicated/admin/databases/delete.md index a20a7a5c0..6543d17a4 100644 --- a/content/influxdb3/cloud-dedicated/admin/databases/delete.md +++ b/content/influxdb3/cloud-dedicated/admin/databases/delete.md @@ -24,6 +24,7 @@ list_code_example: | --header "Authorization: Bearer MANAGEMENT_TOKEN" ``` related: + - /influxdb3/cloud-dedicated/admin/databases/undelete/ - /influxdb3/cloud-dedicated/reference/cli/influxctl/database/delete/ - /influxdb3/cloud-dedicated/reference/api/ --- @@ -47,6 +48,13 @@ to delete a database from your {{< product-name omit=" Clustered" >}} cluster. > that granted access to the deleted database will also grant access to the new > database. +> [!Note] +> #### Deleted databases can be restored +> +> Deleted databases can be [restored](/influxdb3/cloud-dedicated/admin/databases/undelete/) +> within approximately 7 days of deletion. After this grace period, the database +> and its data are permanently removed. + {{< tabs-wrapper >}} {{% tabs %}} [Admin UI](#) diff --git a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md index 91ef14dcd..f1e333218 100644 --- a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md +++ b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md @@ -1,7 +1,7 @@ --- title: Undelete a database description: > - Use the [`influxctl database undelete` command](/influxdb3/cloud-dedicated/reference/cli/influxctl/database/undelete/) + Use the Admin UI or the [`influxctl database undelete` command](/influxdb3/cloud-dedicated/reference/cli/influxctl/database/undelete/) to restore a previously deleted database in your {{< product-name omit=" Cluster" >}} cluster. menu: influxdb3_cloud_dedicated: @@ -17,7 +17,7 @@ related: - /influxdb3/cloud-dedicated/admin/tokens/database/create/ --- -Use the [`influxctl database undelete` command](/influxdb3/cloud-dedicated/reference/cli/influxctl/database/undelete/) +Use the Admin UI or the [`influxctl` CLI](/influxdb3/cloud-dedicated/reference/cli/influxctl/) to restore a previously deleted database in your {{< product-name omit=" Cluster" >}} cluster. > [!Important] @@ -37,7 +37,40 @@ table limits, and column limits as when it was deleted. > After this grace period, all Parquet files associated with the deleted database > are permanently removed and the database cannot be undeleted. -## Undelete a database using the influxctl CLI +{{< tabs-wrapper >}} +{{% tabs %}} +[Admin UI](#admin-ui) +[influxctl](#influxctl) +{{% /tabs %}} +{{% tab-content %}} + +The InfluxDB Cloud Dedicated administrative UI includes a portal for +managing databases, including restoring deleted databases. + +1. To access the {{< product-name >}} Admin UI, visit the following URL in your browser: + +
+   https://console.influxdata.com
+   
+ +2. Use the credentials provided by InfluxData to log into the Admin UI. + If you don't have login credentials, [contact InfluxData support](https://support.influxdata.com). +3. In the database list, find the deleted database you want to restore. + Deleted databases are shown with a "Deleted" status indicator. + You can sort on column headers or use the **Search** field to find a specific database. +4. Click the options button (three vertical dots) to the right of the deleted database you want to restore. + The options menu displays. +5. In the options menu, click **Restore Database**. The **Restore Database** dialog displays. +6. In the **Restore Database** dialog, review the database name and deletion date. +7. Click the **Restore Database** button to restore the database. +{{% /tab-content %}} +{{% tab-content %}} + +1. If you haven't already, [download and install the `influxctl` CLI](/influxdb3/cloud-dedicated/reference/cli/influxctl/#download-and-install-influxctl). +2. Use the [`influxctl database undelete` command](/influxdb3/cloud-dedicated/reference/cli/influxctl/database/undelete/) + to restore a deleted database. Provide the following: + + - The name of the deleted database to restore {{% code-placeholders "DATABASE_NAME" %}} ```sh @@ -49,6 +82,8 @@ Replace the following: - {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}: Name of the deleted database to restore +{{% /tab-content %}} +{{< /tabs-wrapper >}} ## Recreate tokens for the database From cb37ee2574d9b68fb7791029e135962bdda750cc Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Tue, 6 Jan 2026 09:57:47 -0600 Subject: [PATCH 06/19] fix: tab names in generated Markdown (#6698) - maintains semantic flow of tab labels and code-tab labels with their tab contents - formats labels in bold to avoid breaking heading level semantics - wraps tabbed content in begin/end comments to denote options --- scripts/lib/markdown-converter.cjs | 170 ++++++++++++++++++++++++----- 1 file changed, 144 insertions(+), 26 deletions(-) diff --git a/scripts/lib/markdown-converter.cjs b/scripts/lib/markdown-converter.cjs index de8545608..a63a98bce 100644 --- a/scripts/lib/markdown-converter.cjs +++ b/scripts/lib/markdown-converter.cjs @@ -45,9 +45,18 @@ const URL_PATTERN_MAP = { const PRODUCT_NAME_MAP = { influxdb3_core: { name: 'InfluxDB 3 Core', version: 'core' }, - influxdb3_enterprise: { name: 'InfluxDB 3 Enterprise', version: 'enterprise' }, - influxdb3_cloud_dedicated: { name: 'InfluxDB Cloud Dedicated', version: 'cloud-dedicated' }, - influxdb3_cloud_serverless: { name: 'InfluxDB Cloud Serverless', version: 'cloud-serverless' }, + influxdb3_enterprise: { + name: 'InfluxDB 3 Enterprise', + version: 'enterprise', + }, + influxdb3_cloud_dedicated: { + name: 'InfluxDB Cloud Dedicated', + version: 'cloud-dedicated', + }, + influxdb3_cloud_serverless: { + name: 'InfluxDB Cloud Serverless', + version: 'cloud-serverless', + }, influxdb3_clustered: { name: 'InfluxDB Clustered', version: 'clustered' }, influxdb3_explorer: { name: 'InfluxDB 3 Explorer', version: 'explorer' }, influxdb_cloud: { name: 'InfluxDB Cloud (TSM)', version: 'cloud' }, @@ -81,12 +90,18 @@ function detectBaseUrl() { } // Check if Hugo dev server is running on localhost - if (process.env.HUGO_ENV === 'development' || process.env.NODE_ENV === 'development') { + if ( + process.env.HUGO_ENV === 'development' || + process.env.NODE_ENV === 'development' + ) { return 'http://localhost:1313'; } // Check for staging environment - if (process.env.HUGO_ENV === 'staging' || process.env.DEPLOY_ENV === 'staging') { + if ( + process.env.HUGO_ENV === 'staging' || + process.env.DEPLOY_ENV === 'staging' + ) { return process.env.STAGING_URL || 'https://test2.docs.influxdata.com'; } @@ -277,6 +292,79 @@ function createTurndownService() { }, }); + // Handle tabbed content - associate tab names with their content + // This rule handles both .tabs-wrapper and .code-tabs-wrapper containers + turndownService.addRule('tabbedContent', { + filter: function (node) { + return ( + node.nodeName === 'DIV' && + node.classList && + (node.classList.contains('tabs-wrapper') || + node.classList.contains('code-tabs-wrapper')) + ); + }, + replacement: function (_content, node, options) { + const isCodeTabs = node.classList.contains('code-tabs-wrapper'); + const tabsSelector = isCodeTabs ? '.code-tabs' : '.tabs'; + const contentSelector = isCodeTabs ? '.code-tab-content' : '.tab-content'; + + // Extract tab names from anchor elements + const tabsContainer = node.querySelector(tabsSelector); + const tabLinks = tabsContainer + ? Array.from(tabsContainer.querySelectorAll('a')) + : []; + const tabNames = tabLinks.map((link) => link.textContent.trim()); + + // Extract tab content sections + // Note: :scope selector is not supported in Turndown's DOM parser, + // so we use a simple selector and filter by parent + const allContentSections = Array.from( + node.querySelectorAll(contentSelector) + ); + // Filter to only direct children of the tabs-wrapper + const contentSections = allContentSections.filter( + (section) => section.parentNode === node + ); + + // If no tabs or content found, fall back to default conversion + if (tabNames.length === 0 || contentSections.length === 0) { + return _content; + } + + // Build markdown with explicit tab-content association + // Use bold labels instead of headings to avoid breaking heading hierarchy + const parts = []; + + // Add a comment indicating this is tabbed content + parts.push( + '\n\n' + ); + + // Process each tab and its content + const maxTabs = Math.max(tabNames.length, contentSections.length); + for (let i = 0; i < maxTabs; i++) { + const tabName = tabNames[i] || `Tab ${i + 1}`; + const contentSection = contentSections[i]; + + // Add tab label with bold formatting (not a heading to preserve hierarchy) + parts.push(`\n**${tabName}:**\n`); + + if (contentSection) { + // Recursively convert the content inside the tab + const innerHtml = contentSection.innerHTML; + const innerContent = turndownService.turndown(innerHtml); + parts.push(innerContent.trim()); + } + + parts.push('\n'); + } + + parts.push('\n\n'); + + return parts.join('\n'); + }, + }); + // Remove navigation, footer, and other non-content elements turndownService.remove([ 'nav', @@ -398,9 +486,9 @@ function generateFrontmatter(metadata, urlPath, baseUrl = '') { // Sanitize description (remove newlines, truncate to reasonable length) let description = metadata.description || ''; description = description - .replace(/\s+/g, ' ') // Replace all whitespace (including newlines) with single space + .replace(/\s+/g, ' ') // Replace all whitespace (including newlines) with single space .trim() - .substring(0, 500); // Truncate to 500 characters max + .substring(0, 500); // Truncate to 500 characters max // Add token estimate (rough: 4 chars per token) const contentLength = metadata.content?.length || 0; @@ -414,7 +502,7 @@ function generateFrontmatter(metadata, urlPath, baseUrl = '') { title: metadata.title, description: description, url: fullUrl, - estimated_tokens: estimatedTokens + estimated_tokens: estimatedTokens, }; if (product) { @@ -425,10 +513,16 @@ function generateFrontmatter(metadata, urlPath, baseUrl = '') { } // Serialize to YAML (handles special characters properly) - return '---\n' + yaml.dump(frontmatterObj, { - lineWidth: -1, // Disable line wrapping - noRefs: true // Disable anchors/aliases - }).trim() + '\n---'; + return ( + '---\n' + + yaml + .dump(frontmatterObj, { + lineWidth: -1, // Disable line wrapping + noRefs: true, // Disable anchors/aliases + }) + .trim() + + '\n---' + ); } /** @@ -439,15 +533,20 @@ function generateFrontmatter(metadata, urlPath, baseUrl = '') { * @param {string} baseUrl - Base URL for full URL construction * @returns {string} YAML frontmatter as string */ -function generateSectionFrontmatter(metadata, urlPath, childPages, baseUrl = '') { +function generateSectionFrontmatter( + metadata, + urlPath, + childPages, + baseUrl = '' +) { const product = detectProduct(urlPath); // Sanitize description (remove newlines, truncate to reasonable length) let description = metadata.description || ''; description = description - .replace(/\s+/g, ' ') // Replace all whitespace (including newlines) with single space + .replace(/\s+/g, ' ') // Replace all whitespace (including newlines) with single space .trim() - .substring(0, 500); // Truncate to 500 characters max + .substring(0, 500); // Truncate to 500 characters max // Add token estimate (rough: 4 chars per token) const contentLength = metadata.content?.length || 0; @@ -469,7 +568,7 @@ function generateSectionFrontmatter(metadata, urlPath, childPages, baseUrl = '') url: fullUrl, type: 'section', pages: childPages.length, - estimated_tokens: estimatedTokens + estimated_tokens: estimatedTokens, }; if (product) { @@ -481,17 +580,23 @@ function generateSectionFrontmatter(metadata, urlPath, childPages, baseUrl = '') // List child pages with full URLs if (childPages.length > 0) { - frontmatterObj.child_pages = childPages.map(child => ({ + frontmatterObj.child_pages = childPages.map((child) => ({ url: normalizedBaseUrl ? `${normalizedBaseUrl}${child.url}` : child.url, - title: child.title + title: child.title, })); } // Serialize to YAML (handles special characters properly) - return '---\n' + yaml.dump(frontmatterObj, { - lineWidth: -1, // Disable line wrapping - noRefs: true // Disable anchors/aliases - }).trim() + '\n---'; + return ( + '---\n' + + yaml + .dump(frontmatterObj, { + lineWidth: -1, // Disable line wrapping + noRefs: true, // Disable anchors/aliases + }) + .trim() + + '\n---' + ); } /** @@ -506,7 +611,9 @@ async function convertToMarkdown(htmlContent, urlPath) { // Detect base URL for the environment const baseUrl = detectBaseUrl(); if (DEBUG) { - console.log(`[DEBUG] Base URL detected: ${baseUrl} (NODE_ENV=${process.env.NODE_ENV}, HUGO_ENV=${process.env.HUGO_ENV}, BASE_URL=${process.env.BASE_URL})`); + console.log( + `[DEBUG] Base URL detected: ${baseUrl} (NODE_ENV=${process.env.NODE_ENV}, HUGO_ENV=${process.env.HUGO_ENV}, BASE_URL=${process.env.BASE_URL})` + ); } // Use Rust converter if available (10ร— faster) @@ -514,7 +621,10 @@ async function convertToMarkdown(htmlContent, urlPath) { try { return rustConverter.convertToMarkdown(htmlContent, urlPath, baseUrl); } catch (err) { - console.warn(`Rust conversion failed for ${urlPath}, falling back to JavaScript:`, err.message); + console.warn( + `Rust conversion failed for ${urlPath}, falling back to JavaScript:`, + err.message + ); // Fall through to JavaScript implementation } } @@ -563,9 +673,17 @@ async function convertSectionToMarkdown( // Use Rust converter if available (10ร— faster) if (USE_RUST && rustConverter) { try { - return rustConverter.convertSectionToMarkdown(sectionHtml, sectionUrlPath, childHtmls, baseUrl); + return rustConverter.convertSectionToMarkdown( + sectionHtml, + sectionUrlPath, + childHtmls, + baseUrl + ); } catch (err) { - console.warn(`Rust section conversion failed for ${sectionUrlPath}, falling back to JavaScript:`, err.message); + console.warn( + `Rust section conversion failed for ${sectionUrlPath}, falling back to JavaScript:`, + err.message + ); // Fall through to JavaScript implementation } } From 36f9222fd583fa97a57d01a23466ff0790ad3a93 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Tue, 6 Jan 2026 10:13:18 -0600 Subject: [PATCH 07/19] feat(sync): extract style attributes from HTML comments (#6694) Add extractStyleAttributes() function to convert headings like: `#### Heading ` to: `#### Heading {.class}` This allows source READMEs to render cleanly on GitHub while still supporting Hugo style classes in docs-v2. --- .../influxdb3-plugins/port_to_docs.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/helper-scripts/influxdb3-plugins/port_to_docs.js b/helper-scripts/influxdb3-plugins/port_to_docs.js index 324bf2bd8..bbc79e6f9 100644 --- a/helper-scripts/influxdb3-plugins/port_to_docs.js +++ b/helper-scripts/influxdb3-plugins/port_to_docs.js @@ -205,6 +205,25 @@ For other InfluxDB versions, see the [Support and feedback](#bug-reports-and-fee return content; } +/** + * Extract style attributes from HTML comments and apply to headings. + * Converts: `#### Heading ` to `#### Heading {.class}` + * + * Supported class formats: + * - {.green}, {.orange} - Color styling + * - {.recommended}, {.not-recommended} - Semantic styling + * - Any other {.classname} format + * + * This allows source READMEs to render cleanly on GitHub (which ignores + * HTML comments) while still supporting Hugo style classes in docs-v2. + */ +function extractStyleAttributes(content) { + // Match headings with HTML comment style attributes + // Pattern: (#+) (heading text) + const pattern = /^(#{1,6})\s+(.+?)\s*\s*$/gm; + return content.replace(pattern, '$1 $2 $3'); +} + /** * Ensure code blocks are properly formatted. */ @@ -277,6 +296,7 @@ function transformContent(content, pluginName, config) { content = convertTomlReadmeLinks(content); content = addProductShortcodes(content); content = enhanceOpeningParagraph(content); + content = extractStyleAttributes(content); content = fixCodeBlockFormatting(content); // Add schema requirements if applicable From b4debb4fefa588cda3c4be533f5c689e374e7d44 Mon Sep 17 00:00:00 2001 From: Mohammad Naqvi <162358280+mnaqvi08@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:27:27 -0500 Subject: [PATCH 08/19] chore: consolidate points --- .../influxdb3/cloud-dedicated/admin/databases/undelete.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md index f1e333218..4892c4b5a 100644 --- a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md +++ b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md @@ -58,11 +58,9 @@ managing databases, including restoring deleted databases. 3. In the database list, find the deleted database you want to restore. Deleted databases are shown with a "Deleted" status indicator. You can sort on column headers or use the **Search** field to find a specific database. -4. Click the options button (three vertical dots) to the right of the deleted database you want to restore. - The options menu displays. -5. In the options menu, click **Restore Database**. The **Restore Database** dialog displays. -6. In the **Restore Database** dialog, review the database name and deletion date. -7. Click the **Restore Database** button to restore the database. +4. In the options menu (three vertical dots to the right of the database), click **Restore Database**. The **Restore Database** dialog displays. +5. In the **Restore Database** dialog, review the database name and deletion date. +6. Click the **Restore Database** button to restore the database. {{% /tab-content %}} {{% tab-content %}} From 1203602607734509674de74a4e56602a9f7066fc Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Tue, 6 Jan 2026 14:01:49 -0600 Subject: [PATCH 09/19] docs(influxdb3): document log-filter values and targeted filtering (#6695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(link-checker): update configs for v1.3.0 severity classification Remove exclusions for sites that return 403/429 (bot protection) and 5xx (server errors) - these are now handled by severity classification: - 403/401/429 โ†’ info (shown but don't fail CI) - 5xx/timeout โ†’ warning (shown but don't fail CI) - 404/410/DNS โ†’ error (fail CI) Removed exclusions: - GitHub, Slack, Reddit, StackOverflow - Docker Hub, Grafana, Microsoft Learn - Claude.ai, Dremio, Scarf, InfluxData support Kept exclusions: - Localhost/local network URLs - Example/placeholder URLs - CI-specific workarounds (canonical URLs, file fragments) Added [severity] configuration section with default thresholds. * docs(influxdb3): document log-filter values and targeted filtering Add comprehensive documentation for the --log-filter configuration option: - Log levels table (error, warn, info, debug, trace) - Targeted filtering syntax for specific components - Common component names for Core and Enterprise - Debug logging section in write troubleshoot page closes influxdata/DAR#575 * Update content/shared/influxdb3-cli/config-options.md --- .gitignore | 1 + .../shared/influxdb3-cli/config-options.md | 87 ++++++++++++++++++- .../influxdb3-write-guides/troubleshoot.md | 27 +++++- 3 files changed, 113 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5b5487a3d..3cd0d666d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ tmp # User context files for AI assistant tools .context/* !.context/README.md +.task.md # External repos .ext/* diff --git a/content/shared/influxdb3-cli/config-options.md b/content/shared/influxdb3-cli/config-options.md index 46796551c..3723912dd 100644 --- a/content/shared/influxdb3-cli/config-options.md +++ b/content/shared/influxdb3-cli/config-options.md @@ -832,7 +832,92 @@ Sets the endpoint of an S3-compatible, HTTP/2-enabled object store cache. #### log-filter -Sets the filter directive for logs. +Sets the filter directive for logs. Use this option to control the verbosity of +server logs globally or for specific components. + +##### Log levels + +The following log levels are available (from least to most verbose): + +| Level | Description | +| :------ | :---------------------------------------------------------------------------------------------------- | +| `error` | Only errors | +| `warn` | Warnings and errors | +| `info` | Informational messages, warnings, and errors _(default)_ | +| `debug` | Debug information for troubleshooting, plus all above levels | +| `trace` | Very detailed tracing information, plus all above levels (produces high log volume) | + +##### Basic usage + +To set the log level globally, pass one of the log levels: + + + +```sh +influxdb3 serve --log-filter debug +``` + +##### Targeted filtering + +Globally enabling `debug` or `trace` produces a high volume of log output. +For more targeted debugging, you can set different log levels for specific +components using the format `,=`. + +###### Debug write buffer operations + + + +```sh +influxdb3 serve --log-filter info,influxdb3_write_buffer=debug +``` + +###### Trace WAL operations + + + +```sh +influxdb3 serve --log-filter info,influxdb3_wal=trace +``` + +###### Multiple targeted filters + + + +```sh +influxdb3 serve --log-filter info,influxdb3_write_buffer=debug,influxdb3_wal=debug +``` + +{{% show-in "enterprise" %}} + +###### Debug Enterprise storage engine operations + + + +```sh +influxdb3 serve --log-filter info,influxdb3_pacha_tree=debug +``` + +{{% /show-in %}} + +##### Common component names + +The following are common component names you can use for targeted filtering: + +| Component | Description | +| :------------------------------------ | :------------------------------------------------------- | +| `influxdb3_write_buffer` | Write buffer operations | +| `influxdb3_wal` | Write-ahead log operations | +| `influxdb3_catalog` | Catalog and schema operations | +| `influxdb3_cache` | Caching operations | +{{% show-in "enterprise" %}}`influxdb3_pacha_tree` | Enterprise storage engine operations | +`influxdb3_enterprise` | Enterprise-specific features | +{{% /show-in %}} + +> [!Note] +> Targeted filtering requires knowledge of the codebase component names. +> The component names correspond to Rust package names in the InfluxDB 3 source +> code. Use `debug` or `trace` sparingly on specific components to avoid +> excessive log output. | influxdb3 serve option | Environment variable | | :--------------------- | :------------------- | diff --git a/content/shared/influxdb3-write-guides/troubleshoot.md b/content/shared/influxdb3-write-guides/troubleshoot.md index 4b998e152..bd4430cd0 100644 --- a/content/shared/influxdb3-write-guides/troubleshoot.md +++ b/content/shared/influxdb3-write-guides/troubleshoot.md @@ -6,7 +6,8 @@ Learn how to avoid unexpected results and recover from errors when writing to - [Review HTTP status codes](#review-http-status-codes) - [Troubleshoot failures](#troubleshoot-failures) - [Troubleshoot rejected points](#troubleshoot-rejected-points) -{{% show-in "core,enterprise" %}}- [Troubleshoot write performance issues](#troubleshoot-write-performance-issues){{% /show-in %}} +{{% show-in "core,enterprise" %}}- [Troubleshoot write performance issues](#troubleshoot-write-performance-issues) + - [Use debug logs for troubleshooting](#use-debug-logs-for-troubleshooting){{% /show-in %}} ## Handle write responses @@ -105,4 +106,28 @@ influxdb3 serve \ Replace {{% code-placeholder-key %}}`PERCENTAGE`{{% /code-placeholder-key %}} with the percentage of available memory to allocate (for example, `35%` for write-heavy workloads). +### Use debug logs for troubleshooting + +For deeper investigation of write issues, enable debug logging for specific +components. Debug logs provide detailed information about write buffer +operations and WAL activity. + +To enable debug logs for write operations, restart {{% product-name %}} with +targeted log filters: + + + +```sh +influxdb3 serve --log-filter info,influxdb3_write_buffer=debug +``` + + + +```sh +influxdb3 serve --log-filter info,influxdb3_wal=debug +``` + +For more information about log levels and targeted filtering, see +[log-filter configuration](/influxdb3/version/reference/config-options/#log-filter). + {{% /show-in %}} From b1ca174b1332f2b7630c477f23381b09503e5402 Mon Sep 17 00:00:00 2001 From: Mohammad Naqvi <162358280+mnaqvi08@users.noreply.github.com> Date: Tue, 6 Jan 2026 16:10:25 -0500 Subject: [PATCH 10/19] chore: address comments --- .../cloud-dedicated/admin/databases/delete.md | 8 +++---- .../admin/databases/undelete.md | 23 ++++++------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/content/influxdb3/cloud-dedicated/admin/databases/delete.md b/content/influxdb3/cloud-dedicated/admin/databases/delete.md index 6543d17a4..8d21c3f71 100644 --- a/content/influxdb3/cloud-dedicated/admin/databases/delete.md +++ b/content/influxdb3/cloud-dedicated/admin/databases/delete.md @@ -49,11 +49,11 @@ to delete a database from your {{< product-name omit=" Clustered" >}} cluster. > database. > [!Note] -> #### Deleted databases can be restored +> #### Deleted databases may be able to be restored > -> Deleted databases can be [restored](/influxdb3/cloud-dedicated/admin/databases/undelete/) -> within approximately 7 days of deletion. After this grace period, the database -> and its data are permanently removed. +> Deleted databases may be able to be [restored](/influxdb3/cloud-dedicated/admin/databases/undelete/) +> within approximately 7 days of deletion, depending on when cleanup jobs run. +> After the cleanup job runs, the database and its data are permanently removed. {{< tabs-wrapper >}} {{% tabs %}} diff --git a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md index 4892c4b5a..1d928ba06 100644 --- a/content/influxdb3/cloud-dedicated/admin/databases/undelete.md +++ b/content/influxdb3/cloud-dedicated/admin/databases/undelete.md @@ -43,24 +43,15 @@ table limits, and column limits as when it was deleted. [influxctl](#influxctl) {{% /tabs %}} {{% tab-content %}} - -The InfluxDB Cloud Dedicated administrative UI includes a portal for -managing databases, including restoring deleted databases. +{{< admin-ui-access >}} -1. To access the {{< product-name >}} Admin UI, visit the following URL in your browser: +In the database list, find the deleted database you want to restore. +Deleted databases are shown with a "Deleted" status indicator. +You can sort on column headers or use the **Search** field to find a specific database. -
-   https://console.influxdata.com
-   
- -2. Use the credentials provided by InfluxData to log into the Admin UI. - If you don't have login credentials, [contact InfluxData support](https://support.influxdata.com). -3. In the database list, find the deleted database you want to restore. - Deleted databases are shown with a "Deleted" status indicator. - You can sort on column headers or use the **Search** field to find a specific database. -4. In the options menu (three vertical dots to the right of the database), click **Restore Database**. The **Restore Database** dialog displays. -5. In the **Restore Database** dialog, review the database name and deletion date. -6. Click the **Restore Database** button to restore the database. +1. In the options menu (three vertical dots to the right of the database), click **Restore Database**. The **Restore Database** dialog displays. +2. In the **Restore Database** dialog, review the database name and deletion date. +3. Click the **Restore Database** button to restore the database. {{% /tab-content %}} {{% tab-content %}} From 2e50b226673f9dc064d61e1404f9d5b88b3f0771 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Wed, 7 Jan 2026 12:01:22 -0600 Subject: [PATCH 11/19] chore(skills): add Cypress E2E testing skill and update related skills (#6709) - Add new cypress-e2e-testing skill with: - Hugo server management guidance (port 1315, auto-start) - Test execution patterns and quick reference - API reference test prerequisites - Failure analysis and debugging strategies - Error pattern categorization - Update docs-cli-workflow skill with related skills section - Streamline hugo-template-dev skill content --- .claude/skills/cypress-e2e-testing/SKILL.md | 329 ++++++++++++++++++++ .claude/skills/docs-cli-workflow/SKILL.md | 6 + .claude/skills/hugo-template-dev/SKILL.md | 197 +++--------- 3 files changed, 376 insertions(+), 156 deletions(-) create mode 100644 .claude/skills/cypress-e2e-testing/SKILL.md diff --git a/.claude/skills/cypress-e2e-testing/SKILL.md b/.claude/skills/cypress-e2e-testing/SKILL.md new file mode 100644 index 000000000..2d1c734d3 --- /dev/null +++ b/.claude/skills/cypress-e2e-testing/SKILL.md @@ -0,0 +1,329 @@ +--- +name: cypress-e2e-testing +description: Run, validate, and analyze Cypress E2E tests for the InfluxData documentation site. Covers Hugo server management, test execution modes, and failure analysis. +author: InfluxData +version: "1.0" +--- + +# Cypress E2E Testing Skill + +## Purpose + +This skill guides agents through running Cypress end-to-end tests for the documentation site, including understanding when Hugo starts automatically vs. manually, interpreting test results, and debugging failures. + +For comprehensive testing documentation, see **[DOCS-TESTING.md](../../../DOCS-TESTING.md)**. + +## Key Insight: Hugo Server Management + +**The test runner (`run-e2e-specs.js`) automatically manages Hugo.** + +- **Port 1315** is used for testing (not 1313) +- If port 1315 is free โ†’ starts Hugo automatically +- If port 1315 is in use โ†’ checks if it's a working Hugo server and reuses it +- Hugo logs written to `/tmp/hugo_server.log` + +**You do NOT need to start Hugo separately** unless you want to keep it running between test runs for faster iteration. + +## Quick Reference + +| Task | Command | +| ------------------------------- | ------------------------------------------------------------------------------------------------------- | +| Test content file | `node cypress/support/run-e2e-specs.js content/path/to/file.md` | +| Test with specific spec | `node cypress/support/run-e2e-specs.js --spec "cypress/e2e/content/spec.cy.js" content/path/to/file.md` | +| Functionality test (no content) | `node cypress/support/run-e2e-specs.js --spec "cypress/e2e/page-context.cy.js" --no-mapping` | +| Test shortcode examples | `yarn test:shortcode-examples` | + +## Prerequisites + +```bash +# Install dependencies (required) +yarn install + +# Verify Cypress is available +yarn cypress --version +``` + +### API Reference Tests: Additional Prerequisites + +**API reference pages require generation before testing.** The pages don't exist until you run: + +```bash +# Generate API documentation content from OpenAPI specs +yarn build:api-docs +``` + +This step: + +- Processes OpenAPI specs in `api-docs/` directories +- Generates Hugo content pages in `content/*/api/` +- Creates operation pages, tag pages, and index pages + +**Without this step**, all API reference tests will fail with 404 errors. + +**Quick check** - verify API content exists: + +```bash +# Should list generated API content directories +ls content/influxdb3/core/api/ + +# If "No such file or directory", run: yarn build:api-docs +``` + +### Markdown Validation Tests: Additional Prerequisites + +**Markdown validation tests require generated markdown files.** Run: + +```bash +# Build Hugo site first (generates HTML in public/) +npx hugo --quiet + +# Generate LLM-friendly markdown from HTML +yarn build:md +``` + +This creates `.md` files in the `public/` directory that the markdown validation tests check. + +**Without this step**, markdown validation tests will fail with missing file errors. + +## Test Execution Modes + +### Mode 1: Content-Specific Tests (Default) + +Tests specific content files by mapping them to URLs. + +```bash +# Single file +node cypress/support/run-e2e-specs.js content/influxdb3/core/_index.md + +# Multiple files +node cypress/support/run-e2e-specs.js content/influxdb3/core/_index.md content/influxdb3/enterprise/_index.md + +# With specific test spec +node cypress/support/run-e2e-specs.js \ + --spec "cypress/e2e/content/api-reference.cy.js" \ + content/influxdb3/core/reference/api/_index.md +``` + +**What happens:** + +1. Maps content files to URLs (e.g., `content/influxdb3/core/_index.md` โ†’ `/influxdb3/core/`) +2. Starts Hugo on port 1315 (if not running) +3. Runs Cypress tests against mapped URLs +4. Stops Hugo when done + +### Mode 2: Functionality Tests (`--no-mapping`) + +Tests UI functionality without requiring content file paths. + +```bash +# Run functionality test +node cypress/support/run-e2e-specs.js \ + --spec "cypress/e2e/page-context.cy.js" \ + --no-mapping +``` + +**Use when:** Testing JavaScript components, theme switching, navigation, or other UI behavior not tied to specific content. + +### Mode 3: Reusing an Existing Hugo Server + +For faster iteration during development: + +```bash +# Terminal 1: Start Hugo manually on port 1315 +npx hugo server --port 1315 --environment testing --noHTTPCache + +# Terminal 2: Run tests (will detect and reuse existing server) +node cypress/support/run-e2e-specs.js \ + --spec "cypress/e2e/content/api-reference.cy.js" \ + content/influxdb3/core/reference/api/_index.md +``` + +## Available Test Specs + +| Spec File | Purpose | +| ------------------------------------------------------- | --------------------------------------------- | +| `cypress/e2e/content/api-reference.cy.js` | API reference pages (RapiDoc, layouts, links) | +| `cypress/e2e/content/index.cy.js` | General content validation | +| `cypress/e2e/content/markdown-content-validation.cy.js` | LLM markdown generation | +| `cypress/e2e/page-context.cy.js` | Page context and navigation | + +## Understanding Test Output + +### Success Output + +``` +โœ… e2e tests completed successfully +๐Ÿ“Š Detailed Test Results: + โ€ข Total Tests: 25 + โ€ข Tests Passed: 25 + โ€ข Tests Failed: 0 +``` + +### Failure Output + +``` +โ„น๏ธ Note: 3 test(s) failed. +๐Ÿ“Š Detailed Test Results: + โ€ข Total Tests: 25 + โ€ข Tests Passed: 22 + โ€ข Tests Failed: 3 + +๐Ÿ“‹ Failed Spec Files: + โ€ข cypress/e2e/content/api-reference.cy.js + - Failures: 3 + - Failed Tests: + * has API info + Error: Expected to find element '.article--description' +``` + +### Common Failure Patterns + +| Error | Likely Cause | Solution | +| ----------------------------------- | ----------------------------------- | -------------------------------- | +| All API tests fail with 404 | API content not generated | Run `yarn build:api-docs` first | +| `Expected to find element 'X'` | Selector changed or element removed | Update test or fix template | +| `Timed out waiting for element` | Page load issue or JS error | Check Hugo logs, browser console | +| `cy.request() failed` | Broken link or 404 | Fix the link in content | +| `Hugo server died during execution` | Build error or memory issue | Check `/tmp/hugo_server.log` | + +## Debugging Failures + +### Step 1: Check Hugo Logs + +```bash +cat /tmp/hugo_server.log | tail -50 +``` + +Look for: + +- Template errors (`error calling partial`) +- Build failures +- Missing data files + +### Step 2: Run Test in Interactive Mode + +```bash +# Start Hugo manually +npx hugo server --port 1315 --environment testing + +# In another terminal, open Cypress interactively +yarn cypress open +``` + +### Step 3: Inspect the Page + +Visit `http://localhost:1315/path/to/page/` in a browser and: + +- Open DevTools Console for JavaScript errors +- Inspect elements to verify selectors +- Check Network tab for failed requests + +### Step 4: Run Single Test with Verbose Output + +```bash +DEBUG=cypress:* node cypress/support/run-e2e-specs.js \ + --spec "cypress/e2e/content/api-reference.cy.js" \ + content/influxdb3/core/reference/api/_index.md +``` + +## Test Configuration + +The test runner uses these settings: + +```javascript +{ + browser: 'chrome', + baseUrl: 'http://localhost:1315', + video: false, // Disabled in CI + defaultCommandTimeout: 10000, // 15000 in CI + pageLoadTimeout: 30000, // 45000 in CI +} +``` + +## Writing New Tests + +### Basic Test Structure + +```javascript +describe('Feature Name', () => { + beforeEach(() => { + cy.visit('/path/to/page/'); + }); + + it('validates expected behavior', () => { + cy.get('.selector').should('exist'); + cy.get('.selector').should('be.visible'); + cy.get('.selector').contains('Expected text'); + }); +}); +``` + +### Testing Components + +```javascript +describe('Component Name', () => { + it('initializes correctly', () => { + cy.visit('/path/with/component/'); + + // Wait for component initialization + cy.get('[data-component="my-component"]', { timeout: 5000 }) + .should('be.visible'); + + // Verify component rendered expected elements + cy.get('[data-component="my-component"] .child-element') + .should('have.length.at.least', 1); + }); +}); +``` + +### Testing Links + +```javascript +it('contains valid internal links', () => { + cy.get('body').then(($body) => { + if ($body.find('a[href^="/"]').length === 0) { + cy.log('No internal links found'); + return; + } + + cy.get('a[href^="/"]').each(($a) => { + cy.request($a.attr('href')).its('status').should('eq', 200); + }); + }); +}); +``` + +## CI/CD Considerations + +In CI environments: + +- Video recording is disabled to save resources +- Timeouts are increased (15s command, 45s page load) +- Memory management is enabled +- Only 1 test kept in memory at a time + +## Related Files + +- **Test runner**: `cypress/support/run-e2e-specs.js` +- **Hugo server helper**: `cypress/support/hugo-server.js` +- **URL mapper**: `cypress/support/map-files-to-urls.js` +- **Config**: `cypress.config.js` +- **Comprehensive docs**: `DOCS-TESTING.md` + +## Checklist for Test Validation + +Before concluding test analysis: + +- [ ] For API tests: Verify `yarn build:api-docs` was run (check `ls content/*/api/`) +- [ ] All tests passed, or failures are understood +- [ ] Hugo logs checked for build errors +- [ ] Failed selectors verified against current templates +- [ ] Broken links identified and reported +- [ ] JavaScript console errors investigated (if relevant) + +## Related Skills + +- **hugo-template-dev** - For Hugo template syntax, data access patterns, and runtime testing +- **docs-cli-workflow** - For creating/editing documentation content with CLI tools +- **ts-component-dev** (agent) - TypeScript component behavior and interactivity +- **hugo-ui-dev** (agent) - Hugo templates and SASS/CSS styling diff --git a/.claude/skills/docs-cli-workflow/SKILL.md b/.claude/skills/docs-cli-workflow/SKILL.md index a5d6e9866..37b0d77fb 100644 --- a/.claude/skills/docs-cli-workflow/SKILL.md +++ b/.claude/skills/docs-cli-workflow/SKILL.md @@ -131,3 +131,9 @@ npx docs edit --list # List files without opening ``` For full CLI documentation, run `npx docs --help`. + +## Related Skills + +- **hugo-template-dev** - For Hugo template syntax, data access patterns, and runtime testing +- **cypress-e2e-testing** - For running and debugging Cypress E2E tests +- **ts-component-dev** (agent) - TypeScript component behavior and interactivity diff --git a/.claude/skills/hugo-template-dev/SKILL.md b/.claude/skills/hugo-template-dev/SKILL.md index 7139074f0..2c2d7336a 100644 --- a/.claude/skills/hugo-template-dev/SKILL.md +++ b/.claude/skills/hugo-template-dev/SKILL.md @@ -2,7 +2,7 @@ name: hugo-template-dev description: Hugo template development skill for InfluxData docs-v2. Enforces proper build and runtime testing to catch template errors that build-only validation misses. author: InfluxData -version: "1.0" +version: "1.1" --- # Hugo Template Development Skill @@ -23,9 +23,10 @@ Template errors like accessing undefined fields, nil values, or incorrect type a After modifying files in `layouts/`, `layouts/partials/`, or `layouts/shortcodes/`: +**Step 1: Start Hugo server and capture output** + ```bash -# Step 1: Start Hugo server and capture output -npx hugo server --port 1314 2>&1 | head -50 +npx hugo server --port 1315 2>&1 | head -50 ``` **Success criteria:** @@ -33,20 +34,37 @@ npx hugo server --port 1314 2>&1 | head -50 - No `error calling partial` messages - No `can't evaluate field` errors - No `template: ... failed` messages -- Server shows "Web Server is available at " +- Server shows "Web Server is available at " **If errors appear:** Fix the template and repeat Step 1 before proceeding. +**Step 2: Verify the page renders** + ```bash -# Step 2: Verify the page renders (only after Step 1 passes) -curl -s -o /dev/null -w "%{http_code}" http://localhost:1314/PATH/TO/PAGE/ +curl -s -o /dev/null -w "%{http_code}" http://localhost:1315/PATH/TO/PAGE/ ``` **Expected:** HTTP 200 status code +**Step 3: Browser testing (if MCP browser tools available)** + +If `mcp__claude-in-chrome__*` tools are available, use them for visual inspection: + +``` +# Navigate and screenshot +mcp__claude-in-chrome__navigate({ url: "http://localhost:1315/PATH/", tabId: ... }) +mcp__claude-in-chrome__computer({ action: "screenshot", tabId: ... }) + +# Check for JavaScript errors +mcp__claude-in-chrome__read_console_messages({ tabId: ..., onlyErrors: true }) +``` + +This catches runtime JavaScript errors that template changes may introduce. + +**Step 4: Stop the test server** + ```bash -# Step 3: Stop the test server -pkill -f "hugo server --port 1314" +pkill -f "hugo server --port 1315" ``` ### Quick Test Command @@ -54,7 +72,7 @@ pkill -f "hugo server --port 1314" Use this one-liner to test and get immediate feedback: ```bash -timeout 15 npx hugo server --port 1314 2>&1 | grep -E "(error|Error|ERROR|fail|FAIL)" | head -20; pkill -f "hugo server --port 1314" 2>/dev/null +timeout 15 npx hugo server --port 1315 2>&1 | grep -E "(error|Error|ERROR|fail|FAIL)" | head -20; pkill -f "hugo server --port 1315" 2>/dev/null ``` If output is empty, no errors were detected. @@ -335,24 +353,6 @@ The **only** acceptable inline scripts are minimal initialization that MUST run Everything else belongs in `assets/js/`. -### File Organization for Components - -``` -assets/ -โ”œโ”€โ”€ js/ -โ”‚ โ”œโ”€โ”€ main.js # Entry point, component registry -โ”‚ โ”œโ”€โ”€ components/ -โ”‚ โ”‚ โ”œโ”€โ”€ api-nav.ts # API navigation behavior -โ”‚ โ”‚ โ”œโ”€โ”€ api-toc.ts # Table of contents -โ”‚ โ”‚ โ”œโ”€โ”€ api-tabs.ts # Tab switching (if needed beyond CSS) -โ”‚ โ”‚ โ””โ”€โ”€ api-scalar.ts # Scalar/RapiDoc integration -โ”‚ โ””โ”€โ”€ utils/ -โ”‚ โ””โ”€โ”€ dom-helpers.ts # Shared DOM utilities -โ””โ”€โ”€ styles/ - โ””โ”€โ”€ layouts/ - โ””โ”€โ”€ _api-layout.scss # API-specific styles -``` - ### TypeScript Component Checklist When creating a new interactive feature: @@ -363,15 +363,14 @@ When creating a new interactive feature: 4. [ ] Register in `main.js` componentRegistry 5. [ ] Add `data-component` attribute to HTML element 6. [ ] Pass data via `data-*` attributes (not inline JS) -7. [ ] Write Cypress tests for the component -8. [ ] **NO inline `